{"record":{"id":"dcdb9c30c3791fcc","repo":"quarkusio/quarkus","slug":"unsupported-otlp-protocol-s-specified-please-che-dcdb9c","errorCode":null,"errorMessage":"Unsupported OTLP protocol %s specified. Please check `quarkus.otel.exporter.otlp.metrics.protocol` property","messagePattern":"Unsupported OTLP protocol (.+?) specified\\. Please check `quarkus\\.otel\\.exporter\\.otlp\\.metrics\\.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":247,"sourceCode":"                                                StandardComponentId.ExporterType.OTLP_HTTP_METRIC_EXPORTER),\n                                        new VertxHttpSender(\n                                                baseUri,\n                                                VertxHttpSender.METRICS_PATH,\n                                                determineCompression(metricsConfig),\n                                                metricsConfig.timeout(),\n                                                populateTracingExportHttpHeaders(metricsConfig),\n                                                exportAsJson ? \"application/json\" : \"application/x-protobuf\",\n                                                new HttpClientOptionsConsumer(metricsConfig, baseUri, tlsConfigurationRegistry),\n                                                vertx.get()),\n                                        MeterProvider::noop,\n                                        InternalTelemetryVersion.LATEST,\n                                        baseUri,\n                                        false),\n                                aggregationTemporalityResolver(metricsConfig),\n                                aggregationResolver(metricsConfig),\n                                memoryMode);\n                    } else {\n                        throw new IllegalArgumentException(String.format(\"Unsupported OTLP protocol %s specified. \" +\n                                \"Please check `quarkus.otel.exporter.otlp.metrics.protocol` property\", protocol));\n                    }\n\n                } catch (IllegalArgumentException iae) {\n                    throw new IllegalStateException(\"Unable to install OTLP Exporter\", iae);\n                }\n                return metricExporter;\n            }\n        };\n    }\n\n    public Function<SyntheticCreationalContext<LogRecordExporter>, LogRecordExporter> createLogRecordExporter(\n            Supplier<Vertx> vertx) {\n        final URI baseUri = getLogsUri(exporterRuntimeConfig.getValue());\n\n        return new Function<>() {\n            @Override\n            public LogRecordExporter apply(SyntheticCreationalContext<LogRecordExporter> context) {","sourceCodeStart":229,"sourceCodeEnd":265,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/exporter/otlp/OTelExporterRecorder.java#L229-L265","documentation":"When the OpenTelemetry metrics exporter is created, Quarkus checks the `quarkus.otel.exporter.otlp.metrics.protocol` value against the supported protocols. Only `grpc` and `http/protobuf` are supported; any other value makes the recorder throw an IllegalArgumentException, which is immediately wrapped into 'Unable to install OTLP Exporter' IllegalStateException. This fails fast during OTel setup so no exporter is installed with a broken protocol.","triggerScenarios":"Setting `quarkus.otel.exporter.otlp.metrics.protocol` to a value other than `grpc` or `http/protobuf` (e.g. `http/json`, `https`, `otlp`, or a typo like `htt/protobuf`) while OTLP metrics export is enabled.","commonSituations":"Copying config from OTel Collector docs that mention `http/json`; typos in application.properties; values that look valid in other OTel SDKs; environment-specific config drift between dev and prod.","solutions":["Set `quarkus.otel.exporter.otlp.metrics.protocol=http/protobuf` (recommended default)","Or set it to `grpc` if using the gRPC exporter","Check for typos and case; allowed values are exactly `grpc` and `http/protobuf`","If you don't need OTLP metrics, disable the exporter (`quarkus.otel.metrics.enabled=false`) rather than leaving a broken protocol"],"exampleFix":"# before\nquarkus.otel.exporter.otlp.metrics.protocol=http/json\n# after\nquarkus.otel.exporter.otlp.metrics.protocol=http/protobuf","handlingStrategy":"validation","validationCode":"String p = ConfigProvider.getConfig().getValue(\"quarkus.otel.exporter.otlp.metrics.protocol\", String.class);\nif (!\"grpc\".equals(p) && !\"http/protobuf\".equals(p)) {\n    throw new IllegalArgumentException(\"quarkus.otel.exporter.otlp.metrics.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    // trigger OTel init / app startup\n} catch (IllegalStateException e) {\n    if (e.getMessage().contains(\"Unable to install OTLP Exporter\")) {\n        LOG.error(\"Fix quarkus.otel.exporter.otlp.metrics.protocol (grpc | http/protobuf)\", e);\n    }\n}","preventionTips":["Only use `grpc` or `http/protobuf` — the documented supported values","Never copy `http/json` from generic OTel docs into Quarkus config","Add a startup smoke test that boots the app with production config","Keep exporter config in one profile-tested property block"],"tags":["opentelemetry","configuration","otlp","metrics"],"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-12T22:17:10.623Z"}