Hosts already declare parents, and a parent going hard DOWN marks
everything behind it UNREACHABLE (see State
model). That covers one shape of dependency:
a host being unreachable because the network path to it is broken. It
says nothing about a service depending on another service, or on
something that is not a host at all, such as a shared database or a
business process. The dependencies block covers that: an explicit
dependency names its dependents, a rule over its masters, and which
outcomes of that rule count as failed. While a dependency is failing, the
notifications it names are suppressed.
1. The dependency block
dependencies: {
"app-needs-db": {
dependents: [{select: "role=app"}, {ref: "batch01/etl"}]
on: {ref: "db01/postgres"}
fails_on: ["critical", "unknown"]
suppress: "all" // "all" | "problems"; Nagios silences every kind
states: "hard" // "hard" | "soft"; Nagios soft_state_dependencies=0
inherits: false // Nagios inherits_parent
period: "24x7" // Nagios dependency_period; optional, absent = always
}
}
Every field defaults to the behavior Nagios's own dependency directives already have, so a config written for Nagios's defaults carries across unchanged:
| Field | Default | Meaning |
|---|---|---|
dependents |
required | a non-empty list of {ref: "host"}, {ref: "host/service"} or {select: "..."} targets; a selector must match at least one host or service |
on |
required | a rule over the masters: a single ref, or any of select, process, and/or/not/quorum |
fails_on |
required | a non-empty list of ok, warning, critical, unknown, pending, unreachable |
suppress |
"all" |
which notification kinds a failing dependency silences |
states |
"hard" |
whether the rule reads the masters' hard or current status |
inherits |
false |
whether a master with a failing dependency of its own counts as failed too |
period |
none | a timeperiod name; outside it the dependency never fails |
dependents is a host or a service, never a process: only an object with
notifications to suppress can be a dependent. on is the same rule
language a business process uses,
so a dependency can read a single master, a label selector, a quorum
over several, or a process by name. Config rejects an unknown ref, a
selector matching nothing, an unknown timeperiod, and a cycle in the
dependency graph, the way Nagios's own config check rejects circular
dependencies.
2. fails_on, and a single ref versus a composite rule
fails_on is checked against the status on yields. When on is a
single ref, that master's own status is read directly, so a master with
no result yet reads as pending and one that is unreachable reads as
unreachable: one master per dependency object, distinguishing those two
outcomes from each other, the same way Nagios does.
When on is a composite rule (select, quorum, and, or, not),
the rule folds a pending member to UNKNOWN the way any business process
does, so pending and unreachable in fails_on are matched against
the rule's own refs instead: any ref pending or missing satisfies
pending, and any ref unreachable satisfies unreachable, whatever
status the rule itself resolves to.
3. suppress: all versus problems
all silences every notification kind while the dependency fails: the
dependency gate runs ahead of the per-type checks, so a recovery, an
acknowledgement or a downtime start on a dependent all stay quiet along
with the problem. Nagios's own dependency check runs the same way.
problems silences only
the problem-class kinds, the same set acknowledgements and
unreachability already silence, so a recovery still goes out even while
the dependency is failing. See Escalations and
windows section 5 for
where the dependency gate sits among the others.
4. states and inherits
states: "hard" reads the masters' hard status, the confirmed state
after max_attempts; states: "soft" reads their current status,
whatever its type, so a single failed check on the master already trips
the dependency. inherits: true chains dependencies: a master that
itself depends on something failing counts as failed here too, the way
Nagios's inherits_parent does.
5. period
period names a timeperiod. Outside it the dependency
never fails, whatever the masters' status is. Absent, the dependency
always applies.
6. Reload and recovery
A config reload swaps the whole dependencies map at once; nothing about
a dependency is written to the event log or persisted between
evaluations, and there is no timer to re-arm. A dependent notifies again
on its next check result once the master recovers, the same way a
suppressed notification behaves everywhere else in jaque.
7. Importing from Nagios
hostdependency and servicedependency objects become dependencies
entries, one per dependent-master pair. notification_failure_criteria
maps onto fails_on: for a hostdependency, o, d, u, p are
ok, critical, unreachable, pending; for a servicedependency,
o, w, u, c, p are ok, warning, unknown, critical,
pending. n alone means the dependency never fails and nothing is
emitted. inherits_parent and dependency_period carry across as
inherits and period. execution_failure_criteria has no dependency
gate to land on: the scheduler arms and disarms checks on check_period
only, so it is reported unsupported and dropped. See
Importer section 4.