9
9
"go.opentelemetry.io/otel"
10
10
"go.opentelemetry.io/otel/attribute"
11
11
"go.opentelemetry.io/otel/metric"
12
+ semconv "go.opentelemetry.io/otel/semconv/v1.27.0"
12
13
13
14
"github.com/redis/go-redis/v9"
14
15
)
@@ -36,8 +37,7 @@ func InstrumentMetrics(rdb redis.UniversalClient, opts ...MetricsOption) error {
36
37
opt := rdb .Options ()
37
38
conf .poolName = opt .Addr
38
39
}
39
- conf .attrs = append (conf .attrs , attribute .String ("pool.name" , conf .poolName ))
40
-
40
+ conf .attrs = append (conf .attrs ,semconv .DBClientConnectionPoolName (conf .poolName ))
41
41
if err := reportPoolStats (rdb , conf ); err != nil {
42
42
return err
43
43
}
@@ -51,7 +51,7 @@ func InstrumentMetrics(rdb redis.UniversalClient, opts ...MetricsOption) error {
51
51
opt := rdb .Options ()
52
52
conf .poolName = opt .Addr
53
53
}
54
- conf .attrs = append (conf .attrs , attribute . String ( "pool.name" , conf .poolName ))
54
+ conf .attrs = append (conf .attrs , semconv . DBClientConnectionPoolName ( conf .poolName ))
55
55
56
56
if err := reportPoolStats (rdb , conf ); err != nil {
57
57
otel .Handle (err )
@@ -67,7 +67,7 @@ func InstrumentMetrics(rdb redis.UniversalClient, opts ...MetricsOption) error {
67
67
opt := rdb .Options ()
68
68
conf .poolName = opt .Addr
69
69
}
70
- conf .attrs = append (conf .attrs , attribute . String ( "pool.name" , conf .poolName ))
70
+ conf .attrs = append (conf .attrs , semconv . DBClientConnectionPoolName ( conf .poolName ))
71
71
72
72
if err := reportPoolStats (rdb , conf ); err != nil {
73
73
otel .Handle (err )
@@ -88,40 +88,45 @@ func reportPoolStats(rdb *redis.Client, conf *config) error {
88
88
usedAttrs := append (labels , attribute .String ("state" , "used" ))
89
89
90
90
idleMax , err := conf .meter .Int64ObservableUpDownCounter (
91
- "db.client.connections.idle.max" ,
92
- metric .WithDescription ("The maximum number of idle open connections allowed" ),
91
+ semconv .DBClientConnectionIdleMaxName ,
92
+ metric .WithDescription (semconv .DBClientConnectionIdleMaxDescription ),
93
+ metric .WithUnit (semconv .DBClientConnectionIdleMaxUnit ),
93
94
)
94
95
if err != nil {
95
96
return err
96
97
}
97
98
98
99
idleMin , err := conf .meter .Int64ObservableUpDownCounter (
99
- "db.client.connections.idle.min" ,
100
- metric .WithDescription ("The minimum number of idle open connections allowed" ),
100
+ semconv .DBClientConnectionIdleMinName ,
101
+ metric .WithDescription (semconv .DBClientConnectionIdleMinDescription ),
102
+ metric .WithUnit (semconv .DBClientConnectionIdleMinUnit ),
101
103
)
102
104
if err != nil {
103
105
return err
104
106
}
105
107
106
108
connsMax , err := conf .meter .Int64ObservableUpDownCounter (
107
- "db.client.connections.max" ,
108
- metric .WithDescription ("The maximum number of open connections allowed" ),
109
+ semconv .DBClientConnectionMaxName ,
110
+ metric .WithDescription (semconv .DBClientConnectionMaxDescription ),
111
+ metric .WithUnit (semconv .DBClientConnectionMaxUnit ),
109
112
)
110
113
if err != nil {
111
114
return err
112
115
}
113
116
114
117
usage , err := conf .meter .Int64ObservableUpDownCounter (
115
- "db.client.connections.usage" ,
116
- metric .WithDescription ("The number of connections that are currently in state described by the state attribute" ),
118
+ semconv .DBClientConnectionCountName ,
119
+ metric .WithDescription (semconv .DBClientConnectionCountDescription ),
120
+ metric .WithUnit (semconv .DBClientConnectionCountUnit ),
117
121
)
118
122
if err != nil {
119
123
return err
120
124
}
121
125
122
126
timeouts , err := conf .meter .Int64ObservableUpDownCounter (
123
- "db.client.connections.timeouts" ,
124
- metric .WithDescription ("The number of connection timeouts that have occurred trying to obtain a connection from the pool" ),
127
+ semconv .DBClientConnectionTimeoutsName ,
128
+ metric .WithDescription (semconv .DBClientConnectionTimeoutsDescription ),
129
+ metric .WithUnit (semconv .DBClientConnectionTimeoutsUnit ),
125
130
)
126
131
if err != nil {
127
132
return err
@@ -154,18 +159,18 @@ func reportPoolStats(rdb *redis.Client, conf *config) error {
154
159
155
160
func addMetricsHook (rdb * redis.Client , conf * config ) error {
156
161
createTime , err := conf .meter .Float64Histogram (
157
- "db.client.connections.create_time" ,
158
- metric .WithDescription ("The time it took to create a new connection." ),
159
- metric .WithUnit ("ms" ),
162
+ semconv . DBClientConnectionCreateTimeName ,
163
+ metric .WithDescription (semconv . DBClientConnectionCreateTimeDescription ),
164
+ metric .WithUnit (semconv . DBClientConnectionCreateTimeUnit ),
160
165
)
161
166
if err != nil {
162
167
return err
163
168
}
164
169
165
170
useTime , err := conf .meter .Float64Histogram (
166
- "db.client.connections.use_time" ,
167
- metric .WithDescription ("The time between borrowing a connection and returning it to the pool." ),
168
- metric .WithUnit ("ms" ),
171
+ semconv . DBClientConnectionUseTimeName ,
172
+ metric .WithDescription (semconv . DBClientConnectionUseTimeDescription ),
173
+ metric .WithUnit (semconv . DBClientConnectionUseTimeUnit ),
169
174
)
170
175
if err != nil {
171
176
return err
@@ -199,7 +204,7 @@ func (mh *metricsHook) DialHook(hook redis.DialHook) redis.DialHook {
199
204
attrs = append (attrs , mh .attrs ... )
200
205
attrs = append (attrs , statusAttr (err ))
201
206
202
- mh .createTime .Record (ctx , milliseconds ( dur ), metric .WithAttributes (attrs ... ))
207
+ mh .createTime .Record (ctx , dur . Seconds ( ), metric .WithAttributes (attrs ... ))
203
208
return conn , err
204
209
}
205
210
}
@@ -216,8 +221,8 @@ func (mh *metricsHook) ProcessHook(hook redis.ProcessHook) redis.ProcessHook {
216
221
attrs = append (attrs , mh .attrs ... )
217
222
attrs = append (attrs , attribute .String ("type" , "command" ))
218
223
attrs = append (attrs , statusAttr (err ))
219
-
220
- mh .useTime .Record (ctx , milliseconds ( dur ), metric .WithAttributes (attrs ... ))
224
+ attrs = append ( attrs , semconv . DBOperationName ( cmd . FullName ()))
225
+ mh .useTime .Record (ctx , dur . Seconds ( ), metric .WithAttributes (attrs ... ))
221
226
222
227
return err
223
228
}
@@ -237,17 +242,17 @@ func (mh *metricsHook) ProcessPipelineHook(
237
242
attrs = append (attrs , mh .attrs ... )
238
243
attrs = append (attrs , attribute .String ("type" , "pipeline" ))
239
244
attrs = append (attrs , statusAttr (err ))
245
+ if len (cmds ) > 0 {
246
+ attrs = append (attrs , semconv .DBOperationName (cmds [0 ].FullName ()))
247
+ attrs = append (attrs , semconv .DBOperationBatchSize (len (cmds )))
248
+ }
240
249
241
- mh .useTime .Record (ctx , milliseconds ( dur ), metric .WithAttributes (attrs ... ))
250
+ mh .useTime .Record (ctx , dur . Seconds ( ), metric .WithAttributes (attrs ... ))
242
251
243
252
return err
244
253
}
245
254
}
246
255
247
- func milliseconds (d time.Duration ) float64 {
248
- return float64 (d ) / float64 (time .Millisecond )
249
- }
250
-
251
256
func statusAttr (err error ) attribute.KeyValue {
252
257
if err != nil {
253
258
return attribute .String ("status" , "error" )
0 commit comments