nix

configuration files that power my machines
Log | Files | Refs | README | LICENSE

loki.nix (3812B)


      1 {
      2   config,
      3   lib,
      4   pkgs,
      5   ...
      6 }: let
      7   cfg = config.services.haravara.monitoring;
      8 in {
      9   options.services.haravara.monitoring.loki = {
     10     enable = lib.mkEnableOption "Loki log aggregation and Alloy collector" // {default = true;};
     11     port = lib.mkOption {
     12       type = lib.types.port;
     13       default = 3100;
     14       description = "Port for Loki HTTP listener";
     15     };
     16     dataDir = lib.mkOption {
     17       type = lib.types.str;
     18       default = "/var/lib/loki";
     19       description = "Directory for Loki storage";
     20     };
     21   };
     22 
     23   config = lib.mkIf (cfg.enable && cfg.loki.enable) {
     24     services.loki = {
     25       enable = true;
     26       configuration = {
     27         server = {
     28           http_listen_address = "127.0.0.1";
     29           http_listen_port = cfg.loki.port;
     30           grpc_listen_address = "127.0.0.1";
     31         };
     32         auth_enabled = false;
     33 
     34         common = {
     35           instance_addr = "127.0.0.1";
     36           path_prefix = cfg.loki.dataDir;
     37           replication_factor = 1;
     38           ring.kvstore.store = "inmemory";
     39         };
     40 
     41         schema_config.configs = [
     42           {
     43             from = "2020-10-24";
     44             store = "tsdb";
     45             object_store = "filesystem";
     46             schema = "v13";
     47             index.prefix = "index_";
     48             index.period = "24h";
     49           }
     50         ];
     51 
     52         storage_config.filesystem.directory = "${cfg.loki.dataDir}/chunks";
     53       };
     54     };
     55 
     56     services.alloy = {
     57       enable = true;
     58       configPath = pkgs.writeText "alloy-config.river" ''
     59         // ── Logs ────────────────────────────────────────────────────────────
     60 
     61         loki.write "default" {
     62           endpoint {
     63             url = "http://127.0.0.1:${toString cfg.loki.port}/loki/api/v1/push"
     64           }
     65         }
     66 
     67         loki.relabel "journal" {
     68           forward_to = []
     69 
     70           rule {
     71             source_labels = ["__journal__systemd_unit"]
     72             target_label  = "unit"
     73           }
     74 
     75           rule {
     76             source_labels = ["__journal__systemd_unit"]
     77             target_label  = "unit_file"
     78           }
     79 
     80           rule {
     81             source_labels = ["__journal__systemd_unit"]
     82             target_label  = "service_name"
     83           }
     84         }
     85 
     86         loki.source.journal "systemd_logs" {
     87           max_age       = "12h"
     88           forward_to    = [loki.write.default.receiver]
     89           relabel_rules = loki.relabel.journal.rules
     90           labels        = {
     91             job  = "systemd-journal",
     92             host = "${config.networking.hostName}",
     93           }
     94         }
     95 
     96         // ── Caddy access logs ───────────────────────────────────────────
     97 
     98         local.file_match "caddy_access" {
     99           path_targets = [
    100             {__path__ = "/var/log/caddy/access-*.log", job = "caddy-access", host = "${config.networking.hostName}"},
    101           ]
    102         }
    103 
    104         loki.source.file "caddy_access" {
    105           targets       = local.file_match.caddy_access.targets
    106           forward_to    = [loki.write.default.receiver]
    107           tail_from_end = true
    108         }
    109 
    110         // ── Caddy error log ──────────────────────────────────────────────
    111 
    112         local.file_match "caddy_error" {
    113           path_targets = [
    114             {__path__ = "/var/log/caddy/caddy.log", job = "caddy-error", host = "${config.networking.hostName}"},
    115           ]
    116         }
    117 
    118         loki.source.file "caddy_error" {
    119           targets       = local.file_match.caddy_error.targets
    120           forward_to    = [loki.write.default.receiver]
    121           tail_from_end = true
    122         }
    123       '';
    124     };
    125   };
    126 }