-
Notifications
You must be signed in to change notification settings - Fork 18
/
metrics.go
71 lines (59 loc) · 2.03 KB
/
metrics.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
package uptrace
import (
"context"
"time"
runtimemetrics "go.opentelemetry.io/contrib/instrumentation/runtime"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp"
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/metric/metricdata"
"github.com/uptrace/uptrace-go/internal"
)
func configureMetrics(ctx context.Context, client *client, conf *config) {
exp, err := otlpmetricClient(ctx, conf, client.dsn)
if err != nil {
internal.Logger.Printf("otlpmetricClient failed: %s", err)
return
}
reader := sdkmetric.NewPeriodicReader(
exp,
sdkmetric.WithInterval(15*time.Second),
)
providerOptions := append(conf.metricOptions,
sdkmetric.WithReader(reader),
sdkmetric.WithResource(conf.newResource()),
)
provider := sdkmetric.NewMeterProvider(providerOptions...)
otel.SetMeterProvider(provider)
client.mp = provider
if err := runtimemetrics.Start(); err != nil {
internal.Logger.Printf("runtimemetrics.Start failed: %s", err)
}
}
func otlpmetricClient(ctx context.Context, conf *config, dsn *DSN) (sdkmetric.Exporter, error) {
options := []otlpmetrichttp.Option{
otlpmetrichttp.WithEndpoint(dsn.OTLPHttpEndpoint()),
otlpmetrichttp.WithHeaders(map[string]string{
// Set the Uptrace DSN here or use UPTRACE_DSN env var.
"uptrace-dsn": dsn.String(),
}),
otlpmetrichttp.WithCompression(otlpmetrichttp.GzipCompression),
otlpmetrichttp.WithTemporalitySelector(preferDeltaTemporalitySelector),
}
if conf.tlsConf != nil {
options = append(options, otlpmetrichttp.WithTLSClientConfig(conf.tlsConf))
} else if dsn.Scheme == "http" {
options = append(options, otlpmetrichttp.WithInsecure())
}
return otlpmetrichttp.New(ctx, options...)
}
func preferDeltaTemporalitySelector(kind sdkmetric.InstrumentKind) metricdata.Temporality {
switch kind {
case sdkmetric.InstrumentKindCounter,
sdkmetric.InstrumentKindObservableCounter,
sdkmetric.InstrumentKindHistogram:
return metricdata.DeltaTemporality
default:
return metricdata.CumulativeTemporality
}
}