99 "go.opentelemetry.io/otel"
1010 "go.opentelemetry.io/otel/attribute"
1111 "go.opentelemetry.io/otel/metric"
12+ semconv "go.opentelemetry.io/otel/semconv/v1.27.0"
1213
1314 "github.com/redis/go-redis/v9"
1415)
@@ -36,8 +37,7 @@ func InstrumentMetrics(rdb redis.UniversalClient, opts ...MetricsOption) error {
3637 opt := rdb .Options ()
3738 conf .poolName = opt .Addr
3839 }
39- conf .attrs = append (conf .attrs , attribute .String ("pool.name" , conf .poolName ))
40-
40+ conf .attrs = append (conf .attrs ,semconv .DBClientConnectionPoolName (conf .poolName ))
4141 if err := reportPoolStats (rdb , conf ); err != nil {
4242 return err
4343 }
@@ -51,7 +51,7 @@ func InstrumentMetrics(rdb redis.UniversalClient, opts ...MetricsOption) error {
5151 opt := rdb .Options ()
5252 conf .poolName = opt .Addr
5353 }
54- conf .attrs = append (conf .attrs , attribute . String ( "pool.name" , conf .poolName ))
54+ conf .attrs = append (conf .attrs , semconv . DBClientConnectionPoolName ( conf .poolName ))
5555
5656 if err := reportPoolStats (rdb , conf ); err != nil {
5757 otel .Handle (err )
@@ -67,7 +67,7 @@ func InstrumentMetrics(rdb redis.UniversalClient, opts ...MetricsOption) error {
6767 opt := rdb .Options ()
6868 conf .poolName = opt .Addr
6969 }
70- conf .attrs = append (conf .attrs , attribute . String ( "pool.name" , conf .poolName ))
70+ conf .attrs = append (conf .attrs , semconv . DBClientConnectionPoolName ( conf .poolName ))
7171
7272 if err := reportPoolStats (rdb , conf ); err != nil {
7373 otel .Handle (err )
@@ -88,40 +88,45 @@ func reportPoolStats(rdb *redis.Client, conf *config) error {
8888 usedAttrs := append (labels , attribute .String ("state" , "used" ))
8989
9090 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 ),
9394 )
9495 if err != nil {
9596 return err
9697 }
9798
9899 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 ),
101103 )
102104 if err != nil {
103105 return err
104106 }
105107
106108 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 ),
109112 )
110113 if err != nil {
111114 return err
112115 }
113116
114117 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 ),
117121 )
118122 if err != nil {
119123 return err
120124 }
121125
122126 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 ),
125130 )
126131 if err != nil {
127132 return err
@@ -154,18 +159,18 @@ func reportPoolStats(rdb *redis.Client, conf *config) error {
154159
155160func addMetricsHook (rdb * redis.Client , conf * config ) error {
156161 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 ),
160165 )
161166 if err != nil {
162167 return err
163168 }
164169
165170 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 ),
169174 )
170175 if err != nil {
171176 return err
@@ -199,7 +204,7 @@ func (mh *metricsHook) DialHook(hook redis.DialHook) redis.DialHook {
199204 attrs = append (attrs , mh .attrs ... )
200205 attrs = append (attrs , statusAttr (err ))
201206
202- mh .createTime .Record (ctx , milliseconds ( dur ), metric .WithAttributes (attrs ... ))
207+ mh .createTime .Record (ctx , dur . Seconds ( ), metric .WithAttributes (attrs ... ))
203208 return conn , err
204209 }
205210}
@@ -216,8 +221,8 @@ func (mh *metricsHook) ProcessHook(hook redis.ProcessHook) redis.ProcessHook {
216221 attrs = append (attrs , mh .attrs ... )
217222 attrs = append (attrs , attribute .String ("type" , "command" ))
218223 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 ... ))
221226
222227 return err
223228 }
@@ -237,17 +242,17 @@ func (mh *metricsHook) ProcessPipelineHook(
237242 attrs = append (attrs , mh .attrs ... )
238243 attrs = append (attrs , attribute .String ("type" , "pipeline" ))
239244 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+ }
240249
241- mh .useTime .Record (ctx , milliseconds ( dur ), metric .WithAttributes (attrs ... ))
250+ mh .useTime .Record (ctx , dur . Seconds ( ), metric .WithAttributes (attrs ... ))
242251
243252 return err
244253 }
245254}
246255
247- func milliseconds (d time.Duration ) float64 {
248- return float64 (d ) / float64 (time .Millisecond )
249- }
250-
251256func statusAttr (err error ) attribute.KeyValue {
252257 if err != nil {
253258 return attribute .String ("status" , "error" )
0 commit comments