Monitoring and Logging
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-manip 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_hls_requests_total
ew_hls_request_duration_milliseconds
ew_dash_requests_total
ew_dash_request_duration_milliseconds
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-manip
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-manip -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-manip
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-manip TOPIC=access -o verbose
To see entries with a specific request ID:
$ journalctl -u ew-manip REQUEST_ID="host/B1Po0eYz1d-000006" -o verbose
To see the call stack in the event of a crash:
$ journalctl -u ew-manip 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-manip --output-fields=JSON TOPIC=access
To continuously monitor the service:
$ journalctl -fu ew-manip
Log levels
At startup the log level is set to info
. The log level can be changed at run
time by posting a form-field named level
to the loglevel
endpoint on the
ew-manip
server:
$ curl -F level=debug ew-manip-server:8094/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-manip PRIORITY=3 PRIORITY=4
Use a GET request to see the current log level:
$ curl ew-manip-server:8094/loglevel
Messages with higher level than the configured one will not be logged.