From 6bb75728e7821ddba99332587bff8800a136c761 Mon Sep 17 00:00:00 2001 From: Erik Brakkee Date: Wed, 14 Aug 2024 11:26:31 +0200 Subject: [PATCH] eliminated unused fields in State Now preserving the lastState in prometheus.go in a State object instead of in multiple values. --- README.md | 8 ++--- cmd/converge/prometheus.go | 73 +++++++++++++++++++++++--------------- pkg/models/state.go | 3 -- 3 files changed, 49 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 6daa53f..e30b619 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,13 @@ At least go version 1.21 so that it automatically downloads the correct version ``` go install github.com/a-h/templ/cmd/templ@latest go install golang.org/x/pkgsite/cmd/pkgsite@latest - +go install honnef.co/go/tools/cmd/staticcheck@v0.5.0 ``` # Profiling ``` -go tool pprof -http:8081 http://localhost:8000/debug/pprof/profile?seconds=30 -go tool pprof -http:8081 http://localhost:8000/debug/pprof/heap -go tool pprof -http:8081 http://localhost:8000/debug/pprof/goroutine +go tool pprof -http 8081 http://localhost:8000/debug/pprof/profile?seconds=30 +go tool pprof -http 8081 http://localhost:8000/debug/pprof/heap +go tool pprof -http 8081 http://localhost:8000/debug/pprof/goroutine ``` diff --git a/cmd/converge/prometheus.go b/cmd/converge/prometheus.go index 0c6972f..eaf1c6c 100644 --- a/cmd/converge/prometheus.go +++ b/cmd/converge/prometheus.go @@ -15,8 +15,7 @@ const NAMESPACE = "converge" var ( // remember previous values of agent guids and clients so that we can increment // the cumulative counters. - lastAgents map[string]models.Agent = make(map[string]models.Agent) - lastClients map[string]models.Client = make(map[string]models.Client) + lastState *models.State = &models.State{} cumulativeAgentCount = promauto.NewCounter(prometheus.CounterOpts{ Namespace: NAMESPACE, @@ -100,7 +99,7 @@ var ( ) ) -func agentLabels(agent models.Agent) prometheus.Labels { +func agentLabels(agent *models.Agent) prometheus.Labels { return prometheus.Labels{ "agent_guid": agent.Guid, "agent_address": agent.RemoteAddr, @@ -113,7 +112,7 @@ func agentLabels(agent models.Agent) prometheus.Labels { } } -func clientLabels(client models.Client) prometheus.Labels { +func clientLabels(client *models.Client) prometheus.Labels { return prometheus.Labels{ "client_guid": client.Guid, "client_address": client.RemoteAddr, @@ -129,9 +128,9 @@ func clientLabels(client models.Client) prometheus.Labels { } } -func agentActive(agent models.Agent) { - prevAgent, ok := lastAgents[agent.Guid] - if ok && prevAgent != agent { +func agentActive(agent *models.Agent) { + prevAgent, ok := findAgent(lastState, agent.Guid) + if ok && *prevAgent != *agent { removeAgentInfoMetrics(prevAgent) } agentInfo.With(agentLabels(agent)).Set(1) @@ -143,9 +142,27 @@ func agentActive(agent models.Agent) { Set(float64(time.Now().Sub(agent.StartTime).Seconds())) } -func clientActive(client models.Client) { - prevClient, ok := lastClients[client.Guid] - if ok && prevClient != client { +func findAgent(state *models.State, guid string) (*models.Agent, bool) { + for _, agent := range state.Agents { + if agent.Guid == guid { + return &agent, true + } + } + return nil, false +} + +func findClient(state *models.State, guid string) (*models.Client, bool) { + for _, client := range state.Clients { + if client.Guid == guid { + return &client, true + } + } + return nil, false +} + +func clientActive(client *models.Client) { + prevClient, ok := findClient(lastState, client.Guid) + if ok && *prevClient != *client { removeClientInfoMetrics(prevClient) } clientInfo.With(clientLabels(client)).Set(1) @@ -202,12 +219,12 @@ func updateMetrics(state *models.State) { } func updateDurations() { - for _, agent := range lastAgents { + for _, agent := range lastState.Agents { agentDuration. With(prometheus.Labels{"agent_guid": agent.Guid}). Set(float64(time.Now().Sub(agent.StartTime).Seconds())) } - for _, client := range lastClients { + for _, client := range lastState.Clients { clientDuration. With(prometheus.Labels{"client_guid": client.Guid}). Set(float64(time.Now().Sub(client.StartTime).Seconds())) @@ -220,48 +237,48 @@ func updateMetricsImpl(state *models.State) { agentCount.Set(float64(len(state.Agents))) disconnectedAgents := make(map[string]models.Agent) - for k, v := range lastAgents { - disconnectedAgents[k] = v + for _, agent := range lastState.Agents { + disconnectedAgents[agent.Guid] = agent } for _, agent := range state.Agents { - if _, ok := lastAgents[agent.Guid]; !ok { + if _, ok := findAgent(lastState, agent.Guid); !ok { cumulativeAgentCount.Inc() } delete(disconnectedAgents, agent.Guid) agentGuids[agent.Guid] = agent - agentActive(agent) + agentActive(&agent) } for _, agent := range disconnectedAgents { - removeAgentMetrics(agent) + removeAgentMetrics(&agent) } - lastAgents = agentGuids clientCount.Set(float64(len(state.Clients))) // with this app disconnectedClients := make(map[string]models.Client) - for k, v := range lastClients { - disconnectedClients[k] = v + for _, client := range lastState.Clients { + disconnectedClients[client.Guid] = client } for _, client := range state.Clients { - if _, ok := lastClients[client.Guid]; !ok { + if _, ok := findClient(lastState, client.Guid); !ok { cumulativeClientCount.Inc() } delete(disconnectedClients, client.Guid) clientGuids[client.Guid] = client - clientActive(client) + clientActive(&client) } for _, client := range disconnectedClients { - removeClientMetrics(client) + removeClientMetrics(&client) } - lastClients = clientGuids + + lastState = state } -func removeAgentInfoMetrics(agent models.Agent) bool { +func removeAgentInfoMetrics(agent *models.Agent) bool { return agentInfo.Delete(agentLabels(agent)) } -func removeAgentMetrics(agent models.Agent) { +func removeAgentMetrics(agent *models.Agent) { ok1 := removeAgentInfoMetrics(agent) guidLabels := prometheus.Labels{"agent_guid": agent.Guid} ok2 := agentStartTime.Delete(guidLabels) @@ -279,11 +296,11 @@ func removeAgentMetrics(agent models.Agent) { } } -func removeClientInfoMetrics(client models.Client) bool { +func removeClientInfoMetrics(client *models.Client) bool { return clientInfo.Delete(clientLabels(client)) } -func removeClientMetrics(client models.Client) { +func removeClientMetrics(client *models.Client) { ok1 := removeClientInfoMetrics(client) guidLabels := prometheus.Labels{"client_guid": client.Guid} ok2 := clientStartTime.Delete(guidLabels) diff --git a/pkg/models/state.go b/pkg/models/state.go index e407dca..74c7aa5 100644 --- a/pkg/models/state.go +++ b/pkg/models/state.go @@ -1,9 +1,6 @@ package models type State struct { - CumulativeAgentCount int - CumulativeClientCount int - Agents []Agent Clients []Client }