@@ -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
138187func (tel * colTelemetry ) shutdown () error {
0 commit comments