Skip to main content
These three monitor types cover low-level network health checks: ICMP reachability, TCP port availability, and DNS record validation.

Ping monitor

Ping monitors send ICMP packets to one or more hosts and evaluate the combined result.

Configuration

FieldTypeDefaultNotes
hostsArray<{ type, host, timeout, count }>one empty host rowAt least one host required
pingEvalstring (JS function)built-in defaultOptional custom eval
Host fields:
FieldTypeDefaultNotes
typeIP4 | IP6 | DOMAINIP4Address type
hoststringRequired
timeoutnumber1000Timeout per ping attempt in ms
countnumber3Number of ICMP packets to send

Default eval behavior

  • UP if all hosts respond (alive === true)
  • DOWN if any host is unreachable
  • Latency = average latency across all hosts
The built-in eval function:
async function (arrayOfPings) {
    let latencyTotal = arrayOfPings.reduce((acc, ping) => {
        return acc + ping.latency;
    }, 0);

    let alive = arrayOfPings.reduce((acc, ping) => {
        return acc && ping.alive;
    }, true);

    return {
        status: alive ? 'UP' : 'DOWN',
        latency: latencyTotal / arrayOfPings.length,
    }
}

Custom eval contract

Your function receives arrayOfPings and must return { status, latency }.

Example

{
    "type": "PING",
    "type_data": {
        "hosts": [
            { "type": "IP4", "host": "8.8.8.8", "timeout": 1000, "count": 3 }
        ]
    }
}

Troubleshooting

  • Frequent DOWN: some networks and firewalls block ICMP — consider switching to a TCP check on the same host
  • Noisy latency: increase count to reduce the effect of a single dropped packet
  • Validation error: the type field must match the format of the address (e.g., IP4 for IPv4 addresses)

TCP monitor

TCP monitors attempt to open a connection to a host and port, and report whether the port is open, timeout, or error.

Configuration

FieldTypeDefaultNotes
hostsArray<{ type, host, port, timeout }>one empty host rowAt least one host required
tcpEvalstring (JS function)built-in defaultOptional custom eval
Host fields:
FieldTypeDefaultNotes
typeIP4 | IP6 | DOMAINIP4Address type
hoststringRequired
portnumber80TCP port to probe
timeoutnumber1000Connection timeout in ms

Default eval behavior

  • UP if every host result has status === "open"
  • DOWN otherwise
  • Latency = average connection latency across all hosts
The built-in eval function:
async function (arrayOfPings) {
    let latencyTotal = arrayOfPings.reduce((acc, ping) => {
        return acc + ping.latency;
    }, 0);

    let alive = arrayOfPings.reduce((acc, ping) => {
        return acc && ping.status === "open";
    }, true);

    return {
        status: alive ? 'UP' : 'DOWN',
        latency: latencyTotal / arrayOfPings.length,
    }
}

Custom eval contract

Your function receives arrayOfPings (TCP result objects) and must return { status, latency }.

Example

{
    "type": "TCP",
    "type_data": {
        "hosts": [
            { "type": "IP4", "host": "db.example.com", "port": 5432, "timeout": 2000 }
        ]
    }
}

Troubleshooting

  • Timeout: the network path is blocked or the service is slow to accept connections
  • Error: the host is wrong, the port is not listening, or DNS resolution failed
  • Validation error: the type field must match the format of the address

DNS monitor

DNS monitors query a DNS record for a host and compare the returned values to your expected list.

Configuration

FieldTypeDefaultNotes
hoststringRequired — the domain to query
nameServerstring""Optional DNS resolver override
lookupRecordstringARecord type to look up (e.g. A, AAAA, CNAME, MX, TXT)
matchTypeANY | ALLANYHow to compare results to expected values
valuesstring[][]Expected record values (at least one required)

Match behavior

matchTypeResult
ANYUP when at least one expected value is present in the DNS response
ALLUP only when every expected value is present in the DNS response

Value normalization

Before comparison, both the DNS response values and your expected values are normalized:
  • converted to lowercase
  • trailing . removed
  • whitespace trimmed

Example

{
    "type": "DNS",
    "type_data": {
        "host": "example.com",
        "lookupRecord": "A",
        "matchType": "ANY",
        "values": ["93.184.216.34"]
    }
}

Troubleshooting

  • Unexpected DOWN: copy the exact value from a manual dig query — normalization applies, so remove trailing dots
  • No response: verify that the record type exists and that the resolver is reachable from Kener
  • Partial mismatch with multiple IPs: use ANY for dynamic DNS setups where the response varies

Build docs developers (and LLMs) love