Skip to content

Commit d48f8bf

Browse files
meobilivangrichardcase
authored andcommitted
set up TracerProvider + tracer object
1 parent 19299de commit d48f8bf

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed

pkg/otel/tracing.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package otel
2+
3+
import (
4+
"context"
5+
"time"
6+
7+
"github.com/go-logr/logr"
8+
"github.com/pkg/errors"
9+
"google.golang.org/grpc"
10+
"google.golang.org/grpc/credentials/insecure"
11+
"k8s.io/client-go/pkg/version"
12+
13+
"go.opentelemetry.io/otel"
14+
"go.opentelemetry.io/otel/attribute"
15+
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
16+
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
17+
"go.opentelemetry.io/otel/propagation"
18+
"go.opentelemetry.io/otel/sdk/resource"
19+
"go.opentelemetry.io/otel/sdk/trace"
20+
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
21+
)
22+
23+
func RegisterTracing(ctx context.Context, log logr.Logger) error {
24+
25+
tracerProvider, err := SetUpTracing(ctx)
26+
if err != nil {
27+
return err
28+
}
29+
30+
// Safely shut down the tracer provider when context terminates
31+
go func() {
32+
<-ctx.Done()
33+
34+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
35+
defer cancel()
36+
37+
if err := tracerProvider.Shutdown(ctx); err != nil {
38+
log.Error(err, "failed to shut down tracer provider")
39+
}
40+
}()
41+
42+
return nil
43+
}
44+
45+
func newExporter(ctx context.Context) (*otlptrace.Exporter, error) {
46+
47+
conn, err := grpc.DialContext(ctx, "opentelemetry-collector:4317",
48+
// Using non-TLS connection for dev environment
49+
grpc.WithTransportCredentials(insecure.NewCredentials()),
50+
grpc.WithBlock(),
51+
)
52+
53+
if err != nil {
54+
return nil, errors.Wrap(err, "failed to create gRPC connection to collector for opentelemetry")
55+
}
56+
57+
// Set up a trace exporter
58+
traceExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithGRPCConn(conn))
59+
60+
if err != nil {
61+
return nil, errors.Wrap(err, "failed to create trace exporter for opentelemetry")
62+
}
63+
64+
return traceExporter, nil
65+
}
66+
67+
func SetUpTracing(ctx context.Context) (*trace.TracerProvider, error) {
68+
69+
traceExporter, err := newExporter(ctx)
70+
71+
if err != nil {
72+
return nil, err
73+
}
74+
75+
// labels/tags/res common to all traces
76+
// TODO: consider to add more fields
77+
resource, err := resource.New(ctx,
78+
resource.WithAttributes(
79+
semconv.ServiceNameKey.String("capg"),
80+
attribute.String("exporter", "otlpgrpc"),
81+
attribute.String("version", version.Get().String()),
82+
),
83+
)
84+
85+
if err != nil {
86+
return nil, errors.Wrap(err, "failed to create opentelemetry resource")
87+
}
88+
89+
traceProvider := trace.NewTracerProvider(
90+
trace.WithBatcher(traceExporter),
91+
trace.WithResource(resource),
92+
// TODO: dynamic sampling rate?
93+
// sampling rate based on parent span = 60%
94+
trace.WithSampler(trace.ParentBased(trace.TraceIDRatioBased(0.6))),
95+
)
96+
97+
otel.SetTracerProvider(traceProvider)
98+
99+
otel.SetTextMapPropagator(
100+
propagation.NewCompositeTextMapPropagator(
101+
propagation.TraceContext{},
102+
),
103+
)
104+
105+
return traceProvider, nil
106+
}

util/telemetry/oteltracer.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package telemetry
2+
3+
import (
4+
"go.opentelemetry.io/otel"
5+
"go.opentelemetry.io/otel/trace"
6+
)
7+
8+
// default Tracer
9+
func Tracer() trace.Tracer {
10+
return otel.Tracer("capg")
11+
}

0 commit comments

Comments
 (0)