Metrics
Three processes serve Prometheus metrics at /metrics, under liken’s shared
contract
.
The display-operator container serves plain HTTP on port 9200, one
per node. The display-capture container serves them on port 9201,
the same TLS port as the captures, and the route needs no token. The
display-api Deployment serves plain HTTP on port 9200, once for
the cluster. The base applies with no Prometheus in the cluster. An
owner who runs the prometheus-operator adds the deploy/monitoring
component beside the base, which holds a PodMonitor for each port.
Each process also sets liken_build_info{component, version} to 1.
The component is display-operator, display-capture, or
display-api.
| Component | Metric | Type | Why |
|---|---|---|---|
| display-operator | display_output_connected{output} |
gauge | a monitor that went away |
| display-operator | display_output_claimed{output} |
gauge | the hardware triple |
| display-operator | display_observation_valid{source}, display_observation_last_success_timestamp_seconds{source} |
gauge | the card or the compositor socket stopped answering |
| display-operator | display_output_mode_info{output, mode, refresh} |
gauge, info | what is actuated on each panel |
| display-operator | display_compositor_restarts_total{reason} |
counter | the restarts the operator orders, by reason; the unbounded-restart problem as a rate |
| display-operator | display_compositor_serving |
gauge | the compositor answers the handshake, refuses the connect, or answers nothing |
| display-operator | display_compositor_container_restarts_total |
counter | the kubelet’s count of the compositor’s crashes: the exits the operator did not order |
| display-operator | display_surfaces{output} |
gauge | what the compositor holds; a stuck surface |
| display-operator | display_panel_power{output}, display_panel_brightness{output} |
gauge | the DDC state the idle screen drives |
| display-operator | display_reconcile_duration_seconds{kind} |
histogram | how long one pass of the reconcile loop took |
| display-operator | display_reconcile_errors_total{kind} |
counter | passes of the reconcile loop that returned an error |
| display-operator | display_watch_restarts_total{kind} |
counter | watches the API server accepted after the first one, for each kind |
| display-capture | display_capture_ready |
gauge | the sidecar holds the certificate the API verifies it under |
| display-capture | display_capture_conversion{graph} |
gauge | which of the two frame-conversion graphs the node uses, vaapi or software |
| display-capture | display_captures_active{aspect} |
gauge | captures running on the node now |
| display-capture | display_capture_bytes_total{aspect,format}, display_capture_seconds_total{aspect,format} |
counter | how much the sidecar encoded and sent, and how long it streamed |
| display-capture | display_capture_frames_total{format} |
counter | frames taken from the compositor |
| display-capture | display_capture_failures_total{reason} |
counter | captures that failed |
| display-api | display_api_requests_total{route,method,status} |
counter | requests answered |
| display-api | display_api_request_seconds{route} |
histogram | time to the response headers |
| display-api | display_api_streams_active{aspect} |
gauge | capture responses the API is streaming now |
| display-api | display_api_certificate_expiry_seconds |
gauge | when the serving certificate expires, in seconds since the epoch |
resources:
- https://github.com/liken-sh/liken//display-operator/deploy?ref=<version>
components:
- https://github.com/liken-sh/liken//display-operator/deploy/monitoring?ref=<version>
The card observation
display_observation_valid{source="card"} reports whether the last
read of the card succeeded. The operator reads the card only while it
holds a connection to a compositor. While it holds none, the operator
records no card observation: the gauge keeps the value of the last
read, and display_observation_last_success_timestamp_seconds{source="card"}
keeps the time of the last successful read, so its age grows.
Compositor restart reasons
display_compositor_restarts_total counts each restart of the
compositor that the operator orders. The reason label says why:
reason |
Why the operator restarts the compositor |
|---|---|
mode |
A claim’s mode parameter or a Display’s spec.mode changes the mode that a screen runs. Weston reads its config only at startup. |
heal |
The compositor re-created an output with another monitor or another mode, so the canvases on the other screens have the wrong size. |
hung |
The compositor accepted connections on its socket and answered nothing for 10 seconds. The operator sends SIGKILL. |
masterless |
A read of the card found that the compositor holds no DRM master, so it cannot show a frame. The operator restarts each compositor process for this reason at most once. |
The compositor’s container starts weston again at once after each of
these restarts, so the kubelet does not count them. A compositor that
exits on its own has no reason, and this counter does not count it.
Its container exits with it, and
display_compositor_container_restarts_total counts it, from the
kubelet’s restart count.