Unverified Commit 8e372c19 authored by Franz Pletz's avatar Franz Pletz Committed by GitHub
Browse files

Merge pull request #245286 from codec/add-prometheus-idrac-exporter

prometheus-idrac-exporter: init at unstable-2023-06-29
parents 186c0b28 47db2bff
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -3265,6 +3265,12 @@
      fingerprint = "6E3A FA6D 915C C2A4 D26F  C53E 7BB4 BA9C 783D 2BBC";
    }];
  };
  codec = {
    email = "codec@fnord.cx";
    github = "codec";
    githubId = 118829;
    name = "codec";
  };
  CodeLongAndProsper90 = {
    github = "CodeLongAndProsper90";
    githubId = 50145141;
+15 −1
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ let
    "fastly"
    "fritzbox"
    "graphite"
    "idrac"
    "influxdb"
    "ipmi"
    "json"
@@ -318,6 +319,14 @@ in
      message = ''
        Scaphandre needs 'intel_rapl_common' kernel module to be enabled. Please add it in 'boot.kernelModules'.
      '';
    } {
      assertion = cfg.idrac.enable -> (
        (cfg.idrac.configurationPath == null) != (cfg.idrac.configuration == null)
      );
      message = ''
        Please ensure you have either `services.prometheus.exporters.idrac.configuration'
          or `services.prometheus.exporters.idrac.configurationPath' set!
      '';
    } ] ++ (flip map (attrNames exporterOpts) (exporter: {
      assertion = cfg.${exporter}.firewallFilter != null -> cfg.${exporter}.openFirewall;
      message = ''
@@ -325,7 +334,12 @@ in
        `openFirewall' is set to `true'!
      '';
    })) ++ config.services.prometheus.exporters.assertions;
    warnings = config.services.prometheus.exporters.warnings;
    warnings = [(mkIf (config.services.prometheus.exporters.idrac.enable && config.services.prometheus.exporters.idrac.configurationPath != null) ''
        Configuration file in `services.prometheus.exporters.idrac.configurationPath` may override
        `services.prometheus.exporters.idrac.listenAddress` and/or `services.prometheus.exporters.idrac.port`.
        Consider using `services.prometheus.exporters.idrac.configuration` instead.
      ''
    )] ++ config.services.prometheus.exporters.warnings;
  }] ++ [(mkIf config.services.minio.enable {
    services.prometheus.exporters.minio.minioAddress  = mkDefault "http://localhost:9000";
    services.prometheus.exporters.minio.minioAccessKey = mkDefault config.services.minio.accessKey;
+69 −0
Original line number Diff line number Diff line
{ config, lib, pkgs, options }:

with lib;
let
  cfg = config.services.prometheus.exporters.idrac;

  configFile = if cfg.configurationPath != null
               then cfg.configurationPath
               else pkgs.writeText "idrac.yml" (builtins.toJSON cfg.configuration);
in
{
  port = 9348;
  extraOpts = {
    configurationPath = mkOption {
      type = with types; nullOr path;
      default = null;
      example = "/etc/prometheus-idrac-exporter/idrac.yml";
      description = lib.mdDoc ''
        Path to the service's config file. This path can either be a computed path in /nix/store or a path in the local filesystem.

        The config file should NOT be stored in /nix/store as it will contain passwords and/or keys in plain text.

        Mutually exclusive with `configuration` option.

        Configuration reference: https://github.com/mrlhansen/idrac_exporter/#configuration
      '';
    };
    configuration = mkOption {
      type = types.nullOr types.attrs;
      description = lib.mdDoc ''
        Configuration for iDRAC exporter, as a nix attribute set.

        Configuration reference: https://github.com/mrlhansen/idrac_exporter/#configuration

        Mutually exclusive with `configurationPath` option.
      '';
      default = null;
      example = {
        timeout = 10;
        retries = 1;
        hosts = {
          default = {
            username = "username";
            password = "password";
          };
        };
        metrics = {
          system = true;
          sensors = true;
          power = true;
          sel = true;
          storage = true;
          memory = true;
        };
      };
    };
  };

  serviceOpts = {
    serviceConfig = {
      LoadCredential = "configFile:${configFile}";
      ExecStart = "${pkgs.prometheus-idrac-exporter}/bin/idrac_exporter -config %d/configFile";
      Environment = [
        "IDRAC_EXPORTER_LISTEN_ADDRESS=${cfg.listenAddress}"
        "IDRAC_EXPORTER_LISTEN_PORT=${toString cfg.port}"
      ];
    };
  };
}
+17 −0
Original line number Diff line number Diff line
@@ -307,6 +307,23 @@ let
      '';
    };

    idrac = {
      exporterConfig = {
        enable = true;
        port = 9348;
        configuration = {
          hosts = {
            default = { username = "username"; password = "password"; };
          };
        };
      };
      exporterTest = ''
        wait_for_unit("prometheus-idrac-exporter.service")
        wait_for_open_port(9348)
        wait_until_succeeds("curl localhost:9348")
      '';
    };

    influxdb = {
      exporterConfig = {
        enable = true;
+30 −0
Original line number Diff line number Diff line
{ lib, buildGoModule, fetchFromGitHub, nixosTests }:

buildGoModule rec {
  pname = "idrac_exporter";
  version = "unstable-2023-06-29";

  src = fetchFromGitHub {
    owner = "mrlhansen";
    repo = "idrac_exporter";
    rev = "3b311e0e6d602fb0938267287f425f341fbf11da";
    sha256 = "sha256-N8wSjQE25TCXg/+JTsvQk3fjTBgfXTiSGHwZWFDmFKc=";
  };

  vendorHash = "sha256-iNV4VrdQONq7LXwAc6AaUROHy8TmmloUAL8EmuPtF/o=";

  patches = [ ./idrac-exporter/config-from-environment.patch ];

  ldflags = [ "-s" "-w" ];

  doCheck = true;

  passthru.tests = { inherit (nixosTests.prometheus-exporters) idrac; };

  meta = with lib; {
    inherit (src.meta) homepage;
    description = "Simple iDRAC exporter for Prometheus";
    license = licenses.mit;
    maintainers = with maintainers; [ codec ];
  };
}
Loading