@@ -2,22 +2,30 @@ package observability
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
5
6
"os"
6
7
"strings"
7
8
8
9
"github.com/MrAlias/flow"
9
10
"github.com/pkg/errors"
11
+ "github.com/prometheus/client_golang/prometheus"
10
12
"go.opentelemetry.io/otel"
11
13
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
12
14
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
15
+ otelProm "go.opentelemetry.io/otel/exporters/prometheus"
16
+ otelMetric "go.opentelemetry.io/otel/metric"
13
17
"go.opentelemetry.io/otel/propagation"
18
+ "go.opentelemetry.io/otel/sdk/metric"
14
19
"go.opentelemetry.io/otel/sdk/resource"
15
20
sdkTrace "go.opentelemetry.io/otel/sdk/trace"
16
21
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
17
22
"go.opentelemetry.io/otel/trace"
18
23
)
19
24
25
+ var Meter otelMetric.Meter
26
+
20
27
func InitTracer (serviceName , serviceVersion string ) (* sdkTrace.TracerProvider , trace.Tracer , error ) {
28
+ ctx := context .Background ()
21
29
22
30
otlpEndpoint , ok := os .LookupEnv ("OTLP_ENDPOINT" )
23
31
otlpInsecure := os .Getenv ("OTLP_INSECURE" )
@@ -37,7 +45,7 @@ func InitTracer(serviceName, serviceVersion string) (*sdkTrace.TracerProvider, t
37
45
38
46
client := otlptracehttp .NewClient (otlpOptions ... )
39
47
40
- otlptracehttpExporter , err := otlptrace .New (context . Background () , client )
48
+ otlptracehttpExporter , err := otlptrace .New (ctx , client )
41
49
if err != nil {
42
50
return nil , nil , errors .Wrap (err , "failed creating OTLP trace exporter" )
43
51
}
@@ -48,7 +56,7 @@ func InitTracer(serviceName, serviceVersion string) (*sdkTrace.TracerProvider, t
48
56
}
49
57
50
58
resources , err := resource .New (
51
- context . Background () ,
59
+ ctx ,
52
60
resource .WithFromEnv (), // pull attributes from OTEL_RESOURCE_ATTRIBUTES and OTEL_SERVICE_NAME environment variables
53
61
resource .WithOS (), // This option configures a set of Detectors that discover OS information
54
62
resource .WithContainer (), // This option configures a set of Detectors that discover container information
@@ -80,3 +88,68 @@ func InitTracer(serviceName, serviceVersion string) (*sdkTrace.TracerProvider, t
80
88
81
89
return traceProvider , trace , nil
82
90
}
91
+
92
+ func InitMetrics (serviceName , serviceVersion string ) (* metric.MeterProvider , error ) {
93
+ ctx := context .Background ()
94
+
95
+ otlpEndpoint , ok := os .LookupEnv ("OTLP_ENDPOINT" )
96
+ otlpInsecure := os .Getenv ("OTLP_INSECURE" )
97
+
98
+ otlpOptions := make ([]otlptracehttp.Option , 0 )
99
+
100
+ if ok {
101
+ otlpOptions = append (otlpOptions , otlptracehttp .WithEndpoint (otlpEndpoint ))
102
+
103
+ if strings .ToLower (otlpInsecure ) == "true" {
104
+ otlpOptions = append (otlpOptions , otlptracehttp .WithInsecure ())
105
+ }
106
+ } else {
107
+ otlpOptions = append (otlpOptions , otlptracehttp .WithEndpoint ("localhost:4318" ))
108
+ otlpOptions = append (otlpOptions , otlptracehttp .WithInsecure ())
109
+ }
110
+
111
+ registry := prometheus .NewRegistry ()
112
+ exporter , err := otelProm .New (
113
+ otelProm .WithoutUnits (),
114
+ otelProm .WithRegisterer (registry ),
115
+ )
116
+
117
+ if err != nil {
118
+ return nil , err
119
+ }
120
+
121
+ hostname , err := os .Hostname ()
122
+ if err != nil {
123
+ return nil , err
124
+ }
125
+
126
+ resources , err := resource .New (
127
+ ctx ,
128
+ resource .WithFromEnv (), // pull attributes from OTEL_RESOURCE_ATTRIBUTES and OTEL_SERVICE_NAME environment variables
129
+ resource .WithOS (), // This option configures a set of Detectors that discover OS information
130
+ resource .WithContainer (), // This option configures a set of Detectors that discover container information
131
+ resource .WithHost (), // This option configures a set of Detectors that discover host information
132
+ resource .WithAttributes (
133
+ semconv .ServiceNameKey .String (serviceName ),
134
+ semconv .ServiceVersionKey .String (serviceVersion ),
135
+ semconv .ServiceInstanceIDKey .String (hostname ),
136
+ ),
137
+ )
138
+ if err != nil {
139
+ return nil , err
140
+ }
141
+
142
+ resources , err = resource .Merge (resource .Default (), resources )
143
+ if err != nil {
144
+ return nil , err
145
+ }
146
+
147
+ provider := metric .NewMeterProvider (
148
+ metric .WithResource (resources ),
149
+ metric .WithReader (exporter ),
150
+ )
151
+
152
+ Meter = provider .Meter (fmt .Sprintf ("%sMeter" , serviceName ))
153
+
154
+ return provider , nil
155
+ }
0 commit comments