---
title: Health and monitoring
description: The liveness and readiness probes, what they do and do not verify, the log format and which signals to alert on.
canonical: https://developer.unico.io/human-plugin/self-hosting/health-and-monitoring
locale: en
generated_by: markdown-export
---

# Health and monitoring

What to probe, what to watch and what the probes cannot tell you.

## Probes

| Endpoint | Answers | Use for |
| --- | --- | --- |
| `GET /health/live` | `200 {"status":"ok"}` while the process serves requests | Liveness |
| `GET /health/ready` | `200 {"status":"ok"}` when PostgreSQL answers, otherwise `503 {"status":"unavailable"}` | Readiness: route traffic only after it is ready |

```yaml
livenessProbe:
  httpGet: { path: /health/live, port: 8080 }
readinessProbe:
  httpGet: { path: /health/ready, port: 8080 }
  timeoutSeconds: 5
```

Set `timeoutSeconds` on the readiness probe. If PostgreSQL accepts connections but stops answering, the check can wait much longer than that, and the timeout makes the probe fail instead of hang.

### What readiness does not check

Readiness only checks the database. It does **not** check that the access key is valid or that Unico is reachable. A wrong access key shows up as errors on create, not as a failed probe. Include a real create request in your post-deployment checks.

## Logs

Logs are JSON lines on standard output, with `timestamp`, `severity`, `service` and `message`. Failures that involve a stored process include its `id`. Mistakes made by the caller (`400`, `404`, `409`, `422`) are not logged.

A healthy start logs these lines, in this order, among the PostgreSQL connection messages (the catalog `version` and `count` change with each catalog release):

```json
{"severity":"INFO","timestamp":"2026-11-03T14:02:11.482913407Z","message":"attribute catalog loaded","service":"human-plugin","version":"2026-10-29.1","count":53,"url":"https://human-token-assets.unico.app/attribute-catalog.json"}
{"severity":"INFO","timestamp":"2026-11-03T14:02:11.731050212Z","message":"database schema ready","service":"human-plugin"}
{"severity":"INFO","timestamp":"2026-11-03T14:02:11.733418901Z","message":"human plugin listening","service":"human-plugin","addr":":8080"}
```

## What to alert on

- Readiness failing: the database is unreachable.
- Repeated `503 DATABASE_UNAVAILABLE` or `502 UPSTREAM_UNAVAILABLE` answers to your back-end's calls.
- Container restarts: a restart loop usually means a missing setting, an unreachable catalog or a database problem. The log states which.
- Error-level log lines, such as `creating process` or `retrieving process`.

Human Plugin does not export metrics. Use your gateway or service mesh for request rates and latency.