Addons — the probe agent
Your logs see the inside. Addons watch from outside.
A single Go binary on any box beyond your infrastructure. It runs HTTP, TCP, DNS, certificate-expiry, and ping checks on a schedule and reports every measurement through the same ingest plane your logs use — so an outage your app can't log is still an alert that finds a human.
The addons
Nine checks. One agent.
httpcheck
DNS, connect, TLS, and first-byte timed separately — "the port is slow" and "your resolver is slow" wake different people. Asserts status and body.
tcpcheck
Is the port answering, and how fast? Connect and DNS timings for anything that speaks a socket.
dnscheck
Resolution time and answers, checked against what the record is supposed to say. Catches hijacks and expired zones.
tlscert
Reports days_until_expiry on every run, so the
warning threshold lives in a tower rule. An untrusted certificate is
reported down — with issuer, subject, and expiry as the diagnosis.
icmpping
Round-trip min/avg/max and packet loss. "We lack permission" and "the host is unreachable" are opposite conclusions — it never confuses them.
sshcheck opt-in
Log in, run a command, assert its exit code and output — with connect, handshake, and auth timed separately.
portscan opt-in
Scans against a baseline: a port that opened without being declared can page you before someone else finds it.
traceroute opt-in
Hop count, per-hop RTTs, and a path_change signal
when the route to your box quietly rewires itself.
logwatch opt-in
Tails a host log for a pattern, rotation-aware — for the one machine whose software will never POST to a tower itself.
The four marked opt-in
need a credential, an external binary, or host file access — each is off
until the agent's own config lists it in enable_addons, and
a config naming one without that fails at startup instead of silently
running.
No new concepts
Measurements are just events. Rules do the rest.
Every metric travels as a JSON number on a normal ingest event. Thresholds live in your tower rules — not in agent config — so changing "page me at 500 ms" never means touching a probe box.
- Down at level 400 — critical if it should page
- Flapping collapses into one alert with a count
- Quiet when healthy, spools through outages
- Same against hosted and self-hosted towers
curl -s $PT/v1/projects/probes/rules \
-H "Authorization: Bearer $API_KEY" \
-d '{
"name": "slow-ttfb",
"match": { "tags": ["addon:httpcheck"] },
"conditions": [
{ "key": "ttfb_ms", "op": "gte", "value": 500 }
]
}'Download
Version 0.1.1. Releases are signed with the
addons release key
(addons-release.pub — a
different key than the daemon's, so either can rotate without
invalidating the other): one signed
SHA256SUMS
(.minisig) covers every
tarball.
| Artifact | Arch | Size | SHA-256 |
|---|---|---|---|
| addons_0.1.1_linux_amd64.tar.gz | amd64 | 3.5 MB | 032c28bb958448cee00d5fb50751fc7a5a75d6aa7efcaebaf0b5f6586b31d0ff |
| addons_0.1.1_linux_arm64.tar.gz | arm64 | 3.2 MB | 30a6f8f45ee6820f950fe13ad15f68c6bcf3b914954400437d23ed8e0bd2c91c |
Verify before unpacking — the first command checks the sums file was signed by this project, the second checks your tarball matches it. Skipping either lets a tampered tarball and a tampered checksum file agree with each other:
minisign -Vm SHA256SUMS -p addons-release.pub
sha256sum --ignore-missing -c SHA256SUMSInstall
tar xzf addons_<version>_linux_<arch>.tar.gz
cd addons_<version>_linux_<arch>
sudo ./install.shThe installer creates a dedicated addons system user,
installs the binary to /usr/local/bin/addons, and sets up
/etc/addons and a systemd unit. Each tarball's contents
are covered by a signed manifest that install.sh verifies
before it runs anything as root.
Run one check first
addons check runs a single check once and prints the
event it would send. Add --report to send it — the ingest
token comes from the environment, never a flag, so it stays out of
shell history:
export PINGTOWER_INGEST_TOKEN=pti_<tenant>_…
export PINGTOWER_URL=https://api.pingtower.com # or your own box
addons check httpcheck --param url=https://example.com --reportThen let addons agent run a whole config on a
schedule — spooling through outages, heartbeating on itself:
# /etc/addons/agent.yaml
agent:
id: probe-fra-01
heartbeat: 5m
tower:
url: https://api.pingtower.com
token_env: PINGTOWER_INGEST_TOKEN
defaults:
interval: 60s
timeout: 10s
report: on_change
checks:
- id: site
addon: httpcheck
params: { url: "https://example.com", expect_status: 200 }
- id: cert
addon: tlscert
params: { address: "example.com:443" }The agent-readable version of this page lives at /addons/index.md — hand it to your AI agent along with the setup guide and it can do all of the above for you.