Monorepo for Tangled
tangled.org
1package telemetry
2
3import (
4 "context"
5
6 "go.opentelemetry.io/otel"
7 otelmetric "go.opentelemetry.io/otel/metric"
8 "go.opentelemetry.io/otel/sdk/metric"
9 "go.opentelemetry.io/otel/sdk/resource"
10 "go.opentelemetry.io/otel/sdk/trace"
11 semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
12 oteltrace "go.opentelemetry.io/otel/trace"
13)
14
15type Telemetry struct {
16 tp *trace.TracerProvider
17 mp *metric.MeterProvider
18
19 meter otelmetric.Meter
20 tracer oteltrace.Tracer
21
22 serviceName string
23 serviceVersion string
24}
25
26func NewTelemetry(ctx context.Context, serviceName, serviceVersion string, isDev bool) (*Telemetry, error) {
27 res := resource.NewWithAttributes(
28 semconv.SchemaURL,
29 semconv.ServiceName(serviceName),
30 semconv.ServiceVersion(serviceVersion),
31 )
32
33 tp, err := NewTracerProvider(ctx, res, isDev)
34 if err != nil {
35 return nil, err
36 }
37
38 mp, err := NewMeterProvider(ctx, res, isDev)
39 if err != nil {
40 return nil, err
41 }
42
43 return &Telemetry{
44 tp: tp,
45 mp: mp,
46
47 meter: mp.Meter(serviceName),
48 tracer: tp.Tracer(serviceVersion),
49
50 serviceName: serviceName,
51 serviceVersion: serviceVersion,
52 }, nil
53}
54
55func (t *Telemetry) Meter() otelmetric.Meter {
56 return t.meter
57}
58
59func (t *Telemetry) Tracer() oteltrace.Tracer {
60 return t.tracer
61}
62
63func (t *Telemetry) TraceStart(ctx context.Context, name string) (context.Context, oteltrace.Span) {
64 tracer := otel.Tracer(t.serviceName)
65 return tracer.Start(ctx, name)
66}