Skip to content

Commit afc1336

Browse files
committed
add non-flag constant for exporting internal metrics via OpenTelemetry
1 parent 086d5f4 commit afc1336

File tree

4 files changed

+85
-25
lines changed

4 files changed

+85
-25
lines changed

config/configtelemetry/configtelemetry.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ const (
3838
metricsLevelCfg = "metrics-level"
3939
)
4040

41+
const UseOpenTelemetryForInternalMetrics = false
42+
4143
var metricsLevelPtr = new(Level)
4244

4345
// Flags is a helper function to add telemetry config flags to the service that exposes

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,11 @@ require (
2323
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.23.0
2424
go.opentelemetry.io/contrib/zpages v0.23.0
2525
go.opentelemetry.io/otel v1.0.0
26+
go.opentelemetry.io/otel/exporters/prometheus v0.23.0
2627
go.opentelemetry.io/otel/metric v0.23.0
2728
go.opentelemetry.io/otel/sdk v1.0.0
29+
go.opentelemetry.io/otel/sdk/export/metric v0.23.0
30+
go.opentelemetry.io/otel/sdk/metric v0.23.0
2831
go.opentelemetry.io/otel/trace v1.0.0
2932
go.uber.org/atomic v1.9.0
3033
go.uber.org/zap v1.19.1

go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,13 +408,19 @@ go.opentelemetry.io/contrib/zpages v0.23.0/go.mod h1:i5BVZTRftVMBmYLP/T++in2G5MA
408408
go.opentelemetry.io/otel v1.0.0-RC3/go.mod h1:Ka5j3ua8tZs4Rkq4Ex3hwgBgOchyPVq5S6P2lz//nKQ=
409409
go.opentelemetry.io/otel v1.0.0 h1:qTTn6x71GVBvoafHK/yaRUmFzI4LcONZD0/kXxl5PHI=
410410
go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg=
411+
go.opentelemetry.io/otel/exporters/prometheus v0.23.0 h1:ZFx1kUjUSBF7H1mTPHHOqglEDQsxYBrDnYZ8i41v3iE=
412+
go.opentelemetry.io/otel/exporters/prometheus v0.23.0/go.mod h1:kjCXbxQnnEm5l3HrUw4IPyuALu7Uqb/bEK7vWQnbd8s=
411413
go.opentelemetry.io/otel/internal/metric v0.23.0 h1:mPfzm9Iqhw7G2nDBmUAjFTfPqLZPbOW2k7QI57ITbaI=
412414
go.opentelemetry.io/otel/internal/metric v0.23.0/go.mod h1:z+RPiDJe30YnCrOhFGivwBS+DU1JU/PiLKkk4re2DNY=
413415
go.opentelemetry.io/otel/metric v0.23.0 h1:mYCcDxi60P4T27/0jchIDFa1WHEfQeU3zH9UEMpnj2c=
414416
go.opentelemetry.io/otel/metric v0.23.0/go.mod h1:G/Nn9InyNnIv7J6YVkQfpc0JCfKBNJaERBGw08nqmVQ=
415417
go.opentelemetry.io/otel/sdk v1.0.0-RC3/go.mod h1:78H6hyg2fka0NYT9fqGuFLvly2yCxiBXDJAgLKo/2Us=
416418
go.opentelemetry.io/otel/sdk v1.0.0 h1:BNPMYUONPNbLneMttKSjQhOTlFLOD9U22HNG1KrIN2Y=
417419
go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM=
420+
go.opentelemetry.io/otel/sdk/export/metric v0.23.0 h1:7NeoKPPx6NdZBVHLEp/LY5Lq85Ff1WNZnuJkuRy+azw=
421+
go.opentelemetry.io/otel/sdk/export/metric v0.23.0/go.mod h1:SuMiREmKVRIwFKq73zvGTvwFpxb/ZAYkMfyqMoOtDqs=
422+
go.opentelemetry.io/otel/sdk/metric v0.23.0 h1:xlZhPbiue1+jjSFEth94q9QCmX8Q24mOtue9IAmlVyI=
423+
go.opentelemetry.io/otel/sdk/metric v0.23.0/go.mod h1:wa0sKK13eeIFW+0OFjcC3S1i7FTRRiLAXe1kjBVbhwg=
418424
go.opentelemetry.io/otel/trace v1.0.0-RC3/go.mod h1:VUt2TUYd8S2/ZRX09ZDFZQwn2RqfMB5MzO17jBojGxo=
419425
go.opentelemetry.io/otel/trace v1.0.0 h1:TSBr8GTEtKevYMG/2d21M989r5WJYVimhTHBKVEZuh4=
420426
go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs=

service/telemetry.go

Lines changed: 74 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ import (
2424
"contrib.go.opencensus.io/exporter/prometheus"
2525
"github.com/google/uuid"
2626
"go.opencensus.io/stats/view"
27+
otelprometheus "go.opentelemetry.io/otel/exporters/prometheus"
28+
"go.opentelemetry.io/otel/metric/global"
29+
export "go.opentelemetry.io/otel/sdk/export/metric"
30+
"go.opentelemetry.io/otel/sdk/metric/aggregator/histogram"
31+
controller "go.opentelemetry.io/otel/sdk/metric/controller/basic"
32+
processor "go.opentelemetry.io/otel/sdk/metric/processor/basic"
33+
selector "go.opentelemetry.io/otel/sdk/metric/selector/simple"
2734
"go.uber.org/zap"
2835

2936
"go.opentelemetry.io/collector/config/configtelemetry"
@@ -71,9 +78,56 @@ func (tel *colTelemetry) initOnce(asyncErrorChannel chan<- error, ballastSizeByt
7178
return nil
7279
}
7380

81+
var instanceID string
82+
if telemetry.GetAddInstanceID() {
83+
instanceUUID, _ := uuid.NewRandom()
84+
instanceID = instanceUUID.String()
85+
}
86+
87+
var pe http.Handler
88+
if configtelemetry.UseOpenTelemetryForInternalMetrics {
89+
otelHandler, err := tel.initOpenTelemetry()
90+
if err != nil {
91+
return err
92+
}
93+
pe = otelHandler
94+
} else {
95+
ocHandler, err := tel.initOpenCensus(level, instanceID, ballastSizeBytes)
96+
if err != nil {
97+
return err
98+
}
99+
pe = ocHandler
100+
}
101+
102+
logger.Info(
103+
"Serving Prometheus metrics",
104+
zap.String("address", metricsAddr),
105+
zap.Int8("level", int8(level)), // TODO: make it human friendly
106+
zap.String(semconv.AttributeServiceInstanceID, instanceID),
107+
)
108+
109+
mux := http.NewServeMux()
110+
mux.Handle("/metrics", pe)
111+
112+
tel.server = &http.Server{
113+
Addr: metricsAddr,
114+
Handler: mux,
115+
}
116+
117+
go func() {
118+
serveErr := tel.server.ListenAndServe()
119+
if serveErr != nil && serveErr != http.ErrServerClosed {
120+
asyncErrorChannel <- serveErr
121+
}
122+
}()
123+
124+
return nil
125+
}
126+
127+
func (tel *colTelemetry) initOpenCensus(level configtelemetry.Level, instanceID string, ballastSizeBytes uint64) (http.Handler, error) {
74128
processMetricsViews, err := telemetry2.NewProcessMetricsViews(ballastSizeBytes)
75129
if err != nil {
76-
return err
130+
return nil, err
77131
}
78132

79133
var views []*view.View
@@ -84,7 +138,7 @@ func (tel *colTelemetry) initOnce(asyncErrorChannel chan<- error, ballastSizeByt
84138

85139
tel.views = views
86140
if err = view.Register(views...); err != nil {
87-
return err
141+
return nil, err
88142
}
89143

90144
processMetricsViews.StartCollection()
@@ -94,45 +148,40 @@ func (tel *colTelemetry) initOnce(asyncErrorChannel chan<- error, ballastSizeByt
94148
Namespace: telemetry.GetMetricsPrefix(),
95149
}
96150

97-
var instanceID string
98151
if telemetry.GetAddInstanceID() {
99-
instanceUUID, _ := uuid.NewRandom()
100-
instanceID = instanceUUID.String()
101152
opts.ConstLabels = map[string]string{
102153
sanitizePrometheusKey(semconv.AttributeServiceInstanceID): instanceID,
103154
}
104155
}
105156

106157
pe, err := prometheus.NewExporter(opts)
107158
if err != nil {
108-
return err
159+
return nil, err
109160
}
110161

111162
view.RegisterExporter(pe)
163+
return pe, nil
164+
}
112165

113-
logger.Info(
114-
"Serving Prometheus metrics",
115-
zap.String("address", metricsAddr),
116-
zap.Int8("level", int8(level)), // TODO: make it human friendly
117-
zap.String(semconv.AttributeServiceInstanceID, instanceID),
166+
func (tel *colTelemetry) initOpenTelemetry() (http.Handler, error) {
167+
config := otelprometheus.Config{}
168+
c := controller.New(
169+
processor.New(
170+
selector.NewWithHistogramDistribution(
171+
histogram.WithExplicitBoundaries(config.DefaultHistogramBoundaries),
172+
),
173+
export.CumulativeExportKindSelector(),
174+
processor.WithMemory(true),
175+
),
118176
)
119177

120-
mux := http.NewServeMux()
121-
mux.Handle("/metrics", pe)
122-
123-
tel.server = &http.Server{
124-
Addr: metricsAddr,
125-
Handler: mux,
178+
pe, err := otelprometheus.New(config, c)
179+
if err != nil {
180+
return nil, err
126181
}
127182

128-
go func() {
129-
serveErr := tel.server.ListenAndServe()
130-
if serveErr != nil && serveErr != http.ErrServerClosed {
131-
asyncErrorChannel <- serveErr
132-
}
133-
}()
134-
135-
return nil
183+
global.SetMeterProvider(pe.MeterProvider())
184+
return pe, err
136185
}
137186

138187
func (tel *colTelemetry) shutdown() error {

0 commit comments

Comments
 (0)