NixOS/system/services/telemetry/alloy.nix

196 lines
5.3 KiB
Nix
Raw Normal View History

{
config,
lib,
inputs,
unstable,
...
}:
2024-09-06 21:13:31 +07:00
let
cfg = config.profile.services.telemetry.alloy;
webguiListenAddress = "0.0.0.0:5319";
otelcolHTTPListenAddress = "192.168.100.5:4318";
otelcolGRPCListenAddress = "192.168.100.5:4317";
2024-09-06 21:13:31 +07:00
domain = "alloy.tigor.web.id";
in
{
imports = [
# Grafana Alloy is still in unstable options.
"${inputs.nixpkgs-unstable}/nixos/modules/services/monitoring/alloy.nix"
];
config = lib.mkIf cfg.enable {
services.alloy = {
enable = true;
extraFlags = [ ''--server.http.listen-addr=${webguiListenAddress}'' ];
2024-09-06 21:13:31 +07:00
package = unstable.grafana-alloy;
};
services.caddy.virtualHosts.${domain}.extraConfig = ''
@require_auth not remote_ip private_ranges
2024-10-28 21:38:34 +07:00
basic_auth @require_auth {
{$AUTH_USERNAME} {$AUTH_PASSWORD}
2024-09-06 21:13:31 +07:00
}
2024-09-06 21:13:31 +07:00
reverse_proxy ${webguiListenAddress}
'';
services.caddy.virtualHosts."otelhttp.tigor.web.id".extraConfig = ''
@require_auth not remote_ip private_ranges
basic_auth @require_auth {
{$AUTH_USERNAME} {$AUTH_PASSWORD}
}
reverse_proxy ${otelcolHTTPListenAddress}
'';
services.caddy.virtualHosts."otelgrpc.tigor.web.id".extraConfig = ''
@require_auth not remote_ip private_ranges
basic_auth @require_auth {
{$AUTH_USERNAME} {$AUTH_PASSWORD}
}
reverse_proxy ${otelcolGRPCListenAddress} {
transport http {
tls
tls_insecure_skip_verify
}
}
'';
systemd.services.alloy.serviceConfig = {
User = "root";
};
2024-09-06 21:13:31 +07:00
environment.etc."alloy/config.alloy".text =
let
lokiConfig = config.services.loki.configuration;
tempoProtocols = config.services.tempo.settings.distributor.receivers.otlp.protocols;
2024-09-07 10:41:59 +07:00
mimirServer = config.services.mimir.configuration.server;
2024-09-06 21:13:31 +07:00
in
# hcl
''
2024-09-06 21:13:31 +07:00
otelcol.receiver.otlp "homeserver" {
grpc {
endpoint = "${otelcolGRPCListenAddress}"
2024-09-06 21:13:31 +07:00
}
http {
endpoint = "${otelcolHTTPListenAddress}"
2024-09-06 21:13:31 +07:00
}
output {
2024-09-07 10:41:59 +07:00
metrics = [otelcol.processor.batch.default.input]
2024-09-06 21:13:31 +07:00
logs = [otelcol.processor.batch.default.input]
2024-09-07 08:59:44 +07:00
traces = [otelcol.processor.batch.default.input]
2024-09-06 21:13:31 +07:00
}
}
otelcol.processor.batch "default" {
output {
2024-09-07 10:41:59 +07:00
metrics = [otelcol.exporter.prometheus.mimir.input]
2024-09-06 21:13:31 +07:00
logs = [otelcol.exporter.loki.default.input]
2024-09-07 08:59:44 +07:00
traces = [otelcol.exporter.otlp.tempo.input]
2024-09-06 21:13:31 +07:00
}
}
otelcol.exporter.loki "default" {
forward_to = [loki.write.default.receiver]
}
2024-09-07 10:41:59 +07:00
otelcol.exporter.prometheus "mimir" {
forward_to = [prometheus.remote_write.mimir.receiver]
}
2024-09-06 21:13:31 +07:00
loki.write "default" {
endpoint {
url = "http://${lokiConfig.server.http_listen_address}:${toString lokiConfig.server.http_listen_port}/loki/api/v1/push"
2024-09-06 21:13:31 +07:00
}
}
2024-09-07 08:59:44 +07:00
loki.relabel "journal" {
forward_to = []
rule {
source_labels = ["__journal__systemd_unit"]
target_label = "unit"
}
rule {
source_labels = ["__journal__hostname"]
target_label = "host"
}
rule {
source_labels = [ "__journal__systemd_user_unit" ]
target_label = "user_unit"
}
rule {
source_labels = [ "__journal__transport" ]
target_label = "transport"
}
rule {
source_labels = [ "__journal_priority_keyword" ]
target_label = "severity"
}
}
loki.source.journal "read" {
2024-09-17 13:13:30 +07:00
forward_to = [loki.process.general_json_pipeline.receiver]
relabel_rules = loki.relabel.journal.rules
labels = {
job = "systemd-journal",
component = "loki.source.journal",
}
}
2024-09-17 13:13:30 +07:00
loki.process "general_json_pipeline" {
forward_to = [loki.write.default.receiver]
stage.json {
expressions = {
level = "level",
}
}
stage.labels {
values = {
level = "",
}
}
}
2024-09-07 08:59:44 +07:00
otelcol.exporter.otlp "tempo" {
client {
endpoint = "${tempoProtocols.grpc.endpoint}"
tls {
insecure = true
insecure_skip_verify = true
}
2024-09-07 08:59:44 +07:00
}
}
2024-09-07 10:41:59 +07:00
prometheus.exporter.unix "system" {}
prometheus.scrape "system" {
targets = prometheus.exporter.unix.system.targets
forward_to = [prometheus.remote_write.mimir.receiver]
}
2024-09-10 12:09:50 +07:00
prometheus.scrape "caddy" {
targets = [{
__address__ = "localhost:2019",
}]
job_name = "caddy"
forward_to = [prometheus.remote_write.mimir.receiver]
}
2024-09-07 10:41:59 +07:00
prometheus.remote_write "mimir" {
endpoint {
url = "http://${mimirServer.http_listen_address}:${toString mimirServer.http_listen_port}/api/v1/push"
2024-09-07 10:41:59 +07:00
}
}
2024-09-06 21:13:31 +07:00
'';
};
}