boltZharp Docs
shieldAgent

Private Networks

What Zharp can monitor when it can't reach your systems from the internet, what it can't do yet, and the addresses it refuses to check.

Most monitors — websites, APIs, ping, ports, certificates — are checked from Zharp's own servers, so the target has to be reachable from the internet. For anything that isn't, the data has to come out from the inside instead: from the Zharp agent, from your app, or from the job itself. All of these only make outbound HTTPS requests to api.zharp.io; nothing in your network has to accept a connection.

What works today

What you want to watchHowAlerts
PostgreSQL, MySQL, Redis, MongoDBThe agent collects from the database; a Database monitor with Connection: Private evaluates what it reports.Yes — when the agent can't connect, the database or the agent stops reporting, or connection or memory limits are passed.
Log files and app logsThe agent tails files, or your app posts to the API; a Log monitor matches patterns.Yes — on the first matching line.
Scheduled jobsThe job calls its ping URL when it finishes; a Cron job monitor expects it on schedule.Yes — when a heartbeat is late.
Application latency, errors, throughputYour app sends OpenTelemetry traces to the agent on 127.0.0.1:4317 / :4318, or with the Zharp SDK; an Application monitor measures them.Yes — when the measured value passes its threshold.
Host CPU, memory, disk, networkThe agent collects them.No — there is no monitor for them yet. CPU & memory monitor is listed under Coming soon.

Databases through the agent

Install the agent on a server that can reach the database — usually the database's own server — and give it a monitoring user. The database then appears in Agent connection when you create a private database monitor. The full steps, and exactly when such a monitor goes down, are in Private Databases.

The agent doesn't have to share a machine with the database. Point it at any address it can reach — this is how one agent on a jump host or bastion can watch a database with no agent of its own:

On the agent's server
# the agent on a jump host, watching a database elsewhere on the private network
sudo zharp-collector add postgres --host 10.0.0.12 --password 'choose-a-password'
sudo zharp-collector add redis --endpoint 10.0.0.30:6379 --password '<redis password>'

One agent can report on several databases of the same engine: add each one after the first with --name, for example zharp-collector add postgres --name orders --host 10.0.0.12 .... See Private Databases.

Logs, traces and cron jobs

  • Logs: the agent tails nginx, Apache, IIS and system logs by itself; add your own files with zharp-collector add logs --service NAME --path PATH. Then create a log monitor on that service. See Logs.
  • Traces: the agent accepts OpenTelemetry on localhost only and forwards it, so services that can't reach the internet can still send traces through it. See Through the Agent.
  • Cron jobs: a heartbeat is an outbound request from the job, so a job on a private server only needs to reach api.zharp.io over HTTPS. See Cron Jobs & Heartbeats.

What the agent can't do yet

The agent collects and forwards; it doesn't run checks. Website, API endpoint, keyword, ping, port, SSL certificate, DNS, mail (SMTP, IMAP, POP3) and user journey monitors always run from Zharp's servers, over the internet. There is no way today to run an HTTP request, a ping or a port check from inside your network.

warning
Private addresses are refused

A check from Zharp's servers can't reach 10.0.0.5 or 192.168.1.20 in your network, so Zharp refuses such targets (see below). For a private service, monitor what it exposes through the agent instead: its database, its logs, or its traces.

Until there are agent-run checks, a common workaround for an internal HTTP service is a small scheduled job on a machine inside the network that calls the service and, only if it answers, pings a cron job monitor:

crontab, on a machine inside the network
*/5 * * * * curl -fsS --max-time 10 http://10.0.0.5:8080/health > /dev/null && curl -fsS --retry 3 https://api.zharp.io/api/v1/ping/YOUR_TOKEN > /dev/null

Addresses Zharp won't check

Every check that runs on Zharp's servers refuses targets inside a network rather than on the internet:

RangeAddresses
Loopbacklocalhost (and *.localhost), 127.0.0.0/8, ::1
Link-local and cloud metadata169.254.0.0/16, fe80::/10, metadata.google.internal
Private networks10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, CGNAT 100.64.0.0/10, IPv6 unique local fc00::/7
Other non-routable0.0.0.0/8, ::, multicast and broadcast, documentation and benchmarking ranges

IPv4 addresses written another way are judged by the address they stand for: IPv4-mapped IPv6 such as ::ffff:169.254.169.254, NAT64 and 6to4 forms, and decimal or hex spellings such as http://2130706433/.

Why

A check runs on Zharp's servers, so these addresses would point into Zharp's own network, not yours. 169.254.169.254 in particular is the cloud metadata service, which hands out credentials to anything that can reach it.

When it's checked

  • On save. Creating or editing a monitor fails when its URL, host, custom DNS resolver or proxy is one of these addresses, or a host name that resolves to one — for example intranet.example.com resolves to 10.20.30.40, which is a private network address and cannot be checked from Zharp's servers.
  • On every check. The address actually dialled is checked again, so a name that is pointed inward after it was saved (DNS rebinding) fails the check with the same message. This also covers each redirect an HTTP check follows, every request a workflow step makes, every page and resource a user journey loads, links the broken link checker follows, and webhook notifications to your own URLs.

Private database monitors are the exception: their address is only what the agent reports — often localhost, because the agent sits on the database's server — and Zharp never connects to it. Log, application, cron and IP blacklist monitors don't connect to their target either, so they aren't affected.

info
Self-hosted Zharp

A self-hosted installation can set ALLOW_LOOPBACK_TARGETS=true to check loopback and private addresses (including webhooks to internal services). Link-local and metadata addresses stay refused.