Most of what an estate needs checked does not need a subprocess: a TCP connect, an HTTP request, a DNS lookup, a certificate date, an SNMP GET. jaque runs these six inside the engine process itself: no fork, no shell, no plugin binary to keep patched. SNMP is one of the six rather than an add-on because a switch or a router will never run an agent, and polling it over the wire is the only option that exists. The cost is that a native check can only do what jaque has written code for; for everything else there is the legacy exec protocol and WASM.

1. The six types

Every check is a struct with a type discriminator; the schema resolves the branch from it and rejects any field the branch does not declare.

Type Required fields Result
tcp address (host:port) OK on connect, CRITICAL otherwise.
http url 5xx is CRITICAL, 4xx is WARNING, any other response is OK.
dns server (server:port), name OK when name resolves against server.
icmp host OK on echo reply.
tls address, warn_within, crit_within WARNING or CRITICAL as the certificate's expiry comes inside each window.
snmp address, oid, plus v2c or v3 credentials Evaluated against warn/crit ranges or an expect string.

2. Shapes, from the schema

services: {
	ssh:  check: {type: "tcp", address: "10.0.0.1:22"}
	web:  check: {type: "http", url: "https://10.0.0.1/"}
	dns:  check: {type: "dns", server: "10.0.0.1:53", name: "example.com"}
	cert: check: {type: "tls", address: "10.0.0.1:443", warn_within: "336h", crit_within: "72h"}
}

2.1 TLS windows

tls defaults to warn_within: "336h" (14 days) and crit_within: "72h" (3 days). The defaults are wide on purpose: a failed certificate rotation should give the operator a real window to notice, not a same-day scramble.

2.2 ICMP without root

icmp uses unprivileged datagram sockets (udp4), so the binary needs no capability and no setuid bit. The kernel has to permit it: on most Linux distributions run sudo sysctl -w net.ipv4.ping_group_range="0 2147483647" (or a narrower group range) or every icmp check returns UNKNOWN with permission denied.

2.3 SNMP: v2c or v3, never both

check: {
	type:    "snmp"
	address: "10.0.0.254:161"
	oid:     "1.3.6.1.2.1.1.3.0"
	community: "public"
	// or, for v3 USM:
	// user:       "monitor"
	// auth_proto: "SHA256" // "", "MD5", "SHA", "SHA224", "SHA256", "SHA384", "SHA512"
	// auth_pass:  "..."
	// priv_proto: "AES256" // "", "DES", "AES", "AES192", "AES256", "AES192C", "AES256C"
	// priv_pass:  "..."
	warn:   "" // Nagios-style threshold range, or...
	crit:   "" // ...another one, or...
	expect: "" // ...an exact-match string. Mutually exclusive.
	label:  "" // perfdata point name (default: the oid)
	uom:    "" // raw Nagios UOM for gauges: "%", "KB", "B"...
}

The schema is a disjunction: a check carries either community (v2c) or user (v3 USM), and auth_proto, auth_pass, priv_proto and priv_pass are only meaningful beside user. A config naming both fails validation before jaque opens a socket. With warn, crit and expect all empty, the check is presence-only: OK when the OID answers.

Every numeric answer is emitted as a perfdata point, thresholds or not, so an SNMP check doubles as a metric source for cpu, memory and interface octets. label names the point (the OID by default) and uom gives it a unit; counters need neither: a Counter32/Counter64 on the wire is emitted with the c UOM regardless of uom and lands in jaque_perfdata_total, where rate() belongs.

3. Scheduling

Native checks share #Schedule with every other check type: check_interval (default 60s), retry_interval (default 15s), timeout (default 10s), max_attempts (default 3) and flap. The State model says what each of those numbers controls; nothing about a native check changes it.

4. Concurrency and jitter

Two flags bound how much runs at once. -global-concurrency (default 50) caps checks in flight across the whole process. -host-concurrency (default 4) caps them per host, so one host that is timing out on every service cannot hold the scheduler's budget for everyone else. Each object's schedule also carries a deterministic jitter derived from a hash of its own ID, so 500 checks loaded with the same check_interval do not fire in the same instant on every cycle.

5. Security considerations

community, auth_pass and priv_pass are secrets written in the config file; the file's permissions are the only thing protecting them, and SNMP v2c sends the community string in clear on the wire. http and tls checks connect to whatever url or address names, from the engine process, with the engine's network position. The ping_group_range sysctl above widens who on the host may open ICMP datagram sockets; narrow it to the group jaque runs as.