{"record":{"id":"3f72e23f1b1db5c6","repo":"quarkusio/quarkus","slug":"unsupported-otlp-protocol-s-specified-please-che","errorCode":null,"errorMessage":"Unsupported OTLP protocol %s specified. Please check `quarkus.otel.exporter.otlp.traces.protocol` property","messagePattern":"Unsupported OTLP protocol (.+?) specified\\. Please check `quarkus\\.otel\\.exporter\\.otlp\\.traces\\.protocol` property","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/exporter/otlp/OTelExporterRecorder.java","lineNumber":125,"sourceCode":"                    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,\n                    TlsConfigurationRegistry tlsConfigurationRegistry) {\n\n                OtlpExporterTracesConfig tracesConfig = exporterRuntimeConfig.traces();\n                MemoryMode memoryMode = exporterRuntimeConfig.memoryMode();\n\n                return new VertxGrpcSpanExporter(new GrpcExporter(\n                        new VertxGrpcSender(\n                                baseUri,\n                                VertxGrpcSender.GRPC_TRACE_SERVICE_NAME,\n                                determineCompression(tracesConfig),\n                                tracesConfig.timeout(),\n                                populateTracingExportHttpHeaders(tracesConfig),\n                                new HttpClientOptionsConsumer(tracesConfig, baseUri, tlsConfigurationRegistry),","sourceCodeStart":107,"sourceCodeEnd":143,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/exporter/otlp/OTelExporterRecorder.java#L107-L143","documentation":"After reading the trace protocol, createSpanExporter only supports 'grpc' and 'http/protobuf'. Any other value yields IllegalArgumentException('Unsupported OTLP protocol %s specified...'). This guards against typos and unsupported exporters like the removed http/json (thrift) protocol.","triggerScenarios":"quarkus.otel.exporter.otlp.traces.protocol set to e.g. http/json, http/thrift, GRPC (wrong case), or any string other than grpc|http/protobuf.","commonSituations":"Following older OpenTelemetry docs/blogs recommending http/json or http/thrift; case-sensitive typo 'GRPC'; copy-pasting protocol values from non-Quarkus OTel setups.","solutions":["Set protocol to exactly grpc or http/protobuf (lowercase)","Replace deprecated http/json or http/thrift protocols — not supported by the OTLP exporter here","Check the collector endpoint matches the chosen protocol port (4317 grpc, 4318 http)"],"exampleFix":"// before\nquarkus.otel.exporter.otlp.traces.protocol=http/json\n// after\nquarkus.otel.exporter.otlp.traces.protocol=http/protobuf","handlingStrategy":"validation","validationCode":"String proto = ConfigProvider.getConfig()\n    .getValue(\"quarkus.otel.exporter.otlp.traces.protocol\", String.class);\nif (!\"grpc\".equals(proto) && !\"http/protobuf\".equals(proto)) {\n    throw new IllegalArgumentException(\n        \"quarkus.otel.exporter.otlp.traces.protocol must be 'grpc' or 'http/protobuf', got: \" + proto);\n}","typeGuard":"static boolean isSupportedOtlpProtocol(String protocol) {\n    return \"grpc\".equals(protocol) || \"http/protobuf\".equals(protocol);\n}","tryCatchPattern":"try {\n    startApplication();\n} catch (IllegalArgumentException e) {\n    if (e.getMessage() != null && e.getMessage().startsWith(\"Unsupported OTLP protocol\")) {\n        LOG.error(\"Use grpc or http/protobuf for quarkus.otel.exporter.otlp.traces.protocol\");\n    }\n    throw e;\n}","preventionTips":["Use only lowercase grpc or http/protobuf values","Do not use removed protocols like http/json or http/thrift","Match the collector port to the protocol (4317 vs 4318)","Add config validation to CI to catch typos like GRPC"],"tags":["opentelemetry","otlp","config","traces"],"backgroundTag":"invalid-config-value","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"}