{"record":{"id":"cbb71bfe8bedf653","repo":"quarkusio/quarkus","slug":"unsupported-otlp-protocol-s-specified-please-che-cbb71b","errorCode":null,"errorMessage":"Unsupported OTLP protocol %s specified. Please check `quarkus.otel.exporter.otlp.logs.protocol` property","messagePattern":"Unsupported OTLP protocol (.+?) specified\\. Please check `quarkus\\.otel\\.exporter\\.otlp\\.logs\\.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":322,"sourceCode":"                                new HttpExporter(\n                                        ComponentId.generateLazy(\n                                                StandardComponentId.ExporterType.OTLP_HTTP_LOG_EXPORTER),\n                                        new VertxHttpSender(\n                                                baseUri,\n                                                VertxHttpSender.LOGS_PATH,\n                                                determineCompression(logsConfig),\n                                                logsConfig.timeout(),\n                                                populateTracingExportHttpHeaders(logsConfig),\n                                                exportAsJson ? \"application/json\" : \"application/x-protobuf\",\n                                                new HttpClientOptionsConsumer(logsConfig, baseUri, tlsConfigurationRegistry),\n                                                vertx.get()),\n                                        MeterProvider::noop,\n                                        InternalTelemetryVersion.LATEST,\n                                        baseUri,\n                                        false),\n                                memoryMode);\n                    } else {\n                        throw new IllegalArgumentException(String.format(\"Unsupported OTLP protocol %s specified. \" +\n                                \"Please check `quarkus.otel.exporter.otlp.logs.protocol` property\", protocol));\n                    }\n\n                } catch (IllegalArgumentException iae) {\n                    throw new IllegalStateException(\"Unable to install OTLP Exporter\", iae);\n                }\n                return logRecordExporter;\n            }\n        };\n    }\n\n    private static DefaultAggregationSelector aggregationResolver(OtlpExporterMetricsConfig metricsConfig) {\n        String defaultHistogramAggregation = metricsConfig.defaultHistogramAggregation()\n                .map(s -> s.toLowerCase(Locale.ROOT))\n                .orElse(\"explicit_bucket_histogram\");\n\n        DefaultAggregationSelector aggregationSelector;\n        if (defaultHistogramAggregation.equals(\"explicit_bucket_histogram\")) {","sourceCodeStart":304,"sourceCodeEnd":340,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/exporter/otlp/OTelExporterRecorder.java#L304-L340","documentation":"The OTLP log exporter builder only supports `grpc` and `http/protobuf` protocols. If `quarkus.otel.exporter.otlp.logs.protocol` holds any other value, the recorder throws IllegalArgumentException (then wrapped as 'Unable to install OTLP Exporter'). This guards against silently configuring an exporter that cannot send data.","triggerScenarios":"Setting `quarkus.otel.exporter.otlp.logs.protocol` to anything besides `grpc` or `http/protobuf`, e.g. `http/json`, `otlp`, `grpc+tls`, or a misspelled value.","commonSituations":"Typos in properties files; values copied from the OTLP spec (`http/json` exists upstream but is not supported by Quarkus' exporters); mixing up metrics and logs protocol keys.","solutions":["Set `quarkus.otel.exporter.otlp.logs.protocol=http/protobuf`","Or set it to `grpc`","Verify exact spelling and case of the protocol value","Check you edited the `logs.protocol` key and not another signal's"],"exampleFix":"# before\nquarkus.otel.exporter.otlp.logs.protocol=http/json\n# after\nquarkus.otel.exporter.otlp.logs.protocol=http/protobuf","handlingStrategy":"validation","validationCode":"String p = ConfigProvider.getConfig().getValue(\"quarkus.otel.exporter.otlp.logs.protocol\", String.class);\nif (!\"grpc\".equals(p) && !\"http/protobuf\".equals(p)) {\n    throw new IllegalArgumentException(\"quarkus.otel.exporter.otlp.logs.protocol must be grpc or http/protobuf, got: \" + p);\n}","typeGuard":"static boolean isSupportedOtlpProtocol(String p) {\n    return \"grpc\".equals(p) || \"http/protobuf\".equals(p);\n}","tryCatchPattern":"try {\n    app.start();\n} catch (IllegalStateException e) {\n    if (e.getMessage().contains(\"Unable to install OTLP Exporter\")) {\n        LOG.error(\"Check quarkus.otel.exporter.otlp.logs.protocol (grpc | http/protobuf): \" + e.getCause().getMessage());\n    }\n}","preventionTips":["Use exactly `grpc` or `http/protobuf` for the logs protocol","Don't confuse with upstream OTel values like `http/json`","Verify edits target the `logs.protocol` key, not metrics/traces","Boot-test with the final config profile"],"tags":["opentelemetry","configuration","otlp","logging"],"backgroundTag":"unsupported-protocol-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"}