### profile: secured (SecuredActuatorConfig + application-secured.yaml) ### exposure is "*" - the security chain, not the exposure list, is what protects it ANONYMOUS GET /actuator/health 503 GET /actuator/info 200 GET /actuator/env 401 GET /actuator/beans 401 GET /actuator/threaddump 401 GET /actuator (the links index) 401 AUTHENTICATED as ops (ROLE_ACTUATOR) GET /actuator/health 503 GET /actuator/env 200 GET /actuator/beans 200 GET /actuator/threaddump 200 WRONG PASSWORD GET /actuator/env 401 --- health body, anonymous (show-details: when-authorized) --- { "groups": [ "liveness", "readiness" ], "status": "DOWN" } --- health body, authenticated as ROLE_ACTUATOR --- { "components": { "db": { "details": { "database": "H2", "validationQuery": "isValid()" }, "status": "UP" }, "diskSpace": { "details": { "total": 10213466112, "free": 3877920768, "threshold": 10485760, "path": "/tmp/work/spring-boot-demo/.", "exists": true }, "status": "UP" }, "externalApi": { "details": { "url": "http://localhost:8080/stub/upstream/ping", "response": "pong", "latencyMs": 4, "timeoutMs": 750 }, "status": "UP" }, "kafka": { "details": { "bootstrap": "localhost:9092", "tuned": true, "error": "TimeoutException: Timed out waiting for a node assignment. Call: listNodes", "probeMs": 1500, "budgetMs": 1500 }, "status": "DOWN" }, "livenessState": { "status": "UP" }, "ordersDatabase": { "details": { "orders": 3, "queryMs": 0, "slowThresholdMs": 250 }, "status": "UP" }, "ping": { "status": "UP" }, "readinessState": { "status": "UP" }, "ssl": { "details": { "expiringChains": [], "invalidChains": [], "validChains": [] }, "status": "UP" } }, "groups": [ "liveness", "readiness" ], "status": "DOWN" } Same endpoint, same status code, different body. An anonymous prober learns that the service is unhealthy but not WHICH dependency is unhealthy. --- the business endpoint is untouched by the actuator chain --- GET /orders/count (anonymous) 200