Skip to content

Troubleshooting

Symptoms, their causes and the fix.

/peekaboot returns 404

Cause: one of these.

Cause Fix
Peekaboot is off. It is off by default for java -jar, wars, native images, AOT builds, containers and tests. Set peekaboot.enabled=true in application.yml, an environment variable or a system property. See Configuration, when Peekaboot is on.
You develop inside a devcontainer or GitHub Codespaces. Those count as containers. Set peekaboot.enabled=true and the feature switches you want, such as peekaboot.dev-toolbar, explicitly. See Configuration, containers.
The application sets server.servlet.context-path. Open the dashboard under that path, for example /my-app/peekaboot. The /peekaboot part cannot be changed.
The application is reactive (WebFlux) or not a web application. None. Peekaboot’s dashboard needs a servlet web application.
Spring Boot Actuator is not on the class path. Keep spring-boot-starter-actuator, which the Peekaboot starter brings in.

The startup log helps to tell these apart. Peekaboot logs a startup summary with the application name, build, server and datasource details whenever it is on, unless you set peekaboot.lifecycle.enabled=false. The summary’s Peekaboot Dashboard line shows the URL, and it is missing where no dashboard is served.

Peekaboot is off in @SpringBootTest

Cause: tests never count as a local run, so Peekaboot stays off in CI. See Configuration, where it turns itself on.

Fix: switch it on for the test that needs it.

@SpringBootTest(properties = "peekaboot.enabled=true")

The Traces tab is empty

Cause: nothing feeds the trace store. Check tracingSpansPossible in GET /peekaboot/api/features.

tracingSpansPossible Cause Fix
false No OpenTelemetry SDK on the class path. Keep spring-boot-starter-opentelemetry, which the Peekaboot starter brings in. See Quick start.
true Your configuration sets management.tracing.sampling.probability below 1.0. Peekaboot’s default of 1.0 loses to any value you set. Check the effective value on the Environment tab and remove or raise your setting.

A Traces tab that is missing altogether means peekaboot.tracing.enabled=false.

Traces arrive late in tests

Cause: spans are exported in batches. The delay is 200 ms while the dev toolbar is on and Spring Boot’s 5 s otherwise, and tests do not turn the toolbar on. A test that reads /peekaboot/api/traces/** right after its request runs before the spans are there. Until they are, /peekaboot/api/traces/{traceId}/insights answers 200 with rootSpan: null.

Fix: shorten the export delay in the test profile, or poll until rootSpan is set.

management:
  opentelemetry:
    tracing:
      export:
        schedule-delay: 50ms

A trace shows a TRUNCATED badge or fewer queries than expected

Cause: the trace hit peekaboot.tracing.max-spans-per-trace (default 500). The oldest spans were dropped, and their queries with them. The badge stays on that trace. Without the badge, the query count is complete.

Fix: raise peekaboot.tracing.max-spans-per-trace. See Configuration, query-heavy application.

A trace has no logs

Cause: one of these.

Fix: set peekaboot.dev-toolbar: true. See Traces, what gets recorded.

@Async work is missing or shows up as separate traces

Cause: the trace context does not reach the executor thread. Spring Boot does not propagate it by default, and Peekaboot does not switch that on for you.

Fix: enable context propagation.

spring:
  task:
    execution:
      propagate-context: true

Also check that peekaboot.tracing.async and peekaboot.tracing.enabled are not set to false. An application that declares its own Executor bean also needs spring.task.execution.mode=force. See Configuration, peekaboot.tracing and Traces, background work.

The toolbar does not appear

Cause: one of these.

Fix: set peekaboot.dev-toolbar: true where you want the toolbar outside a local run.

The toolbar says “could not start”

The bar reads:

Peekaboot toolbar could not start — sign in, or check that its script is allowed to load

Cause: the toolbar script was blocked. Either security in front of /peekaboot/** requires a login, or a Content-Security-Policy with a nonce-only script-src refuses the script.

Fix: sign in to the dashboard, or allow /peekaboot/ui/toolbar/toolbar.js in your script-src. See Security, the dev toolbar asks the reader to sign in.

The Meters tab is missing

Cause: there is no MeterRegistry bean. GET /peekaboot/api/features then reports metrics: false. The Insights tab and the stat tiles on Overview are missing too.

Fix: find what excludes Spring Boot Actuator’s metrics auto-configuration and remove it. See The dashboard, which tabs appear.

The Insights tab is missing or a panel says “No data”

Symptom Cause Fix
Insights tab missing peekaboot.insights.enabled=false, or there is no MeterRegistry (Meters is missing too). Remove the setting, or see the Meters tab is missing.
Your panels are replaced by the default ones Your peekaboot-insights.yml is invalid. The startup log has an ERROR containing is invalid; discarding it entirely. Fix the file as the log message says.
A panel says “No data” The panel’s meters are not registered, for example there is no HikariCP, Hibernate or datasource-micrometer. Look the meter up on the Meters tab. A meter that is not there cannot be charted.

See Insights, when the tab appears.

Values show as ******

Cause: Peekaboot masks values whose key or content looks like a secret. The rules can miss a secret or mask a harmless value. See Security, what gets masked, and how.

Fix: set peekaboot.enable-unmasking: true. Then use the “Show secrets” toggle on the Environment and Config tabs, or add ?unmask=true to GET /peekaboot/api/actuator/all/insights. You need both. See Security, two opt-ins before a real value is shown.

The dashboard returns 401

Cause: Peekaboot runs outside a local run, and nothing it can detect protects /peekaboot/**. Its own HTTP Basic guard is then on. It cannot see protection outside Spring Security, such as a VPN, a proxy with basic auth, an IP allowlist or an API gateway.

This also hits smoke tests that start the packaged jar with Testcontainers or docker-compose. That process counts as a deployment, not a test.

Fix: one of these.

See Security, securing the dashboard.

Users get a browser login dialog on application pages

Cause: peekaboot.dev-toolbar: true is set in a deployed environment. The toolbar’s requests to /peekaboot/api/** get a 401 with an HTTP Basic challenge, and the browser asks for credentials on whatever page is open.

Fix: remove peekaboot.dev-toolbar: true outside local development. It is off there by default. See Configuration, when Peekaboot is on.

The generated password changes on every restart

Cause: peekaboot.storage.enabled is false, the default outside a local run. The generated password is not saved.

Fix: one of these.

See Configuration, peekaboot.security.

Peekaboot’s error page does not appear

Cause: one of these.

Fix: set peekaboot.error-page.enabled: true outside a local run. To show Peekaboot’s page in place of your own, set peekaboot.error-page.override: true, typically in your local profile. The override does not work when the application excludes ErrorMvcAutoConfiguration or maps its own ErrorController to /error. See Configuration, peekaboot.error-page.

Peekaboot’s error page replaces your own

Cause: peekaboot.error-page.override: true is set. Without it, Peekaboot’s page never replaces an error page the application has.

Fix: remove override, or set it only in your local profile. To switch the page off entirely, set peekaboot.error-page.enabled: false.

Stack frames are hidden

Cause: stack-trace folding is on, the default for a local run. Framework frames collapse behind a toggle on the error page and in the Logs tab. Your own frames are never folded.

Fix: click the toggle to expand them. To stop folding, set peekaboot.stack-trace.fold: false. To change which frames fold, set peekaboot.stack-trace.exclude. See Configuration, peekaboot.stack-trace.