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
}