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