1
- // Copyright (c) 2023 Uber Technologies, Inc.
1
+ // Copyright (c) 2024 Uber Technologies, Inc.
2
2
//
3
3
// Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
// of this software and associated documentation files (the "Software"), to deal
@@ -33,10 +33,15 @@ var (
33
33
scopeRegistryKey = keyForPrefixedStringMaps
34
34
35
35
// Metrics related.
36
- internalTags = map [string ]string {"version" : Version }
37
- counterCardinalityName = "tally_internal_counter_cardinality"
38
- gaugeCardinalityName = "tally_internal_gauge_cardinality"
39
- histogramCardinalityName = "tally_internal_histogram_cardinality"
36
+ counterCardinalityName = "tally.internal.counter_cardinality"
37
+ gaugeCardinalityName = "tally.internal.gauge_cardinality"
38
+ histogramCardinalityName = "tally.internal.histogram_cardinality"
39
+ scopeCardinalityName = "tally.internal.scope_cardinality"
40
+ )
41
+
42
+ const (
43
+ // DefaultTagRedactValue is the default tag value to use when redacting
44
+ DefaultTagRedactValue = "global"
40
45
)
41
46
42
47
type scopeRegistry struct {
@@ -45,10 +50,16 @@ type scopeRegistry struct {
45
50
// We need a subscope per GOPROC so that we can take advantage of all the cpu available to the application.
46
51
subscopes []* scopeBucket
47
52
// Internal metrics related.
48
- internalMetricsOption InternalMetricOption
53
+ cardinalityMetricsOption CardinalityMetricsOption
54
+ cardinalityMetricsTags map [string ]string
49
55
sanitizedCounterCardinalityName string
50
56
sanitizedGaugeCardinalityName string
51
57
sanitizedHistogramCardinalityName string
58
+ sanitizedScopeCardinalityName string
59
+ cachedCounterCardinalityGauge CachedGauge
60
+ cachedGaugeCardinalityGauge CachedGauge
61
+ cachedHistogramCardinalityGauge CachedGauge
62
+ cachedScopeCardinalityGauge CachedGauge
52
63
}
53
64
54
65
type scopeBucket struct {
@@ -59,7 +70,8 @@ type scopeBucket struct {
59
70
func newScopeRegistryWithShardCount (
60
71
root * scope ,
61
72
shardCount uint ,
62
- internalMetricsOption InternalMetricOption ,
73
+ cardinalityMetricsOption CardinalityMetricsOption ,
74
+ cardinalityMetricsTags map [string ]string ,
63
75
) * scopeRegistry {
64
76
if shardCount == 0 {
65
77
shardCount = uint (runtime .GOMAXPROCS (- 1 ))
@@ -69,17 +81,34 @@ func newScopeRegistryWithShardCount(
69
81
root : root ,
70
82
subscopes : make ([]* scopeBucket , shardCount ),
71
83
seed : maphash .MakeSeed (),
72
- internalMetricsOption : internalMetricsOption ,
84
+ cardinalityMetricsOption : cardinalityMetricsOption ,
73
85
sanitizedCounterCardinalityName : root .sanitizer .Name (counterCardinalityName ),
74
86
sanitizedGaugeCardinalityName : root .sanitizer .Name (gaugeCardinalityName ),
75
87
sanitizedHistogramCardinalityName : root .sanitizer .Name (histogramCardinalityName ),
88
+ sanitizedScopeCardinalityName : root .sanitizer .Name (scopeCardinalityName ),
89
+ cardinalityMetricsTags : map [string ]string {
90
+ "version" : Version ,
91
+ "host" : DefaultTagRedactValue ,
92
+ "instance" : DefaultTagRedactValue ,
93
+ },
94
+ }
95
+
96
+ for k , v := range cardinalityMetricsTags {
97
+ r .cardinalityMetricsTags [root .sanitizer .Key (k )] = root .sanitizer .Value (v )
76
98
}
99
+
77
100
for i := uint (0 ); i < shardCount ; i ++ {
78
101
r .subscopes [i ] = & scopeBucket {
79
102
s : make (map [string ]* scope ),
80
103
}
81
104
r .subscopes [i ].s [scopeRegistryKey (root .prefix , root .tags )] = root
82
105
}
106
+ if r .root .cachedReporter != nil {
107
+ r .cachedCounterCardinalityGauge = r .root .cachedReporter .AllocateGauge (r .sanitizedCounterCardinalityName , r .cardinalityMetricsTags )
108
+ r .cachedGaugeCardinalityGauge = r .root .cachedReporter .AllocateGauge (r .sanitizedGaugeCardinalityName , r .cardinalityMetricsTags )
109
+ r .cachedHistogramCardinalityGauge = r .root .cachedReporter .AllocateGauge (r .sanitizedHistogramCardinalityName , r .cardinalityMetricsTags )
110
+ r .cachedScopeCardinalityGauge = r .root .cachedReporter .AllocateGauge (r .sanitizedScopeCardinalityName , r .cardinalityMetricsTags )
111
+ }
83
112
return r
84
113
}
85
114
@@ -237,12 +266,13 @@ func (r *scopeRegistry) removeWithRLock(subscopeBucket *scopeBucket, key string)
237
266
238
267
// Records internal Metrics' cardinalities.
239
268
func (r * scopeRegistry ) reportInternalMetrics () {
240
- if r .internalMetricsOption != SendInternalMetrics {
269
+ if r .cardinalityMetricsOption == OmitCardinalityMetrics {
241
270
return
242
271
}
243
272
244
- counters , gauges , histograms := atomic.Int64 {}, atomic.Int64 {}, atomic.Int64 {}
273
+ counters , gauges , histograms , scopes := atomic. Int64 {}, atomic.Int64 {}, atomic.Int64 {}, atomic.Int64 {}
245
274
rootCounters , rootGauges , rootHistograms := atomic.Int64 {}, atomic.Int64 {}, atomic.Int64 {}
275
+ scopes .Inc () // Account for root scope.
246
276
r .ForEachScope (
247
277
func (ss * scope ) {
248
278
counterSliceLen , gaugeSliceLen , histogramSliceLen := int64 (len (ss .countersSlice )), int64 (len (ss .gaugesSlice )), int64 (len (ss .histogramsSlice ))
@@ -255,25 +285,24 @@ func (r *scopeRegistry) reportInternalMetrics() {
255
285
counters .Add (counterSliceLen )
256
286
gauges .Add (gaugeSliceLen )
257
287
histograms .Add (histogramSliceLen )
288
+ scopes .Inc ()
258
289
},
259
290
)
260
291
261
292
counters .Add (rootCounters .Load ())
262
293
gauges .Add (rootGauges .Load ())
263
294
histograms .Add (rootHistograms .Load ())
264
-
265
295
if r .root .reporter != nil {
266
- r .root .reporter .ReportCounter (r .sanitizedCounterCardinalityName , internalTags , counters .Load ())
267
- r .root .reporter .ReportCounter (r .sanitizedGaugeCardinalityName , internalTags , gauges .Load ())
268
- r .root .reporter .ReportCounter (r .sanitizedHistogramCardinalityName , internalTags , histograms .Load ())
296
+ r .root .reporter .ReportGauge (r .sanitizedCounterCardinalityName , r .cardinalityMetricsTags , float64 (counters .Load ()))
297
+ r .root .reporter .ReportGauge (r .sanitizedGaugeCardinalityName , r .cardinalityMetricsTags , float64 (gauges .Load ()))
298
+ r .root .reporter .ReportGauge (r .sanitizedHistogramCardinalityName , r .cardinalityMetricsTags , float64 (histograms .Load ()))
299
+ r .root .reporter .ReportGauge (r .sanitizedScopeCardinalityName , r .cardinalityMetricsTags , float64 (scopes .Load ()))
269
300
}
270
301
271
302
if r .root .cachedReporter != nil {
272
- numCounters := r .root .cachedReporter .AllocateCounter (r .sanitizedCounterCardinalityName , internalTags )
273
- numGauges := r .root .cachedReporter .AllocateCounter (r .sanitizedGaugeCardinalityName , internalTags )
274
- numHistograms := r .root .cachedReporter .AllocateCounter (r .sanitizedHistogramCardinalityName , internalTags )
275
- numCounters .ReportCount (counters .Load ())
276
- numGauges .ReportCount (gauges .Load ())
277
- numHistograms .ReportCount (histograms .Load ())
303
+ r .cachedCounterCardinalityGauge .ReportGauge (float64 (counters .Load ()))
304
+ r .cachedGaugeCardinalityGauge .ReportGauge (float64 (gauges .Load ()))
305
+ r .cachedHistogramCardinalityGauge .ReportGauge (float64 (histograms .Load ()))
306
+ r .cachedScopeCardinalityGauge .ReportGauge (float64 (scopes .Load ()))
278
307
}
279
308
}
0 commit comments