diff --git a/common/src/main/java/org/keycloak/common/Profile.java b/common/src/main/java/org/keycloak/common/Profile.java index 29d2b4f702e..8e141056582 100755 --- a/common/src/main/java/org/keycloak/common/Profile.java +++ b/common/src/main/java/org/keycloak/common/Profile.java @@ -131,6 +131,7 @@ public class Profile { OPENTELEMETRY("OpenTelemetry support", Type.DEFAULT), OPENTELEMETRY_LOGS("OpenTelemetry Logs support", Type.PREVIEW, OPENTELEMETRY), + OPENTELEMETRY_METRICS("Micrometer to OpenTelemetry bridge support for metrics", Type.EXPERIMENTAL, 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 f82e11d4113..8346eb387aa 100644 --- a/docs/documentation/release_notes/topics/26_5_0.adoc +++ b/docs/documentation/release_notes/topics/26_5_0.adoc @@ -156,6 +156,13 @@ For more details, see the link:{telemetryguide_link}[{telemetryguide_name}] guid == 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. +This preview feature allows you to export {project_name} logs to any OpenTelemetry-compatible backend and use the same OpenTelemetry collector for logs, metrics and traces. + +For more details, see the link:{telemetryguide_link}[{telemetryguide_name}] guide. + +== OpenTelemetry Metrics (experimental) + +{project_name} now provides the experimental support for exporting metrics to OpenTelemetry collectors by using the https://quarkus.io/guides/telemetry-micrometer-to-opentelemetry[Micrometer-to-OpenTelemetry bridge]. +This experimental feature allows you to export {project_name} metrics to any OpenTelemetry-compatible backend and use the same OpenTelemetry collector for logs, metrics and traces. For more details, see the link:{telemetryguide_link}[{telemetryguide_name}] guide. diff --git a/docs/guides/observability/telemetry.adoc b/docs/guides/observability/telemetry.adoc index f04fb8ae4c8..c180b12b775 100644 --- a/docs/guides/observability/telemetry.adoc +++ b/docs/guides/observability/telemetry.adoc @@ -80,6 +80,27 @@ For example, if you want only to export `WARN` and `ERROR` logs, you can change <@kc.start parameters="--telemetry-logs-level=WARN"/> +== Metrics + +WARNING: The OpenTelemetry Metrics feature is currently experimental, and it is not recommended for use in production. + +NOTE: In order for the Metrics feature to function, the OpenTelemetry feature `opentelemetry` cannot be disabled. + +For integrating OpenTelemetry Metrics, {project_name} uses the https://quarkus.io/guides/telemetry-micrometer-to-opentelemetry[Micrometer-to-OpenTelemetry bridge], +which provides the functionality to export metrics created by Micrometer to the OpenTelemetry Collector. +This means that all metrics created via Micrometer or OpenTelemetry metrics will be exported to the OpenTelemetry. + +There are some https://quarkus.io/guides/telemetry-micrometer-to-opentelemetry#metric-differences-between-micrometer-and-opentelemetry[API, and Semantic convention differences] for Micrometer vs OTel Metrics, so you should check if all required metrics are exported. + +=== Enable Metrics +You can enable the OpenTelemetry Metrics via CLI as follows: + +<@kc.start parameters="--features=opentelemetry-metrics --telemetry-metrics-enabled=true --metrics-enabled=true"/> + +NOTE: Metrics (`metrics-enabled`) needs to be enabled as well + +For more information on how to set up metrics, see the configuration options below or visit the https://www.keycloak.org/observability/configuration-metrics[Gaining insights with metrics guide]. + <@profile.ifCommunity> == Development setup @@ -100,7 +121,7 @@ Then, you can navigate to Grafana UI by accessing `+localhost:3000+` and then yo -<@opts.printRelevantOptions includedOptions="telemetry-*" excludedOptions="telemetry-logs-*"> +<@opts.printRelevantOptions includedOptions="telemetry-*" excludedOptions="telemetry-logs-* telemetry-metrics-*"> === Traces <@opts.includeOptions includedOptions="tracing-enabled tracing-endpoint tracing-protocol tracing-service-name tracing-resource-attributes"/> @@ -108,6 +129,9 @@ Then, you can navigate to Grafana UI by accessing `+localhost:3000+` and then yo === Logs <@opts.includeOptions includedOptions="telemetry-logs-*"/> +=== Metrics +<@opts.includeOptions includedOptions="metrics-enabled telemetry-metrics-*"/> + 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 559750516b7..f1540fc2de6 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 @@ -37,19 +37,19 @@ public class TelemetryOptions { // 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).") + .description("Enables exporting logs to a destination handling 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())) + .description("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())) + .description("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(); @@ -59,4 +59,29 @@ public class TelemetryOptions { .defaultValue(LoggingOptions.Level.ALL) .caseInsensitiveExpectedValues(true) .build(); + + // Telemetry Metrics + public static final Option TELEMETRY_METRICS_ENABLED = new OptionBuilder<>("telemetry-metrics-enabled", Boolean.class) + .category(OptionCategory.TELEMETRY) + .description("Enables exporting metrics to a destination handling OpenTelemetry metrics.") + .defaultValue(Boolean.FALSE) + .buildTime(true) + .build(); + + public static final Option TELEMETRY_METRICS_ENDPOINT = new OptionBuilder<>("telemetry-metrics-endpoint", String.class) + .category(OptionCategory.TELEMETRY) + .description("OpenTelemetry endpoint to connect to for Metrics. If not given, the value is inherited from the '%s' option.".formatted(TelemetryOptions.TELEMETRY_ENDPOINT.getKey())) + .build(); + + public static final Option TELEMETRY_METRICS_PROTOCOL = new OptionBuilder<>("telemetry-metrics-protocol", String.class) + .category(OptionCategory.TELEMETRY) + .description("OpenTelemetry protocol used for the metrics telemetry data. If not given, the value is inherited from the '%s' option.".formatted(TelemetryOptions.TELEMETRY_PROTOCOL.getKey())) + .expectedValues("grpc", "http/protobuf") + .build(); + + public static final Option TELEMETRY_METRICS_INTERVAL = new OptionBuilder<>("telemetry-metrics-interval", String.class) + .category(OptionCategory.TELEMETRY) + .description("The interval between the start of two metric export attempts to the destination handling OpenTelemetry metrics data. It accepts simplified format for time units as java.time.Duration (like 5000ms, 30s, 5m, 1h). If the value is only a number, it represents time in seconds.") + .defaultValue("60s") + .build(); } diff --git a/quarkus/deployment/pom.xml b/quarkus/deployment/pom.xml index f7cf59199f6..86b53aa11f7 100644 --- a/quarkus/deployment/pom.xml +++ b/quarkus/deployment/pom.xml @@ -270,6 +270,10 @@ io.quarkus quarkus-opentelemetry-deployment + + io.quarkus + quarkus-micrometer-opentelemetry-deployment + io.quarkus diff --git a/quarkus/runtime/pom.xml b/quarkus/runtime/pom.xml index c60e8e1419e..2140087a5c9 100644 --- a/quarkus/runtime/pom.xml +++ b/quarkus/runtime/pom.xml @@ -125,6 +125,10 @@ io.opentelemetry.instrumentation opentelemetry-apache-httpclient-4.3 + + io.quarkus + quarkus-micrometer-opentelemetry + com.apicatalog diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/IgnoredArtifacts.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/IgnoredArtifacts.java index 3c2b77d9b7e..44fa9f39ffb 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/IgnoredArtifacts.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/configuration/IgnoredArtifacts.java @@ -25,6 +25,7 @@ import java.util.stream.Stream; import org.keycloak.common.Profile; import org.keycloak.config.HealthOptions; import org.keycloak.config.MetricsOptions; +import org.keycloak.config.TelemetryOptions; import org.keycloak.config.database.Database; import static java.util.Collections.emptySet; @@ -41,7 +42,8 @@ public class IgnoredArtifacts { fips(), jdbcDrivers(), health(), - metrics() + metrics(), + otelMetrics() ) .flatMap(Collection::stream) .collect(Collectors.toUnmodifiableSet()); @@ -171,4 +173,16 @@ public class IgnoredArtifacts { boolean isMetricsEnabled = Configuration.isTrue(MetricsOptions.METRICS_ENABLED); return !isMetricsEnabled ? METRICS : emptySet(); } + + // OpenTelemetry Metrics (Micrometer to OTel bridge) + public static Set OTEL_METRICS = Set.of( + "io.quarkus:quarkus-micrometer-opentelemetry", + "io.quarkus:quarkus-micrometer-opentelemetry-deployment", + "io.opentelemetry.instrumentation:opentelemetry-micrometer-1.5" + ); + + private static Set otelMetrics() { + boolean isOtelMetricsEnabled = Configuration.isTrue(TelemetryOptions.TELEMETRY_METRICS_ENABLED); + return !isOtelMetricsEnabled ? OTEL_METRICS : emptySet(); + } } 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 0d30f389d46..c41506fb572 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,12 +6,14 @@ import java.net.URL; import java.util.List; import org.keycloak.common.Profile; +import org.keycloak.config.MetricsOptions; import org.keycloak.config.TelemetryOptions; import org.keycloak.config.TracingOptions; import org.keycloak.quarkus.runtime.cli.PropertyException; import org.keycloak.quarkus.runtime.configuration.Configuration; import org.keycloak.utils.StringUtil; +import io.quarkus.runtime.configuration.DurationConverter; import io.smallrye.config.ConfigSourceInterceptorContext; import static org.keycloak.config.TelemetryOptions.TELEMETRY_ENABLED; @@ -20,6 +22,10 @@ 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_METRICS_ENABLED; +import static org.keycloak.config.TelemetryOptions.TELEMETRY_METRICS_ENDPOINT; +import static org.keycloak.config.TelemetryOptions.TELEMETRY_METRICS_INTERVAL; +import static org.keycloak.config.TelemetryOptions.TELEMETRY_METRICS_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; @@ -27,9 +33,11 @@ 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 (Logs, Traces) is turned on"; + private static final String OTEL_COLLECTOR_ENABLED_MSG = "any of available OpenTelemetry components (Logs, Metrics, 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()); + private static final String OTEL_METRICS_FEATURE_ENABLED_MSG = "metrics and feature '%s' are enabled".formatted(Profile.Feature.OPENTELEMETRY_METRICS.getVersionedKey()); + private static final String OTEL_METRICS_ENABLED_MSG = "metrics ('%s') and Telemetry Metrics functionality ('%s') are enabled".formatted(MetricsOptions.METRICS_ENABLED.getKey(), TELEMETRY_METRICS_ENABLED.getKey()); @Override public List> getPropertyMappers() { @@ -85,12 +93,36 @@ public class TelemetryPropertyMappers implements PropertyMapperGrouping{ .to("quarkus.otel.logs.level") .paramLabel("level") .transformer(LoggingPropertyMappers::upperCase) + .build(), + // Telemetry Metrics + fromOption(TELEMETRY_METRICS_ENABLED) + .isEnabled(TelemetryPropertyMappers::isOtelMetricsFeatureEnabled, OTEL_METRICS_FEATURE_ENABLED_MSG) + .to("quarkus.otel.metrics.enabled") + .build(), + fromOption(TELEMETRY_METRICS_ENDPOINT) + .isEnabled(TelemetryPropertyMappers::isTelemetryMetricsEnabled, OTEL_METRICS_ENABLED_MSG) + .mapFrom(TelemetryOptions.TELEMETRY_ENDPOINT) + .to("quarkus.otel.exporter.otlp.metrics.endpoint") + .paramLabel("url") + .validator(TelemetryPropertyMappers::validateEndpoint) + .build(), + fromOption(TELEMETRY_METRICS_PROTOCOL) + .isEnabled(TelemetryPropertyMappers::isTelemetryMetricsEnabled, OTEL_METRICS_ENABLED_MSG) + .mapFrom(TelemetryOptions.TELEMETRY_PROTOCOL) + .to("quarkus.otel.exporter.otlp.metrics.protocol") + .paramLabel("protocol") + .build(), + fromOption(TELEMETRY_METRICS_INTERVAL) + .isEnabled(TelemetryPropertyMappers::isTelemetryMetricsEnabled, OTEL_METRICS_ENABLED_MSG) + .to("quarkus.otel.metric.export.interval") + .paramLabel("duration") + .validator(TelemetryPropertyMappers::validateDuration) .build() ); } private static String checkIfDependantsAreEnabled(String value, ConfigSourceInterceptorContext context) { - if (TelemetryPropertyMappers.isTelemetryLogsEnabled() || TracingPropertyMappers.isTracingEnabled()) { + if (TelemetryPropertyMappers.isTelemetryLogsEnabled() || TelemetryPropertyMappers.isTelemetryMetricsEnabled() || TracingPropertyMappers.isTracingEnabled()) { return Boolean.TRUE.toString(); } return Boolean.FALSE.toString(); @@ -104,6 +136,10 @@ public class TelemetryPropertyMappers implements PropertyMapperGrouping{ return Profile.isFeatureEnabled(Profile.Feature.OPENTELEMETRY_LOGS); } + public static boolean isOtelMetricsFeatureEnabled() { + return MetricsPropertyMappers.metricsEnabled() && Profile.isFeatureEnabled(Profile.Feature.OPENTELEMETRY_METRICS); + } + public static boolean isTelemetryEnabled() { return Configuration.isTrue("quarkus.otel.enabled"); } @@ -112,6 +148,10 @@ public class TelemetryPropertyMappers implements PropertyMapperGrouping{ return Configuration.isTrue("quarkus.otel.logs.enabled"); } + public static boolean isTelemetryMetricsEnabled() { + return MetricsPropertyMappers.metricsEnabled() && Configuration.isTrue("quarkus.otel.metrics.enabled"); + } + static void validateEndpoint(String value) { if (StringUtil.isBlank(value)) { throw new PropertyException("Specified Endpoint URL must not be empty."); @@ -130,4 +170,15 @@ public class TelemetryPropertyMappers implements PropertyMapperGrouping{ return false; } } + + private static void validateDuration(String value) { + try { + var duration = DurationConverter.parseDuration(value); + if (duration.isNegative() || duration.isZero()) { + throw new IllegalArgumentException(); + } + } catch (IllegalArgumentException e) { + throw new PropertyException("Duration specified via '%s' is invalid.".formatted(TELEMETRY_METRICS_INTERVAL.getKey())); + } + } } 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 235add8a536..647b49e46d1 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 (Logs, Traces) is turned on") + containsString("Disabled option: '--telemetry-service-name'. Available only when any of available OpenTelemetry components (Logs, Metrics, 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 (Logs, Traces) is turned on")); + assertThat(nonRunningPicocli.getErrString(), containsString("Disabled option: '--telemetry-service-name'. Available only when any of available OpenTelemetry components (Logs, Metrics, 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())); @@ -1496,4 +1496,215 @@ public class PicocliTest extends AbstractConfigurationTest { "quarkus.otel.logs.level", "DEBUG" )); } + + @Test + public void otelMetrics() { + // parent feature disabled + NonRunningPicocli nonRunningPicocli = pseudoLaunch("start-dev", "--feature-opentelemetry=disabled", "--feature-opentelemetry-metrics=enabled"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("ERROR: Feature opentelemetry-metrics depends on disabled feature opentelemetry")); + onAfter(); + + // feature disabled + nonRunningPicocli = pseudoLaunch("start-dev", "--telemetry-metrics-enabled=true"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("Disabled option: '--telemetry-metrics-enabled'. Available only when metrics and feature 'opentelemetry-metrics:v1' are enabled")); + onAfter(); + + // export disabled + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--telemetry-metrics-enabled=true"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("Disabled option: '--telemetry-metrics-enabled'. Available only when metrics and feature 'opentelemetry-metrics:v1' are enabled")); + onAfter(); + + // export disabled + nonRunningPicocli = pseudoLaunch("start-dev", "--metrics-enabled=true", "--features=opentelemetry-metrics", "--telemetry-metrics-enabled=false", "--telemetry-metrics-endpoint=endpoint"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("Disabled option: '--telemetry-metrics-endpoint'. Available only when metrics ('metrics-enabled') and Telemetry Metrics functionality ('telemetry-metrics-enabled') are enabled")); + onAfter(); + + // check enabled + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertConfig("metrics-enabled", "true"); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.metrics.enabled", "true" + )); + onAfter(); + + // multiple components enabled + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics,opentelemetry-logs", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-logs-enabled=false"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.metrics.enabled", "true", + "quarkus.otel.logs.enabled", "false" + )); + onAfter(); + + // wrong protocol + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-metrics-protocol=wrong"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("Invalid value for option '--telemetry-metrics-protocol': wrong. Expected values are: grpc, http/protobuf")); + onAfter(); + + // otel protocol + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-metrics-protocol=http/protobuf"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.exporter.otlp.metrics.protocol", "http/protobuf" + )); + onAfter(); + + // parent + child protocol + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-metrics-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.metrics.protocol", "http/protobuf" + )); + onAfter(); + + // parent protocol + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-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.metrics.protocol", "http/protobuf" + )); + onAfter(); + + // wrong parent endpoint + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-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-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-metrics-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-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-metrics-endpoint=http://keycloak.org"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.exporter.otlp.endpoint", "http://localhost:4317", + "quarkus.otel.exporter.otlp.metrics.endpoint", "http://keycloak.org" + )); + onAfter(); + + // parent + child endpoint + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-endpoint=http://keycloak-keycloak-keycloak.org:3455", "--telemetry-metrics-endpoint=http://keycloak.org"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.exporter.otlp.endpoint", "http://keycloak-keycloak-keycloak.org:3455", + "quarkus.otel.exporter.otlp.metrics.endpoint", "http://keycloak.org" + )); + onAfter(); + + // parent endpoint + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-endpoint=http://keycloak-keycloak-keycloak.org:3455"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.exporter.otlp.endpoint", "http://keycloak-keycloak-keycloak.org:3455", + "quarkus.otel.exporter.otlp.metrics.endpoint", "http://keycloak-keycloak-keycloak.org:3455" + )); + onAfter(); + + // wrong export interval + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-metrics-interval=qwerty"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("Duration specified via 'telemetry-metrics-interval' is invalid.")); + onAfter(); + + // negative export interval + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-metrics-interval=-12s"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("Duration specified via 'telemetry-metrics-interval' is invalid.")); + onAfter(); + + // zero export interval + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-metrics-interval=0"); + assertEquals(CommandLine.ExitCode.USAGE, nonRunningPicocli.exitCode); + assertThat(nonRunningPicocli.getErrString(), containsString("Duration specified via 'telemetry-metrics-interval' is invalid.")); + onAfter(); + + // interval minutes + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-metrics-interval=10m"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig("quarkus.otel.metric.export.interval","10m"); + onAfter(); + + // interval hours + nonRunningPicocli = pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-metrics-interval=12h"); + assertEquals(CommandLine.ExitCode.OK, nonRunningPicocli.exitCode); + assertExternalConfig("quarkus.otel.metric.export.interval","12h"); + } + + @Test + public void otelAll() { + // tracing + pseudoLaunch("start-dev", "--tracing-enabled=true"); + assertConfig("tracing-enabled", "true"); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.traces.enabled", "true" + )); + onAfter(); + + // logs + pseudoLaunch("start-dev", "--features=opentelemetry-logs", "--telemetry-logs-enabled=true"); + assertConfig(Map.of("telemetry-logs-enabled", "true")); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.logs.enabled", "true" + )); + onAfter(); + + // metrics - not enabled + pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--telemetry-metrics-enabled=true"); + assertConfig(Map.of( + "telemetry-metrics-enabled", "true", + "metrics-enabled", "false" + )); + assertExternalConfigNull("quarkus.otel.metrics.enabled"); + assertExternalConfig("quarkus.otel.enabled", "false"); + onAfter(); + + // metrics + pseudoLaunch("start-dev", "--features=opentelemetry-metrics", "--telemetry-metrics-enabled=true", "--metrics-enabled=true"); + assertConfig(Map.of( + "telemetry-metrics-enabled", "true", + "metrics-enabled", "true" + )); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.metrics.enabled", "true" + )); + onAfter(); + + // all + pseudoLaunch("start-dev", "--features=opentelemetry-metrics,opentelemetry-logs", "--telemetry-metrics-enabled=true", "--metrics-enabled=true", "--tracing-enabled=true", "--telemetry-logs-enabled=true"); + assertConfig(Map.of( + "telemetry-metrics-enabled", "true", + "metrics-enabled", "true", + "tracing-enabled", "true", + "telemetry-logs-enabled", "true" + )); + assertExternalConfig(Map.of( + "quarkus.otel.enabled", "true", + "quarkus.otel.metrics.enabled", "true", + "quarkus.otel.traces.enabled", "true", + "quarkus.otel.logs.enabled", "true" + )); + } } diff --git a/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/IgnoredArtifactsTest.java b/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/IgnoredArtifactsTest.java index 88cd650d552..b98158fe207 100644 --- a/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/IgnoredArtifactsTest.java +++ b/quarkus/runtime/src/test/java/org/keycloak/quarkus/runtime/configuration/IgnoredArtifactsTest.java @@ -31,6 +31,7 @@ import org.keycloak.config.DatabaseOptions; import org.keycloak.config.HealthOptions; import org.keycloak.config.MetricsOptions; import org.keycloak.config.Option; +import org.keycloak.config.TelemetryOptions; import org.junit.Test; @@ -155,6 +156,11 @@ public class IgnoredArtifactsTest extends AbstractConfigurationTest { assertIgnoredArtifacts(IgnoredArtifacts.METRICS, MetricsOptions.METRICS_ENABLED); } + @Test + public void otelMetrics(){ + assertIgnoredArtifacts(IgnoredArtifacts.OTEL_METRICS, TelemetryOptions.TELEMETRY_METRICS_ENABLED); + } + private void assertIgnoredArtifacts(Set artifactsSet, Option enabledOption) { assertIgnoredArtifacts(artifactsSet, enabledOption, true); } 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 3bf8d672fb1..56ae7ad3605 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 @@ -124,4 +124,58 @@ public class TelemetryConfigurationTest extends AbstractConfigurationTest { "quarkus.otel.exporter.otlp.logs.protocol", "http/protobuf" )); } + + @Test + public void metricsDefaults() { + initConfig(); + + assertConfig(Map.of( + "telemetry-metrics-enabled", "false", + "telemetry-metrics-endpoint", "http://localhost:4317", + "telemetry-metrics-protocol", "grpc", + "telemetry-metrics-interval", "60s" + )); + + assertExternalConfig(Map.of( + "quarkus.otel.metrics.enabled", "false", + "quarkus.otel.enabled", "false", + "quarkus.otel.exporter.otlp.metrics.endpoint", "http://localhost:4317", + "quarkus.otel.exporter.otlp.metrics.protocol", "grpc", + "quarkus.otel.metric.export.interval", "60s" + )); + } + + @Test + public void metricsPriorities() { + ConfigArgsConfigSource.setCliArgs("--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-metrics-enabled=true", "--telemetry-metrics-endpoint=localhost:2000", "--telemetry-metrics-protocol=http/protobuf"); + initConfig(); + assertConfig(Map.of( + "telemetry-metrics-enabled", "true", + "telemetry-metrics-endpoint", "localhost:2000", + "telemetry-metrics-protocol", "http/protobuf" + )); + assertExternalConfig(Map.of( + "quarkus.otel.metrics.enabled", "true", + "quarkus.otel.enabled", "true", + "quarkus.otel.exporter.otlp.metrics.endpoint", "localhost:2000", + "quarkus.otel.exporter.otlp.metrics.protocol", "http/protobuf" + )); + onAfter(); + + ConfigArgsConfigSource.setCliArgs("--features=opentelemetry-metrics", "--metrics-enabled=true", "--telemetry-endpoint=http://keycloak.org:1234", "--telemetry-protocol=grpc", "--telemetry-metrics-enabled=true", "--telemetry-metrics-endpoint=my-domain:2001", "--telemetry-metrics-protocol=http/protobuf"); + initConfig(); + assertConfig(Map.of( + "telemetry-metrics-enabled", "true", + "telemetry-metrics-endpoint", "my-domain:2001", + "telemetry-metrics-protocol", "http/protobuf", + "telemetry-endpoint", "http://keycloak.org:1234", + "telemetry-protocol", "grpc" + )); + assertExternalConfig(Map.of( + "quarkus.otel.metrics.enabled", "true", + "quarkus.otel.enabled", "true", + "quarkus.otel.exporter.otlp.metrics.endpoint", "my-domain:2001", + "quarkus.otel.exporter.otlp.metrics.protocol", "http/protobuf" + )); + } } 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 ed5651ec9cc..568c7781399 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,16 +313,15 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Logs, Traces) - is turned on. + Available only when any of available OpenTelemetry components (Logs, + Metrics, 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. + Enables exporting logs to a destination handling 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. + 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 @@ -330,24 +329,46 @@ Telemetry (OpenTelemetry): 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 + 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-metrics-enabled + Enables exporting metrics to a destination handling OpenTelemetry metrics. + Default: false. Available only when metrics and feature + 'opentelemetry-metrics:v1' are enabled. +--telemetry-metrics-endpoint + OpenTelemetry endpoint to connect to for Metrics. If not given, the value is + inherited from the 'telemetry-endpoint' option. Available only when metrics + ('metrics-enabled') and Telemetry Metrics functionality + ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-interval + The interval between the start of two metric export attempts to the + destination handling OpenTelemetry metrics data. It accepts simplified + format for time units as java.time.Duration (like 5000ms, 30s, 5m, 1h). If + the value is only a number, it represents time in seconds. Default: 60s. + Available only when metrics ('metrics-enabled') and Telemetry Metrics + functionality ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-protocol + OpenTelemetry protocol used for the metrics telemetry data. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when metrics ('metrics-enabled') + and Telemetry Metrics functionality ('telemetry-metrics-enabled') are + 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 (Logs, - Traces) is turned on. + Metrics, 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 (Logs, Traces) is turned on. + OpenTelemetry components (Logs, Metrics, 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 (Logs, Traces) is turned - on. + only when any of available OpenTelemetry components (Logs, Metrics, 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 d2d54a11a6e..32301c12bb1 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,16 +313,15 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Logs, Traces) - is turned on. + Available only when any of available OpenTelemetry components (Logs, + Metrics, 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. + Enables exporting logs to a destination handling 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. + 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 @@ -330,24 +329,46 @@ Telemetry (OpenTelemetry): 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 + 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-metrics-enabled + Enables exporting metrics to a destination handling OpenTelemetry metrics. + Default: false. Available only when metrics and feature + 'opentelemetry-metrics:v1' are enabled. +--telemetry-metrics-endpoint + OpenTelemetry endpoint to connect to for Metrics. If not given, the value is + inherited from the 'telemetry-endpoint' option. Available only when metrics + ('metrics-enabled') and Telemetry Metrics functionality + ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-interval + The interval between the start of two metric export attempts to the + destination handling OpenTelemetry metrics data. It accepts simplified + format for time units as java.time.Duration (like 5000ms, 30s, 5m, 1h). If + the value is only a number, it represents time in seconds. Default: 60s. + Available only when metrics ('metrics-enabled') and Telemetry Metrics + functionality ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-protocol + OpenTelemetry protocol used for the metrics telemetry data. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when metrics ('metrics-enabled') + and Telemetry Metrics functionality ('telemetry-metrics-enabled') are + 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 (Logs, - Traces) is turned on. + Metrics, 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 (Logs, Traces) is turned on. + OpenTelemetry components (Logs, Metrics, 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 (Logs, Traces) is turned - on. + only when any of available OpenTelemetry components (Logs, Metrics, 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 1c2c3129321..1e91f432b86 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,16 +640,15 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Logs, Traces) - is turned on. + Available only when any of available OpenTelemetry components (Logs, + Metrics, 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. + Enables exporting logs to a destination handling 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. + 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 @@ -657,24 +656,46 @@ Telemetry (OpenTelemetry): 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 + 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-metrics-enabled + Enables exporting metrics to a destination handling OpenTelemetry metrics. + Default: false. Available only when metrics and feature + 'opentelemetry-metrics:v1' are enabled. +--telemetry-metrics-endpoint + OpenTelemetry endpoint to connect to for Metrics. If not given, the value is + inherited from the 'telemetry-endpoint' option. Available only when metrics + ('metrics-enabled') and Telemetry Metrics functionality + ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-interval + The interval between the start of two metric export attempts to the + destination handling OpenTelemetry metrics data. It accepts simplified + format for time units as java.time.Duration (like 5000ms, 30s, 5m, 1h). If + the value is only a number, it represents time in seconds. Default: 60s. + Available only when metrics ('metrics-enabled') and Telemetry Metrics + functionality ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-protocol + OpenTelemetry protocol used for the metrics telemetry data. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when metrics ('metrics-enabled') + and Telemetry Metrics functionality ('telemetry-metrics-enabled') are + 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 (Logs, - Traces) is turned on. + Metrics, 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 (Logs, Traces) is turned on. + OpenTelemetry components (Logs, Metrics, 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 (Logs, Traces) is turned - on. + only when any of available OpenTelemetry components (Logs, Metrics, 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 740dfb0177b..1144c6cc1cc 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,16 +641,15 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Logs, Traces) - is turned on. + Available only when any of available OpenTelemetry components (Logs, + Metrics, 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. + Enables exporting logs to a destination handling 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. + 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 @@ -658,24 +657,46 @@ Telemetry (OpenTelemetry): 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 + 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-metrics-enabled + Enables exporting metrics to a destination handling OpenTelemetry metrics. + Default: false. Available only when metrics and feature + 'opentelemetry-metrics:v1' are enabled. +--telemetry-metrics-endpoint + OpenTelemetry endpoint to connect to for Metrics. If not given, the value is + inherited from the 'telemetry-endpoint' option. Available only when metrics + ('metrics-enabled') and Telemetry Metrics functionality + ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-interval + The interval between the start of two metric export attempts to the + destination handling OpenTelemetry metrics data. It accepts simplified + format for time units as java.time.Duration (like 5000ms, 30s, 5m, 1h). If + the value is only a number, it represents time in seconds. Default: 60s. + Available only when metrics ('metrics-enabled') and Telemetry Metrics + functionality ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-protocol + OpenTelemetry protocol used for the metrics telemetry data. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when metrics ('metrics-enabled') + and Telemetry Metrics functionality ('telemetry-metrics-enabled') are + 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 (Logs, - Traces) is turned on. + Metrics, 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 (Logs, Traces) is turned on. + OpenTelemetry components (Logs, Metrics, 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 (Logs, Traces) is turned - on. + only when any of available OpenTelemetry components (Logs, Metrics, 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 b49584b0648..a140c5d9427 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,12 +567,12 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Logs, Traces) - is turned on. + Available only when any of available OpenTelemetry components (Logs, + Metrics, 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. + 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 @@ -580,24 +580,42 @@ Telemetry (OpenTelemetry): 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 + 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-metrics-endpoint + OpenTelemetry endpoint to connect to for Metrics. If not given, the value is + inherited from the 'telemetry-endpoint' option. Available only when metrics + ('metrics-enabled') and Telemetry Metrics functionality + ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-interval + The interval between the start of two metric export attempts to the + destination handling OpenTelemetry metrics data. It accepts simplified + format for time units as java.time.Duration (like 5000ms, 30s, 5m, 1h). If + the value is only a number, it represents time in seconds. Default: 60s. + Available only when metrics ('metrics-enabled') and Telemetry Metrics + functionality ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-protocol + OpenTelemetry protocol used for the metrics telemetry data. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when metrics ('metrics-enabled') + and Telemetry Metrics functionality ('telemetry-metrics-enabled') are + 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 (Logs, - Traces) is turned on. + Metrics, 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 (Logs, Traces) is turned on. + OpenTelemetry components (Logs, Metrics, 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 (Logs, Traces) is turned - on. + only when any of available OpenTelemetry components (Logs, Metrics, 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 17167f5d16d..2ffca498cae 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,16 +640,15 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Logs, Traces) - is turned on. + Available only when any of available OpenTelemetry components (Logs, + Metrics, 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. + Enables exporting logs to a destination handling 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. + 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 @@ -657,24 +656,46 @@ Telemetry (OpenTelemetry): 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 + 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-metrics-enabled + Enables exporting metrics to a destination handling OpenTelemetry metrics. + Default: false. Available only when metrics and feature + 'opentelemetry-metrics:v1' are enabled. +--telemetry-metrics-endpoint + OpenTelemetry endpoint to connect to for Metrics. If not given, the value is + inherited from the 'telemetry-endpoint' option. Available only when metrics + ('metrics-enabled') and Telemetry Metrics functionality + ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-interval + The interval between the start of two metric export attempts to the + destination handling OpenTelemetry metrics data. It accepts simplified + format for time units as java.time.Duration (like 5000ms, 30s, 5m, 1h). If + the value is only a number, it represents time in seconds. Default: 60s. + Available only when metrics ('metrics-enabled') and Telemetry Metrics + functionality ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-protocol + OpenTelemetry protocol used for the metrics telemetry data. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when metrics ('metrics-enabled') + and Telemetry Metrics functionality ('telemetry-metrics-enabled') are + 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 (Logs, - Traces) is turned on. + Metrics, 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 (Logs, Traces) is turned on. + OpenTelemetry components (Logs, Metrics, 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 (Logs, Traces) is turned - on. + only when any of available OpenTelemetry components (Logs, Metrics, 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 de6299ec503..6ac4162b58d 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,16 +638,15 @@ Telemetry (OpenTelemetry): --telemetry-endpoint OpenTelemetry endpoint to connect to. Default: http://localhost:4317. - Available only when any of available OpenTelemetry components (Logs, Traces) - is turned on. + Available only when any of available OpenTelemetry components (Logs, + Metrics, 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. + Enables exporting logs to a destination handling 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. + 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 @@ -655,24 +654,46 @@ Telemetry (OpenTelemetry): 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 + 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-metrics-enabled + Enables exporting metrics to a destination handling OpenTelemetry metrics. + Default: false. Available only when metrics and feature + 'opentelemetry-metrics:v1' are enabled. +--telemetry-metrics-endpoint + OpenTelemetry endpoint to connect to for Metrics. If not given, the value is + inherited from the 'telemetry-endpoint' option. Available only when metrics + ('metrics-enabled') and Telemetry Metrics functionality + ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-interval + The interval between the start of two metric export attempts to the + destination handling OpenTelemetry metrics data. It accepts simplified + format for time units as java.time.Duration (like 5000ms, 30s, 5m, 1h). If + the value is only a number, it represents time in seconds. Default: 60s. + Available only when metrics ('metrics-enabled') and Telemetry Metrics + functionality ('telemetry-metrics-enabled') are enabled. +--telemetry-metrics-protocol + OpenTelemetry protocol used for the metrics telemetry data. If not given, the + value is inherited from the 'telemetry-protocol' option. Possible values + are: grpc, http/protobuf. Available only when metrics ('metrics-enabled') + and Telemetry Metrics functionality ('telemetry-metrics-enabled') are + 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 (Logs, - Traces) is turned on. + Metrics, 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 (Logs, Traces) is turned on. + OpenTelemetry components (Logs, Metrics, 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 (Logs, Traces) is turned - on. + only when any of available OpenTelemetry components (Logs, Metrics, Traces) + is turned on. Tracing: