Skip to content

Commit ac3281f

Browse files
authored
fix: Remove duplicate OTEL observability setup in imc-dispatcher (#8885)
The imc-dispatcher was calling otel.SetupObservabilityOrDie in its NewController function, but sharedmain.MainWithContext already sets up observability before calling NewController. This caused Go runtime metrics to be registered twice, resulting in the error: "collected metric 'go_memory_allocations_total' was collected before with the same name and label values" This caused the metrics endpoint (/metrics) to fail with an error, preventing Prometheus from scraping metrics. Changes: - Use otel.GetMeterProvider() and otel.GetTracerProvider() to get the global providers already set up by sharedmain - Remove duplicate pprof server creation (sharedmain handles it) - Remove pprof config watch (sharedmain handles it) - Remove provider shutdown calls (sharedmain handles cleanup) - Clean up unused imports
1 parent d3feb16 commit ac3281f

File tree

1 file changed

+5
-20
lines changed

1 file changed

+5
-20
lines changed

pkg/reconciler/inmemorychannel/dispatcher/controller.go

Lines changed: 5 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"context"
2121
"time"
2222

23+
"go.opentelemetry.io/otel"
2324
"knative.dev/pkg/injection"
2425
"knative.dev/pkg/system"
2526

@@ -32,16 +33,13 @@ import (
3233
"knative.dev/eventing/pkg/channel/multichannelfanout"
3334
"knative.dev/eventing/pkg/eventingtls"
3435
"knative.dev/eventing/pkg/kncloudevents"
35-
"knative.dev/eventing/pkg/observability/otel"
3636

3737
"knative.dev/pkg/logging"
3838

3939
"go.uber.org/zap"
4040
filteredconfigmapinformer "knative.dev/pkg/client/injection/kube/informers/core/v1/configmap/filtered"
4141
"knative.dev/pkg/configmap"
42-
configmapinformer "knative.dev/pkg/configmap/informer"
4342
"knative.dev/pkg/controller"
44-
k8sruntime "knative.dev/pkg/observability/runtime/k8s"
4543
pkgreconciler "knative.dev/pkg/reconciler"
4644

4745
kubeclient "knative.dev/pkg/client/injection/kube/client"
@@ -55,7 +53,6 @@ import (
5553
inmemorychannelinformer "knative.dev/eventing/pkg/client/injection/informers/messaging/v1/inmemorychannel"
5654
inmemorychannelreconciler "knative.dev/eventing/pkg/client/injection/reconciler/messaging/v1/inmemorychannel"
5755
"knative.dev/eventing/pkg/inmemorychannel"
58-
o11yconfigmap "knative.dev/eventing/pkg/observability/configmap"
5956
)
6057

6158
const (
@@ -85,15 +82,12 @@ func NewController(
8582
) *controller.Impl {
8683
logger := logging.FromContext(ctx)
8784

88-
pprof := k8sruntime.NewProfilingServer(logger.Named("pprof"))
89-
90-
mp, tp := otel.SetupObservabilityOrDie(ctx, "inmemorychannel.dispatcher", logger, pprof)
85+
// Use the global meter and tracer providers that were set up by sharedmain
86+
mp := otel.GetMeterProvider()
87+
tp := otel.GetTracerProvider()
9188

9289
trustBundleConfigMapLister := filteredconfigmapinformer.Get(ctx, eventingtls.TrustBundleLabelSelector).Lister().ConfigMaps(system.Namespace())
9390

94-
iw := cmw.(*configmapinformer.InformedWatcher)
95-
iw.Watch(o11yconfigmap.Name(), pprof.UpdateFromConfigMap)
96-
9791
var env envConfig
9892
if err := envconfig.Process("", &env); err != nil {
9993
logger.Panicw("Failed to process env var", zap.Error(err))
@@ -222,16 +216,7 @@ func NewController(
222216
logging.FromContext(ctx).Errorw("Failed stopping inMemoryDispatcher.", zap.Error(err))
223217
}
224218

225-
ctx, cancel := context.WithTimeout(ctx, 10*time.Second)
226-
defer cancel()
227-
228-
if err := mp.Shutdown(ctx); err != nil {
229-
logger.Errorw("Error flushing metrics", zap.Error(err))
230-
}
231-
232-
if err := tp.Shutdown(ctx); err != nil {
233-
logger.Errorw("Error flushing traces", zap.Error(err))
234-
}
219+
// Note: Meter and tracer provider shutdown is handled by sharedmain
235220
}()
236221

237222
return impl

0 commit comments

Comments
 (0)