Troubleshooting
Offline, 401, 403, 413, queue backlog — causes and fixes by symptom
Start by looking at these on the device. Most answers are here.
geo-mlops-edge status # the '!!' sentence at the top, link.state, sync.state, backlog
geo-mlops-edge queue --state failed
journalctl -u geo-mlops-edge -n 200 # or docker compose logs edge
link.state | Meaning |
|---|---|
online | Talking to Central |
probing | Checking the connection (waiting for 2 successes in a row) |
offline | Central unreachable — buffering |
auth_failed | Token rejected — a person has to replace the token |
Shown as Unhealthy in the fleet / offline
Symptom: Unhealthy (비정상) in the list, last heartbeat several minutes ago. link.state on the device is offline.
If no heartbeat arrives within the server threshold (180 seconds by default), the device becomes Unhealthy (비정상). Check:
-
Is the agent running? If
geo-mlops-edge statussaysno agent is listening …, the service has stopped. Look atsystemctl status geo-mlops-edge. -
Is the address right? Check
central.base_urlingeo-mlops-edge config, and probe it directly from the device.curl -s https://mlops.example.com/api/v1/healthNo response means a DNS, firewall or proxy problem. If the server uses an internal certificate, install the CA on the device (recommended) or test with
central.verify_tls: false. -
Is it an Offline block? If the screen shows the Blocked (Offline) (Offline 차단됨) badge, an operator has cut the device off at the server. The device is receiving
503and buffering data, and it recovers on its own when the block is lifted. -
Is the heartbeat interval too long? If the policy's heartbeat interval is close to 180 seconds, even a healthy device flickers.
Collection continues while offline, and data accumulates within the retention limits. When the link comes back, nobody has to do anything.
401 — token rejected
Symptom: !! Central rejected this device's token … at the top of status, link.state and sync.state are auth_failed, and the log shows 401 invalid or expired edge token.
The token is wrong, has been rotated or revoked, or has expired (after one year). In this state the agent stops on purpose, and command polling stops too, so it cannot be fixed from Central.
Fix: get a new token with Rotate (회전) on Central, edit /etc/geo-mlops/edge.env on the device, and restart the service (Deploy — rotating the device token). Also check that no leading or trailing spaces or line breaks got into the token.
403 — missing scope
Symptom: status shows !! Central refuses uploads: … The token is still valid; a scope was removed., with the reason in sync.denied.
The token is valid, but the scope for that job is off (for example, a file upload without data:write). Only that kind of work stops; the rest continues.
Fix: turn the scope on with scope Edit (편집) in Token management (토큰 관리) on the device detail page. There is nothing to do on the device; it recovers on its own.
413 — too large
It depends on where it came from.
| Where | Cause | Agent behaviour | Fix |
|---|---|---|---|
Local API (/inference, /blobs, push) | Request body exceeds api.max_body_bytes (default 2 GiB) | Rejected | Check the sender. Adjust the limit if needed |
| Sending records to Central | Records in one request exceed the server limit (1000) | Shrinks the batch and retries automatically; no data is dropped | Set sync.batch_size to 1000 or less |
| Uploading a file to Central | A single file exceeds the server's per-file limit (default 2 GiB) | Folds that file into failed | Split the file, or ask the server administrator about the limit |
| http collector | A poll response exceeds max_body_bytes (default 1 MiB) | Logs that poll as an error | Check the URL is right; adjust the limit if needed |
A PayloadTooLargeError gives the same result when resent, so CentralClient does not retry it either.
The queue does not shrink (backlog)
Symptom: the fleet's Backlog (대기) number keeps rising, or a red −N (items dropped by retention limits in the last 24 hours) appears next to it.
Look at sync in status.
sync.state / last_error | Cause | Fix |
|---|---|---|
paused / paused: cpu above threshold | System CPU exceeds sync.cpu_pause_percent (default 85) | If the device is always busy, raise the threshold in the policy or set 0 (no check) |
idle but pending does not shrink | It is currently outside sync.windows (allowed upload windows) | Widen the windows, or give urgent data a priority of urgent_priority (90) or more |
offline | Link down | See "offline" above |
auth_failed | Token rejected | See "401" above |
idle but failed keeps growing | Items rejected one by one (validation failures and so on) | Check last_error in queue --state failed, remove the cause, then use the Resync (재동기화) command or sync:retry-failed |
Also:
- You collect more than you can send. If
−Nkeeps showing, the link cannot keep up. Increase the http collector'sinterval_ms, cut down watchdir files, or check thatsync.max_bytes_per_sis not too low. - Failures are retried up to 20 times. A transient failure is resent starting at around 10 seconds and doubling up to a 15-minute interval; after 20 tries it is folded into
failed. - Items are dropped in the order lower priority → older. Raise
priorityon collectors whose data must not be lost.
Other symptoms
| Symptom | Cause | Fix |
|---|---|---|
| The agent exits immediately with exit code 4 | Something is already using the local API port (8600) | Check whether another agent is running, or change api.port |
| The agent does not come back after a restart command | Running without a supervisor | Run it with systemd Restart=always or a container restart: |
queued but could not be removed on a watchdir collector | The agent account has no write permission on that folder | Grant folder permission; with systemd, add it to ReadWritePaths= |
activated: false after pulling a model | The extra for that framework is missing | Install as the log says: install 'geo-mlops-sdk[yolo]' |
pull_model command gives 404 model artifact not found | The registry version has no artifacts | Check that the version came from training |
404 no push collector named … on push | No push collector with that name in edge.yaml | Declare it under collectors: and restart |
| GPU values are empty | No NVIDIA driver or gpu extra | On a GPU device, pip install 'geo-mlops-sdk[gpu]' |