44 lines
1.3 KiB
Nix
44 lines
1.3 KiB
Nix
|
## Health check
|
||
|
##
|
||
|
## Runs a service and a separate periodic health process. When the
|
||
|
## health check starts failing over a period of time, kill the service.
|
||
|
## (Usually that means the supervisor will restart it, but you can
|
||
|
## have other behaviours by e.g. combining this service with a round-robin
|
||
|
## for failover)
|
||
|
|
||
|
|
||
|
{ lib, pkgs, config, ...}:
|
||
|
let
|
||
|
inherit (lib) mkOption types;
|
||
|
inherit (pkgs) liminix;
|
||
|
# inherit (pkgs.liminix.services) longrun;
|
||
|
in {
|
||
|
options = {
|
||
|
system.service.health-check = mkOption {
|
||
|
description = "run a service while periodically checking it is healthy";
|
||
|
type = liminix.lib.types.serviceDefn;
|
||
|
};
|
||
|
};
|
||
|
config.system.service.health-check = config.system.callService ./service.nix {
|
||
|
service = mkOption {
|
||
|
type = liminix.lib.types.service;
|
||
|
};
|
||
|
interval = mkOption {
|
||
|
description = "interval between checks, in seconds";
|
||
|
type = types.int;
|
||
|
default = 10;
|
||
|
example = 10;
|
||
|
};
|
||
|
threshold = mkOption {
|
||
|
description = "number of consecutive failures required for the service to be kicked";
|
||
|
type = types.int;
|
||
|
example = 3;
|
||
|
};
|
||
|
healthCheck = mkOption {
|
||
|
description = "health check command or script. Expected to exit 0 if the service is healthy or any other exit status otherwise";
|
||
|
type = types.path;
|
||
|
};
|
||
|
};
|
||
|
config.programs.busybox.applets = ["expr"];
|
||
|
}
|