Skip to main content

Monitor an instance

The authorization server exposes health checks and Prometheus metrics over HTTP and writes its logs to standard output. Use this page to wire them into your monitoring. To send traces, metrics and logs to your own OpenTelemetry collector instead, see Telemetry export.

Set one value. Run the blocks below in order in one shell. Each one checks the answer it gets.

export POLICYARC_URL="https://your-environment.example"

Health​

for path in /actuator/health /actuator/health/liveness /actuator/health/readiness; do
curl -fsS "$POLICYARC_URL$path" | jq -e '.status == "UP"' >/dev/null || { echo "Expected UP from $path" >&2; false; }
done
PathUse it for
/actuator/health/livenessA liveness probe. The Helm chart uses it.
/actuator/health/readinessA readiness probe. The Helm chart uses it.
/actuator/healthThe overall status. It includes the database check. A caller without credentials sees the status only, not the details.

These paths answer without a key. See Harden an instance.

Metrics​

/actuator/prometheus serves metrics in the Prometheus text format. It answers without a key, so scrape it from inside your network and block it at your proxy.

Every series carries two labels, application and instance. instance is the value of INSTANCE_NAME, local by default. The Helm chart sets it.

This block registers a client, which makes the server ask the policy engine for a decision, and then reads two series.

curl -fsS -o /dev/null -X POST "$POLICYARC_URL/register" -H 'Content-Type: application/json' \
-d '{"client_name": "metrics-check", "redirect_uris": ["https://metrics-check.example/cb"]}'
metrics=$(curl -fsS "$POLICYARC_URL/actuator/prometheus")
grep -q '^http_server_requests_seconds_count{' <<<"$metrics" || { echo 'Expected http_server_requests_seconds_count' >&2; false; }
grep '^opa_evaluation_seconds_count{' <<<"$metrics" | grep -q 'path="/v1/data/oauth/register"' ||
{ echo 'Expected an opa_evaluation_seconds series for the register policy' >&2; false; }
SeriesLabelsWhat to watch
http_server_requests_secondsuri, method, status, outcomeLatency and error rate per route. A rise in status="500" on /token can mean the audit log cannot be written. See Audit log. A rise in status="429" means clients hit the rate limit.
opa_evaluation_secondspath, outcomeTime each call to the policy engine takes. outcome="error" counts calls that failed, such as an unreachable policy engine.
hikaricp_connections_active, hikaricp_connections_pendingpoolDatabase connections in use and requests waiting for one

The server also serves the standard JVM, Tomcat and process series.

Logs​

With any Spring profile except dev, the server writes one JSON object per line to standard output. Collect it with your platform's log collector. This line is from a refused token request.

{"@timestamp":"2026-10-13T19:13:20.235140511Z","@version":"1","message":"Token decision: error","logger_name":"com.identos.pbac.oauth.service.TokenService","thread_name":"http-nio-8080-exec-9","level":"WARN","level_value":30000,"lokiUrl":"http://localhost:3100","instanceName":"local","appName":"pbac-authorization-server","request_id":"61923f07-da51-4f1f-ac15-a4f547d12fc2","client_id":"nobody","event":"token_decision","outcome":"error","client_id":"nobody","grant_type":"client_credentials","reason":"invalid_client: Unknown client_id — client has not been registered or was deleted"}

Each line also carries lokiUrl, instanceName and appName from the logging configuration. A line written while a request runs carries its request_id. It matches the requestId of the audit log row that request wrote. Decision lines carry event, and most carry outcome and reason.

eventWritten when
token_decision/token allows, denies or fails a request
authorize_decision/authorize allows, denies or fails a request
introspect_decision/introspect answers
register_decision/register allows or denies a client
evaluation_decisionAn AuthZEN evaluation answers
callback_resultAn identity provider returns a user
auth_failureA call fails the admin key check on /admin/**, the bundle key check on /bundles/** or the credential check on /access/**. The filter field says which.
admin_mutationAn administrator changes something

To alert on refused admin calls, count auth_failure lines whose filter is admin_api_key. To alert on a policy engine outage, watch opa_evaluation_seconds_count{outcome="error"}.

On a hosted environment​

PolicyArc runs the server. Use Telemetry export to send telemetry to your collector, and the audit log to see each decision.