{ config, lib, ... }: with lib; with types; let cfg = config.components.monitor.promtail; in { options.components.monitor.promtail = { enable = mkOption { type = lib.types.bool; default = config.components.monitor.enable; }; port = mkOption { type = int; default = 3500; description = "port to provide promtail export"; }; }; config = mkMerge [ (mkIf config.components.monitor.promtail.enable { services.opentelemetry-collector.settings = { receivers.loki = { protocols.http.endpoint = "127.0.0.1:${toString cfg.port}"; use_incoming_timestamp = true; }; service.pipelines.logs.receivers = [ "loki" ]; }; services.promtail = { enable = true; configuration = { server = { http_listen_port = 28183; grpc_listen_port = 0; }; positions.filename = "/tmp/positions.yaml"; clients = [ { url = "http://127.0.0.1:${toString cfg.port}/loki/api/v1/push"; } ]; scrape_configs = [ { job_name = "journal"; journal = { max_age = "12h"; }; relabel_configs = [ { source_labels = [ "__journal__systemd_unit" ]; target_label = "unit"; } { source_labels = [ "__journal__transport" ]; target_label = "transport"; } ]; } ]; }; }; }) ]; }