Troubleshooting
The dashboard doesn't load
- The process exited. The dashboard runs on a background thread and stops with the process. See A script.
- The port is taken. When another process holds the port, the dashboard logs a critical message and retries in the background until the port is free. Pass another
porttoinit(), or stop the other process. - It's on another interface. By default the dashboard only listens on
127.0.0.1. To reach it from another machine or a container, see Exposing the dashboard.
The dashboard keeps asking to log in
authorizereturns a falsy value. Check what it receives:request.headersandrequest.cookies.authorizeraises. The request is denied and the error logged, look for "authorize() failed".- The cookie doesn't reach the dashboard. A cookie set on another host, or another subdomain without a covering
Domain, isn't sent to it. See Logging in.
A card stays empty
- Nothing was emitted yet. A card fills in with the first event of its source.
- The source doesn't match. A widget shows the events emitted under its name, or its
source. - The field doesn't match.
Numberreadsvalueunless given anothery. A missing or non-numeric field logs a warning once, see Choosing a widget. - The events are older than 30 minutes. Only line and time series charts keep older events. Build the widget with
persist=Trueto keep its state, see How long events are kept.
A count over the last hour doesn't go down
An aggregate is refreshed with each event of its source and on page load, not on a timer. With no new event, it shows its value as of the last one. Reload the page to see it as of now.
"wants to persist, but no storage is configured"
A widget built with persist=True needs the dashboard's storage. Pass it to init(), called before the widget is added or its page included:
from dachshund.storage import SQLiteStorage
dachshund.init("My service", storage=SQLiteStorage("widget_state.db"))
"already exists" or "already taken"
Widget and action names are unique across the whole dashboard, every page included. Rename one of the two.
An action fails
- A required argument is missing. On a card, give it in
action_args. On a table row, emit it as a field of the row. - An async action fails on another event loop. Call
init()from inside your application's running loop, so actions run on it. See Running with Your App.
Some events only show after a reload
Under several worker processes, live updates only come from the worker serving the dashboard. Events from the other workers show on the next page load. See Several workers.