(dockerCli command.Cli)
| 66 | } |
| 67 | |
| 68 | func InitProvider(dockerCli command.Cli) (ShutdownFunc, error) { |
| 69 | ctx := context.Background() |
| 70 | |
| 71 | var errs []error |
| 72 | var exporters []sdktrace.SpanExporter |
| 73 | |
| 74 | envClient, otelEnv := traceClientFromEnv() |
| 75 | if envClient != nil { |
| 76 | if envExporter, err := otlptrace.New(ctx, envClient); err != nil { |
| 77 | errs = append(errs, err) |
| 78 | } else if envExporter != nil { |
| 79 | exporters = append(exporters, envExporter) |
| 80 | } |
| 81 | } |
| 82 | |
| 83 | if dcClient, err := traceClientFromDockerContext(dockerCli, otelEnv); err != nil { |
| 84 | errs = append(errs, err) |
| 85 | } else if dcClient != nil { |
| 86 | if dcExporter, err := otlptrace.New(ctx, dcClient); err != nil { |
| 87 | errs = append(errs, err) |
| 88 | } else if dcExporter != nil { |
| 89 | exporters = append(exporters, dcExporter) |
| 90 | } |
| 91 | } |
| 92 | if len(errs) != 0 { |
| 93 | return nil, errors.Join(errs...) |
| 94 | } |
| 95 | |
| 96 | res, err := resource.New( |
| 97 | ctx, |
| 98 | resource.WithAttributes( |
| 99 | semconv.ServiceName("compose"), |
| 100 | semconv.ServiceVersion(internal.Version), |
| 101 | attribute.String("docker.context", dockerCli.CurrentContext()), |
| 102 | ), |
| 103 | ) |
| 104 | if err != nil { |
| 105 | return nil, fmt.Errorf("failed to create resource: %w", err) |
| 106 | } |
| 107 | |
| 108 | muxExporter := MuxExporter{exporters: exporters} |
| 109 | tracerProvider := sdktrace.NewTracerProvider( |
| 110 | sdktrace.WithResource(res), |
| 111 | sdktrace.WithBatcher(muxExporter), |
| 112 | ) |
| 113 | otel.SetTracerProvider(tracerProvider) |
| 114 | |
| 115 | // Shutdown will flush any remaining spans and shut down the exporter. |
| 116 | return tracerProvider.Shutdown, nil |
| 117 | } |
| 118 | |
| 119 | // traceClientFromEnv creates a GRPC OTLP client based on OS environment |
| 120 | // variables. |
no test coverage detected