From 29c86b2ab71d9bc09b4df613a1d3cae2f9964b08 Mon Sep 17 00:00:00 2001 From: vragov_pf Date: Sat, 25 Oct 2025 17:52:52 +0700 Subject: [PATCH] Add a 'error_type' metrics attribute to separate context errors --- extra/redisotel/metrics.go | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/extra/redisotel/metrics.go b/extra/redisotel/metrics.go index 7fe5545278..77aa5d1448 100644 --- a/extra/redisotel/metrics.go +++ b/extra/redisotel/metrics.go @@ -2,6 +2,7 @@ package redisotel import ( "context" + "errors" "fmt" "net" "sync" @@ -271,9 +272,10 @@ func (mh *metricsHook) DialHook(hook redis.DialHook) redis.DialHook { dur := time.Since(start) - attrs := make([]attribute.KeyValue, 0, len(mh.attrs)+1) + attrs := make([]attribute.KeyValue, 0, len(mh.attrs)+2) attrs = append(attrs, mh.attrs...) attrs = append(attrs, statusAttr(err)) + attrs = append(attrs, errorTypeAttribute(err)) mh.createTime.Record(ctx, milliseconds(dur), metric.WithAttributeSet(attribute.NewSet(attrs...))) return conn, err @@ -288,10 +290,11 @@ func (mh *metricsHook) ProcessHook(hook redis.ProcessHook) redis.ProcessHook { dur := time.Since(start) - attrs := make([]attribute.KeyValue, 0, len(mh.attrs)+2) + attrs := make([]attribute.KeyValue, 0, len(mh.attrs)+3) attrs = append(attrs, mh.attrs...) attrs = append(attrs, attribute.String("type", "command")) attrs = append(attrs, statusAttr(err)) + attrs = append(attrs, errorTypeAttribute(err)) mh.useTime.Record(ctx, milliseconds(dur), metric.WithAttributeSet(attribute.NewSet(attrs...))) @@ -309,10 +312,11 @@ func (mh *metricsHook) ProcessPipelineHook( dur := time.Since(start) - attrs := make([]attribute.KeyValue, 0, len(mh.attrs)+2) + attrs := make([]attribute.KeyValue, 0, len(mh.attrs)+3) attrs = append(attrs, mh.attrs...) attrs = append(attrs, attribute.String("type", "pipeline")) attrs = append(attrs, statusAttr(err)) + attrs = append(attrs, errorTypeAttribute(err)) mh.useTime.Record(ctx, milliseconds(dur), metric.WithAttributeSet(attribute.NewSet(attrs...))) @@ -330,3 +334,16 @@ func statusAttr(err error) attribute.KeyValue { } return attribute.String("status", "ok") } + +func errorTypeAttribute(err error) attribute.KeyValue { + switch { + case err == nil: + return attribute.String("error_type", "none") + case errors.Is(err, context.Canceled): + return attribute.String("error_type", "context_canceled") + case errors.Is(err, context.DeadlineExceeded): + return attribute.String("error_type", "context_timeout") + default: + return attribute.String("error_type", "other") + } +}