Skip to content
Snippets Groups Projects
promtail.nix 2.36 KiB
Newer Older
  • Learn to ignore specific revisions
  • # Promtail log forwarder configuration
    #
    # Scope: Tail logs on the local system and send them to Loki
    #
    # Description: This is not strictly an "exporter" like the Prometheus
    #              exporters, but it is very similar in what it is doing -
    #              preparing local data and sending it off to a TSDB.
    
    
    { config, options, lib, ... }:
    
      cfg = config.services.private-storage.monitoring.exporters.promtail;
    
      hostName = config.networking.hostName;
    
    in {
    
      options.services.private-storage.monitoring.exporters.promtail = {
        enable = lib.mkEnableOption "Promtail log exporter service";
    
        lokiUrl = lib.mkOption {
          type = lib.types.str;
          description = ''
            The server URL that logs should be pushed to.
          '';
          # Resolving names is hard, let's have breakfast
    
          # If you are curious why there's a plain IP address in here, read all of
          # https://whetstone.private.storage/privatestorage/PrivateStorageio/-/merge_requests/251
          # https://whetstone.private.storage/privatestorage/PrivateStorageio/-/merge_requests/257
          # https://whetstone.private.storage/privatestorage/PrivateStorageio/-/merge_requests/258
    
          default = "http://172.23.23.1:3100/loki/api/v1/push";
        };
    
      config = lib.mkIf cfg.enable {
        services.promtail.enable = true;
        networking.firewall.interfaces.monitoringvpn.allowedTCPPorts = [ 9080 ];
        services.promtail.configuration = {
          server = {
            http_listen_port = 9080; # Using /metrics for health check
            grpc_listen_address = "127.0.0.1"; # unused, but no option to turn it off.
            grpc_listen_port = 9094; # unused, but no option to turn it off.
          };
    
          clients = [{
    
          }];
    
          scrape_configs = [{
            job_name = "systemd-journal";
            journal = {
              labels = {
                job = "systemd-journal";
                host = hostName;
              };
    
            # The journal has many internal labels, that by default will
            # be dropped because of their "__" prefix.  To keep them, rename them.
            # https://grafana.com/docs/loki/latest/clients/promtail/scraping/#journal-scraping-linux-only
            # https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html
    
            relabel_configs = [{
              source_labels = [ "__journal__systemd_unit" ];
              target_label = "unit";
            }];