-
Notifications
You must be signed in to change notification settings - Fork 2k
/
factory.go
120 lines (103 loc) · 3.57 KB
/
factory.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// Copyright (c) The Thanos Authors.
// Licensed under the Apache License 2.0.
package client
import (
"context"
"io"
"strings"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/opentracing/opentracing-go"
"github.com/pkg/errors"
"github.com/prometheus/client_golang/prometheus"
"gopkg.in/yaml.v2"
"github.com/thanos-io/thanos/pkg/tracing/elasticapm"
"github.com/thanos-io/thanos/pkg/tracing/google_cloud"
"github.com/thanos-io/thanos/pkg/tracing/jaeger"
"github.com/thanos-io/thanos/pkg/tracing/lightstep"
"github.com/thanos-io/thanos/pkg/tracing/migration"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
tracesdk "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
"go.opentelemetry.io/otel/trace"
)
type TracingProvider string
const (
Stackdriver TracingProvider = "STACKDRIVER"
GoogleCloud TracingProvider = "GOOGLE_CLOUD"
Jaeger TracingProvider = "JAEGER"
ElasticAPM TracingProvider = "ELASTIC_APM"
Lightstep TracingProvider = "LIGHTSTEP"
name = "thanos"
)
type TracingConfig struct {
Type TracingProvider `yaml:"type"`
Config interface{} `yaml:"config"`
}
func NewOTELTracer(ctx context.Context, logger log.Logger) trace.Tracer {
client := otlptracehttp.NewClient()
exporter, err := otlptrace.New(ctx, client)
if err != nil {
level.Error(logger).Log("err with new client", err.Error())
}
tp := tracesdk.NewTracerProvider(
tracesdk.WithBatcher(exporter),
tracesdk.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
)),
)
otel.SetTracerProvider(tp)
otel.SetTextMapPropagator(propagation.TraceContext{})
tracer := otel.GetTracerProvider().Tracer(
name,
trace.WithInstrumentationVersion("v0.1"),
trace.WithSchemaURL(semconv.SchemaURL),
)
return tracer
}
// exporter will export data in OTLP format
// need to add a collector which will export data in multiple formats eg. Jaeger
func NewTracer(ctx context.Context, logger log.Logger, metrics *prometheus.Registry, confContentYaml []byte) (opentracing.Tracer, io.Closer, error) {
level.Info(logger).Log("msg", "loading tracing configuration")
tracingConf := &TracingConfig{}
if err := yaml.UnmarshalStrict(confContentYaml, tracingConf); err != nil {
return nil, nil, errors.Wrap(err, "parsing config tracing YAML")
}
var config []byte
var err error
if tracingConf.Config != nil {
config, err = yaml.Marshal(tracingConf.Config)
if err != nil {
return nil, nil, errors.Wrap(err, "marshal content of tracing configuration")
}
}
switch strings.ToUpper(string(tracingConf.Type)) {
case string(Stackdriver), string(GoogleCloud):
tracerProvider, err := google_cloud.NewTracerProvider(ctx, logger, config)
if err != nil {
return nil, nil, err
}
tracer, closerFunc := migration.Bridge(tracerProvider, logger)
return tracer, closerFunc, nil
case string(Jaeger):
tracerProvider, err := jaeger.NewTracerProvider(ctx, logger, config)
if err != nil {
return nil, nil, errors.Wrap(err, "new tracer provider err")
}
tracer, closerFunc := migration.Bridge(tracerProvider, logger)
return tracer, closerFunc, nil
case string(ElasticAPM):
return elasticapm.NewTracer(config)
case string(Lightstep):
return lightstep.NewTracer(ctx, config)
default:
return nil, nil, errors.Errorf("tracing with type %s is not supported", tracingConf.Type)
}
}
func NoopTracer() opentracing.Tracer {
return &opentracing.NoopTracer{}
}