From fc5be74fe9f371d037089f793df724c4fef9027c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Catt=C4=AB=20Cr=C5=ABd=C4=93l=C4=93s?= <17695588+wzy9607@users.noreply.github.com> Date: Sun, 15 Sep 2024 18:26:16 +0800 Subject: [PATCH] fix(redisotel): fix buggy append in reportPoolStats The current append twice to `conf.attrs` approach in `reportPoolStats` may result in unexpected idleAttrs, due to `append` [can mutate](https://github.com/golang/go/issues/29115#issuecomment-444669036) the underlying array of the original slice, as demonstrated at . Also, I replaced `metric.WithAttributes` in `reportPoolStats` with `metric.WithAttributeSet`, since `WithAttributes` is just `WithAttributeSet` with some extra works that are not needed here, see . --- extra/redisotel/metrics.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/extra/redisotel/metrics.go b/extra/redisotel/metrics.go index 915838f3..2778c7bc 100644 --- a/extra/redisotel/metrics.go +++ b/extra/redisotel/metrics.go @@ -83,9 +83,9 @@ func InstrumentMetrics(rdb redis.UniversalClient, opts ...MetricsOption) error { } func reportPoolStats(rdb *redis.Client, conf *config) error { - labels := conf.attrs - idleAttrs := append(labels, attribute.String("state", "idle")) - usedAttrs := append(labels, attribute.String("state", "used")) + poolAttrs := attribute.NewSet(conf.attrs...) + idleAttrs := attribute.NewSet(append(poolAttrs.ToSlice(), attribute.String("state", "idle"))...) + usedAttrs := attribute.NewSet(append(poolAttrs.ToSlice(), attribute.String("state", "used"))...) idleMax, err := conf.meter.Int64ObservableUpDownCounter( "db.client.connections.idle.max", @@ -132,14 +132,14 @@ func reportPoolStats(rdb *redis.Client, conf *config) error { func(ctx context.Context, o metric.Observer) error { stats := rdb.PoolStats() - o.ObserveInt64(idleMax, int64(redisConf.MaxIdleConns), metric.WithAttributes(labels...)) - o.ObserveInt64(idleMin, int64(redisConf.MinIdleConns), metric.WithAttributes(labels...)) - o.ObserveInt64(connsMax, int64(redisConf.PoolSize), metric.WithAttributes(labels...)) + o.ObserveInt64(idleMax, int64(redisConf.MaxIdleConns), metric.WithAttributeSet(poolAttrs)) + o.ObserveInt64(idleMin, int64(redisConf.MinIdleConns), metric.WithAttributeSet(poolAttrs)) + o.ObserveInt64(connsMax, int64(redisConf.PoolSize), metric.WithAttributeSet(poolAttrs)) - o.ObserveInt64(usage, int64(stats.IdleConns), metric.WithAttributes(idleAttrs...)) - o.ObserveInt64(usage, int64(stats.TotalConns-stats.IdleConns), metric.WithAttributes(usedAttrs...)) + o.ObserveInt64(usage, int64(stats.IdleConns), metric.WithAttributeSet(idleAttrs)) + o.ObserveInt64(usage, int64(stats.TotalConns-stats.IdleConns), metric.WithAttributeSet(usedAttrs)) - o.ObserveInt64(timeouts, int64(stats.Timeouts), metric.WithAttributes(labels...)) + o.ObserveInt64(timeouts, int64(stats.Timeouts), metric.WithAttributeSet(poolAttrs)) return nil }, idleMax,