func SendOTLP()

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
}