Skip to content

Commit 602f53e

Browse files
authored
✨🔧 Setup Open Telemetry Metrics and Traces (#237)
We use go.opentelemetry.io/contrib/exporters/autoexport for standard loading exporter configurations via env variables.
1 parent d453ca6 commit 602f53e

File tree

3 files changed

+148
-16
lines changed

3 files changed

+148
-16
lines changed

go.mod

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,12 @@ require (
1616
github.com/joho/godotenv v1.5.1
1717
github.com/r3labs/sse/v2 v2.10.0
1818
github.com/spf13/cobra v1.8.0
19-
github.com/stretchr/testify v1.8.4
19+
github.com/stretchr/testify v1.9.0
2020
github.com/swaggo/swag v1.16.3
21+
go.opentelemetry.io/contrib/exporters/autoexport v0.51.0
22+
go.opentelemetry.io/otel v1.26.0
23+
go.opentelemetry.io/otel/sdk v1.26.0
24+
go.opentelemetry.io/otel/sdk/metric v1.26.0
2125
go.uber.org/goleak v1.3.0
2226
go.uber.org/multierr v1.11.0
2327
go.uber.org/zap v1.26.0
@@ -38,15 +42,21 @@ require (
3842
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect
3943
github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect
4044
github.com/aws/smithy-go v1.19.0 // indirect
45+
github.com/beorn7/perks v1.0.1 // indirect
46+
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
47+
github.com/cespare/xxhash/v2 v2.2.0 // indirect
4148
github.com/davecgh/go-spew v1.1.1 // indirect
4249
github.com/fasthttp/websocket v1.5.7 // indirect
4350
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
51+
github.com/go-logr/logr v1.4.1 // indirect
52+
github.com/go-logr/stdr v1.2.2 // indirect
4453
github.com/go-openapi/jsonpointer v0.20.2 // indirect
4554
github.com/go-openapi/jsonreference v0.20.4 // indirect
4655
github.com/go-openapi/spec v0.20.13 // indirect
4756
github.com/go-openapi/swag v0.22.7 // indirect
4857
github.com/go-playground/locales v0.14.1 // indirect
4958
github.com/go-playground/universal-translator v0.18.1 // indirect
59+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect
5060
github.com/inconshreveable/mousetrap v1.1.0 // indirect
5161
github.com/josharian/intern v1.0.0 // indirect
5262
github.com/klauspost/compress v1.17.6 // indirect
@@ -56,17 +66,36 @@ require (
5666
github.com/mattn/go-isatty v0.0.20 // indirect
5767
github.com/mattn/go-runewidth v0.0.15 // indirect
5868
github.com/pmezard/go-difflib v1.0.0 // indirect
69+
github.com/prometheus/client_golang v1.19.0 // indirect
70+
github.com/prometheus/client_model v0.6.1 // indirect
71+
github.com/prometheus/common v0.48.0 // indirect
72+
github.com/prometheus/procfs v0.12.0 // indirect
5973
github.com/rivo/uniseg v0.4.7 // indirect
6074
github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect
6175
github.com/spf13/pflag v1.0.5 // indirect
6276
github.com/swaggo/files/v2 v2.0.0 // indirect
6377
github.com/valyala/bytebufferpool v1.0.0 // indirect
6478
github.com/valyala/fasthttp v1.52.0 // indirect
6579
github.com/valyala/tcplisten v1.0.0 // indirect
66-
golang.org/x/crypto v0.21.0 // indirect
67-
golang.org/x/net v0.21.0 // indirect
68-
golang.org/x/sys v0.18.0 // indirect
80+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.26.0 // indirect
81+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.26.0 // indirect
82+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect
83+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.26.0 // indirect
84+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0 // indirect
85+
go.opentelemetry.io/otel/exporters/prometheus v0.48.0 // indirect
86+
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.26.0 // indirect
87+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.26.0 // indirect
88+
go.opentelemetry.io/otel/metric v1.26.0 // indirect
89+
go.opentelemetry.io/otel/trace v1.26.0 // indirect
90+
go.opentelemetry.io/proto/otlp v1.2.0 // indirect
91+
golang.org/x/crypto v0.22.0 // indirect
92+
golang.org/x/net v0.24.0 // indirect
93+
golang.org/x/sys v0.19.0 // indirect
6994
golang.org/x/text v0.14.0 // indirect
7095
golang.org/x/tools v0.16.1 // indirect
96+
google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect
97+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect
98+
google.golang.org/grpc v1.63.2 // indirect
99+
google.golang.org/protobuf v1.33.0 // indirect
71100
gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect
72101
)

go.sum

Lines changed: 71 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/telemetry/telemetry.go

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,25 @@
11
package telemetry
22

3-
import "go.uber.org/zap"
3+
import (
4+
"context"
5+
6+
"go.opentelemetry.io/contrib/exporters/autoexport"
7+
"go.opentelemetry.io/otel"
8+
"go.opentelemetry.io/otel/propagation"
9+
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
10+
"go.opentelemetry.io/otel/sdk/resource"
11+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
12+
semconv "go.opentelemetry.io/otel/semconv/v1.24.0"
13+
"go.uber.org/zap"
14+
)
15+
16+
var Resource = resource.NewWithAttributes(
17+
semconv.SchemaURL,
18+
semconv.ServiceName("glide"),
19+
)
420

521
type Config struct {
622
LogConfig *LogConfig `yaml:"logging" validate:"required"`
7-
// TODO: add OTEL config
823
}
924

1025
type Telemetry struct {
@@ -29,6 +44,33 @@ func NewTelemetry(cfg *Config) (*Telemetry, error) {
2944
return nil, err
3045
}
3146

47+
spanExporter, err := autoexport.NewSpanExporter(context.Background())
48+
if err != nil {
49+
return nil, err
50+
}
51+
52+
tp := sdktrace.NewTracerProvider(
53+
sdktrace.WithResource(Resource),
54+
sdktrace.WithSampler(sdktrace.AlwaysSample()),
55+
sdktrace.WithBatcher(spanExporter),
56+
)
57+
otel.SetTracerProvider(tp)
58+
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
59+
60+
metricsReader, err := autoexport.NewMetricReader(context.Background())
61+
if err != nil {
62+
return nil, err
63+
}
64+
65+
provider := sdkmetric.NewMeterProvider(
66+
sdkmetric.WithReader(
67+
metricsReader,
68+
),
69+
sdkmetric.WithResource(Resource),
70+
)
71+
72+
otel.SetMeterProvider(provider)
73+
3274
return &Telemetry{
3375
Config: cfg,
3476
Logger: logger,

0 commit comments

Comments
 (0)