eliminated unused fields in State

Now preserving the lastState in prometheus.go in a State object instead
of in multiple values.
This commit is contained in:
Erik Brakkee 2024-08-14 11:26:31 +02:00
parent 6d48146e6b
commit 6bb75728e7
3 changed files with 49 additions and 35 deletions

View File

@ -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
```

View File

@ -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)

View File

@ -1,9 +1,6 @@
package models
type State struct {
CumulativeAgentCount int
CumulativeClientCount int
Agents []Agent
Clients []Client
}