{ config, ... }: let otel-prometheus-exporter-port = 4316; 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 config.services.prometheus.port}"; } ]; }; }; }; services.nginx.virtualHosts."sorre.xyz" = { forceSSL = true; enableACME = true; locations."/grafana/" = { proxyPass = "http://${toString config.services.grafana.settings.server.http_addr}:${toString config.services.grafana.settings.server.http_port}"; proxyWebsockets = true; recommendedProxySettings = true; }; }; }