2525package metrics
2626
2727import (
28- "context"
29- "net/http"
30- "time"
31-
3228 "go.opentelemetry.io/otel/exporters/prometheus"
3329 "go.opentelemetry.io/otel/metric"
34- "go.opentelemetry.io/otel/sdk/export/metric/aggregation"
35- controller "go.opentelemetry.io/otel/sdk/metric/controller/basic"
36- processor "go.opentelemetry.io/otel/sdk/metric/processor/basic"
37- "go.opentelemetry.io/otel/sdk/resource"
3830
3931 "go.temporal.io/server/common/log"
40- "go.temporal.io/server/common/log/tag"
4132)
4233
4334var _ Reporter = (OpentelemetryReporter )(nil )
4435var _ OpentelemetryReporter = (* opentelemetryReporterImpl )(nil )
36+ var _ OpentelemetryMustProvider = (* opentelemetryMustProviderImpl )(nil )
4537
4638type (
4739 OpentelemetryReporter interface {
@@ -56,105 +48,57 @@ type (
5648 exporter * prometheus.Exporter
5749 meter metric.Meter
5850 meterMust metric.MeterMust
59- config * PrometheusConfig
60- server * http.Server
6151 clientConfig * ClientConfig
6252 gaugeCache OtelGaugeCache
6353 userScope UserScope
54+ mustProvider OpentelemetryMustProvider
6455 }
6556
6657 OpentelemetryListener struct {
6758 }
6859)
6960
70- func NewOpentelemeteryReporter (
71- logger log.Logger ,
61+ func NewOpentelemeteryReporterWithMust (
62+ logger log.Logger , // keeping this to maintain API in case of adding more logging later
7263 prometheusConfig * PrometheusConfig ,
7364 clientConfig * ClientConfig ,
7465) (* opentelemetryReporterImpl , error ) {
75- histogramBoundaries := prometheusConfig .DefaultHistogramBoundaries
76- if len (histogramBoundaries ) == 0 {
77- histogramBoundaries = defaultHistogramBoundaries
78- }
79-
80- c := controller .New (
81- processor .NewFactory (
82- NewOtelAggregatorSelector (
83- histogramBoundaries ,
84- clientConfig .PerUnitHistogramBoundaries ,
85- ),
86- aggregation .CumulativeTemporalitySelector (),
87- processor .WithMemory (true ),
88- ),
89- controller .WithResource (resource .Empty ()),
90- )
91- exporter , err := prometheus .New (
92- prometheus.Config {DefaultHistogramBoundaries : histogramBoundaries }, c )
93-
66+ mustProvider , err := NewOpentelemetryMustProvider (logger , prometheusConfig , clientConfig )
9467 if err != nil {
95- logger .Error ("Failed to initialize prometheus exporter." , tag .Error (err ))
9668 return nil , err
9769 }
70+ return NewOpentelemeteryReporter (logger , clientConfig , mustProvider )
71+ }
9872
99- metricServer := initPrometheusListener (prometheusConfig , logger , exporter )
100-
101- meter := c .Meter ("temporal" )
102- meterMust := metric .Must (meter )
73+ func NewOpentelemeteryReporter (
74+ logger log.Logger , // keeping this to maintain API in case of adding more logging later
75+ clientConfig * ClientConfig ,
76+ mustProvider OpentelemetryMustProvider ,
77+ ) (* opentelemetryReporterImpl , error ) {
78+ meterMust := mustProvider .GetMeterMust ()
10379 gaugeCache := NewOtelGaugeCache (meterMust )
104- userScope := newOpentelemetryUserScope (meterMust , clientConfig .Tags , gaugeCache )
80+ userScope := NewOpentelemetryUserScope (meterMust , clientConfig .Tags , gaugeCache )
10581 reporter := & opentelemetryReporterImpl {
106- exporter : exporter ,
107- meter : meter ,
108- meterMust : meterMust ,
109- config : prometheusConfig ,
110- server : metricServer ,
11182 clientConfig : clientConfig ,
11283 gaugeCache : gaugeCache ,
11384 userScope : userScope ,
85+ mustProvider : mustProvider ,
11486 }
11587
11688 return reporter , nil
11789}
11890
119- func initPrometheusListener (config * PrometheusConfig , logger log.Logger , exporter * prometheus.Exporter ) * http.Server {
120- handlerPath := config .HandlerPath
121- if handlerPath == "" {
122- handlerPath = "/metrics"
123- }
124-
125- handler := http .NewServeMux ()
126- handler .HandleFunc (handlerPath , exporter .ServeHTTP )
127-
128- if config .ListenAddress == "" {
129- logger .Fatal ("Listen address must be specified." , tag .Address (config .ListenAddress ))
130- }
131- server := & http.Server {Addr : config .ListenAddress , Handler : handler }
132-
133- go func () {
134- err := server .ListenAndServe ()
135- if err != http .ErrServerClosed {
136- logger .Fatal ("Failed to initialize prometheus listener." , tag .Address (config .ListenAddress ))
137- }
138- }()
139-
140- return server
141- }
142-
14391func (r * opentelemetryReporterImpl ) GetMeterMust () metric.MeterMust {
144- return r .meterMust
92+ return r .mustProvider . GetMeterMust ()
14593}
14694
14795func (r * opentelemetryReporterImpl ) NewClient (logger log.Logger , serviceIdx ServiceIdx ) (Client , error ) {
14896
149- return newOpentelemeteryClient (r .clientConfig , serviceIdx , r , logger , r .gaugeCache )
97+ return NewOpentelemeteryClient (r .clientConfig , serviceIdx , r , logger , r .gaugeCache )
15098}
15199
152100func (r * opentelemetryReporterImpl ) Stop (logger log.Logger ) {
153- ctx , closeCtx := context .WithTimeout (context .Background (), time .Second )
154- defer closeCtx ()
155- if err := r .server .Shutdown (ctx ); ! (err == nil || err == http .ErrServerClosed ) {
156- logger .Error ("Prometheus metrics server shutdown failure." , tag .Address (r .config .ListenAddress ), tag .Error (err ))
157- }
101+ r .mustProvider .Stop (logger )
158102}
159103
160104func (r * opentelemetryReporterImpl ) UserScope () UserScope {
0 commit comments