Federico Mariani created CAMEL-24592:
----------------------------------------

             Summary: camel-spring-boot - health check details include the full 
error stack trace at the default exposure level
                 Key: CAMEL-24592
                 URL: https://issues.apache.org/jira/browse/CAMEL-24592
             Project: Camel
          Issue Type: Bug
          Components: camel-spring-boot
            Reporter: Federico Mariani
            Assignee: Federico Mariani
             Fix For: 4.23.0


{{CamelHealthHelper.applyHealthDetail}} adds the full stack trace of a failed 
health check to the actuator output at every exposure level except {{oneline}}:

{code:java}
result.getError().ifPresent(error -> {
    if (error.getMessage() != null) {
        builder.withDetail("error.message", error.getMessage());
    }
    final StringWriter stackTraceWriter = new StringWriter();
    try (final PrintWriter pw = new PrintWriter(stackTraceWriter, true)) {
        error.printStackTrace(pw);
        data.put("error.stacktrace", stackTraceWriter.toString());
    }
});
{code}

(core/camel-spring-boot: CamelHealthHelper.java:62-71)

So with the default {{camel.health.exposure-level=default}}, any DOWN check 
whose result carries an exception - a JMS consumer that lost its broker, a JDBC 
pool that cannot connect - serialises the whole cause chain, including internal 
host names and ports from the connection exception, into {{/actuator/health}} 
for any caller allowed to see details.

This is stricter everywhere else:

* Spring Boot's own health indicators expose at most the exception class and 
message, never a trace.
* camel-main's management endpoint ({{ManagementHttpServer}}) includes 
{{error-stacktrace}} only when the caller explicitly asks with 
{{?stackTrace=true}}; the {{full}} level alone adds only the message.
* Camel Quarkus (camel-quarkus-microprofile-health) never emits a stack trace.

The user manual describes {{full}} as "all details and status from all the 
invoked health checks" and {{default}} as detailed information only for checks 
that are DOWN. The stack trace is the most verbose detail there is and belongs 
to {{full}}.

The trace was added together with the exposure-level handling in CAMEL-18832 
(2022) to align the output with microprofile-health, but the MicroProfile 
implementation does not carry a trace, so the alignment argument no longer 
applies.

*Proposal*

* Emit {{error.stacktrace}} only when the exposure level is {{full}}.
* Keep {{error.message}} at the {{default}} level, which mirrors what Spring 
Boot's own indicators do.
* Keep the full trace in the application log, where it is today.
* Add a test with a DOWN check that carries an exception, asserting that 
{{error.stacktrace}} is absent at {{default}} and present at {{full}}.

Note that this touches the same method as CAMEL-24512 ({{error.message}} 
overwritten when several checks are DOWN); the two are best done in one pass.

Anyone relying on the trace at the default level can set 
{{camel.health.exposure-level=full}}. Worth a line in the upgrade guide.

----
_This issue was drafted by Claude Code on behalf of Federico Mariani._



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to