From 29fdcedbc8266466462c2cf5f4082d439ddcf2b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Barto=C5=A1?= Date: Mon, 15 Dec 2025 10:50:30 +0100 Subject: [PATCH] [OTel] Introduce preview support for OpenTelemetry Logs (#41265) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #41264 Co-authored-by: Ryan Emerson --- .../java/org/keycloak/common/Profile.java | 1 + .../release_notes/topics/26_5_0.adoc | 9 +- .../observability/grafana-otel-lgtm.png | Bin 0 -> 95195 bytes docs/guides/observability/telemetry.adoc | 51 ++++++- docs/guides/server/logging.adoc | 12 +- .../org/keycloak/config/TelemetryOptions.java | 26 ++++ .../mappers/LoggingPropertyMappers.java | 2 +- .../mappers/TelemetryPropertyMappers.java | 47 ++++++- .../quarkus/runtime/cli/PicocliTest.java | 130 +++++++++++++++++- .../TelemetryConfigurationTest.java | 56 ++++++++ .../keycloak/it/cli/dist/LoggingDistTest.java | 10 ++ ...andDistTest.testExportHelpAll.approved.txt | 32 ++++- ...andDistTest.testImportHelpAll.approved.txt | 32 ++++- ...dDistTest.testStartDevHelpAll.approved.txt | 32 ++++- ...mandDistTest.testStartHelpAll.approved.txt | 32 ++++- ...est.testStartOptimizedHelpAll.approved.txt | 28 +++- ...dateCompatibilityCheckHelpAll.approved.txt | 32 ++++- ...eCompatibilityMetadataHelpAll.approved.txt | 32 ++++- 18 files changed, 512 insertions(+), 52 deletions(-) create mode 100644 docs/guides/images/observability/grafana-otel-lgtm.png diff --git a/common/src/main/java/org/keycloak/common/Profile.java b/common/src/main/java/org/keycloak/common/Profile.java index 974d03c572c..29d2b4f702e 100755 --- a/common/src/main/java/org/keycloak/common/Profile.java +++ b/common/src/main/java/org/keycloak/common/Profile.java @@ -130,6 +130,7 @@ public class Profile { OID4VC_VCI("Support for the OID4VCI protocol as part of OID4VC.", Type.EXPERIMENTAL), OPENTELEMETRY("OpenTelemetry support", Type.DEFAULT), + OPENTELEMETRY_LOGS("OpenTelemetry Logs support", Type.PREVIEW, OPENTELEMETRY), DECLARATIVE_UI("declarative ui spi", Type.EXPERIMENTAL), diff --git a/docs/documentation/release_notes/topics/26_5_0.adoc b/docs/documentation/release_notes/topics/26_5_0.adoc index 5bfcf5a04e7..f82e11d4113 100644 --- a/docs/documentation/release_notes/topics/26_5_0.adoc +++ b/docs/documentation/release_notes/topics/26_5_0.adoc @@ -144,7 +144,7 @@ For more details, see the https://www.keycloak.org/server/logging#_adding_contex == New centralized telemetry options -{project_name} now provides centralized telemetry configuration options that can be shared across all telemetry (OpenTelemetry) components - traces, with future support planned for logs and metrics. +{project_name} now provides centralized telemetry configuration options that can be shared across all telemetry (OpenTelemetry) components - traces and logs, with future support planned for metrics. Individual components can override these global settings when needed. New options: `telemetry-endpoint`, `telemetry-protocol`, `telemetry-service-name`, and `telemetry-resource-attributes`. @@ -152,3 +152,10 @@ New options: `telemetry-endpoint`, `telemetry-protocol`, `telemetry-service-name *Deprecation:* The `tracing-service-name` and `tracing-resource-attributes` options are now deprecated in favor of `telemetry-service-name` and `telemetry-resource-attributes`. For more details, see the link:{telemetryguide_link}[{telemetryguide_name}] guide. + +== OpenTelemetry Logs (preview) + +{project_name} now supports exporting logs to OpenTelemetry collectors, enabling centralized log management. +This preview feature allows you to export {project_name} logs to any OpenTelemetry-compatible backend and use the same OpenTelemetry collector for logs and traces. + +For more details, see the link:{telemetryguide_link}[{telemetryguide_name}] guide. diff --git a/docs/guides/images/observability/grafana-otel-lgtm.png b/docs/guides/images/observability/grafana-otel-lgtm.png new file mode 100644 index 0000000000000000000000000000000000000000..e2c802410d04698682c7c8e2697f5750cd2187e9 GIT binary patch literal 95195 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 <#import "/templates/options.adoc" as opts> <#import "/templates/links.adoc" as links> +<#import "/templates/profile.adoc" as profile> +<#import "/templates/features.adoc" as features> <@tmpl.guide title="Centralize your observability stack with OpenTelemetry" @@ -55,11 +57,58 @@ See the https://www.keycloak.org/observability/tracing[Root cause analysis with You can override the global OpenTelemetry settings via the Tracing options if you want to export traces to a different OpenTelemetry collector. -<@opts.printRelevantOptions includedOptions="telemetry-*"> +== Logs + +<@features.techpreview feature="opentelemetry-logs"/> + +NOTE: The OpenTelemetry feature (`opentelemetry`) needs to be turned on (by default). + +It is possible to export {project_name}'s logs to the OpenTelemetry collector and be managed by various logging backends that support OpenTelemetry. + +=== Enable Logs +You can enable OpenTelemetry Logs via CLI as follows: + +<@kc.start parameters="--features=opentelemetry-logs --telemetry-logs-enabled=true"/> + +For more details about OpenTelemetry Logs functionality in Quarkus, see the https://quarkus.io/guides/opentelemetry-logging[Quarkus OpenTelemetry Logging guide]. +For more information on how to set up logging, see the https://www.keycloak.org/server/logging[Configuring Logging guide]. + +=== Log level +By default, all log levels are exported by {project_name}. +You can optionally configure the most verbose log level to be exported via the `telemetry-logs-level` option. + +For example, if you want only to export `WARN` and `ERROR` logs, you can change the log level via the CLI as follows: + +<@kc.start parameters="--telemetry-logs-level=WARN"/> + +<@profile.ifCommunity> + +== Development setup + +For development purposes, you can use the https://github.com/grafana/docker-otel-lgtm[Grafana OTel-LGTM service], containing OpenTelemetry Collector and backends for logs (Loki), metrics (Prometheus), and traces (Tempo). + +.Service architecture +image::observability/grafana-otel-lgtm.png[] + +You can start the service by using Docker/Podman as follows: + +[source,shell] +---- +docker run -p 3000:3000 -p 4317:4317 -p 4318:4318 --rm -ti grafana/otel-lgtm +---- + +Then, you can navigate to Grafana UI by accessing `+localhost:3000+` and then you can explore all the data sent to OpenTelemetry Collector. + + + +<@opts.printRelevantOptions includedOptions="telemetry-*" excludedOptions="telemetry-logs-*"> === Traces <@opts.includeOptions includedOptions="tracing-enabled tracing-endpoint tracing-protocol tracing-service-name tracing-resource-attributes"/> +=== Logs +<@opts.includeOptions includedOptions="telemetry-logs-*"/> + diff --git a/docs/guides/server/logging.adoc b/docs/guides/server/logging.adoc index bb63a910122..b94c64c3963 100644 --- a/docs/guides/server/logging.adoc +++ b/docs/guides/server/logging.adoc @@ -300,7 +300,14 @@ You can use regular expressions to exclude them, such as: In this case, all calls to the `/realms/my-internal-realm/` and subsequent paths will be excluded from the HTTP Access log. -<@opts.printRelevantOptions includedOptions="log log-*" excludedOptions="log-console-* log-file log-file-* log-syslog-* log-mdc*"> +[[logs-export-opentelemetry]] +== Telemetry Logs export (OpenTelemetry) + +It is possible to export OpenTelemetry logs from your deployment to the OpenTelemetry collector for centralized log management. + +For more details, see the link:{telemetryguide_link}[{telemetryguide_name}] guide. + +<@opts.printRelevantOptions includedOptions="log log-*" excludedOptions="log-console-* log-file log-file-* log-syslog-* log-mdc* telemetry-logs-*"> === Console <@opts.includeOptions includedOptions="log-console-*"/> @@ -317,6 +324,9 @@ In this case, all calls to the `/realms/my-internal-realm/` and subsequent paths === Mapped Diagnostic Context (MDC) <@opts.includeOptions includedOptions="log-mdc*"/> +=== Telemetry Logs (OpenTelemetry) +<@opts.includeOptions includedOptions="telemetry-logs-*"/> + diff --git a/quarkus/config-api/src/main/java/org/keycloak/config/TelemetryOptions.java b/quarkus/config-api/src/main/java/org/keycloak/config/TelemetryOptions.java index 4421385e820..559750516b7 100644 --- a/quarkus/config-api/src/main/java/org/keycloak/config/TelemetryOptions.java +++ b/quarkus/config-api/src/main/java/org/keycloak/config/TelemetryOptions.java @@ -33,4 +33,30 @@ public class TelemetryOptions { .category(OptionCategory.TELEMETRY) .description("OpenTelemetry resource attributes characterize the telemetry producer. Values in format 'key1=val1,key2=val2'.") .build(); + + // Telemetry Logs + public static final Option TELEMETRY_LOGS_ENABLED = new OptionBuilder<>("telemetry-logs-enabled", Boolean.class) + .category(OptionCategory.TELEMETRY) + .description("Enables exporting logs to a destination handling telemetry data (OpenTelemetry Logs).") + .defaultValue(Boolean.FALSE) + .buildTime(true) + .build(); + + public static final Option TELEMETRY_LOGS_ENDPOINT = new OptionBuilder<>("telemetry-logs-endpoint", String.class) + .category(OptionCategory.TELEMETRY) + .description("Telemetry (OpenTelemetry) endpoint to export logs to. If not given, the value is inherited from the '%s' option.".formatted(TELEMETRY_ENDPOINT.getKey())) + .build(); + + public static final Option TELEMETRY_LOGS_PROTOCOL = new OptionBuilder<>("telemetry-logs-protocol", String.class) + .category(OptionCategory.TELEMETRY) + .description("Telemetry (OpenTelemetry) protocol used for exporting logs. If not given, the value is inherited from the '%s' option.".formatted(TELEMETRY_PROTOCOL.getKey())) + .expectedValues("grpc", "http/protobuf") + .build(); + + public static final Option TELEMETRY_LOGS_LEVEL = new OptionBuilder<>("telemetry-logs-level", LoggingOptions.Level.class) + .category(OptionCategory.TELEMETRY) + .description("The most verbose log level exported to the telemetry endpoint. For more information, check the Telemetry guide.") + .defaultValue(LoggingOptions.Level.ALL) + .caseInsensitiveExpectedValues(true) + .build(); } diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/LoggingPropertyMappers.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/LoggingPropertyMappers.java index b377fa1f19a..e0b5159bf91 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/LoggingPropertyMappers.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/LoggingPropertyMappers.java @@ -431,7 +431,7 @@ public final class LoggingPropertyMappers implements PropertyMapperGrouping { return LoggingOptions.DEFAULT_LOG_FORMAT; } - private static String upperCase(String value, ConfigSourceInterceptorContext context) { + static String upperCase(String value, ConfigSourceInterceptorContext context) { return value.toUpperCase(Locale.ROOT); } diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/TelemetryPropertyMappers.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/TelemetryPropertyMappers.java index 1f79eab1ffb..0d30f389d46 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/TelemetryPropertyMappers.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/mappers/TelemetryPropertyMappers.java @@ -6,6 +6,7 @@ import java.net.URL; import java.util.List; import org.keycloak.common.Profile; +import org.keycloak.config.TelemetryOptions; import org.keycloak.config.TracingOptions; import org.keycloak.quarkus.runtime.cli.PropertyException; import org.keycloak.quarkus.runtime.configuration.Configuration; @@ -15,6 +16,10 @@ import io.smallrye.config.ConfigSourceInterceptorContext; import static org.keycloak.config.TelemetryOptions.TELEMETRY_ENABLED; import static org.keycloak.config.TelemetryOptions.TELEMETRY_ENDPOINT; +import static org.keycloak.config.TelemetryOptions.TELEMETRY_LOGS_ENABLED; +import static org.keycloak.config.TelemetryOptions.TELEMETRY_LOGS_ENDPOINT; +import static org.keycloak.config.TelemetryOptions.TELEMETRY_LOGS_LEVEL; +import static org.keycloak.config.TelemetryOptions.TELEMETRY_LOGS_PROTOCOL; import static org.keycloak.config.TelemetryOptions.TELEMETRY_PROTOCOL; import static org.keycloak.config.TelemetryOptions.TELEMETRY_RESOURCE_ATTRIBUTES; import static org.keycloak.config.TelemetryOptions.TELEMETRY_SERVICE_NAME; @@ -22,13 +27,15 @@ import static org.keycloak.quarkus.runtime.configuration.mappers.PropertyMapper. public class TelemetryPropertyMappers implements PropertyMapperGrouping{ private static final String OTEL_FEATURE_ENABLED_MSG = "'opentelemetry' feature is enabled"; - private static final String OTEL_COLLECTOR_ENABLED_MSG = "any of available OpenTelemetry components (Traces) is turned on"; + private static final String OTEL_COLLECTOR_ENABLED_MSG = "any of available OpenTelemetry components (Logs, Traces) is turned on"; + private static final String OTEL_LOGS_FEATURE_ENABLED_MSG = "feature '%s' is enabled".formatted(Profile.Feature.OPENTELEMETRY_LOGS.getVersionedKey()); + private static final String OTEL_LOGS_ENABLED_MSG = "Telemetry Logs functionality ('%s') is enabled".formatted(TELEMETRY_LOGS_ENABLED.getKey()); @Override public List> getPropertyMappers() { return List.of( fromOption(TELEMETRY_ENABLED) - .isEnabled(TelemetryPropertyMappers::isFeatureEnabled, OTEL_FEATURE_ENABLED_MSG) + .isEnabled(TelemetryPropertyMappers::isOtelFeatureEnabled, OTEL_FEATURE_ENABLED_MSG) .transformer(TelemetryPropertyMappers::checkIfDependantsAreEnabled) .to("quarkus.otel.enabled") .build(), @@ -54,25 +61,57 @@ public class TelemetryPropertyMappers implements PropertyMapperGrouping{ .isEnabled(TelemetryPropertyMappers::isTelemetryEnabled, OTEL_COLLECTOR_ENABLED_MSG) .to("quarkus.otel.resource.attributes") .paramLabel("attributes") + .build(), + // Telemetry Logs + fromOption(TELEMETRY_LOGS_ENABLED) + .isEnabled(TelemetryPropertyMappers::isOtelLogsFeatureEnabled, OTEL_LOGS_FEATURE_ENABLED_MSG) + .to("quarkus.otel.logs.enabled") + .build(), + fromOption(TELEMETRY_LOGS_ENDPOINT) + .isEnabled(TelemetryPropertyMappers::isTelemetryLogsEnabled, OTEL_LOGS_ENABLED_MSG) + .mapFrom(TelemetryOptions.TELEMETRY_ENDPOINT) + .to("quarkus.otel.exporter.otlp.logs.endpoint") + .validator(TelemetryPropertyMappers::validateEndpoint) + .paramLabel("url") + .build(), + fromOption(TELEMETRY_LOGS_PROTOCOL) + .isEnabled(TelemetryPropertyMappers::isTelemetryLogsEnabled, OTEL_LOGS_ENABLED_MSG) + .mapFrom(TelemetryOptions.TELEMETRY_PROTOCOL) + .to("quarkus.otel.exporter.otlp.logs.protocol") + .paramLabel("protocol") + .build(), + fromOption(TELEMETRY_LOGS_LEVEL) + .isEnabled(TelemetryPropertyMappers::isTelemetryLogsEnabled, OTEL_LOGS_ENABLED_MSG) + .to("quarkus.otel.logs.level") + .paramLabel("level") + .transformer(LoggingPropertyMappers::upperCase) .build() ); } private static String checkIfDependantsAreEnabled(String value, ConfigSourceInterceptorContext context) { - if (Configuration.isTrue(TracingOptions.TRACING_ENABLED)) { + if (TelemetryPropertyMappers.isTelemetryLogsEnabled() || TracingPropertyMappers.isTracingEnabled()) { return Boolean.TRUE.toString(); } return Boolean.FALSE.toString(); } - private static boolean isFeatureEnabled() { + private static boolean isOtelFeatureEnabled() { return Profile.isFeatureEnabled(Profile.Feature.OPENTELEMETRY); } + public static boolean isOtelLogsFeatureEnabled() { + return Profile.isFeatureEnabled(Profile.Feature.OPENTELEMETRY_LOGS); + } + public static boolean isTelemetryEnabled() { return Configuration.isTrue("quarkus.otel.enabled"); } + public static boolean isTelemetryLogsEnabled() { + return Configuration.isTrue("quarkus.otel.logs.enabled"); + } + static void validateEndpoint(String value) { if (StringUtil.isBlank(value)) { throw new PropertyException("Specified Endpoint URL must not be empty."); diff --git a/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/cli/PicocliTest.java b/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/cli/PicocliTest.java index 0731748814e..235add8a536 100644 --- a/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/cli/PicocliTest.java +++ b/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/cli/PicocliTest.java @@ -1266,7 +1266,7 @@ public class PicocliTest extends AbstractConfigurationTest { assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); assertThat(nonRunningPicocli.getErrString(), anyOf( containsString("Disabled option: '--tracing-service-name'. Available only when Tracing is enabled"), - containsString("Disabled option: '--telemetry-service-name'. Available only when any of available OpenTelemetry components (Traces) is turned on") + containsString("Disabled option: '--telemetry-service-name'. Available only when any of available OpenTelemetry components (Logs, Traces) is turned on") )); assertThat(nonRunningPicocli.config.getConfigValue("quarkus.otel.enabled").getValue(), is("false")); assertThat(nonRunningPicocli.config.getConfigValue("quarkus.otel.traces.enabled").getValue(), is("false")); @@ -1276,7 +1276,7 @@ public class PicocliTest extends AbstractConfigurationTest { // disabled tracing nonRunningPicocli = pseudoLaunch("start-dev", "--telemetry-service-name=service123"); assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); - assertThat(nonRunningPicocli.getErrString(), containsString("Disabled option: '--telemetry-service-name'. Available only when any of available OpenTelemetry components (Traces) is turned on")); + assertThat(nonRunningPicocli.getErrString(), containsString("Disabled option: '--telemetry-service-name'. Available only when any of available OpenTelemetry components (Logs, Traces) is turned on")); assertThat(nonRunningPicocli.config.getConfigValue("quarkus.otel.enabled").getValue(), is("false")); assertThat(nonRunningPicocli.config.getConfigValue("quarkus.otel.traces.enabled").getValue(), is("false")); assertThat(nonRunningPicocli.config.getConfigValue("quarkus.otel.service.name").getValue(), is(nullValue())); @@ -1370,4 +1370,130 @@ public class PicocliTest extends AbstractConfigurationTest { assertThat(nonRunningPicocli.config.getConfigValue("quarkus.otel.exporter.otlp.endpoint").getValue(), is("http://keycloak-keycloak-keycloak.org:3455")); // value inherited assertThat(nonRunningPicocli.config.getConfigValue("quarkus.otel.exporter.otlp.traces.endpoint").getValue(), is("http://keycloak-keycloak-keycloak.org:3455")); // value inherited } + + @Test + public void otelLogs() { + // parent feature disabled + NonRunningPicocli nonRunningPicocli = pseudoLaunch("start-dev", "--feature-opentelemetry=disabled", "--feature-opentelemetry-logs=enabled"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("ERROR: Feature opentelemetry-logs depends on disabled feature opentelemetry")); + onAfter(); + + // feature disabled + nonRunningPicocli = pseudoLaunch("start-dev", "--telemetry-logs-enabled=true"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("Disabled option: '--telemetry-logs-enabled'. Available only when feature 'opentelemetry-logs:v1' is enabled")); + onAfter(); + + // export disabled + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=false", "--telemetry-logs-protocol=http/protobuf"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("Disabled option: '--telemetry-logs-protocol'. Available only when Telemetry Logs functionality ('telemetry-logs-enabled') is enabled")); + onAfter(); + + // check enabled + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.logs.enabled", "true" + )); + onAfter(); + + // multiple components enabled + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true", "--tracing-enabled=false"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.logs.enabled", "true", + "quarkus.otel.traces.enabled", "false" + )); + onAfter(); + + // wrong protocol + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true", "--telemetry-logs-protocol=wrong"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("Invalid value for option '--telemetry-logs-protocol': wrong. Expected values are: grpc, http/protobuf")); + onAfter(); + + // otel protocol + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true", "--telemetry-logs-protocol=http/protobuf"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.exporter.otlp.logs.protocol", "http/protobuf" + )); + onAfter(); + + // parent + child protocol + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true", "--telemetry-logs-protocol=http/protobuf", "--telemetry-protocol=grpc"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.exporter.otlp.protocol", "grpc", + "quarkus.otel.exporter.otlp.logs.protocol", "http/protobuf" + )); + onAfter(); + + // parent protocol + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true", "--telemetry-protocol=http/protobuf"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.exporter.otlp.protocol", "http/protobuf", + "quarkus.otel.exporter.otlp.logs.protocol", "http/protobuf" + )); + onAfter(); + + // wrong parent endpoint + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true", "--telemetry-endpoint=not-url"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("Specified Endpoint URL is invalid")); + onAfter(); + + // wrong endpoint + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true", "--telemetry-logs-endpoint=not-url"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("Specified Endpoint URL is invalid")); + onAfter(); + + // otel endpoint + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true", "--telemetry-logs-endpoint=http://keycloak.org"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig("quarkus.otel.exporter.otlp.logs.endpoint", "http://keycloak.org"); + onAfter(); + + // parent + child endpoint + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true", "--telemetry-endpoint=http://keycloak-keycloak-keycloak.org:3455", "--telemetry-logs-endpoint=http://keycloak.org"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig(Map.of( + "quarkus.otel.exporter.otlp.endpoint", "http://keycloak-keycloak-keycloak.org:3455", + "quarkus.otel.exporter.otlp.logs.endpoint", "http://keycloak.org" + )); + onAfter(); + + // parent endpoint + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true", "--telemetry-endpoint=http://keycloak-keycloak-keycloak.org:3455"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig(Map.of( + "quarkus.otel.exporter.otlp.endpoint", "http://keycloak-keycloak-keycloak.org:3455", + "quarkus.otel.exporter.otlp.logs.endpoint", "http://keycloak-keycloak-keycloak.org:3455" + )); + onAfter(); + + // wrong level + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true", "--telemetry-logs-level=wrong"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("Invalid value for option '--telemetry-logs-level': wrong. Expected values are (case insensitive): off, fatal, error, warn, info, debug, trace, all")); + onAfter(); + + // level + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true", "--telemetry-logs-level=debug"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.logs.enabled", "true", + "quarkus.otel.logs.level", "DEBUG" + )); + } } diff --git a/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/TelemetryConfigurationTest.java b/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/TelemetryConfigurationTest.java index 23cf561039b..3bf8d672fb1 100644 --- a/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/TelemetryConfigurationTest.java +++ b/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/TelemetryConfigurationTest.java @@ -68,4 +68,60 @@ public class TelemetryConfigurationTest extends AbstractConfigurationTest { "quarkus.otel.resource.attributes", "val3=hello3" )); } + + @Test + public void logsDefault() { + initConfig(); + + assertConfig(Map.of( + "telemetry-logs-enabled", "false", + "telemetry-logs-endpoint", "http://localhost:4317", + "telemetry-logs-protocol", "grpc", + "telemetry-logs-level", "all" + )); + + assertExternalConfig(Map.of( + "quarkus.otel.logs.enabled", "false", + "quarkus.otel.enabled", "false", + "quarkus.otel.exporter.otlp.logs.endpoint", "http://localhost:4317", + "quarkus.otel.exporter.otlp.logs.protocol", "grpc", + "quarkus.otel.logs.level","ALL" + )); + } + + @Test + public void logsPriority() { + ConfigArgsConfigSource.setCliArgs("--features=opentelemetry-logs", "--telemetry-logs-enabled=true", "--telemetry-logs-endpoint=localhost:2000", "--telemetry-logs-protocol=http/protobuf", "--telemetry-logs-level=warn"); + initConfig(); + assertConfig(Map.of( + "telemetry-logs-enabled", "true", + "telemetry-logs-endpoint", "localhost:2000", + "telemetry-logs-protocol", "http/protobuf", + "telemetry-logs-level", "warn" + )); + assertExternalConfig(Map.of( + "quarkus.otel.logs.enabled", "true", + "quarkus.otel.enabled", "true", + "quarkus.otel.exporter.otlp.logs.endpoint", "localhost:2000", + "quarkus.otel.exporter.otlp.logs.protocol", "http/protobuf", + "quarkus.otel.logs.level","WARN" + )); + onAfter(); + + ConfigArgsConfigSource.setCliArgs("--features=opentelemetry-logs", "--telemetry-endpoint=http://keycloak.org:1234", "--telemetry-protocol=grpc", "--telemetry-logs-enabled=true", "--telemetry-logs-endpoint=my-domain:2001", "--telemetry-logs-protocol=http/protobuf"); + initConfig(); + assertConfig(Map.of( + "telemetry-logs-enabled", "true", + "telemetry-logs-endpoint", "my-domain:2001", + "telemetry-logs-protocol", "http/protobuf", + "telemetry-endpoint", "http://keycloak.org:1234", + "telemetry-protocol", "grpc" + )); + assertExternalConfig(Map.of( + "quarkus.otel.logs.enabled", "true", + "quarkus.otel.enabled", "true", + "quarkus.otel.exporter.otlp.logs.endpoint", "my-domain:2001", + "quarkus.otel.exporter.otlp.logs.protocol", "http/protobuf" + )); + } } diff --git a/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/LoggingDistTest.java b/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/LoggingDistTest.java index 26c1ae6587e..7a0e242ba9a 100644 --- a/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/LoggingDistTest.java +++ b/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/LoggingDistTest.java @@ -303,4 +303,14 @@ public class LoggingDistTest { .statusCode(200); cliResult.assertNoMessage("http://127.0.0.1:8080/realms/master/clients/account/redirect"); } + + // Telemetry Logs + @Test + @Launch({"start-dev", "--feature-opentelemetry-logs=enabled", "--telemetry-logs-enabled=true", "--log-level=io.opentelemetry:fine"}) + void telemetryLogsEnabled(CLIResult cliResult) { + cliResult.assertStartedDevMode(); + cliResult.assertMessage("opentelemetry"); + cliResult.assertMessage("service.name=\"keycloak\""); + cliResult.assertMessage("Failed to export LogsRequestMarshaler."); + } } diff --git a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testExportHelpAll.approved.txt b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testExportHelpAll.approved.txt index 39804f0875c..ed5651ec9cc 100644 --- a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testExportHelpAll.approved.txt +++ b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testExportHelpAll.approved.txt @@ -313,21 +313,41 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Traces) is - turned on. + Available only when any of available OpenTelemetry components (Logs, Traces) + is turned on. +--telemetry-logs-enabled + Enables exporting logs to a destination handling telemetry data (OpenTelemetry + Logs). Default: false. Available only when feature 'opentelemetry-logs:v1' + is enabled. +--telemetry-logs-endpoint + Telemetry (OpenTelemetry) endpoint to export logs to. If not given, the value + is inherited from the 'telemetry-endpoint' option. Available only when + Telemetry Logs functionality ('telemetry-logs-enabled') is enabled. +--telemetry-logs-level + The most verbose log level exported to the telemetry endpoint. For more + information, check the Telemetry guide. Possible values are (case + insensitive): off, fatal, error, warn, info, debug, trace, all. Default: + all. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. +--telemetry-logs-protocol + Telemetry (OpenTelemetry) protocol used for exporting logs. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. --telemetry-protocol OpenTelemetry protocol used for the communication between server and OpenTelemetry collector. Possible values are: grpc, http/protobuf. Default: - grpc. Available only when any of available OpenTelemetry components (Traces) - is turned on. + grpc. Available only when any of available OpenTelemetry components (Logs, + Traces) is turned on. --telemetry-resource-attributes OpenTelemetry resource attributes characterize the telemetry producer. Values in format 'key1=val1,key2=val2'. Available only when any of available - OpenTelemetry components (Traces) is turned on. + OpenTelemetry components (Logs, Traces) is turned on. --telemetry-service-name OpenTelemetry service name. Takes precedence over 'service.name' defined in the 'telemetry-resource-attributes' property. Default: keycloak. Available - only when any of available OpenTelemetry components (Traces) is turned on. + only when any of available OpenTelemetry components (Logs, Traces) is turned + on. Tracing: diff --git a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testImportHelpAll.approved.txt b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testImportHelpAll.approved.txt index 14863b9a37c..d2d54a11a6e 100644 --- a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testImportHelpAll.approved.txt +++ b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testImportHelpAll.approved.txt @@ -313,21 +313,41 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Traces) is - turned on. + Available only when any of available OpenTelemetry components (Logs, Traces) + is turned on. +--telemetry-logs-enabled + Enables exporting logs to a destination handling telemetry data (OpenTelemetry + Logs). Default: false. Available only when feature 'opentelemetry-logs:v1' + is enabled. +--telemetry-logs-endpoint + Telemetry (OpenTelemetry) endpoint to export logs to. If not given, the value + is inherited from the 'telemetry-endpoint' option. Available only when + Telemetry Logs functionality ('telemetry-logs-enabled') is enabled. +--telemetry-logs-level + The most verbose log level exported to the telemetry endpoint. For more + information, check the Telemetry guide. Possible values are (case + insensitive): off, fatal, error, warn, info, debug, trace, all. Default: + all. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. +--telemetry-logs-protocol + Telemetry (OpenTelemetry) protocol used for exporting logs. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. --telemetry-protocol OpenTelemetry protocol used for the communication between server and OpenTelemetry collector. Possible values are: grpc, http/protobuf. Default: - grpc. Available only when any of available OpenTelemetry components (Traces) - is turned on. + grpc. Available only when any of available OpenTelemetry components (Logs, + Traces) is turned on. --telemetry-resource-attributes OpenTelemetry resource attributes characterize the telemetry producer. Values in format 'key1=val1,key2=val2'. Available only when any of available - OpenTelemetry components (Traces) is turned on. + OpenTelemetry components (Logs, Traces) is turned on. --telemetry-service-name OpenTelemetry service name. Takes precedence over 'service.name' defined in the 'telemetry-resource-attributes' property. Default: keycloak. Available - only when any of available OpenTelemetry components (Traces) is turned on. + only when any of available OpenTelemetry components (Logs, Traces) is turned + on. Tracing: diff --git a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testStartDevHelpAll.approved.txt b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testStartDevHelpAll.approved.txt index dc9842c42d8..1c2c3129321 100644 --- a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testStartDevHelpAll.approved.txt +++ b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testStartDevHelpAll.approved.txt @@ -640,21 +640,41 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Traces) is - turned on. + Available only when any of available OpenTelemetry components (Logs, Traces) + is turned on. +--telemetry-logs-enabled + Enables exporting logs to a destination handling telemetry data (OpenTelemetry + Logs). Default: false. Available only when feature 'opentelemetry-logs:v1' + is enabled. +--telemetry-logs-endpoint + Telemetry (OpenTelemetry) endpoint to export logs to. If not given, the value + is inherited from the 'telemetry-endpoint' option. Available only when + Telemetry Logs functionality ('telemetry-logs-enabled') is enabled. +--telemetry-logs-level + The most verbose log level exported to the telemetry endpoint. For more + information, check the Telemetry guide. Possible values are (case + insensitive): off, fatal, error, warn, info, debug, trace, all. Default: + all. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. +--telemetry-logs-protocol + Telemetry (OpenTelemetry) protocol used for exporting logs. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. --telemetry-protocol OpenTelemetry protocol used for the communication between server and OpenTelemetry collector. Possible values are: grpc, http/protobuf. Default: - grpc. Available only when any of available OpenTelemetry components (Traces) - is turned on. + grpc. Available only when any of available OpenTelemetry components (Logs, + Traces) is turned on. --telemetry-resource-attributes OpenTelemetry resource attributes characterize the telemetry producer. Values in format 'key1=val1,key2=val2'. Available only when any of available - OpenTelemetry components (Traces) is turned on. + OpenTelemetry components (Logs, Traces) is turned on. --telemetry-service-name OpenTelemetry service name. Takes precedence over 'service.name' defined in the 'telemetry-resource-attributes' property. Default: keycloak. Available - only when any of available OpenTelemetry components (Traces) is turned on. + only when any of available OpenTelemetry components (Logs, Traces) is turned + on. Tracing: diff --git a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testStartHelpAll.approved.txt b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testStartHelpAll.approved.txt index 02de71b5a3d..740dfb0177b 100644 --- a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testStartHelpAll.approved.txt +++ b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testStartHelpAll.approved.txt @@ -641,21 +641,41 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Traces) is - turned on. + Available only when any of available OpenTelemetry components (Logs, Traces) + is turned on. +--telemetry-logs-enabled + Enables exporting logs to a destination handling telemetry data (OpenTelemetry + Logs). Default: false. Available only when feature 'opentelemetry-logs:v1' + is enabled. +--telemetry-logs-endpoint + Telemetry (OpenTelemetry) endpoint to export logs to. If not given, the value + is inherited from the 'telemetry-endpoint' option. Available only when + Telemetry Logs functionality ('telemetry-logs-enabled') is enabled. +--telemetry-logs-level + The most verbose log level exported to the telemetry endpoint. For more + information, check the Telemetry guide. Possible values are (case + insensitive): off, fatal, error, warn, info, debug, trace, all. Default: + all. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. +--telemetry-logs-protocol + Telemetry (OpenTelemetry) protocol used for exporting logs. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. --telemetry-protocol OpenTelemetry protocol used for the communication between server and OpenTelemetry collector. Possible values are: grpc, http/protobuf. Default: - grpc. Available only when any of available OpenTelemetry components (Traces) - is turned on. + grpc. Available only when any of available OpenTelemetry components (Logs, + Traces) is turned on. --telemetry-resource-attributes OpenTelemetry resource attributes characterize the telemetry producer. Values in format 'key1=val1,key2=val2'. Available only when any of available - OpenTelemetry components (Traces) is turned on. + OpenTelemetry components (Logs, Traces) is turned on. --telemetry-service-name OpenTelemetry service name. Takes precedence over 'service.name' defined in the 'telemetry-resource-attributes' property. Default: keycloak. Available - only when any of available OpenTelemetry components (Traces) is turned on. + only when any of available OpenTelemetry components (Logs, Traces) is turned + on. Tracing: diff --git a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testStartOptimizedHelpAll.approved.txt b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testStartOptimizedHelpAll.approved.txt index 239819af9fe..b49584b0648 100644 --- a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testStartOptimizedHelpAll.approved.txt +++ b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testStartOptimizedHelpAll.approved.txt @@ -567,21 +567,37 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Traces) is - turned on. + Available only when any of available OpenTelemetry components (Logs, Traces) + is turned on. +--telemetry-logs-endpoint + Telemetry (OpenTelemetry) endpoint to export logs to. If not given, the value + is inherited from the 'telemetry-endpoint' option. Available only when + Telemetry Logs functionality ('telemetry-logs-enabled') is enabled. +--telemetry-logs-level + The most verbose log level exported to the telemetry endpoint. For more + information, check the Telemetry guide. Possible values are (case + insensitive): off, fatal, error, warn, info, debug, trace, all. Default: + all. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. +--telemetry-logs-protocol + Telemetry (OpenTelemetry) protocol used for exporting logs. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. --telemetry-protocol OpenTelemetry protocol used for the communication between server and OpenTelemetry collector. Possible values are: grpc, http/protobuf. Default: - grpc. Available only when any of available OpenTelemetry components (Traces) - is turned on. + grpc. Available only when any of available OpenTelemetry components (Logs, + Traces) is turned on. --telemetry-resource-attributes OpenTelemetry resource attributes characterize the telemetry producer. Values in format 'key1=val1,key2=val2'. Available only when any of available - OpenTelemetry components (Traces) is turned on. + OpenTelemetry components (Logs, Traces) is turned on. --telemetry-service-name OpenTelemetry service name. Takes precedence over 'service.name' defined in the 'telemetry-resource-attributes' property. Default: keycloak. Available - only when any of available OpenTelemetry components (Traces) is turned on. + only when any of available OpenTelemetry components (Logs, Traces) is turned + on. Tracing: diff --git a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testUpdateCompatibilityCheckHelpAll.approved.txt b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testUpdateCompatibilityCheckHelpAll.approved.txt index f6229b70625..17167f5d16d 100644 --- a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testUpdateCompatibilityCheckHelpAll.approved.txt +++ b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testUpdateCompatibilityCheckHelpAll.approved.txt @@ -640,21 +640,41 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Traces) is - turned on. + Available only when any of available OpenTelemetry components (Logs, Traces) + is turned on. +--telemetry-logs-enabled + Enables exporting logs to a destination handling telemetry data (OpenTelemetry + Logs). Default: false. Available only when feature 'opentelemetry-logs:v1' + is enabled. +--telemetry-logs-endpoint + Telemetry (OpenTelemetry) endpoint to export logs to. If not given, the value + is inherited from the 'telemetry-endpoint' option. Available only when + Telemetry Logs functionality ('telemetry-logs-enabled') is enabled. +--telemetry-logs-level + The most verbose log level exported to the telemetry endpoint. For more + information, check the Telemetry guide. Possible values are (case + insensitive): off, fatal, error, warn, info, debug, trace, all. Default: + all. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. +--telemetry-logs-protocol + Telemetry (OpenTelemetry) protocol used for exporting logs. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. --telemetry-protocol OpenTelemetry protocol used for the communication between server and OpenTelemetry collector. Possible values are: grpc, http/protobuf. Default: - grpc. Available only when any of available OpenTelemetry components (Traces) - is turned on. + grpc. Available only when any of available OpenTelemetry components (Logs, + Traces) is turned on. --telemetry-resource-attributes OpenTelemetry resource attributes characterize the telemetry producer. Values in format 'key1=val1,key2=val2'. Available only when any of available - OpenTelemetry components (Traces) is turned on. + OpenTelemetry components (Logs, Traces) is turned on. --telemetry-service-name OpenTelemetry service name. Takes precedence over 'service.name' defined in the 'telemetry-resource-attributes' property. Default: keycloak. Available - only when any of available OpenTelemetry components (Traces) is turned on. + only when any of available OpenTelemetry components (Logs, Traces) is turned + on. Tracing: diff --git a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testUpdateCompatibilityMetadataHelpAll.approved.txt b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testUpdateCompatibilityMetadataHelpAll.approved.txt index b72405826d2..de6299ec503 100644 --- a/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testUpdateCompatibilityMetadataHelpAll.approved.txt +++ b/quarkus/tests/integration/src/test/resources/org/keycloak/it/cli/dist/approvals/cli/help/HelpCommandDistTest.testUpdateCompatibilityMetadataHelpAll.approved.txt @@ -638,21 +638,41 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Traces) is - turned on. + Available only when any of available OpenTelemetry components (Logs, Traces) + is turned on. +--telemetry-logs-enabled + Enables exporting logs to a destination handling telemetry data (OpenTelemetry + Logs). Default: false. Available only when feature 'opentelemetry-logs:v1' + is enabled. +--telemetry-logs-endpoint + Telemetry (OpenTelemetry) endpoint to export logs to. If not given, the value + is inherited from the 'telemetry-endpoint' option. Available only when + Telemetry Logs functionality ('telemetry-logs-enabled') is enabled. +--telemetry-logs-level + The most verbose log level exported to the telemetry endpoint. For more + information, check the Telemetry guide. Possible values are (case + insensitive): off, fatal, error, warn, info, debug, trace, all. Default: + all. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. +--telemetry-logs-protocol + Telemetry (OpenTelemetry) protocol used for exporting logs. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when Telemetry Logs functionality + ('telemetry-logs-enabled') is enabled. --telemetry-protocol OpenTelemetry protocol used for the communication between server and OpenTelemetry collector. Possible values are: grpc, http/protobuf. Default: - grpc. Available only when any of available OpenTelemetry components (Traces) - is turned on. + grpc. Available only when any of available OpenTelemetry components (Logs, + Traces) is turned on. --telemetry-resource-attributes OpenTelemetry resource attributes characterize the telemetry producer. Values in format 'key1=val1,key2=val2'. Available only when any of available - OpenTelemetry components (Traces) is turned on. + OpenTelemetry components (Logs, Traces) is turned on. --telemetry-service-name OpenTelemetry service name. Takes precedence over 'service.name' defined in the 'telemetry-resource-attributes' property. Default: keycloak. Available - only when any of available OpenTelemetry components (Traces) is turned on. + only when any of available OpenTelemetry components (Logs, Traces) is turned + on. Tracing: