Skip to content

Commit 12fcdab

Browse files
committed
Use struct key
1 parent f407b47 commit 12fcdab

File tree

1 file changed

+41
-17
lines changed

1 file changed

+41
-17
lines changed

coderd/prometheusmetrics/aggregator.go

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package prometheusmetrics
22

33
import (
44
"context"
5-
"fmt"
65
"strings"
76
"time"
87

@@ -32,7 +31,7 @@ const (
3231
)
3332

3433
type MetricsAggregator struct {
35-
store map[string]annotatedMetric
34+
store map[metricKey]annotatedMetric
3635

3736
log slog.Logger
3837
metricsCleanupInterval time.Duration
@@ -67,29 +66,54 @@ type annotatedMetric struct {
6766
expiryDate time.Time
6867
}
6968

70-
func hashKey(req *updateRequest, m *agentproto.Stats_Metric) string {
71-
var sbLabels strings.Builder
72-
for i, label := range m.GetLabels() {
73-
_, _ = sbLabels.WriteString(label.Name)
74-
_ = sbLabels.WriteByte('=')
75-
_, _ = sbLabels.WriteString(label.Value)
69+
type metricKey struct {
70+
username string
71+
workspaceName string
72+
agentName string
73+
templateName string
7674

77-
if i-1 != len(m.GetLabels()) {
78-
_ = sbLabels.WriteByte(',')
79-
}
75+
metricName string
76+
labelsStr string
77+
}
78+
79+
func (m1 metricKey) Equal(m2 metricKey) bool {
80+
return m1.metricName == m2.metricName &&
81+
m1.labelsStr == m2.labelsStr &&
82+
m1.username == m2.username &&
83+
m1.workspaceName == m2.workspaceName &&
84+
m1.agentName == m2.agentName &&
85+
m1.templateName == m2.templateName
86+
}
87+
88+
func hashKey(req *updateRequest, m *agentproto.Stats_Metric) metricKey {
89+
var sb strings.Builder
90+
for _, label := range m.GetLabels() {
91+
_, _ = sb.WriteString(label.Name)
92+
_ = sb.WriteByte('=')
93+
_, _ = sb.WriteString(label.Value)
94+
_ = sb.WriteByte(',')
95+
}
96+
labels := strings.TrimRight(sb.String(), ",")
97+
98+
return metricKey{
99+
username: req.username,
100+
workspaceName: req.workspaceName,
101+
agentName: req.agentName,
102+
templateName: req.templateName,
103+
metricName: m.Name,
104+
labelsStr: labels,
80105
}
81-
return fmt.Sprintf("%s|%s|%s|%s|%s|%s", req.username, req.workspaceName, req.agentName, req.templateName, m.GetName(), sbLabels.String())
82106
}
83107

84108
var _ prometheus.Collector = new(MetricsAggregator)
85109

86110
func (am *annotatedMetric) is(req updateRequest, m *agentproto.Stats_Metric) bool {
87-
return am.username == req.username &&
111+
return am.Name == m.Name &&
112+
agentproto.LabelsEqual(am.Labels, m.Labels) &&
113+
am.username == req.username &&
88114
am.workspaceName == req.workspaceName &&
89115
am.agentName == req.agentName &&
90-
am.templateName == req.templateName &&
91-
am.Name == m.Name &&
92-
agentproto.LabelsEqual(am.Labels, m.Labels)
116+
am.templateName == req.templateName
93117
}
94118

95119
func (am *annotatedMetric) asPrometheus() (prometheus.Metric, error) {
@@ -157,7 +181,7 @@ func NewMetricsAggregator(logger slog.Logger, registerer prometheus.Registerer,
157181
log: logger.Named(loggerName),
158182
metricsCleanupInterval: metricsCleanupInterval,
159183

160-
store: map[string]annotatedMetric{},
184+
store: map[metricKey]annotatedMetric{},
161185

162186
collectCh: make(chan (chan []prometheus.Metric), sizeCollectCh),
163187
updateCh: make(chan updateRequest, sizeUpdateCh),

0 commit comments

Comments
 (0)