-
Notifications
You must be signed in to change notification settings - Fork 13
/
otel.go
58 lines (46 loc) · 1.82 KB
/
otel.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
package otel
import (
"context"
"strings"
"github.com/sirupsen/logrus"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric"
"go.opentelemetry.io/otel/sdk/metric/export/aggregation"
"github.com/heroku/x/go-kit/metrics"
"github.com/heroku/x/go-kit/metrics/provider/otel"
)
// MustProvider ensures setting up and starting a otel.Provider succeeds.
// nolint: lll
func MustProvider(ctx context.Context, logger logrus.FieldLogger, cfg Config, service, serviceNamespace, stage, serviceInstanceID string, opts ...otel.Option) metrics.Provider {
// This provider is used for metrics reporting to the collector.
logger.WithField("metrics_destinations", strings.Join(cfg.MetricsDestinations, ",")).Info("setting up provider")
if cfg.CollectorURL == nil {
logger.Fatal("provider collectorURL cannot be nil")
}
client := otel.NewHTTPClient(*cfg.CollectorURL)
expOpts := otlpmetric.WithMetricAggregationTemporalitySelector(aggregation.DeltaTemporalitySelector())
exporter := otlpmetric.NewUnstarted(client, expOpts)
attrs := []attribute.KeyValue{}
if cfg.Honeycomb.MetricsDataset != "" {
attrs = append(attrs, attribute.String("dataset", cfg.Honeycomb.MetricsDataset))
}
for _, md := range cfg.MetricsDestinations {
attrs = append(attrs, attribute.String(md, "true"))
}
allOpts := []otel.Option{
otel.WithExporter(exporter),
otel.WithAttributes(attrs...),
otel.WithServiceNamespaceAttribute(serviceNamespace),
otel.WithServiceInstanceIDAttribute(serviceInstanceID),
otel.WithStageAttribute(stage),
}
allOpts = append(allOpts, opts...)
otelProvider, err := otel.New(ctx, service, allOpts...)
if err != nil {
logger.Fatal(err)
}
if err := otelProvider.(*otel.Provider).Start(); err != nil {
logger.WithError(err).Fatal("failed to start metrics provider")
}
return otelProvider
}