{"record":{"id":"8197451e919465c1","repo":"quarkusio/quarkus","slug":"no-otlp-protocol-specified-please-check-quarkus","errorCode":null,"errorMessage":"No OTLP protocol specified. Please check `quarkus.otel.exporter.otlp.traces.protocol` property","messagePattern":"No OTLP protocol specified\\. Please check `quarkus\\.otel\\.exporter\\.otlp\\.traces\\.protocol` property","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/exporter/otlp/OTelExporterRecorder.java","lineNumber":112,"sourceCode":"                try {\n                    TlsConfigurationRegistry tlsConfigurationRegistry = context\n                            .getInjectedReference(TlsConfigurationRegistry.class);\n\n                    return createSpanExporter(exporterRuntimeConfig.getValue(), vertx.get(), baseUri,\n                            tlsConfigurationRegistry);\n\n                } catch (IllegalArgumentException iae) {\n                    throw new IllegalStateException(\"Unable to install OTLP Exporter\", iae);\n                }\n            }\n\n            private SpanExporter createSpanExporter(OtlpExporterRuntimeConfig exporterRuntimeConfig,\n                    Vertx vertx,\n                    URI baseUri,\n                    TlsConfigurationRegistry tlsConfigurationRegistry) {\n                OtlpExporterTracesConfig tracesConfig = exporterRuntimeConfig.traces();\n                if (tracesConfig.protocol().isEmpty()) {\n                    throw new IllegalStateException(\"No OTLP protocol specified. \" +\n                            \"Please check `quarkus.otel.exporter.otlp.traces.protocol` property\");\n                }\n\n                String protocol = tracesConfig.protocol().get();\n                if (GRPC.equals(protocol)) {\n                    return createOtlpGrpcSpanExporter(exporterRuntimeConfig, vertx, baseUri,\n                            tlsConfigurationRegistry);\n                } else if (HTTP_PROTOBUF.equals(protocol)) {\n                    return createHttpSpanExporter(exporterRuntimeConfig, vertx, baseUri, protocol,\n                            tlsConfigurationRegistry);\n                }\n\n                throw new IllegalArgumentException(String.format(\"Unsupported OTLP protocol %s specified. \" +\n                        \"Please check `quarkus.otel.exporter.otlp.traces.protocol` property\", protocol));\n            }\n\n            private SpanExporter createOtlpGrpcSpanExporter(OtlpExporterRuntimeConfig exporterRuntimeConfig,\n                    Vertx vertx, final URI baseUri,","sourceCodeStart":94,"sourceCodeEnd":130,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/exporter/otlp/OTelExporterRecorder.java#L94-L130","documentation":"createSpanExporter requires a configured OTLP protocol for traces. When quarkus.otel.exporter.otlp.traces.protocol is empty/unset and the default is not resolvable, the recorder throws IllegalStateException('No OTLP protocol specified...'). The protocol selects between gRPC and HTTP/protobuf OTLP exporters.","triggerScenarios":"Setting quarkus.otel.exporter.otlp.traces.protocol to an empty string (or a config source yielding empty) so Optional.isEmpty() is true in createSpanExporter, called from apply during startup.","commonSituations":"application.properties containing `quarkus.otel.exporter.otlp.traces.protocol=` (blank), an environment variable QUARKUS_OTEL_EXPORTER_OTLP_TRACES_PROTOCOL='' overriding a good default, or profile-specific config blanking the value.","solutions":["Set quarkus.otel.exporter.otlp.traces.protocol=grpc (or http/protobuf)","Remove blank overrides from application.properties, env vars, or profile-specific configs","Run with quarkus config dump to see which config source yields the empty value"],"exampleFix":"// before\nquarkus.otel.exporter.otlp.traces.protocol=\n// after\nquarkus.otel.exporter.otlp.traces.protocol=grpc","handlingStrategy":"validation","validationCode":"Optional<String> proto = ConfigProvider.getConfig()\n    .getOptionalValue(\"quarkus.otel.exporter.otlp.traces.protocol\", String.class);\nif (proto.isEmpty()) {\n    throw new IllegalStateException(\"Set quarkus.otel.exporter.otlp.traces.protocol=grpc or http/protobuf\");\n}","typeGuard":"static boolean tracesProtocolConfigured() {\n    return ConfigProvider.getConfig()\n        .getOptionalValue(\"quarkus.otel.exporter.otlp.traces.protocol\", String.class)\n        .filter(s -> !s.isBlank())\n        .isPresent();\n}","tryCatchPattern":"try {\n    startApplication();\n} catch (IllegalStateException e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"No OTLP protocol specified\")) {\n        LOG.error(\"Set quarkus.otel.exporter.otlp.traces.protocol to grpc or http/protobuf\");\n    }\n    throw e;\n}","preventionTips":["Never leave quarkus.otel.exporter.otlp.traces.protocol blank in properties or env vars","Remember env vars with empty values override property defaults","Check %profile-specific configs for blank overrides","Explicitly set protocol=grpc in shared config templates"],"tags":["opentelemetry","otlp","config","traces"],"backgroundTag":"missing-config-property","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}