-
-
Notifications
You must be signed in to change notification settings - Fork 105
/
jaeger.go
88 lines (76 loc) · 2.85 KB
/
jaeger.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Copyright © 2023 Ory Corp
// SPDX-License-Identifier: Apache-2.0
package otelx
import (
"net"
"go.opentelemetry.io/contrib/propagators/b3"
jaegerPropagator "go.opentelemetry.io/contrib/propagators/jaeger"
"go.opentelemetry.io/contrib/samplers/jaegerremote"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/jaeger"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
"go.opentelemetry.io/otel/trace"
)
// SetupJaeger configures and returns a Jaeger tracer.
//
// The returned tracer will by default attempt to send spans to a local Jaeger agent.
// Optionally, [otelx.JaegerConfig.LocalAgentAddress] can be set to specify a different target.
//
// By default, unless a parent sampler has taken a sampling decision, every span is sampled.
// [otelx.JaegerSampling.TraceIdRatio] may be used to customize the sampling probability,
// optionally alongside [otelx.JaegerSampling.ServerURL] to consult a remote server
// for the sampling strategy to be used.
func SetupJaeger(t *Tracer, tracerName string, c *Config) (trace.Tracer, error) {
host, port, err := net.SplitHostPort(c.Providers.Jaeger.LocalAgentAddress)
if err != nil {
return nil, err
}
exp, err := jaeger.New(
jaeger.WithAgentEndpoint(
jaeger.WithAgentHost(host), jaeger.WithAgentPort(port),
),
)
if err != nil {
return nil, err
}
tpOpts := []sdktrace.TracerProviderOption{
sdktrace.WithBatcher(exp),
sdktrace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String(c.ServiceName),
)),
}
samplingServerURL := c.Providers.Jaeger.Sampling.ServerURL
traceIdRatio := c.Providers.Jaeger.Sampling.TraceIdRatio
sampler := sdktrace.TraceIDRatioBased(traceIdRatio)
if samplingServerURL != "" {
sampler = jaegerremote.New(
"jaegerremote",
jaegerremote.WithSamplingServerURL(samplingServerURL),
jaegerremote.WithInitialSampler(sampler),
)
}
// Respect any sampling decision taken by the client.
sampler = sdktrace.ParentBased(sampler)
tpOpts = append(tpOpts, sdktrace.WithSampler(sampler))
tp := sdktrace.NewTracerProvider(tpOpts...)
otel.SetTracerProvider(tp)
// At the moment, software across our cloud stack only support Zipkin (B3)
// and Jaeger propagation formats. Proposals for standardized formats for
// context propagation are in the works (ref: https://www.w3.org/TR/trace-context/
// and https://www.w3.org/TR/baggage/).
//
// Simply add propagation.TraceContext{} and propagation.Baggage{}
// here to enable those as well.
prop := propagation.NewCompositeTextMapPropagator(
propagation.TraceContext{},
jaegerPropagator.Jaeger{},
b3.New(b3.WithInjectEncoding(b3.B3MultipleHeader|b3.B3SingleHeader)),
propagation.Baggage{},
)
otel.SetTextMapPropagator(prop)
return tp.Tracer(tracerName), nil
}