quarkusio/quarkus · error · IllegalStateException

No OTLP protocol specified. Please check `quarkus.otel.expor

Error message

No OTLP protocol specified. Please check `quarkus.otel.exporter.otlp.logs.protocol` property

What it means

Before creating the OTLP log record exporter, Quarkus requires an explicit protocol via `quarkus.otel.exporter.otlp.logs.protocol`. If the property is absent or empty, the recorder throws IllegalStateException because it cannot decide between the gRPC and HTTP senders. Unlike an unsupported value, this means nothing was configured at all.

Source

Thrown at extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/exporter/otlp/OTelExporterRecorder.java:279

        final URI baseUri = getLogsUri(exporterRuntimeConfig.getValue());

        return new Function<>() {
            @Override
            public LogRecordExporter apply(SyntheticCreationalContext<LogRecordExporter> context) {

                if (runtimeConfig.getValue().sdkDisabled() || baseUri == null) {
                    return NoopLogRecordExporter.INSTANCE;
                }

                MemoryMode memoryMode = exporterRuntimeConfig.getValue().memoryMode();
                LogRecordExporter logRecordExporter;

                try {
                    TlsConfigurationRegistry tlsConfigurationRegistry = context
                            .getInjectedReference(TlsConfigurationRegistry.class);
                    OtlpExporterLogsConfig logsConfig = exporterRuntimeConfig.getValue().logs();
                    if (logsConfig.protocol().isEmpty()) {
                        throw new IllegalStateException("No OTLP protocol specified. " +
                                "Please check `quarkus.otel.exporter.otlp.logs.protocol` property");
                    }

                    String protocol = logsConfig.protocol().get();
                    if (GRPC.equals(protocol)) {
                        logRecordExporter = new VertxGrpcLogRecordExporter(
                                new GrpcExporter(
                                        new VertxGrpcSender(
                                                baseUri,
                                                VertxGrpcSender.GRPC_LOG_SERVICE_NAME,
                                                determineCompression(logsConfig),
                                                logsConfig.timeout(),
                                                populateTracingExportHttpHeaders(logsConfig),
                                                new HttpClientOptionsConsumer(logsConfig, baseUri, tlsConfigurationRegistry),
                                                vertx.get()),
                                        InternalTelemetryVersion.LATEST,
                                        ComponentId.generateLazy(
                                                StandardComponentId.ExporterType.OTLP_GRPC_LOG_EXPORTER), // use the same as OTel does

View on GitHub (pinned to e1c734241f)

Solutions

  1. Set `quarkus.otel.exporter.otlp.logs.protocol=http/protobuf`
  2. Or set it to `grpc` if your collector endpoint speaks gRPC
  3. If logs export is not wanted, disable it so no protocol is required

Example fix

# before
# (no logs protocol configured)
# after
quarkus.otel.exporter.otlp.logs.protocol=http/protobuf
Defensive patterns

Strategy: validation

Validate before calling

java.util.Optional<String> p = ConfigProvider.getConfig().getOptionalValue("quarkus.otel.exporter.otlp.logs.protocol", String.class);
if (p.isEmpty()) throw new IllegalStateException("Set quarkus.otel.exporter.otlp.logs.protocol (grpc | http/protobuf)");

Type guard

static boolean logsProtocolConfigured(java.util.Optional<String> p) {
    return p != null && p.isPresent() && !p.get().isBlank();
}

Try / catch

try {
    app.start();
} catch (IllegalStateException e) {
    if (String.valueOf(e.getMessage()).contains("No OTLP protocol specified")) {
        LOG.error("Add quarkus.otel.exporter.otlp.logs.protocol=http/protobuf");
    }
}

Prevention

When it happens

Trigger: OTLP log export is enabled but `quarkus.otel.exporter.otlp.logs.protocol` is not set (or set to empty) in configuration.

Common situations: Adding the OpenTelemetry extension and enabling logs without completing the exporter config; migrating config where the logs protocol was omitted while the metrics/traces protocol existed; assuming a default that does not exist.

Understand the failure class

Background: "X is required", "must be set", "cannot be empty": the missing-required-config error family, from Vertex AI project/location to WeChat keys — this error's family across 18 libraries.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/a3d0a27cc2cce80b. Report an issue: GitHub.