func initPrometheusExporter()

in pkg/metrics/prometheus_exporter.go [21:59]


func initPrometheusExporter(metricsAddress string) error {
	exporter, err := prometheus.New()
	if err != nil {
		return err
	}

	meterProvider := metric.NewMeterProvider(
		metric.WithReader(exporter),
		metric.WithView(
			metric.NewView(
				metric.Instrument{
					Kind: metric.InstrumentKindHistogram,
				},
				metric.Stream{
					Aggregation: aggregation.ExplicitBucketHistogram{
						// Use custom buckets to avoid the default buckets which are too small for our use case.
						// Start 100ms with last bucket being [~4m, +Inf)
						Boundaries: cgprometheus.ExponentialBucketsRange(0.1, 2, 11),
					},
				},
			),
		),
	)
	global.SetMeterProvider(meterProvider)

	http.HandleFunc(fmt.Sprintf("/%s", metricsEndpoint), promhttp.Handler().ServeHTTP)
	go func() {
		server := &http.Server{
			Addr:              fmt.Sprintf(":%s", metricsAddress),
			ReadHeaderTimeout: 5 * time.Second,
		}
		if err := server.ListenAndServe(); err != nil {
			mlog.Fatal(err, "failed to register prometheus endpoint", "metricsAddress", metricsAddress)
		}
	}()
	mlog.Always("Prometheus metrics server running", "address", metricsAddress)

	return nil
}