diff --git a/staging/src/k8s.io/apiserver/pkg/server/config.go b/staging/src/k8s.io/apiserver/pkg/server/config.go index c47e82d7bc8..27aeeeef292 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/config.go +++ b/staging/src/k8s.io/apiserver/pkg/server/config.go @@ -17,6 +17,7 @@ limitations under the License. package server import ( + "context" "fmt" "net" "net/http" @@ -30,7 +31,6 @@ import ( jsonpatch "github.com/evanphx/json-patch" "github.com/google/uuid" - oteltrace "go.opentelemetry.io/otel/trace" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -68,6 +68,7 @@ import ( "k8s.io/component-base/logs" "k8s.io/component-base/metrics/features" "k8s.io/component-base/metrics/prometheus/slis" + "k8s.io/component-base/tracing" "k8s.io/klog/v2" openapicommon "k8s.io/kube-openapi/pkg/common" "k8s.io/kube-openapi/pkg/validation/spec" @@ -140,7 +141,7 @@ type Config struct { ExternalAddress string // TracerProvider can provide a tracer, which records spans for distributed tracing. - TracerProvider oteltrace.TracerProvider + TracerProvider tracing.TracerProvider //=========================================================================== // Fields you probably don't care about changing @@ -377,7 +378,7 @@ func NewConfig(codecs serializer.CodecFactory) *Config { APIServerID: id, StorageVersionManager: storageversion.NewDefaultManager(), - TracerProvider: oteltrace.NewNoopTracerProvider(), + TracerProvider: tracing.NewNoopTracerProvider(), } } @@ -787,6 +788,11 @@ func (c completedConfig) New(name string, delegationTarget DelegationTarget) (*G } s.AddHealthChecks(delegateCheck) } + s.RegisterDestroyFunc(func() { + if err := c.Config.TracerProvider.Shutdown(context.Background()); err != nil { + klog.Errorf("failed to shut down tracer provider: %v", err) + } + }) s.listedPathProvider = routes.ListedPathProviders{s.listedPathProvider, delegationTarget} diff --git a/staging/src/k8s.io/component-base/tracing/utils.go b/staging/src/k8s.io/component-base/tracing/utils.go index 0ba1d9523e2..ae894a8091c 100644 --- a/staging/src/k8s.io/component-base/tracing/utils.go +++ b/staging/src/k8s.io/component-base/tracing/utils.go @@ -31,14 +31,32 @@ import ( "k8s.io/component-base/tracing/api/v1" ) +// TracerProvider is an OpenTelemetry TracerProvider which can be shut down +type TracerProvider interface { + oteltrace.TracerProvider + Shutdown(context.Context) error +} + +type noopTracerProvider struct { + oteltrace.TracerProvider +} + +func (n *noopTracerProvider) Shutdown(context.Context) error { + return nil +} + +func NewNoopTracerProvider() TracerProvider { + return &noopTracerProvider{TracerProvider: oteltrace.NewNoopTracerProvider()} +} + // NewProvider creates a TracerProvider in a component, and enforces recommended tracing behavior func NewProvider(ctx context.Context, tracingConfig *v1.TracingConfiguration, addedOpts []otlptracegrpc.Option, resourceOpts []resource.Option, -) (oteltrace.TracerProvider, error) { +) (TracerProvider, error) { if tracingConfig == nil { - return oteltrace.NewNoopTracerProvider(), nil + return NewNoopTracerProvider(), nil } opts := append([]otlptracegrpc.Option{}, addedOpts...) if tracingConfig.Endpoint != nil {