This is an automated email from the ASF dual-hosted git repository.
Croway pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot.git
The following commit(s) were added to refs/heads/main by this push:
new d22aa0016af CAMEL-24498: align camel-observability-services-starter
defaults with the Spring Boot baseline
d22aa0016af is described below
commit d22aa0016af5469e3a2807cb5eb45b6f1cc5e9d6
Author: croway <[email protected]>
AuthorDate: Wed Sep 2 14:46:28 2026 +0200
CAMEL-24498: align camel-observability-services-starter defaults with the
Spring Boot baseline
ObservabilityServicesEnvironmentPostProcessor injects a set of management
defaults as soon as the starter is on the classpath. Three of them were
wider
than the Spring Boot or Camel setting they replaced:
- management.server.port was injected with no matching
management.server.address, so adding the starter opened a second listener
on
every interface. Spring Boot ships no separate management listener at all.
The listener now binds to 127.0.0.1, the same choice camel-jolokia-starter
makes for its agent.
- management.endpoint.health.show-details was 'always' where the Spring Boot
default is 'never'. The aggregate /observe/health endpoint now uses
'when-authorized'. Camel health checks report on the resources a route
talks
to and their detail can identify those resources.
- camel.health.exposure-level was forced to 'full' where the Camel default
is
'default'. It is no longer injected; 'full' is documented as an opt-in.
The live and ready health groups keep show-details=always. The kubelet reads
them unauthenticated and puts the response body into the probe-failure
event,
so 'kubectl describe pod' still names the indicator that took the pod down,
and
both groups contain availability-state indicators only - livenessState,
readinessState and their Camel counterparts report a status and carry no
data.
The property source is still added with addLast, so all of these remain
overridable by ordinary application configuration. Kubernetes deployments
whose
probes or scrapers reach the pod over the network now have to set
management.server.address=0.0.0.0 explicitly.
Adds starter docs (src/main/doc/intro.adoc and usage.adoc) documenting the
full
injected property set and how to opt back into each of the previous values,
and
regenerates the starter doc page.
Co-Authored-By: Claude Opus 5 <[email protected]>
---
.../src/main/doc/intro.adoc | 8 ++
.../src/main/doc/usage.adoc | 89 ++++++++++++++++++
...ervabilityServicesEnvironmentPostProcessor.java | 15 ++-
...bilityServicesEnvironmentPostProcessorTest.java | 61 ++++++++++++-
.../ObservabilityServicesOptInOverridesTest.java | 54 +++++++++++
.../pages/starters/observability-services.adoc | 101 +++++++++++++++++++++
6 files changed, 321 insertions(+), 7 deletions(-)
diff --git
a/components-starter/camel-observability-services-starter/src/main/doc/intro.adoc
b/components-starter/camel-observability-services-starter/src/main/doc/intro.adoc
new file mode 100644
index 00000000000..3038cd5a6b9
--- /dev/null
+++
b/components-starter/camel-observability-services-starter/src/main/doc/intro.adoc
@@ -0,0 +1,8 @@
+Spring Boot auto-configuration bundling the Camel observability services:
metrics, tracing and health.
+
+The starter pulls in `camel-micrometer`, `micrometer-registry-prometheus`,
`camel-opentelemetry2` and
+`camel-management`, and contributes a set of defaults so that a Camel
application exposes a Prometheus
+scrape endpoint and Kubernetes-shaped liveness and readiness probes without
any configuration.
+
+The defaults are registered as the lowest precedence property source, so
anything you set in
+`application.properties`, in an environment variable or on the command line
overrides them.
diff --git
a/components-starter/camel-observability-services-starter/src/main/doc/usage.adoc
b/components-starter/camel-observability-services-starter/src/main/doc/usage.adoc
new file mode 100644
index 00000000000..bba4aec5c42
--- /dev/null
+++
b/components-starter/camel-observability-services-starter/src/main/doc/usage.adoc
@@ -0,0 +1,89 @@
+Add the starter to the classpath and the endpoints below are available on a
separate management listener,
+bound to loopback on port `9876`:
+
+[width="100%",cols="3,5",options="header"]
+|===
+| Endpoint | Purpose
+| `http://127.0.0.1:9876/observe/health` | Aggregate health
+| `http://127.0.0.1:9876/observe/health/live` | Kubernetes liveness probe
+| `http://127.0.0.1:9876/observe/health/ready` | Kubernetes readiness probe
+| `http://127.0.0.1:9876/observe/metrics` | Prometheus scrape endpoint
+|===
+
+=== Injected defaults
+
+This is the full set of properties the starter contributes. Every one of them
can be overridden by your own
+configuration:
+
+[width="100%",cols="4,2,4",options="header"]
+|===
+| Property | Value | Notes
+| `management.server.port` | `9876` | Management endpoints run on their own
listener, separate from the application port.
+| `management.server.address` | `127.0.0.1` | The listener binds to loopback.
See <<Exposing the management listener>>.
+| `management.endpoints.web.exposure.include` | `health,prometheus` | Only
these two endpoints are exposed.
+| `management.endpoints.web.base-path` | `/observe` | Replaces the `/actuator`
base path.
+| `management.endpoints.web.path-mapping.prometheus` | `metrics` | Serves the
Prometheus endpoint at `/observe/metrics`.
+| `camel.metrics.log-metrics-on-shutdown` | `true` | Dumps a metrics summary
to the log when the application stops.
+| `camel.metrics.log-metrics-on-shutdown-filters` |
`app.info,camel.exchanges.*,process.cpu.usage,jvm.memory.max,jvm.memory.used` |
Which metrics that summary contains.
+| `camel.metrics.log-metrics-on-shutdown-format` | `prometheus` | Format of
that summary.
+| `camel.opentelemetry2.enabled` | `true` | Enables the OpenTelemetry tracing
instrumentation.
+| `management.endpoint.health.probes.enabled` | `true` | Enables the liveness
and readiness health groups.
+| `management.health.livenessState.enabled` | `true` | Registers the
`livenessState` indicator.
+| `management.health.readinessState.enabled` | `true` | Registers the
`readinessState` indicator.
+| `management.endpoint.health.show-details` | `when-authorized` | See <<Health
detail exposure>>.
+| `management.endpoint.health.group.live.include` |
`livenessState,camelLivenessState` | Contents of `/observe/health/live`.
+| `management.endpoint.health.group.live.show-details` | `always` | See
<<Health detail exposure>>.
+| `management.endpoint.health.group.ready.include` |
`readinessState,camelReadinessState` | Contents of `/observe/health/ready`.
+| `management.endpoint.health.group.ready.show-details` | `always` | See
<<Health detail exposure>>.
+|===
+
+=== Exposing the management listener
+
+The management listener binds to `127.0.0.1`, so out of the box the health and
metrics endpoints are reachable
+from the same host only. This matches the Spring Boot baseline, which ships no
separate management listener at
+all: opening one on every interface should be a decision you make, not one the
starter makes for you.
+
+A Kubernetes deployment whose kubelet probes or Prometheus scrapers reach the
pod over the network has to widen
+the bind address:
+
+[source,properties]
+----
+management.server.address = 0.0.0.0
+----
+
+Pair that with a `NetworkPolicy`, or with authentication in front of the
management port, so the endpoints are
+only reachable from your probes and your scrapers.
+
+=== Health detail exposure
+
+`/observe/health` uses `when-authorized`, the setting that shows the
individual health indicators to an
+authenticated caller and the overall status alone to everybody else. Camel
health checks report on the
+resources a route talks to — broker connections, data sources, remote
endpoints — and their detail can
+identify those resources, so it is not something to hand to an unauthenticated
caller. With no Spring Security
+on the classpath there is no authenticated caller, and the endpoint behaves as
`never`.
+
+To restore the previous behaviour of showing the details to anyone who asks:
+
+[source,properties]
+----
+management.endpoint.health.show-details = always
+----
+
+The `live` and `ready` groups keep `always`. The kubelet reaches them
unauthenticated, and it puts the response
+body into the probe-failure event, so `kubectl describe pod` names the
indicator that took the pod down. Both
+groups contain availability-state indicators only — `livenessState`,
`readinessState` and their Camel
+counterparts report a status and carry no data — so there is nothing in those
responses beyond the indicator
+names and their state.
+
+=== Camel health exposure level
+
+`camel.health.exposure-level` is left at its Camel default of `default`, which
filters health check metadata —
+endpoint URIs, route and consumer identifiers — out of the health response
while keeping the check names,
+error messages and stack traces that tell you what failed.
+
+If you want the metadata as well, opt in:
+
+[source,properties]
+----
+camel.health.exposure-level = full
+----
diff --git
a/components-starter/camel-observability-services-starter/src/main/java/org/apache/camel/observability/services/springboot/ObservabilityServicesEnvironmentPostProcessor.java
b/components-starter/camel-observability-services-starter/src/main/java/org/apache/camel/observability/services/springboot/ObservabilityServicesEnvironmentPostProcessor.java
index cea919ed3a8..ff0d1cfa9c3 100644
---
a/components-starter/camel-observability-services-starter/src/main/java/org/apache/camel/observability/services/springboot/ObservabilityServicesEnvironmentPostProcessor.java
+++
b/components-starter/camel-observability-services-starter/src/main/java/org/apache/camel/observability/services/springboot/ObservabilityServicesEnvironmentPostProcessor.java
@@ -29,6 +29,11 @@ import org.springframework.core.env.MapPropertySource;
* Contributes the opinionated observability defaults as the lowest precedence
property source so that any
* user-provided configuration (application.properties, environment variables,
system properties, ...) overrides them
* following the standard Spring Boot precedence rules.
+ * <p>
+ * The defaults stay within the Spring Boot baseline: the management listener
binds to loopback, and the aggregate
+ * health endpoint only shows its details to an authorized caller. The {@code
live} and {@code ready} probe groups
+ * keep {@code show-details=always} because they are consumed unauthenticated
by the kubelet, and the indicators
+ * they contain report an availability state and nothing else.
*/
public class ObservabilityServicesEnvironmentPostProcessor implements
EnvironmentPostProcessor, Ordered {
@@ -38,6 +43,8 @@ public class ObservabilityServicesEnvironmentPostProcessor
implements Environmen
public void postProcessEnvironment(ConfigurableEnvironment environment,
SpringApplication application) {
Map<String, Object> defaults = new LinkedHashMap<>();
defaults.put("management.server.port", "9876");
+ // bind the management listener to loopback; exposing it beyond the
host is a conscious step
+ defaults.put("management.server.address", "127.0.0.1");
defaults.put("management.endpoints.web.exposure.include",
"health,prometheus");
defaults.put("management.endpoints.web.base-path", "/observe");
defaults.put("management.endpoints.web.path-mapping.prometheus",
"metrics");
@@ -48,15 +55,15 @@ public class ObservabilityServicesEnvironmentPostProcessor
implements Environmen
// Opentelemetry
defaults.put("camel.opentelemetry2.enabled", "true");
// Health
- defaults.put("camel.health.exposure-level", "full");
defaults.put("management.endpoint.health.probes.enabled", "true");
defaults.put("management.health.readinessState.enabled", "true");
defaults.put("management.health.livenessState.enabled", "true");
- defaults.put("management.endpoint.health.show-details", "always");
- // /observe/health/live remap
+ defaults.put("management.endpoint.health.show-details",
"when-authorized");
+ // /observe/health/live remap; the group carries availability states
only, and the kubelet reads it
+ // unauthenticated, so its details stay visible
defaults.put("management.endpoint.health.group.live.include",
"livenessState,camelLivenessState");
defaults.put("management.endpoint.health.group.live.show-details",
"always");
- // /observe/health/ready remap
+ // /observe/health/ready remap; see the note on the live group above
defaults.put("management.endpoint.health.group.ready.include",
"readinessState,camelReadinessState");
defaults.put("management.endpoint.health.group.ready.show-details",
"always");
diff --git
a/components-starter/camel-observability-services-starter/src/test/java/org/apache/camel/observability/services/springboot/ObservabilityServicesEnvironmentPostProcessorTest.java
b/components-starter/camel-observability-services-starter/src/test/java/org/apache/camel/observability/services/springboot/ObservabilityServicesEnvironmentPostProcessorTest.java
index 77c4c623960..d27752f7736 100644
---
a/components-starter/camel-observability-services-starter/src/test/java/org/apache/camel/observability/services/springboot/ObservabilityServicesEnvironmentPostProcessorTest.java
+++
b/components-starter/camel-observability-services-starter/src/test/java/org/apache/camel/observability/services/springboot/ObservabilityServicesEnvironmentPostProcessorTest.java
@@ -16,12 +16,18 @@
*/
package org.apache.camel.observability.services.springboot;
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.ConfigurableEnvironment;
+import org.springframework.core.env.EnumerablePropertySource;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@SpringBootTest(classes = ObservabilityServicesTestApplication.class)
@@ -42,19 +48,68 @@ public class
ObservabilityServicesEnvironmentPostProcessorTest {
environment.getProperty("camel.metrics.log-metrics-on-shutdown-filters"));
assertEquals("prometheus",
environment.getProperty("camel.metrics.log-metrics-on-shutdown-format"));
- assertEquals("full",
environment.getProperty("camel.health.exposure-level"));
assertEquals("true",
environment.getProperty("management.endpoint.health.probes.enabled"));
assertEquals("true",
environment.getProperty("management.health.readinessState.enabled"));
assertEquals("true",
environment.getProperty("management.health.livenessState.enabled"));
- assertEquals("always",
environment.getProperty("management.endpoint.health.show-details"));
assertEquals("livenessState,camelLivenessState",
environment.getProperty("management.endpoint.health.group.live.include"));
- assertEquals("always",
environment.getProperty("management.endpoint.health.group.live.show-details"));
assertEquals("readinessState,camelReadinessState",
environment.getProperty("management.endpoint.health.group.ready.include"));
+ }
+
+ @Test
+ public void managementListenerBindsToLoopback() {
+ // the port alone would put a second listener on every interface
+ assertEquals("127.0.0.1",
environment.getProperty("management.server.address"));
+ }
+
+ @Test
+ public void aggregateHealthDetailsRequireAuthorization() {
+ assertEquals("when-authorized",
environment.getProperty("management.endpoint.health.show-details"));
+ }
+
+ @Test
+ public void probeGroupsKeepTheirDetails() {
+ // the kubelet reads these unauthenticated and surfaces the body in a
probe-failure event; the groups
+ // hold availability-state indicators only, which report a status and
no data
+ assertEquals("always",
environment.getProperty("management.endpoint.health.group.live.show-details"));
assertEquals("always",
environment.getProperty("management.endpoint.health.group.ready.show-details"));
}
+ @Test
+ public void camelHealthExposureLevelIsNotForced() {
+ // 'full' is an opt-in; left alone, Camel's own 'default' level
applies and filters health check metadata
+ assertNull(environment.getProperty("camel.health.exposure-level"));
+ }
+
+ @Test
+ public void injectedPropertiesAreTheDocumentedSet() {
+ EnumerablePropertySource<?> source = (EnumerablePropertySource<?>)
environment.getPropertySources()
+
.get(ObservabilityServicesEnvironmentPostProcessor.PROPERTY_SOURCE_NAME);
+
+ Set<String> expected = new LinkedHashSet<>(Arrays.asList(
+ "management.server.port",
+ "management.server.address",
+ "management.endpoints.web.exposure.include",
+ "management.endpoints.web.base-path",
+ "management.endpoints.web.path-mapping.prometheus",
+ "camel.metrics.log-metrics-on-shutdown",
+ "camel.metrics.log-metrics-on-shutdown-filters",
+ "camel.metrics.log-metrics-on-shutdown-format",
+ "camel.opentelemetry2.enabled",
+ "management.endpoint.health.probes.enabled",
+ "management.health.readinessState.enabled",
+ "management.health.livenessState.enabled",
+ "management.endpoint.health.show-details",
+ "management.endpoint.health.group.live.include",
+ "management.endpoint.health.group.live.show-details",
+ "management.endpoint.health.group.ready.include",
+ "management.endpoint.health.group.ready.show-details"));
+
+ // keep this in sync with the table in src/main/doc/usage.adoc
+ assertEquals(expected, new
LinkedHashSet<>(Arrays.asList(source.getPropertyNames())));
+ }
+
@Test
public void userApplicationPropertiesOverrideDefaults() {
// these values are set in src/test/resources/application.properties
and must win
diff --git
a/components-starter/camel-observability-services-starter/src/test/java/org/apache/camel/observability/services/springboot/ObservabilityServicesOptInOverridesTest.java
b/components-starter/camel-observability-services-starter/src/test/java/org/apache/camel/observability/services/springboot/ObservabilityServicesOptInOverridesTest.java
new file mode 100644
index 00000000000..ea51c4a3530
--- /dev/null
+++
b/components-starter/camel-observability-services-starter/src/test/java/org/apache/camel/observability/services/springboot/ObservabilityServicesOptInOverridesTest.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.observability.services.springboot;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.core.env.ConfigurableEnvironment;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+/**
+ * Verifies that the wider settings the starter no longer ships by default can
be opted back into, which is what
+ * a deployment reached over the pod network has to do.
+ */
+@SpringBootTest(classes = ObservabilityServicesTestApplication.class,
+ properties = {
+ "management.server.address=0.0.0.0",
+ "management.endpoint.health.show-details=always",
+ "camel.health.exposure-level=full" })
+public class ObservabilityServicesOptInOverridesTest {
+
+ @Autowired
+ private ConfigurableEnvironment environment;
+
+ @Test
+ public void bindAddressCanBeWidened() {
+ assertEquals("0.0.0.0",
environment.getProperty("management.server.address"));
+ }
+
+ @Test
+ public void healthDetailsCanBeAlwaysShown() {
+ assertEquals("always",
environment.getProperty("management.endpoint.health.show-details"));
+ }
+
+ @Test
+ public void camelHealthExposureLevelCanBeSetToFull() {
+ assertEquals("full",
environment.getProperty("camel.health.exposure-level"));
+ }
+}
diff --git
a/docs/spring-boot/modules/ROOT/pages/starters/observability-services.adoc
b/docs/spring-boot/modules/ROOT/pages/starters/observability-services.adoc
index 3a383c14cca..93a054b48c2 100644
--- a/docs/spring-boot/modules/ROOT/pages/starters/observability-services.adoc
+++ b/docs/spring-boot/modules/ROOT/pages/starters/observability-services.adoc
@@ -3,6 +3,15 @@
= Observability Services
:artifactid: camel-observability-services-starter
+Spring Boot auto-configuration bundling the Camel observability services:
metrics, tracing and health.
+
+The starter pulls in `camel-micrometer`, `micrometer-registry-prometheus`,
`camel-opentelemetry2` and
+`camel-management`, and contributes a set of defaults so that a Camel
application exposes a Prometheus
+scrape endpoint and Kubernetes-shaped liveness and readiness probes without
any configuration.
+
+The defaults are registered as the lowest precedence property source, so
anything you set in
+`application.properties`, in an environment variable or on the command line
overrides them.
+
== Maven coordinates
[source,xml]
@@ -13,3 +22,95 @@
</dependency>
----
+== Usage
+
+Add the starter to the classpath and the endpoints below are available on a
separate management listener,
+bound to loopback on port `9876`:
+
+[width="100%",cols="3,5",options="header"]
+|===
+| Endpoint | Purpose
+| `http://127.0.0.1:9876/observe/health` | Aggregate health
+| `http://127.0.0.1:9876/observe/health/live` | Kubernetes liveness probe
+| `http://127.0.0.1:9876/observe/health/ready` | Kubernetes readiness probe
+| `http://127.0.0.1:9876/observe/metrics` | Prometheus scrape endpoint
+|===
+
+=== Injected defaults
+
+This is the full set of properties the starter contributes. Every one of them
can be overridden by your own
+configuration:
+
+[width="100%",cols="4,2,4",options="header"]
+|===
+| Property | Value | Notes
+| `management.server.port` | `9876` | Management endpoints run on their own
listener, separate from the application port.
+| `management.server.address` | `127.0.0.1` | The listener binds to loopback.
See <<Exposing the management listener>>.
+| `management.endpoints.web.exposure.include` | `health,prometheus` | Only
these two endpoints are exposed.
+| `management.endpoints.web.base-path` | `/observe` | Replaces the `/actuator`
base path.
+| `management.endpoints.web.path-mapping.prometheus` | `metrics` | Serves the
Prometheus endpoint at `/observe/metrics`.
+| `camel.metrics.log-metrics-on-shutdown` | `true` | Dumps a metrics summary
to the log when the application stops.
+| `camel.metrics.log-metrics-on-shutdown-filters` |
`app.info,camel.exchanges.*,process.cpu.usage,jvm.memory.max,jvm.memory.used` |
Which metrics that summary contains.
+| `camel.metrics.log-metrics-on-shutdown-format` | `prometheus` | Format of
that summary.
+| `camel.opentelemetry2.enabled` | `true` | Enables the OpenTelemetry tracing
instrumentation.
+| `management.endpoint.health.probes.enabled` | `true` | Enables the liveness
and readiness health groups.
+| `management.health.livenessState.enabled` | `true` | Registers the
`livenessState` indicator.
+| `management.health.readinessState.enabled` | `true` | Registers the
`readinessState` indicator.
+| `management.endpoint.health.show-details` | `when-authorized` | See <<Health
detail exposure>>.
+| `management.endpoint.health.group.live.include` |
`livenessState,camelLivenessState` | Contents of `/observe/health/live`.
+| `management.endpoint.health.group.live.show-details` | `always` | See
<<Health detail exposure>>.
+| `management.endpoint.health.group.ready.include` |
`readinessState,camelReadinessState` | Contents of `/observe/health/ready`.
+| `management.endpoint.health.group.ready.show-details` | `always` | See
<<Health detail exposure>>.
+|===
+
+=== Exposing the management listener
+
+The management listener binds to `127.0.0.1`, so out of the box the health and
metrics endpoints are reachable
+from the same host only. This matches the Spring Boot baseline, which ships no
separate management listener at
+all: opening one on every interface should be a decision you make, not one the
starter makes for you.
+
+A Kubernetes deployment whose kubelet probes or Prometheus scrapers reach the
pod over the network has to widen
+the bind address:
+
+[source,properties]
+----
+management.server.address = 0.0.0.0
+----
+
+Pair that with a `NetworkPolicy`, or with authentication in front of the
management port, so the endpoints are
+only reachable from your probes and your scrapers.
+
+=== Health detail exposure
+
+`/observe/health` uses `when-authorized`, the setting that shows the
individual health indicators to an
+authenticated caller and the overall status alone to everybody else. Camel
health checks report on the
+resources a route talks to — broker connections, data sources, remote
endpoints — and their detail can
+identify those resources, so it is not something to hand to an unauthenticated
caller. With no Spring Security
+on the classpath there is no authenticated caller, and the endpoint behaves as
`never`.
+
+To restore the previous behaviour of showing the details to anyone who asks:
+
+[source,properties]
+----
+management.endpoint.health.show-details = always
+----
+
+The `live` and `ready` groups keep `always`. The kubelet reaches them
unauthenticated, and it puts the response
+body into the probe-failure event, so `kubectl describe pod` names the
indicator that took the pod down. Both
+groups contain availability-state indicators only — `livenessState`,
`readinessState` and their Camel
+counterparts report a status and carry no data — so there is nothing in those
responses beyond the indicator
+names and their state.
+
+=== Camel health exposure level
+
+`camel.health.exposure-level` is left at its Camel default of `default`, which
filters health check metadata —
+endpoint URIs, route and consumer identifiers — out of the health response
while keeping the check names,
+error messages and stack traces that tell you what failed.
+
+If you want the metadata as well, opt in:
+
+[source,properties]
+----
+camel.health.exposure-level = full
+----
+