88 lines
2.5 KiB
Markdown
88 lines
2.5 KiB
Markdown
# Tracing
|
|
|
|
containerd supports OpenTelemetry tracing since v1.6.0.
|
|
Tracing currently targets only gRPC calls.
|
|
|
|
## Sending traces from containerd deamon
|
|
|
|
By configuring `io.containerd.tracing.processor.v1.otlp` plugin.
|
|
containerd daemon can send traces to the specified OpenTelemetry endpoint.
|
|
|
|
```toml
|
|
version = 2
|
|
|
|
[plugins."io.containerd.tracing.processor.v1.otlp"]
|
|
endpoint = "http://localhost:4318"
|
|
```
|
|
|
|
The following options are supported.
|
|
|
|
- `endpoint`: The address of a server that receives [OpenTelemetry Protocol](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.8.0/specification/protocol/otlp.md).
|
|
- `protocol`: OpenTelemetry supports multiple protocols.
|
|
The default value is "http/protobuf". "grpc" is also supported.
|
|
- `insecure`: Disable transport security when the protocol is "grpc". The default is false.
|
|
"http/protobuf" always uses the schema provided by the endpoint and
|
|
the value of this setting being ignored.
|
|
|
|
The sampling ratio and the service name on the traces could be configured by
|
|
`io.containerd.internal.v1.tracing` plugin.
|
|
|
|
```toml
|
|
version = 2
|
|
|
|
[plugins."io.containerd.internal.v1.tracing"]
|
|
sampling_ratio = 1.0
|
|
service_name = "containerd"
|
|
```
|
|
|
|
## Sending traces from containerd client
|
|
|
|
By configuring its underlying gRPC client, containerd's Go client can send
|
|
traces to an OpenTelemetry endpoint.
|
|
|
|
Note that the Go client's methods and gRPC calls are not 1:1. Single method
|
|
call would issue multiple gRPC calls.
|
|
|
|
```go
|
|
func clientWithTrace() error {
|
|
exp, err := otlptracehttp.New(ctx,
|
|
otlptracehttp.WithEndpoint("localhost:4318"),
|
|
otlptracehttp.WithInsecure(),
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
res, err := resource.New(ctx, resource.WithAttributes(
|
|
semconv.ServiceNameKey.String("CLIENT NAME"),
|
|
))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
provider := trace.NewTracerProvider(
|
|
trace.WithSampler(trace.AlwaysSample()),
|
|
trace.WithSpanProcessor(trace.NewSimpleSpanProcessor(exp)),
|
|
trace.WithResource(res),
|
|
)
|
|
otel.SetTracerProvider(provider)
|
|
otel.SetTextMapPropagator(propagation.TraceContext{})
|
|
|
|
...
|
|
|
|
dialOpts := []grpc.DialOption{
|
|
grpc.WithTransportCredentials(insecure.NewCredentials()),
|
|
grpc.WithStreamInterceptor(otelgrpc.StreamClientInterceptor()),
|
|
grpc.WithUnaryInterceptor(otelgrpc.UnaryClientInterceptor()),
|
|
}
|
|
client, ctx, cancel, err := commands.NewClient(context, containerd.WithDialOpts(dialOpts))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer cancel()
|
|
|
|
ctx, span := tracing.StartSpan(ctx, "OPERATION NAME")
|
|
defer span.End()
|
|
...
|
|
}
|