in pkg/metricgen/otlp.go [44:88]
func SendOTLP(ctx context.Context, opts ...ConfigOption) (EventStats, error) {
cfg := newConfig(opts...)
if err := cfg.Validate(); err != nil {
return EventStats{}, fmt.Errorf("cannot validate OTLP Metrics configuration: %w", err)
}
var exporter sdkmetric.Exporter
switch cfg.otlpProtocol {
case grpcOTLPProtocol:
e, cleanup, err := newOTLPMetricGRPCExporter(ctx, cfg)
if err != nil {
return EventStats{}, err
}
defer cleanup()
exporter = e
case httpOTLPProtocol:
e, err := newOTLPMetricHTTPExporter(ctx, cfg)
if err != nil {
return EventStats{}, err
}
exporter = e
}
defer exporter.Shutdown(ctx)
resource := resource.NewSchemaless(
attribute.String("service.name", cfg.otlpServiceName),
)
mp := sdkmetric.NewMeterProvider(
sdkmetric.WithReader(sdkmetric.NewPeriodicReader(exporter)),
sdkmetric.WithResource(resource),
)
stats := EventStats{}
if err := generateMetrics(mp.Meter("metricgen"), &stats); err != nil {
return stats, fmt.Errorf("cannot generate metrics: %w", err)
}
if err := mp.Shutdown(ctx); err != nil {
return EventStats{}, fmt.Errorf("cannot shut down meter provider: %w", err)
}
return stats, nil
}