| 88 | } |
| 89 | |
| 90 | func NewOTel(ctx context.Context, logger log.Logger, tracer trace.Tracer, method string, resolver TenantResolver, kvps ...any) (*SpanLogger, context.Context) { |
| 91 | ctx, span := tracer.Start(ctx, method) |
| 92 | if ids, err := resolver.TenantIDs(ctx); err == nil && len(ids) > 0 { |
| 93 | span.SetAttributes(attribute.StringSlice(TenantIDsTagName, ids)) |
| 94 | } |
| 95 | sampled := span.SpanContext().IsSampled() |
| 96 | |
| 97 | l := &SpanLogger{ |
| 98 | ctx: ctx, |
| 99 | resolver: resolver, |
| 100 | baseLogger: log.With(logger, "method", method), |
| 101 | |
| 102 | opentracingSpan: nil, |
| 103 | otelSpan: span, |
| 104 | |
| 105 | sampled: sampled, |
| 106 | debugEnabled: debugEnabled(logger), |
| 107 | } |
| 108 | if len(kvps) > 0 { |
| 109 | l.DebugLog(kvps...) |
| 110 | } |
| 111 | |
| 112 | ctx = context.WithValue(ctx, loggerCtxKey, logger) |
| 113 | return l, ctx |
| 114 | } |
| 115 | |
| 116 | // FromContext returns a span logger using the current parent span. |
| 117 | // If there is no parent span, the SpanLogger will only log to the logger |