forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
1package telemetry
2
3import (
4 "context"
5 "fmt"
6 "time"
7
8 "go.opentelemetry.io/otel"
9 "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
10 "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
11 "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric"
12 "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
13 "go.opentelemetry.io/otel/sdk/metric"
14 "go.opentelemetry.io/otel/sdk/resource"
15 "go.opentelemetry.io/otel/sdk/trace"
16)
17
18func NewTracerProvider(ctx context.Context, res *resource.Resource, isDev bool) (*trace.TracerProvider, error) {
19 var exporter trace.SpanExporter
20 var err error
21
22 if isDev {
23 exporter, err = stdouttrace.New()
24 if err != nil {
25 return nil, fmt.Errorf("failed to create stdout trace exporter: %w", err)
26 }
27 } else {
28 exporter, err = otlptracegrpc.New(ctx)
29 if err != nil {
30 return nil, fmt.Errorf("failed to create OTLP trace exporter: %w", err)
31 }
32 }
33
34 tp := trace.NewTracerProvider(
35 trace.WithBatcher(exporter, trace.WithBatchTimeout(1*time.Second)),
36 trace.WithResource(res),
37 )
38 otel.SetTracerProvider(tp)
39
40 return tp, nil
41}
42
43func NewMeterProvider(ctx context.Context, res *resource.Resource, isDev bool) (*metric.MeterProvider, error) {
44 var exporter metric.Exporter
45 var err error
46
47 if isDev {
48 exporter, err = stdoutmetric.New()
49 if err != nil {
50 return nil, fmt.Errorf("failed to create stdout metric exporter: %w", err)
51 }
52 } else {
53 exporter, err = otlpmetricgrpc.New(ctx)
54 if err != nil {
55 return nil, fmt.Errorf("failed to create OTLP metric exporter: %w", err)
56 }
57 }
58
59 mp := metric.NewMeterProvider(
60 metric.WithReader(metric.NewPeriodicReader(exporter, metric.WithInterval(10*time.Second))),
61 metric.WithResource(res),
62 )
63 otel.SetMeterProvider(mp)
64 return mp, nil
65}