#!/bin/sh set -eu textfile_directory=/run/prom s6rc_service_is_up() { if s6-rc -a list | grep -q "${1:?}"; then printf '1'; else printf '0'; fi } printmetric() { local name=${1:?} local labels=${2:?} local value=${3:?} printf '%s{%s} %s\n' "$name" "$labels" "$value" } services_count() { printf '# HELP s6_rc_services_count number of services\n' printf '# TYPE s6_rc_services_count gauge\n' for bundle in $(s6-rc-db list bundles); do printmetric 's6_rc_services_count' \ $(printf 'bundle="%s"' $bundle) \ $(s6-rc list $bundle | wc -l) done } services_up() { printf '# HELP s6_rc_service_up if a service is running\n' #printf '# TYPE s6_rc_service_up stateset\n' for bundle in $(s6-rc-db list bundles) do for service in $(s6-rc-db contents "$bundle") do printmetric 's6_rc_service_up' \ $(printf 'bundle="%s",service="%s"' $bundle $service) \ $(s6rc_service_is_up $service) done done } write_textfile() { mkdir -p "$textfile_directory" || exit 1 tmp=$(mktemp --tmpdir metrics_s6_rc.XXXXX) ( services_count services_up ) | tee "$tmp" mv -v "$tmp" "$textfile_directory"/s6_rc.prom || exit 1 chmod +r "$textfile_directory"/s6_rc.prom chown nobody:nobody "$textfile_directory"/s6_rc.prom } main() { write_textfile } main >/dev/null 2>&1