{"record":{"id":"c07d422aa2260208","repo":"quarkusio/quarkus","slug":"no-clock-bean-found","errorCode":null,"errorMessage":"No Clock bean found","messagePattern":"No Clock bean found","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/AutoConfiguredOpenTelemetrySdkBuilderCustomizer.java","lineNumber":312,"sourceCode":"            this.oTelBuildConfig = oTelBuildConfig;\n            this.clock = clock;\n            this.managedExecutor = managedExecutor;\n            this.oTelRuntimeConfig = runtimeConfig;\n        }\n\n        @Override\n        public void customize(AutoConfiguredOpenTelemetrySdkBuilder builder) {\n            AtomicReference<MetricExporter> metricExporterRef = new AtomicReference<>();\n            builder.addMeterProviderCustomizer(\n                    new BiFunction<SdkMeterProviderBuilder, ConfigProperties, SdkMeterProviderBuilder>() {\n                        @Override\n                        public SdkMeterProviderBuilder apply(SdkMeterProviderBuilder meterProviderBuilder,\n                                ConfigProperties configProperties) {\n\n                            if (oTelBuildConfig.metrics().enabled().orElse(TRUE)) {\n\n                                if (clock.isUnsatisfied()) {\n                                    throw new IllegalStateException(\"No Clock bean found\");\n                                }\n                                meterProviderBuilder.setClock(clock.get());\n                            } else {\n                                // disable batch exporter metrics if metrics disabled\n                                // In the future we can inject scopes here.\n                                Set<String> dropInstrumentationScopes = Set.of(\n                                        \"io.opentelemetry.sdk.trace\",\n                                        \"io.opentelemetry.sdk.logs\",\n                                        \"io.opentelemetry.sdk.metrics\");\n                                for (String target : dropInstrumentationScopes) {\n                                    SdkMeterProviderUtil.addMeterConfiguratorCondition(\n                                            meterProviderBuilder,\n                                            nameEquals(target),\n                                            MeterConfig.disabled());\n                                }\n                            }\n                            return meterProviderBuilder;\n                        }","sourceCodeStart":294,"sourceCodeEnd":330,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/AutoConfiguredOpenTelemetrySdkBuilderCustomizer.java#L294-L330","documentation":"The Quarkus OpenTelemetry extension requires a CDI bean of type io.opentelemetry.api.common/clock (io.opentelemetry.sdk.common.Clock) when metrics are enabled, to back the SdkMeterProvider. When the metrics module is active and metrics.enabled is true but no Clock bean is resolvable from the container, the builder throws IllegalStateException('No Clock bean found'). The extension normally provides this bean itself, so losing it signals a broken/absent OpenTelemetry metrics wiring.","triggerScenarios":"Application starts with quarkus.otel.metrics.enabled=true (or default) while no Clock bean is registered in the CDI container — e.g. custom OpenTelemetry configuration overriding the extension's beans, or the clock supplier's isUnsatisfied() returning true because the OpenTelemetry support bean was excluded or its producer removed.","commonSituations":"Users supplying their own custom OpenTelemetrySdk builder customization, disabling Quarkus's default OpenTelemetry beans via @ExcludeInterceptor/property (quarkus.otel.enabled=false interplay), or replacing the recorded clock bean; also broken extension versions where the metrics clock producer was removed.","solutions":["Ensure the Quarkus OpenTelemetry extension's default beans are not excluded: remove any quarkus.otel.* exclusion or custom @Alternative that removes the default Clock producer","If providing a custom Clock, register it as a CDI bean: @Produces @Singleton Clock clock() { return System::nanoTime; } (proper SdkClock/SdkMillisClock)","Check that quarkus-opentelemetry runtime module is fully on the classpath and version-aligned; do a clean rebuild","If metrics are not intended, set quarkus.otel.metrics.enabled=false"],"exampleFix":"// before\n@ApplicationScoped\nclass MyOtelConfig {\n   // no Clock bean produced\n}\n// after\n@ApplicationScoped\nclass MyOtelConfig {\n   @Produces\n   @Singleton\n   Clock clock() {\n      return io.opentelemetry.sdk.metrics.SdkMeterProvider.builder().getClock(); // or a custom Clock impl\n   }\n}","handlingStrategy":"validation","validationCode":"// verify a Clock bean exists before metrics-dependent initialization\nstatic void requireClockBean(BeanManager bm) {\n    if (bm.getBeans(Clock.class).isEmpty()) {\n        throw new IllegalStateException(\n            \"Provide a CDI bean of io.opentelemetry.sdk.common.Clock or disable metrics\");\n    }\n}","typeGuard":"static boolean hasClockBean(BeanManager bm) {\n    return !bm.getBeans(Clock.class).isEmpty();\n}","tryCatchPattern":"try {\n    otelInitialization();\n} catch (IllegalStateException e) {\n    if (\"No Clock bean found\".equals(e.getMessage())) {\n        // register fallback clock or disable metrics and retry init\n    }\n    throw e;\n}","preventionTips":["Do not exclude Quarkus's default OpenTelemetry beans","If customizing OTel, @Produces a Clock bean yourself","Set quarkus.otel.metrics.enabled=false when metrics are unused","Keep the quarkus-opentelemetry dependency version aligned with the Quarkus BOM"],"tags":["opentelemetry","cdi","metrics","missing-bean"],"backgroundTag":"missing-cdi-bean","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}