12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
- //
- // This Source Code Form is subject to the terms of the MIT License.
- // If a copy of the MIT was not distributed with this file,
- // You can obtain one at https://github.com/gogf/gf.
- package gredis
- import (
- "context"
- "fmt"
- "github.com/gogf/gf"
- "github.com/gogf/gf/internal/json"
- "github.com/gogf/gf/net/gtrace"
- "go.opentelemetry.io/otel"
- "go.opentelemetry.io/otel/attribute"
- "go.opentelemetry.io/otel/codes"
- "go.opentelemetry.io/otel/trace"
- )
- // tracingItem holds the information for redis tracing.
- type tracingItem struct {
- err error
- commandName string
- arguments []interface{}
- costMilli int64
- }
- const (
- tracingInstrumentName = "github.com/gogf/gf/database/gredis"
- tracingAttrRedisHost = "redis.host"
- tracingAttrRedisPort = "redis.port"
- tracingAttrRedisDb = "redis.db"
- tracingEventRedisExecution = "redis.execution"
- tracingEventRedisExecutionCommand = "redis.execution.command"
- tracingEventRedisExecutionCost = "redis.execution.cost"
- tracingEventRedisExecutionArguments = "redis.execution.arguments"
- )
- // addTracingItem checks and adds redis tracing information to OpenTelemetry.
- func (c *Conn) addTracingItem(item *tracingItem) {
- if !gtrace.IsTracingInternal() || !gtrace.IsActivated(c.ctx) {
- return
- }
- tr := otel.GetTracerProvider().Tracer(
- tracingInstrumentName,
- trace.WithInstrumentationVersion(gf.VERSION),
- )
- ctx := c.ctx
- if ctx == nil {
- ctx = context.Background()
- }
- _, span := tr.Start(ctx, "Redis."+item.commandName, trace.WithSpanKind(trace.SpanKindInternal))
- defer span.End()
- if item.err != nil {
- span.SetStatus(codes.Error, fmt.Sprintf(`%+v`, item.err))
- }
- span.SetAttributes(gtrace.CommonLabels()...)
- span.SetAttributes(
- attribute.String(tracingAttrRedisHost, c.redis.config.Host),
- attribute.Int(tracingAttrRedisPort, c.redis.config.Port),
- attribute.Int(tracingAttrRedisDb, c.redis.config.Db),
- )
- jsonBytes, _ := json.Marshal(item.arguments)
- span.AddEvent(tracingEventRedisExecution, trace.WithAttributes(
- attribute.String(tracingEventRedisExecutionCommand, item.commandName),
- attribute.String(tracingEventRedisExecutionCost, fmt.Sprintf(`%d ms`, item.costMilli)),
- attribute.String(tracingEventRedisExecutionArguments, string(jsonBytes)),
- ))
- }
|