in systemtest/cmd/sendotlp/main.go [262:320]
func newOTLPGRPCExporters(ctx context.Context, endpointURL *url.URL) (*otlpExporters, error) {
var transportCredentials credentials.TransportCredentials
switch endpointURL.Scheme {
case "http":
// If http:// is specified, then use insecure (plaintext).
transportCredentials = grpcinsecure.NewCredentials()
case "https":
transportCredentials = credentials.NewTLS(&tls.Config{InsecureSkipVerify: *insecure})
}
grpcConn, err := grpc.DialContext(ctx, endpointURL.Host, grpc.WithTransportCredentials(transportCredentials))
if err != nil {
return nil, err
}
cleanup := func(context.Context) error {
return grpcConn.Close()
}
traceOptions := []otlptracegrpc.Option{otlptracegrpc.WithGRPCConn(grpcConn)}
metricOptions := []otlpmetricgrpc.Option{otlpmetricgrpc.WithGRPCConn(grpcConn)}
var headers map[string]string
if *apiKey != "" {
// If -api-key is specified then we set headers explicitly,
// overriding anything set in $OTEL_EXPORTER_OTLP_HEADERS and -secret-token.
headers = map[string]string{"Authorization": "ApiKey " + *apiKey}
} else if *secretToken != "" {
// If -secret-token is specified then we set headers explicitly,
// overriding anything set in $OTEL_EXPORTER_OTLP_HEADERS.
headers = map[string]string{"Authorization": "Bearer " + *secretToken}
}
if headers != nil {
traceOptions = append(traceOptions, otlptracegrpc.WithHeaders(headers))
metricOptions = append(metricOptions, otlpmetricgrpc.WithHeaders(headers))
}
otlpTraceExporter, err := otlptracegrpc.New(ctx, traceOptions...)
if err != nil {
cleanup(ctx)
return nil, err
}
otlpMetricExporter, err := otlpmetricgrpc.New(ctx, metricOptions...)
if err != nil {
cleanup(ctx)
return nil, err
}
return &otlpExporters{
cleanup: cleanup,
trace: otlpTraceExporter,
metric: otlpMetricExporter,
log: &otlploggrpcExporter{
client: plogotlp.NewGRPCClient(grpcConn),
headers: headers, // logs exporter does not respect OTEL_EXPORTER_OTLP_HEADERS
},
}, nil
}