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}