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