Monitoring and Logging

Health, service logs and monitoring

Health check

You can check the health of the server by making a request to /healthz, which should return a 200 OK response.

Monitoring

For monitoring, ew-vod2cbm generates Prometheus data available at /metrics. There are different metrics for the response times for segments for different media types. All bucket and counter names start with ew_, or more precisely:

ew_audio_segment_request_duration_milliseconds_bucket
ew_audio_segment_requests_total
ew_subs_segment_request_duration_milliseconds_bucket
ew_subs_segment_requests_total
ew_video_segment_request_duration_milliseconds_bucket
ew_video_segment_requests_total

Logging

To provide context to each log message, structured logging is used. Thus instead of free text log messages without any specific format, the log data is to some extent divided into fields of name-value pairs, making the logs more coherent and more suitable for processing by external tools.

Log messages related to a specific HTTP request include the log field named request_id which can be used to filter out specific requests.

The log field named topic is always present and is used to separate different areas of logging. The current topics are access, messages and error, and are used to log HTTP access, debug messages and panic stack traces, respectively.

As a comparison, the topics are similar to having separate files for access logging, debug messages and errors in a conventional file-based logging system.

Log formats

When run from the command line ew-vod2cbm can log in one of the formats consolepretty, consolejson or journald depending on the value of the -logformat parameter. Logging can be disabled by using the value discard.

$ ew-vod2cbm -upstream http://127.0.0.1 -logformat consolejson

consolepretty logs to standard output (stdout) in a human-readable format. Each log line starts with the date and the log message followed by the context- dependent log fields:

2022-02-07T11:54:42Z INF Incoming request bytes_out=27592 latency_ms=6.18251 method=GET ...

consolejson logs to stdout using a JSON object for each message:

{"level":"info","topic":"access","time":"2022-02-07T12:06:07Z","bytes_out":27592, ...}

When run as a systemd service, ew-vod2cbm logs directly to journald using the logjournald configuration parameter. When stored in journald, field names are upper case whereas the values keep their format. Some examples:

To see entries with the topic access:

$ journalctl -u ew-vod2cbm TOPIC=access -o verbose

To see entries with a specific request ID:

$ journalctl -u ew-vod2cbm REQUEST_ID="host/B1Po0eYz1d-000006" -o verbose

To see the call stack in the event of a crash:

$ journalctl -u ew-vod2cbm TOPIC=error -o verbose

Using the verbose output includes all available name-value fields. Without this only the log message is printed. The field named JSON contains the original structured log message as sent by the service. To filter out only this field --output-fields=JSON can be used, however this requires a systemd version of at least 236.

$ journalctl -u ew-vod2cbm --output-fields=JSON TOPIC=access

To continuously monitor the service:

$ journalctl -fu ew-vod2cbm

Log levels

At startup the log level is set to info. The log level can be changed by posting a form-field named level to the loglevel endpoint on the ew-vod2cbm server:

$ curl -F level=debug ew-vod2cbm-server:8090/loglevel

The available log levels and how they relate to systemd priority values is listed below:

Log level  Systemd priority
trace      7
debug      7
info       6
warn       4
error      3
fatal      2
panic      0

To e.g. see all error and warning messages using journalctl:

$ journalctl -u ew-vod2cbm PRIORITY=3 PRIORITY=4

Use a GET request to see the current log level:

$ curl ew-vod2cbm-server:8090/loglevel

Messages with higher level than the configured one will not be logged.