in pkg/otel_setup.go [143:201]
func initMetrics() error {
ctx := context.Background()
// TODO: abstract the if-else
var err error
if testaccess.IsInTest() {
metricsProvider = metric.NewMeterProvider(
metric.WithReader(testaccess.ManualReader),
)
} else {
if os.Getenv(metrics_exporter) == "none" {
metricsProvider = noop.NewMeterProvider()
} else if os.Getenv(metrics_exporter) == "console" {
metricExporter, err = stdoutmetric.New()
metricsProvider = metric.NewMeterProvider(
metric.WithReader(metric.NewPeriodicReader(metricExporter)),
)
} else if os.Getenv(metrics_exporter) == "prometheus" {
promExporter, err := prometheus.New()
if err != nil {
log.Fatalf("Failed to create prometheus metric exporter: %v", err)
}
metricsProvider = metric.NewMeterProvider(
metric.WithReader(promExporter),
)
go serveMetrics()
} else {
if os.Getenv(report_protocol) == "grpc" || os.Getenv(trace_report_protocol) == "grpc" {
metricExporter, err = otlpmetricgrpc.New(ctx)
metricsProvider = metric.NewMeterProvider(
metric.WithReader(metric.NewPeriodicReader(metricExporter)),
)
} else {
metricExporter, err = otlpmetrichttp.New(ctx)
metricsProvider = metric.NewMeterProvider(
metric.WithReader(metric.NewPeriodicReader(metricExporter)),
)
}
}
}
if err != nil {
log.Fatalf("Failed to create metric exporter: %v", err)
}
if metricsProvider == nil {
return errors.New("No MeterProvider is provided")
}
otel.SetMeterProvider(metricsProvider)
m := metricsProvider.Meter("opentelemetry-global-meter")
meter.SetMeter(m)
// init http metrics
http.InitHttpMetrics(m)
// init rpc metrics
rpc.InitRpcMetrics(m)
// init db metrics
db.InitDbMetrics(m)
// nacos experimental metrics
experimental.InitNacosExperimentalMetrics(m)
// DefaultMinimumReadMemStatsInterval is 15 second
return otelruntime.Start(otelruntime.WithMeterProvider(metricsProvider))
}