forked from tangled.org/core
Monorepo for Tangled — https://tangled.org
at tracing 1.7 kB view raw
1package telemetry 2 3import ( 4 "context" 5 "fmt" 6 7 "go.opentelemetry.io/otel/attribute" 8 otelmetric "go.opentelemetry.io/otel/metric" 9 "go.opentelemetry.io/otel/sdk/metric" 10 "go.opentelemetry.io/otel/sdk/resource" 11 "go.opentelemetry.io/otel/sdk/trace" 12 semconv "go.opentelemetry.io/otel/semconv/v1.17.0" 13 oteltrace "go.opentelemetry.io/otel/trace" 14) 15 16type Telemetry struct { 17 tp *trace.TracerProvider 18 mp *metric.MeterProvider 19 20 meter otelmetric.Meter 21 tracer oteltrace.Tracer 22 23 serviceName string 24 serviceVersion string 25} 26 27func NewTelemetry(ctx context.Context, serviceName, serviceVersion string, isDev bool) (*Telemetry, error) { 28 res := resource.NewWithAttributes( 29 semconv.SchemaURL, 30 semconv.ServiceName(serviceName), 31 semconv.ServiceVersion(serviceVersion), 32 ) 33 34 tp, err := NewTracerProvider(ctx, res, isDev) 35 if err != nil { 36 return nil, err 37 } 38 39 mp, err := NewMeterProvider(ctx, res, isDev) 40 if err != nil { 41 return nil, err 42 } 43 44 return &Telemetry{ 45 tp: tp, 46 mp: mp, 47 48 meter: mp.Meter(serviceName), 49 tracer: tp.Tracer(serviceVersion), 50 51 serviceName: serviceName, 52 serviceVersion: serviceVersion, 53 }, nil 54} 55 56func (t *Telemetry) Meter() otelmetric.Meter { 57 return t.meter 58} 59 60func (t *Telemetry) Tracer() oteltrace.Tracer { 61 return t.tracer 62} 63 64func (t *Telemetry) TraceStart(ctx context.Context, name string, attrs ...attribute.KeyValue) (context.Context, oteltrace.Span) { 65 ctx, span := t.tracer.Start(ctx, name) 66 span.SetAttributes(attrs...) 67 return ctx, span 68} 69 70func MapAttrs[T any](attrs map[string]T) []attribute.KeyValue { 71 var result []attribute.KeyValue 72 for k, v := range attrs { 73 result = append(result, attribute.Key(k).String(fmt.Sprintf("%v", v))) 74 } 75 return result 76}