@@ -2,7 +2,6 @@ package prometheusmetrics
2
2
3
3
import (
4
4
"context"
5
- "fmt"
6
5
"strings"
7
6
"time"
8
7
@@ -32,7 +31,7 @@ const (
32
31
)
33
32
34
33
type MetricsAggregator struct {
35
- store map [string ]annotatedMetric
34
+ store map [metricKey ]annotatedMetric
36
35
37
36
log slog.Logger
38
37
metricsCleanupInterval time.Duration
@@ -67,29 +66,54 @@ type annotatedMetric struct {
67
66
expiryDate time.Time
68
67
}
69
68
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
76
74
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 ,
80
105
}
81
- return fmt .Sprintf ("%s|%s|%s|%s|%s|%s" , req .username , req .workspaceName , req .agentName , req .templateName , m .GetName (), sbLabels .String ())
82
106
}
83
107
84
108
var _ prometheus.Collector = new (MetricsAggregator )
85
109
86
110
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 &&
88
114
am .workspaceName == req .workspaceName &&
89
115
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
93
117
}
94
118
95
119
func (am * annotatedMetric ) asPrometheus () (prometheus.Metric , error ) {
@@ -157,7 +181,7 @@ func NewMetricsAggregator(logger slog.Logger, registerer prometheus.Registerer,
157
181
log : logger .Named (loggerName ),
158
182
metricsCleanupInterval : metricsCleanupInterval ,
159
183
160
- store : map [string ]annotatedMetric {},
184
+ store : map [metricKey ]annotatedMetric {},
161
185
162
186
collectCh : make (chan (chan []prometheus.Metric ), sizeCollectCh ),
163
187
updateCh : make (chan updateRequest , sizeUpdateCh ),
0 commit comments