{ config, ... }: let otel-prometheus-exporter-port = 4316; grafana-cfg = config.services.grafana; prometheus-cfg = config.services.prometheus; in { services.opentelemetry-collector = { enable = true; settings = { receivers = { otlp = { protocols = { grpc.endpoint = "localhost:4317"; http.endpoint = "localhost:4318"; }; }; hostmetrics.scrapers = { cpu = { }; disk = { }; filesystem = { }; load = { }; memory = { }; network = { }; process = { }; processes = { }; paging = { }; }; }; processors = { memory_limiter = { check_interval = "5s"; limit_mib = 2500; spike_limit_mib = 500; }; batch = { timeout = "10s"; send_batch_size = 100; }; }; exporters = { debug = { verbosity = "detailed"; }; prometheus = { endpoint = "localhost:${toString otel-prometheus-exporter-port}"; send_timestamps = true; enable_open_metrics = true; }; }; service = { extensions = [ ]; pipelines = { traces = { receivers = [ "otlp" ]; exporters = [ "debug" ]; }; metrics = { receivers = [ "otlp" "hostmetrics" ]; exporters = [ "debug" "prometheus" ]; }; logs = { receivers = [ "otlp" ]; exporters = [ "debug" ]; }; }; }; }; }; services.prometheus = { enable = true; globalConfig = { scrape_timeout = "10s"; scrape_interval = "1m"; }; scrapeConfigs = [ { job_name = "otel"; scrape_interval = "5s"; static_configs = [ { targets = [ "localhost:${toString otel-prometheus-exporter-port}" ]; } ]; } ]; }; services.grafana = { enable = true; settings = { server = { http_addr = "127.0.0.1"; http_port = 9001; domain = "sorre.xyz"; root_url = "https://sorre.xyz/grafana"; serve_from_sub_path = true; }; }; provision = { enable = true; datasources.settings = { prune = true; datasources = [ { type = "prometheus"; name = "prometheus"; url = "http://localhost:${toString prometheus-cfg.port}"; } ]; }; }; }; services.clickhouse = { enable = true; usersConfig = { otel = { profile = "analytics"; password_sha256_hex = "bf07f7edecb3a2ee3e91f468964c1ef0e03d724d87af08fe8cec0552887b5b68"; access_management = false; default_database = "otel"; }; }; serverConfig = { http_port = 8123; tcp_port = 9000; }; }; services.nginx.virtualHosts."grafana.sorre.xyz" = { forceSSL = true; enableACME = true; locations."/" = let proxyPass = "http://" + (toString grafana-cfg.settings.server.http_addr) + ":" + (toString grafana-cfg.settings.server.http_port); in { inherit proxyPass; proxyWebsockets = true; recommendedProxySettings = true; }; }; }