-
Notifications
You must be signed in to change notification settings - Fork 0
/
meter.go
46 lines (36 loc) · 1.28 KB
/
meter.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
package clotel
import (
"context"
"fmt"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
"go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/resource"
)
// NewMeterProvider initializes otel provider for metrics throughout the application.
func NewMeterProvider(cfg Config, det resource.Detector, mtr metric.Reader) (*metric.MeterProvider, error) {
// detect the resource with a timeout
ctx, cancel := context.WithTimeout(context.Background(), cfg.DetectorDetectTimeout)
defer cancel()
res, err := det.Detect(ctx)
if err != nil {
return nil, fmt.Errorf("failed to detect resource: %w", err)
}
mtp := metric.NewMeterProvider(
metric.WithReader(mtr),
metric.WithResource(res))
// set globally in case libraries don't allow injecting
otel.SetMeterProvider(mtp)
return mtp, nil
}
// NewMetricExporter inits a metric exporter.
func NewMetricExporter(cfg Config) (metric.Exporter, error) {
ctx, cancel := context.WithTimeout(context.Background(), cfg.MetricExporterConnectTimeout)
defer cancel()
exp, err := otlpmetricgrpc.New(ctx, otlpmetricgrpc.WithInsecure(),
otlpmetricgrpc.WithEndpoint(cfg.ExporterEndpoint))
if err != nil {
return nil, fmt.Errorf("failed to init exporter: %w", err)
}
return exp, nil
}