func Main()

in systemtest/cmd/sendotlp/main.go [118:185]


func Main(ctx context.Context, logger *zap.SugaredLogger) (result error) {
	endpointURL, err := url.Parse(*endpoint)
	if err != nil {
		return fmt.Errorf("failed to parse endpoint: %w", err)
	}
	switch endpointURL.Scheme {
	case "http":
		if endpointURL.Port() == "" {
			endpointURL.Host = net.JoinHostPort(endpointURL.Host, "80")
		}
	case "https":
		if endpointURL.Port() == "" {
			endpointURL.Host = net.JoinHostPort(endpointURL.Host, "443")
		}
	default:
		return fmt.Errorf("endpoint must be prefixed with http:// or https://")
	}

	otlpExporters, err := newOTLPExporters(ctx, endpointURL)
	if err != nil {
		return err
	}
	tracerProvider := sdktrace.NewTracerProvider(sdktrace.WithSyncer(otlpExporters.trace))
	defer func() {
		if err := tracerProvider.Shutdown(ctx); err != nil {
			result = errors.Join(result,
				fmt.Errorf("error shutting down tracer provider: %w", err),
			)
		}
	}()

	meterProvider := sdkmetric.NewMeterProvider(
		sdkmetric.WithReader(sdkmetric.NewPeriodicReader(
			otlpExporters.metric,
			sdkmetric.WithInterval(time.Hour),
		)),
		sdkmetric.WithView(sdkmetric.NewView(
			sdkmetric.Instrument{Name: "*"},
			sdkmetric.Stream{
				Aggregation: sdkmetric.AggregationExplicitBucketHistogram{
					Boundaries: []float64{1, 10, 100, 1000, 10000},
				},
			},
		)),
	)
	defer func() {
		if err := meterProvider.Shutdown(ctx); err != nil {
			result = errors.Join(result,
				fmt.Errorf("error shutting down meter provider: %w", err),
			)
		}
	}()

	logger.Infof("sending OTLP data to %s (%s)", endpointURL.String(), *protocol)

	// Generate some data. Metrics are sent when the controller is stopped, traces and logs
	// are sent immediately.
	if err := generateMetrics(ctx, meterProvider.Meter("sendotlp")); err != nil {
		return err
	}
	if err := generateSpans(ctx, tracerProvider.Tracer("sendotlp")); err != nil {
		return err
	}
	if err := generateLogs(ctx, otlpExporters.log); err != nil {
		return err
	}
	return nil
}