1{ config, lib, pkgs, ... }:
2
3let
4 inherit (lib) mkEnableOption mkPackageOption mkIf mkOption types getExe;
5
6 cfg = config.services.opentelemetry-collector;
7 opentelemetry-collector = cfg.package;
8
9 settingsFormat = pkgs.formats.yaml {};
10in {
11 options.services.opentelemetry-collector = {
12 enable = mkEnableOption "Opentelemetry Collector";
13
14 package = mkPackageOption pkgs "opentelemetry-collector" { };
15
16 settings = mkOption {
17 type = settingsFormat.type;
18 default = {};
19 description = ''
20 Specify the configuration for Opentelemetry Collector in Nix.
21
22 See https://opentelemetry.io/docs/collector/configuration/ for available options.
23 '';
24 };
25
26 configFile = mkOption {
27 type = types.nullOr types.path;
28 default = null;
29 description = ''
30 Specify a path to a configuration file that Opentelemetry Collector should use.
31 '';
32 };
33 };
34
35 config = mkIf cfg.enable {
36 assertions = [{
37 assertion = (
38 (cfg.settings == {}) != (cfg.configFile == null)
39 );
40 message = ''
41 Please specify a configuration for Opentelemetry Collector with either
42 'services.opentelemetry-collector.settings' or
43 'services.opentelemetry-collector.configFile'.
44 '';
45 }];
46
47 systemd.services.opentelemetry-collector = {
48 description = "Opentelemetry Collector Service Daemon";
49 wantedBy = [ "multi-user.target" ];
50
51 serviceConfig = let
52 conf = if cfg.configFile == null
53 then settingsFormat.generate "config.yaml" cfg.settings
54 else cfg.configFile;
55 in
56 {
57 ExecStart = "${getExe opentelemetry-collector} --config=file:${conf}";
58 DynamicUser = true;
59 Restart = "always";
60 ProtectSystem = "full";
61 DevicePolicy = "closed";
62 NoNewPrivileges = true;
63 WorkingDirectory = "/var/lib/opentelemetry-collector";
64 StateDirectory = "opentelemetry-collector";
65 };
66 };
67 };
68}