Platform

Monitor a DigitalOcean App Platform or Droplet Stack

11 min read

The short version: To monitor digitalocean app platform properly you have to know what its three native layers do and do not do, and they are better than most people give them credit for: the App Platform health check, threshold alerts across App Platform, Droplets, and managed databases, and DigitalOcean Uptime, a real first-party external synthetic monitor. The catch is that all three answer the same question, "is the box or process up and reachable," and none of them assert the response body, validate JSON, run a multi-step flow, or sign into your login. So a green App Platform deploy whose internal health check passed and whose URL returns a 200 that DigitalOcean Uptime reads as healthy can still serve a broken build, a blank render, or a page whose managed-database read silently failed. This post maps the exact gap on each of the three DigitalOcean surfaces, App Platform components, raw Droplets, and managed databases, and shows how a free, no-code content-assertion and browser login monitor closes it.

The conceptual anchor: a green deploy that serves a broken page

Picture the failure this post is about. You push to your connected branch, App Platform rebuilds the component, the build passes, the internal health check confirms the port answers 2xx, and the deploy goes green. DigitalOcean Uptime, pointed at the public URL, reads a 200 and reports the service healthy. Every native signal you have is green. And the page your users load is blank, or it is yesterday's build, or it renders a shell while the read from your managed Postgres returns nothing. Nothing native catches it, because nothing native is looking at the body.

This is not a hypothetical specific to one bad day. DigitalOcean's own status history shows App Platform has had multi-region deploy and build-failure incidents, and the broader class, a deploy that succeeds from the platform's point of view but serves the wrong response, is the steady-state risk between named incidents. The rest of this post is the three DigitalOcean surfaces and the precise native gap on each.

What the three native DigitalOcean layers actually do

To monitor digitalocean app platform honestly you have to start by giving the native tooling full credit, because the differentiator is a capability gap, not an absence. There are three layers.

App Platform health checks. These are configurable HTTP or TCP readiness and liveness probes that run internally, from inside DigitalOcean's network, against an http_path you set. The readiness probe gates the deploy and stops routing traffic to an instance that is not ready. The liveness probe automatically restarts a component whose check fails and emails the account. They are real and you should configure them. What they confirm is narrow: the port answered 2xx from inside the platform. They never leave the network and never read the body for correctness.

Threshold metric alerts across all three surfaces. App Platform alert policies cover failed and successful deploys (failed-deploy alerting is on by default), CPU, RAM, restart count, request rate, and P95 request duration, delivered to email or Slack. Droplets get the free DigitalOcean Monitoring agent plus Alert Policies: threshold alerts on CPU, memory, disk, and bandwidth. Managed databases get their own alert policies on connection count, CPU, memory, and disk. Every one of these is a threshold on a metric. A metric crossing a line is a useful signal and a different signal from "the response is wrong."

DigitalOcean Uptime. This is DigitalOcean's own first-party external synthetic monitor, and it deserves to be named, because the lazy version of this post would pretend it does not exist. Per DigitalOcean's Uptime feature docs, it checks a URL or IP over HTTPS, HTTP, or ICMP from up to 4 global regions, alerts on downtime and latency to email and Slack, monitors SSL certificate expiry on HTTPS checks, and keeps up to 90 days of latency history. It is a competent reachability and latency monitor.

Side by side, the capability split is the whole story. The App Platform health check and DigitalOcean Uptime each assert reachability and metrics; neither reads the response body, validates JSON, or signs into a login. That body-and-login correctness layer is what an external no-code monitor adds.

CapabilityApp Platform health checkDigitalOcean UptimeVelprove
Endpoint reachable / 2xx statusYes (internal probe)Yes (external, up to 4 regions)Yes (external, 5 regions)
Latency and SSL expiry alertsNoYesYes
Auto-restart on failed livenessYesNoNo
Response body / string assertionNoNoYes
JSON validation and multi-step flowsNoNoYes (multi-step up to 3 on free)
No-code browser login monitoringNoNoYes

The honest gap: reachability green, correctness unverified

Here is the thesis, stated precisely so nobody can read it as an overclaim. All three native layers answer "is the box or process up and reachable?" None of them assert the response body, validate JSON, drive a browser, sign into a login, or run a multi-step flow. DigitalOcean Uptime confirms a 200, acceptable latency, and a valid certificate. Verified against DigitalOcean's own feature docs, it does not do content matching, string matching, JSON validation, or login flows. It treats any status outside the 200-299 range as an outage and stops there.

The difference between DigitalOcean's health check and external monitoring is the difference between reachability and correctness: the App Platform health check confirms the component's port answers 2xx from inside the platform, while an external content monitor confirms the public response actually renders the right body. Reachability failures change the status code, so the native tools catch them. Correctness failures leave the status code at 200 and change only the body, so the native tools miss them entirely. A successful App Platform deploy can serve a 200 with a blank render, the wrong build, or a page whose database read silently returned empty, and your health check, your metric alerts, and DigitalOcean Uptime all stay green. The layer that reads the body is the external no-code assertion monitor, and it is the only thing in this stack that catches a logically broken 200.

One DigitalOcean-specific surface worth a single sentence: if you run worker components or DO Jobs, their PRE-, POST-, and FAILED-DEPLOY hooks are platform-side lifecycle events, not response correctness, and the way to make a worker observable from outside is the same freshness-endpoint approach the rest of this stack uses. The freshness-endpoint and build-SHA assertion mechanic itself is covered in our API health-check patterns guide, so this post references it rather than re-teaching it.

Monitor DigitalOcean App Platform components: assert the body the deploy left behind

To monitor a DigitalOcean App Platform app for correctness, point an external HTTP monitor at the component's public URL and assert on the response body, not just the status code. On an App Platform component the native gap is the deploy that succeeds but serves the wrong response, and the fix is a content assertion on the public URL. In the Velprove wizard, set the check type to an HTTP monitor, point it at your component's URL, and on the Verify step add two Success Conditions: a status code of 200, and a Response Body Contains assertion on a string your correct page always renders. Pick a string that is load-bearing, a known piece of copy, a marker your template emits, or, better, a value that only appears when a real read succeeded, so a blank or shell render fails the check even though the status code is 200.

For the deploy-skew case specifically, where the build succeeded but promoted the wrong code, the pattern is a freshness or build-SHA assertion against a light /version route your app exposes. That route and the multi-step build-SHA comparison mechanic are owned by the API health-check patterns guide, so configure it there and point a Velprove monitor at the result. The point on App Platform is only this: the platform tells you the deploy finished, your assertion tells you the deploy finished correctly.

The two Success Conditions for an App Platform component. Status Code Equals 200 matches what DigitalOcean Uptime already sees. The Response Body Contains rule is the part DigitalOcean Uptime cannot do: it fails the check when the deploy went green but the page renders blank, stale, or with a failed database read behind it.
Velprove new HTTP monitor wizard on the Verify step for a DigitalOcean App Platform component URL, showing two Success Conditions in order: Status Code Equals 200, and Response Body Contains a known string that only renders when the page is correct.

Droplets and managed databases: same blind spot, different native tool

You can monitor a DigitalOcean Droplet, an App Platform component, and a Managed Database with the same external content monitor: each has a different native tool (Droplet metric Alert Policies, App Platform alert policies, Managed Database alert policies) but the same blind spot, because none of them assert the response body. On a Droplet, a raw VM, the native monitoring is the agent-based metric story: the free Monitoring agent plus Alert Policies on CPU, memory, disk, and bandwidth. Those are excellent for a runaway process or a full disk. They say nothing about whether the nginx in front of your app is returning your application or a default welcome page, or a 200 error page from a misconfigured reverse proxy. You point the same Velprove content-assertion monitor at the Droplet's public URL, and the metric-green-but-content-wrong case becomes visible.

On a managed database the native alert policies watch connection count, CPU, memory, and disk on the database itself. They cannot tell you the read your application performs through that database came back with the right data, or came back at all. A connection-pool exhaustion, a bad migration, or a permissions change can leave every database metric green while your app's query silently returns empty. The external probe that catches that does not touch the database directly. It asserts a string on a page or endpoint whose render depends on a real read: the metric stays green, the assertion goes red, and you learn the read broke before your customers file the ticket.

Note one thing this post is not claiming. Unlike a platform that sleeps idle services, DigitalOcean App Platform components stay warm, so the gap here is not cold-start or idle-sleep latency, the way it is on some sibling platforms (the idle-sleep contrast is covered in the Railway platform-layer guide). The DigitalOcean gap is purely the ceiling of native synthetic monitoring: reachability and metrics are covered, response correctness is not.

The browser login monitor on the real signed-in path

Content assertions prove the public surface renders correctly. They do not prove a real user can sign in and see their data, and on a DigitalOcean-hosted SaaS that is the failure that costs you customers. This is where the no-code login monitoring sits. Velprove's browser login monitor opens a real browser, signs in as a dedicated low-privilege test user, follows the post-login redirect, and asserts a string on the landing page that only renders if a real read from your managed database actually succeeded.

The setup is no-code: in the wizard you give the login URL, the test user's credentials, and, under Customize detection, switch Success verification from the default URL-change to "Page contains text" set to a post-login data string, a customer name, an invoice ID, a known plan label. A component can return 200 with an intact page shell while the database read behind the dashboard fails. A text-present assertion on post-login content catches that; a status-code probe never will. To be precise about the claim: Velprove is not the only tool that offers free browser checks, but the combination here, free and no-code login monitoring that signs into your own login with no Playwright code to write, is the differentiator.

Use a dedicated test account with the smallest permissions that still renders a real data-backed page, never production admin credentials. The browser login monitor is free on every plan, including the free plan, at a 15-minute interval, which is enough to catch a multi-hour database-backed outage and a login regression within one window.

The no-code browser login monitor on the real DigitalOcean user path. It signs in as a dedicated low-privilege test user, then Success verification is switched from URL-change to Page contains text, so the check passes only when a string that depends on a real managed-database read renders on the landing page.
Velprove browser login monitor wizard with the login URL, test-user email and password filled, and the Customize detection panel expanded so Success verification is set to Page contains text with a post-login data string that depends on a real managed-database read.

How this compares to the sibling platform guides

The platform-sibling guides share this shape, native reachability is solid, native body-correctness is the gap, and they differ on the exact native wedge. Heroku charges for native alerting, so external monitoring there is partly a cost play; DigitalOcean is different, because DigitalOcean actually sells you a competent external monitor in DigitalOcean Uptime, separately, and it still cannot assert your body, so the wedge here is capability, not price (the cost framing is in the Heroku platform-layer guide). For the broader pattern shared across managed-host platforms, see the Render platform-layer guide; the DigitalOcean version is distinguished by the three-surface split (App Platform, Droplet, managed database) and by the fact that DigitalOcean's first-party synthetic monitor sets the native ceiling higher than most while still stopping at reachability.

Getting started

The Velprove free plan covers 10 monitors total at a 5-minute HTTP interval, one browser login monitor at a 15-minute interval, multi-step API monitors up to 3 steps, 5 global regions to choose from (one per monitor), email alerts, SSL expiry monitoring, and 1 status page. Commercial use is allowed on every plan, including free. No credit card required.

That is enough to land the DigitalOcean correctness layer for a single production app: a content-assertion HTTP monitor on your App Platform component or Droplet URL, a freshness or build-SHA assertion on a /version route, and one browser login monitor on the signed-in path. Keep your App Platform health checks, your metric alert policies, and DigitalOcean Uptime turned on; this sits on top of them and reads the body they never read. Start with the free plan. The first monitor takes about three minutes to configure.

Frequently Asked Questions

Isn't DigitalOcean Uptime or the App Platform health check enough?

They are real and worth turning on, but they answer a narrower question than most people assume. The App Platform health check is an internal HTTP or TCP readiness and liveness probe: it gates the deploy and auto-restarts a component whose port stops answering 2xx, and it emails the account. DigitalOcean Uptime is a genuine external synthetic monitor that checks a URL or IP over HTTPS, HTTP, or ICMP from up to 4 regions and alerts on downtime, latency, and SSL certificate expiry. What none of them do is assert your response body, validate JSON, run a multi-step flow, or sign into your login. They confirm the box is up and reachable and the certificate is valid. They do not confirm the page renders correct content. That correctness layer is what an external no-code assertion monitor adds on top.

Can I monitor DigitalOcean App Platform on the Velprove free plan?

Yes. The Velprove free plan covers 10 monitors total at a 5-minute HTTP interval, one browser login monitor at a 15-minute interval, multi-step API monitors up to 3 steps, email alerts, SSL expiry monitoring, and 1 status page. Commercial use is allowed and no credit card is required. That is enough to put a content-assertion HTTP monitor on your App Platform component URL, a freshness or build-SHA assertion on a /version route, and one browser login monitor on the signed-in path of a DigitalOcean-hosted SaaS.

Is monitoring a DigitalOcean Droplet different from monitoring an App Platform component?

The native tools differ, the blind spot is the same. A Droplet is a raw VM, so its native monitoring is the free DigitalOcean Monitoring agent plus Alert Policies: threshold alerts on CPU, memory, disk, and bandwidth to email or Slack. An App Platform component is managed, so its native monitoring is App Platform alert policies (deploy outcome, CPU, RAM, restart count, request rate, P95 latency) plus the internal health check. Both are metrics and reachability signals. Neither asserts that the response your Droplet's nginx or your App Platform service returns is the correct content. You point a Velprove content-assertion or browser login monitor at the public URL in front of either surface, and the setup is the same regardless of which DigitalOcean product is behind it.

What about a DigitalOcean managed database? Native alerts already cover it.

Managed-database alert policies watch connection count, CPU, memory, and disk on the database itself, which is genuinely useful. They do not tell you that the read your app performs through that database returned the right data, or returned anything at all. A managed database can be green on every metric while a connection-pool exhaustion, a bad migration, or a permissions change makes your app's query silently return empty. The external probe that catches that is a content assertion on a page or endpoint whose render depends on a real database read: assert that a known string only that read produces is present. The database metric stays green; your assertion goes red.

Does DigitalOcean Uptime check the response body or sign into my login?

No. DigitalOcean Uptime confirms the endpoint is reachable, measures latency from up to 4 regions, and on HTTPS checks watches the SSL certificate expiry, with 90 days of latency history. It treats any HTTP status outside the 200-299 range as an outage. It does not do content or string matching, JSON validation, multi-step request chains, or browser-driven login flows. So a deploy that succeeds, passes the internal health check, and returns a 200 that DigitalOcean Uptime reads as healthy can still be serving a blank render, a stale build, or a page whose database read silently failed. The body-level and login-level correctness check is the no-code assertion and browser login monitor's job, not DigitalOcean Uptime's.

Start monitoring for free

Free browser login monitors. Multi-step API chains. No credit card required.

Start for free