aboutsummaryrefslogtreecommitdiff
path: root/nixpkgs/nixos/modules/services/monitoring/longview.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/nixos/modules/services/monitoring/longview.nix')
-rw-r--r--nixpkgs/nixos/modules/services/monitoring/longview.nix160
1 files changed, 160 insertions, 0 deletions
diff --git a/nixpkgs/nixos/modules/services/monitoring/longview.nix b/nixpkgs/nixos/modules/services/monitoring/longview.nix
new file mode 100644
index 00000000000..9c38956f9ba
--- /dev/null
+++ b/nixpkgs/nixos/modules/services/monitoring/longview.nix
@@ -0,0 +1,160 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+ cfg = config.services.longview;
+
+ runDir = "/run/longview";
+ configsDir = "${runDir}/longview.d";
+
+in {
+ options = {
+
+ services.longview = {
+
+ enable = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ If enabled, system metrics will be sent to Linode LongView.
+ '';
+ };
+
+ apiKey = mkOption {
+ type = types.str;
+ default = "";
+ example = "01234567-89AB-CDEF-0123456789ABCDEF";
+ description = ''
+ Longview API key. To get this, look in Longview settings which
+ are found at https://manager.linode.com/longview/.
+
+ Warning: this secret is stored in the world-readable Nix store!
+ Use <option>apiKeyFile</option> instead.
+ '';
+ };
+
+ apiKeyFile = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ example = "/run/keys/longview-api-key";
+ description = ''
+ A file containing the Longview API key.
+ To get this, look in Longview settings which
+ are found at https://manager.linode.com/longview/.
+
+ <option>apiKeyFile</option> takes precedence over <option>apiKey</option>.
+ '';
+ };
+
+ apacheStatusUrl = mkOption {
+ type = types.str;
+ default = "";
+ example = "http://127.0.0.1/server-status";
+ description = ''
+ The Apache status page URL. If provided, Longview will
+ gather statistics from this location. This requires Apache
+ mod_status to be loaded and enabled.
+ '';
+ };
+
+ nginxStatusUrl = mkOption {
+ type = types.str;
+ default = "";
+ example = "http://127.0.0.1/nginx_status";
+ description = ''
+ The Nginx status page URL. Longview will gather statistics
+ from this URL. This requires the Nginx stub_status module to
+ be enabled and configured at the given location.
+ '';
+ };
+
+ mysqlUser = mkOption {
+ type = types.str;
+ default = "";
+ description = ''
+ The user for connecting to the MySQL database. If provided,
+ Longview will connect to MySQL and collect statistics about
+ queries, etc. This user does not need to have been granted
+ any extra privileges.
+ '';
+ };
+
+ mysqlPassword = mkOption {
+ type = types.str;
+ default = "";
+ description = ''
+ The password corresponding to <option>mysqlUser</option>.
+ Warning: this is stored in cleartext in the Nix store!
+ Use <option>mysqlPasswordFile</option> instead.
+ '';
+ };
+
+ mysqlPasswordFile = mkOption {
+ type = types.nullOr types.path;
+ default = null;
+ example = "/run/keys/dbpassword";
+ description = ''
+ A file containing the password corresponding to <option>mysqlUser</option>.
+ '';
+ };
+
+ };
+
+ };
+
+ config = mkIf cfg.enable {
+ systemd.services.longview =
+ { description = "Longview Metrics Collection";
+ after = [ "network.target" ];
+ wantedBy = [ "multi-user.target" ];
+ serviceConfig.Type = "forking";
+ serviceConfig.ExecStop = "-${pkgs.coreutils}/bin/kill -TERM $MAINPID";
+ serviceConfig.ExecReload = "-${pkgs.coreutils}/bin/kill -HUP $MAINPID";
+ serviceConfig.PIDFile = "${runDir}/longview.pid";
+ serviceConfig.ExecStart = "${pkgs.longview}/bin/longview";
+ preStart = ''
+ umask 077
+ mkdir -p ${configsDir}
+ '' + (optionalString (cfg.apiKeyFile != null) ''
+ cp --no-preserve=all "${cfg.apiKeyFile}" ${runDir}/longview.key
+ '') + (optionalString (cfg.apacheStatusUrl != "") ''
+ cat > ${configsDir}/Apache.conf <<EOF
+ location ${cfg.apacheStatusUrl}?auto
+ EOF
+ '') + (optionalString (cfg.mysqlUser != "" && cfg.mysqlPasswordFile != null) ''
+ cat > ${configsDir}/MySQL.conf <<EOF
+ username ${cfg.mysqlUser}
+ password `head -n1 "${cfg.mysqlPasswordFile}"`
+ EOF
+ '') + (optionalString (cfg.nginxStatusUrl != "") ''
+ cat > ${configsDir}/Nginx.conf <<EOF
+ location ${cfg.nginxStatusUrl}
+ EOF
+ '');
+ };
+
+ warnings = let warn = k: optional (cfg.${k} != "")
+ "config.services.longview.${k} is insecure. Use ${k}File instead.";
+ in concatMap warn [ "apiKey" "mysqlPassword" ];
+
+ assertions = [
+ { assertion = cfg.apiKeyFile != null;
+ message = "Longview needs an API key configured";
+ }
+ ];
+
+ # Create API key file if not configured.
+ services.longview.apiKeyFile = mkIf (cfg.apiKey != "")
+ (mkDefault (toString (pkgs.writeTextFile {
+ name = "longview.key";
+ text = cfg.apiKey;
+ })));
+
+ # Create MySQL password file if not configured.
+ services.longview.mysqlPasswordFile = mkDefault (toString (pkgs.writeTextFile {
+ name = "mysql-password-file";
+ text = cfg.mysqlPassword;
+ }));
+ };
+}