{"record":{"id":"3a92533dc0b2e9c9","repo":"louislam/uptime-kuma","slug":"ping-timed-out-line","errorCode":null,"errorMessage":"Ping timed out: \"${line}\"","messagePattern":"Ping timed out: \"(.+?)\"","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"server/monitor-types/tailscale-ping.js","lineNumber":62,"sourceCode":"    /**\n     * Parses the output of the Tailscale ping command to update the heartbeat.\n     * @param {string} tailscaleOutput The output of the Tailscale ping command.\n     * @param {object} heartbeat The heartbeat object to update.\n     * @returns {void}\n     * @throws Will throw an eror if the output contains any unexpected string.\n     */\n    parseTailscaleOutput(tailscaleOutput, heartbeat) {\n        let lines = tailscaleOutput.split(\"\\n\");\n\n        for (let line of lines) {\n            if (line.includes(\"pong from\")) {\n                heartbeat.status = UP;\n                let time = line.split(\" in \")[1].split(\" \")[0];\n                heartbeat.ping = parseInt(time);\n                heartbeat.msg = \"OK\";\n                break;\n            } else if (line.includes(\"timed out\")) {\n                throw new Error(`Ping timed out: \"${line}\"`);\n                // Immediately throws upon \"timed out\" message, the server is expected to re-call the check function\n            } else if (line.includes(\"no matching peer\")) {\n                throw new Error(`Nonexistant or inaccessible due to ACLs: \"${line}\"`);\n            } else if (line.includes(\"is local Tailscale IP\")) {\n                throw new Error(`Tailscale only works if used on other machines: \"${line}\"`);\n            } else if (line !== \"\") {\n                throw new Error(`Unexpected output: \"${line}\"`);\n            }\n        }\n    }\n}\n\nmodule.exports = {\n    TailscalePing,\n};\n","sourceCodeStart":44,"sourceCodeEnd":78,"githubUrl":"https://github.com/louislam/uptime-kuma/blob/6b5ea0155793e666666745fb8d6fef1e829543a2/server/monitor-types/tailscale-ping.js#L44-L78","documentation":"Thrown by parseTailscaleOutput() when a line of the tailscale ping output contains 'timed out'. This is the expected signal that the target Tailscale node did not respond to the ping within the CLI's window; the monitor treats it as a DOWN condition and relies on the scheduler to retry on the next interval.","triggerScenarios":"Produced when 'tailscale ping' reports a timeout line (e.g. 'pong from ... ' was not received and the output contains 'timed out'). The peer is reachable in the control plane but did not answer the DERP/direct ping in time.","commonSituations":"Target node offline or suspended; high latency or packet loss on the path; DERP relay congested and direct connection not established; target behind a restrictive firewall blocking WireGuard UDP; node in a tailnet that recently changed keysets.","solutions":["Confirm the target machine is online and tailscaled is running on it ('tailscale status' on the source should show it).","Check 'tailscale status' for the peer's relay/direct status and 'tailscale netcheck' for local network conditions.","If persistent, review ACLs and firewall rules blocking UDP 41641 (or the configured port).","Treat transient timeouts as recoverable; the scheduler will retry on the next interval automatically."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"function isTimeoutLine(line) { return typeof line === \"string\" && line.includes(\"timed out\"); }","typeGuard":"function isPongLine(line) { return typeof line === \"string\" && line.includes(\"pong from\"); }","tryCatchPattern":"if (isTimeoutLine(line)) { heartbeat.status = DOWN; heartbeat.msg = `Ping timed out: \"${line}\"`; return; }","preventionTips":["Confirm the target node is online with 'tailscale status'.","Allow UDP for the WireGuard port through firewalls.","Treat transient timeouts as retryable; let the scheduler re-run."],"tags":["tailscale","ping","timeout","vpn"],"backgroundTag":null,"analyzedSha":"6b5ea0155793e666666745fb8d6fef1e829543a2","analyzedAt":"2026-08-12T23:42:12.959Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}