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 }