Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions dnscrypt-proxy/monitoring_ui.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ type MonitoringUI struct {
clients map[*websocket.Conn]bool
clientsMutex sync.Mutex
proxy *Proxy
tasks chan *PluginsState

// Mutex for all WebSocket write operations to prevent races
writesMutex sync.Mutex
Expand Down Expand Up @@ -202,6 +203,7 @@ func NewMonitoringUI(proxy *Proxy) *MonitoringUI {
},
clients: make(map[*websocket.Conn]bool),
proxy: proxy,
tasks: make(chan *PluginsState, proxy.maxClients),
// Initialize broadcast rate limiting with 100ms minimum delay
broadcastMinDelay: 100 * time.Millisecond,
// Initialize Prometheus path
Expand Down Expand Up @@ -256,6 +258,8 @@ func (ui *MonitoringUI) Start() error {
}
}()

go ui.WatchTasks()

return nil
}

Expand All @@ -267,8 +271,18 @@ func (ui *MonitoringUI) Stop() error {
return nil
}

// WatchTasks - Consumes the query result queue
func (ui *MonitoringUI) WatchTasks() {
for {
select {
case pluginsState := <-ui.tasks:
ui.UpdateMetrics(pluginsState)
}
}
}

// UpdateMetrics - Updates metrics with a new query
func (ui *MonitoringUI) UpdateMetrics(pluginsState PluginsState, msg *dns.Msg) {
func (ui *MonitoringUI) UpdateMetrics(pluginsState *PluginsState) {
if !ui.config.Enabled {
return
}
Expand Down Expand Up @@ -323,6 +337,7 @@ func (ui *MonitoringUI) UpdateMetrics(pluginsState PluginsState, msg *dns.Msg) {
mc.invalidateCache()

// Update query types - separate lock
msg := pluginsState.questionMsg
if msg != nil && len(msg.Question) > 0 {
question := msg.Question[0]
qType, ok := dns.TypeToString[question.Qtype]
Expand Down Expand Up @@ -1056,7 +1071,7 @@ func (ui *MonitoringUI) handleTestQuery(w http.ResponseWriter, r *http.Request)
}

// Update metrics
ui.UpdateMetrics(pluginsState, msg)
ui.tasks <- &pluginsState

// Return success
w.Header().Set("Content-Type", "text/plain")
Expand Down
2 changes: 1 addition & 1 deletion dnscrypt-proxy/query_processing.go
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ func updateMonitoringMetrics(
) {
if proxy.monitoringUI.Enabled && proxy.monitoringInstance != nil && pluginsState.questionMsg != nil {
dlog.Debugf("Calling UpdateMetrics for query: %s", pluginsState.qName)
proxy.monitoringInstance.UpdateMetrics(*pluginsState, pluginsState.questionMsg)
proxy.monitoringInstance.tasks <- pluginsState
} else {
if pluginsState.questionMsg == nil {
dlog.Debugf("Question message is nil")
Expand Down