Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/docker-otel-lgtm
Path: blob/main/examples/go/otel.go
401 views
1
package main
2
3
import (
4
"context"
5
"errors"
6
"time"
7
8
"go.opentelemetry.io/contrib/bridges/otelslog"
9
"go.opentelemetry.io/contrib/instrumentation/runtime"
10
"go.opentelemetry.io/otel"
11
"go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp"
12
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp"
13
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
14
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
15
"go.opentelemetry.io/otel/log/global"
16
"go.opentelemetry.io/otel/propagation"
17
"go.opentelemetry.io/otel/sdk/log"
18
"go.opentelemetry.io/otel/sdk/metric"
19
"go.opentelemetry.io/otel/sdk/trace"
20
)
21
22
const schemaName = "https://github.com/grafana/docker-otel-lgtm"
23
24
var (
25
tracer = otel.Tracer(schemaName)
26
logger = otelslog.NewLogger(schemaName)
27
)
28
29
// setupOTelSDK bootstraps the OpenTelemetry pipeline.
30
// If it does not return an error, make sure to call shutdown for proper cleanup.
31
func setupOTelSDK(ctx context.Context) (shutdown func(context.Context) error, err error) {
32
var shutdownFuncs []func(context.Context) error
33
34
// shutdown calls cleanup functions registered via shutdownFuncs.
35
// The errors from the calls are joined.
36
// Each registered cleanup will be invoked once.
37
shutdown = func(ctx context.Context) error {
38
var err error
39
for _, fn := range shutdownFuncs {
40
err = errors.Join(err, fn(ctx))
41
}
42
shutdownFuncs = nil
43
return err
44
}
45
46
// handleErr calls shutdown for cleanup and makes sure that all errors are returned.
47
handleErr := func(inErr error) {
48
err = errors.Join(inErr, shutdown(ctx))
49
}
50
51
prop := propagation.NewCompositeTextMapPropagator(
52
propagation.TraceContext{},
53
propagation.Baggage{},
54
)
55
otel.SetTextMapPropagator(prop)
56
57
traceExporter, err := otlptrace.New(ctx, otlptracehttp.NewClient())
58
if err != nil {
59
return nil, err
60
}
61
62
tracerProvider := trace.NewTracerProvider(trace.WithBatcher(traceExporter))
63
if err != nil {
64
handleErr(err)
65
return
66
}
67
shutdownFuncs = append(shutdownFuncs, tracerProvider.Shutdown)
68
otel.SetTracerProvider(tracerProvider)
69
70
metricExporter, err := otlpmetrichttp.New(ctx)
71
if err != nil {
72
return nil, err
73
}
74
75
meterProvider := metric.NewMeterProvider(metric.WithReader(metric.NewPeriodicReader(metricExporter)))
76
if err != nil {
77
handleErr(err)
78
return
79
}
80
shutdownFuncs = append(shutdownFuncs, meterProvider.Shutdown)
81
otel.SetMeterProvider(meterProvider)
82
83
logExporter, err := otlploghttp.New(ctx, otlploghttp.WithInsecure())
84
if err != nil {
85
return nil, err
86
}
87
88
loggerProvider := log.NewLoggerProvider(log.WithProcessor(log.NewBatchProcessor(logExporter)))
89
if err != nil {
90
handleErr(err)
91
return
92
}
93
shutdownFuncs = append(shutdownFuncs, loggerProvider.Shutdown)
94
global.SetLoggerProvider(loggerProvider)
95
96
err = runtime.Start(runtime.WithMinimumReadMemStatsInterval(time.Second))
97
if err != nil {
98
logger.ErrorContext(ctx, "otel runtime instrumentation failed:", err)
99
}
100
101
return
102
}
103
104