GCP Uptime Checks Explained: Public vs Private, Alerting

GCP uptime checks send HTTP, HTTPS, or TCP probes to your endpoints from multiple locations around the world and report whether they responded correctly. They catch external availability failures — DNS outages, SSL errors, port-closed, network-layer 5xx — before a user reports them. But they do not test whether your application is healthy. A service returning 200 with a broken payment flow passes an uptime check. This page covers what they actually test, how public and private checks differ, and how to use them without getting burned.

Simple explanation

An uptime check is a scheduled probe. Google’s infrastructure regularly sends a request to a URL or TCP port you specify, then records whether it got the expected response. That is the whole mechanism. The value is that these probes come from outside your infrastructure, so they catch failures your internal metrics cannot see: a misconfigured load balancer, a DNS entry pointing at a dead IP, or a firewall rule that silently dropped traffic.

Public uptime checks probe endpoints reachable from the public internet. Private uptime checks probe internal VPC endpoints using a checker deployed inside your own network. Both feed results into Cloud Monitoring, where you attach alerting policies to them.

The core limitation: uptime checks validate reachability and response codes. They do not validate application correctness. A passing check tells you the door is open. It tells you nothing about what is happening inside.

Quick answer

At a glance
  • What it tests: HTTP/HTTPS/TCP reachability, response code, optional response body content, SSL certificate validity
  • What it does not test: Application logic, database health, background jobs, partial outages that still return 200
  • Best-practice pairing: Create an uptime check, immediately attach an alerting policy, and require 2+ regions to fail before the alert fires. Pair with application metrics for full coverage.

What uptime checks actually test

Your internal metrics can look healthy while your service is completely unreachable. If your load balancer has a misconfigured SSL certificate, your DNS entry points at a dead IP, or a firewall rule is blocking traffic, your application containers may be running fine but users cannot get to them. Uptime checks catch this class of failure because they probe from outside your infrastructure.

Specific failures uptime checks detect:

  • DNS resolution failures
  • SSL certificate errors or expiry
  • TCP connection refused (port not open or firewall blocking)
  • HTTP 5xx responses from the load balancer or CDN layer
  • Timeout because the service is not responding within the window
  • Response body content mismatches (if you configure content matching)
  • Redirect loops or unexpected redirect destinations (if you configure redirect following)

What uptime checks do NOT catch:

  • Application logic errors that still return 200
  • Slow database queries causing high latency without causing timeouts
  • Background job failures
  • Partial outages affecting some users but not the health endpoint
  • Memory leaks that have not yet caused failures
  • Whether application logic is correct, only that a response arrived
Analogy

An uptime check is like checking whether a restaurant’s door is unlocked and the lights are on. That tells you it is open. It does not tell you whether they are out of your order or whether the kitchen is on fire. Use uptime checks for the door-and-lights check, and application metrics plus log analysis for everything inside.

Public vs private uptime checks

Cloud Monitoring supports two modes of uptime check. Choosing the wrong one is a common setup mistake that produces checks that never succeed.

Public uptime checks

Public checks probe from Google-managed global infrastructure to any publicly accessible endpoint on the internet. The target must have a public IP address or hostname. No setup is required inside your network; you just provide a URL or hostname.

Use public checks for:

  • Publicly accessible web applications and APIs
  • Cloud Run services behind a load balancer
  • Any endpoint your users reach from the internet
Cannot do this

You cannot point a public uptime check at a private VPC IP address (such as 10.x.x.x or 192.168.x.x). The probes originate from Google’s public infrastructure and have no path into your VPC. The check will fail immediately and permanently. For internal endpoints, use a private uptime check instead.

Private uptime checks

Private checks probe internal endpoints that are not reachable from the public internet. They work through a private checker: a small agent you deploy inside your VPC that receives probe instructions from Cloud Monitoring and tests your internal services locally. Results are reported back through standard GCP APIs.

Use private checks for:

  • Internal microservices with no public IP
  • Databases and backend services inside a VPC
  • GKE workloads not exposed via an external load balancer
  • Services on private VPCs or behind internal internal load balancers

Private uptime checks are generally available (GA) in Cloud Monitoring. They require creating a private checker resource and granting it permissions in your project. For most internal service monitoring, private checks are simpler to set up than a full synthetic monitor, but less flexible.

Outdated docs

If you see older documentation describing private uptime checks as “in preview,” that is outdated. Private checks are now GA. The console UI is the most straightforward path for first-time configuration.

How uptime checks work

When you create an uptime check, Cloud Monitoring schedules probes from multiple geographic locations simultaneously. Google operates check infrastructure across North America, South America, Europe, and Asia-Pacific (typically six locations for public checks).

Each probe independently sends the configured request and evaluates the response:

  • Success: response received within the timeout window, status code matches the expected value (default: any 2xx), and content match passes if configured
  • Failure: connection refused, timeout, unexpected status code, SSL error, or content mismatch

The per-location results are what make uptime checks useful for diagnosing partial outages. If your service is failing only from Europe, that points to a routing or regional issue, not a complete outage. The location breakdown narrows your investigation immediately, which is exactly what matters when debugging production incidents.

False positive risk

A single-location failure does not always mean your service is down. Transient network conditions between Google’s check infrastructure and your service cause occasional one-location blips. Always configure your alerting policy to require at least 2 of the 6 locations to fail before the alert fires. One location failing is noise. Two or more failing at the same time is a real signal.

Uptime check results are different from application metrics like request latency or error rate. Metrics measure what your service is doing internally. Uptime checks measure whether an external probe can reach it at all. Both are necessary for complete observability.

Check types

HTTPS

Sends an HTTPS request (GET by default, configurable to POST) to a URL. Validates the response code, checks SSL certificate validity, and optionally matches response body content. This is the most common type and the right default for any web-facing service. It validates the full TLS handshake, so a misconfigured or expired certificate shows up immediately as a failure.

Start here

If you are not sure which check type to use, start with HTTPS. It validates your SSL certificate at the same time as reachability, which catches a class of failure that HTTP checks miss entirely.

HTTP

Same as HTTPS but over plain HTTP. Use this only for services that do not support TLS, such as internal-only endpoints or legacy services. For anything public-facing, prefer HTTPS so the check validates your certificate as well as reachability.

TCP

Opens a TCP connection to a host and port. No HTTP request is sent; it only verifies the port is accepting connections. Useful for non-HTTP services where you need to confirm the port is open: a message broker, a database proxy, or a custom protocol service. TCP checks work for both public and private endpoints (private requires a private checker).

When to use uptime checks

  • Monitoring any public-facing endpoint where you need to know immediately if it becomes unreachable
  • Catching SSL certificate expiry before it affects users
  • Detecting DNS failures or misconfiguration
  • Monitoring internal VPC services that do not need a full synthetic test (use private checks)
  • As a baseline check for Cloud Run services, paired with request error rate metrics for complete coverage
  • As part of incident response tooling to get a fast, external view during active outages
  • Setting up a smoke test after a deployment to confirm the new version is serving traffic

When not to rely on uptime checks alone

Uptime checks are necessary but not sufficient for production observability. You still need:

  • Application metrics: error rate, latency, saturation, and traffic volume from Cloud Monitoring metrics. A passing uptime check means the service is reachable. High error rates in metrics mean users are still hitting failures.
  • Logs: Logs Explorer gives you the actual error messages and stack traces when something goes wrong. Uptime checks tell you the door is closed; logs tell you why.
  • Traces: If a service is slow but not failing, uptime checks will not detect it. Distributed tracing shows which service in a chain is causing latency.
  • Synthetic monitors: If you need to validate a multi-step user flow (login, search, checkout), a synthetic monitor tests the full journey. An uptime check only tests one endpoint.

Uptime checks vs load balancer health checks vs synthetic monitors

These three tools are often confused because they all involve checking whether something is healthy. They test different things from different vantage points.

ToolWhat it testsBest forWhat it missesWhen to choose it
Public uptime checkHTTP/TCP reachability from public internetExternal availability, DNS and SSL validationApp logic, partial failuresDefault baseline for any public endpoint
Private uptime checkHTTP/TCP reachability inside your VPCInternal services, VPC-only APIsApp logic, complex flowsWhen the endpoint is not public
Load balancer health checkBackend pod or VM health from inside Google’s networkRouting traffic to healthy backends onlyExternal DNS, SSL layer, user-facing pathManaged automatically; present behind any load balancer
Synthetic monitorMulti-step user flows via a Node.js scriptEnd-to-end user journey testingRaw availability baselineWhen you need more than “is the endpoint up?”
Analogy

A load balancer health check asks “is the kitchen open and accepting orders?” An uptime check asks “can a customer actually get through the front door?” Both can pass at the same time while the other fails. A misconfigured DNS record means the uptime check fails while the load balancer health check is green. A crashed backend pod means the load balancer health check fails while the uptime check is green, because the load balancer is still accepting the connection and returning a 503. You need both.

How to create an uptime check

The simplest path is the Cloud Monitoring console: navigate to Monitoring > Uptime checks > Create uptime check. The console walks you through selecting the check type, specifying the target, configuring optional content matching, and creating an alerting policy at the same time. Accept the offer to create an alert. An uptime check without an alert is just data collection.

For public HTTPS and TCP checks, the gcloud CLI works too:

# Create a public HTTPS uptime check with 1-minute frequency
gcloud monitoring uptime create \
  --display-name="API Health Check" \
  --uri="https://api-service-xxxx-ew.a.run.app/health" \
  --period=60 \
  --project=my-app-prod

# Create a public TCP uptime check on a public host and port
gcloud monitoring uptime create \
  --display-name="App TCP Port Check" \
  --tcp-host=203.0.113.10 \
  --tcp-port=8080 \
  --period=300 \
  --project=my-app-prod

# List all uptime checks in a project
gcloud monitoring uptime list-configs --project=my-app-prod
Private checks

Private uptime checks require creating a private checker resource in your VPC before the check can be configured. Use the Console or Terraform with the google_monitoring_uptime_check_config resource and a private checker target. The gcloud CLI flow for private checks is more involved than for public checks.

First run delay

After creating a check, allow a few minutes before the first results appear. “No data” immediately after creation is expected.

What to point the check at

Point uptime checks at a dedicated /health or /healthz endpoint. A good health endpoint:

  • Returns HTTP 200 when the service is ready to handle requests
  • Returns a non-200 status (typically 503) when the service is degraded or not ready
  • Is lightweight: no database queries, no external calls, only confirms the process is alive
  • Returns a simple response body like {“status”: “ok”} that the uptime check can optionally validate with content matching

Shallow vs deep health endpoints

A shallow health endpoint checks only that the process is running and can respond. No dependencies. This is what your uptime check should target. Failures mean the service itself is unreachable, not that a downstream database is slow.

A deep health endpoint checks that dependencies (database, cache, external APIs) are also healthy. Useful for load balancer health checks or separate alerting policies, but do not target it with your basic uptime check.

False alarm risk

If your uptime check targets an endpoint that queries a database, a momentarily slow database will cause the check to time out. You will get paged for a service that is technically reachable. Always keep the uptime check target shallow: one process, no outbound calls.

Analogy

A shallow health check is like asking a shop assistant “are you open?” A deep health check is like asking “are you open, is your stockroom full, and is your card machine working?” The first question gets a fast, reliable answer. The second takes longer and might give you a “no” for a reason that has nothing to do with whether customers can come in. Use shallow for uptime checks, deep for separate dependency monitoring.

Tip

If your service is behind a Cloud Load Balancer, point the uptime check at the load balancer’s public URL, not the Cloud Run or Compute Engine URL directly. This validates the full path from the public internet through the load balancer, including SSL termination and routing rules.

Common mistakes

  1. Creating an uptime check without an alerting policy. An uptime check that nobody is alerted about is just data collection. Always pair your check with an alerting policy. When creating a check in the console, accept the offer to create an alert at the same time.
  2. Pointing a public uptime check at a private IP address. Public uptime checks originate from Google’s public infrastructure. They cannot reach VPC-private addresses like 10.x.x.x. The check will fail immediately and keep failing. If you need to check an internal endpoint, use a private uptime check with a private checker deployed in your VPC.
  3. Checking the main application URL instead of a health endpoint. A homepage that hits your database can time out and trigger a false alert if the database is momentarily slow. Use a dedicated, lightweight health endpoint that returns 200 only if the process itself is alive.
  4. Alerting on a single location failure. Transient network blips cause occasional single-location failures. Require at least 2 of the 6 check locations to fail before the alert fires. This dramatically reduces false positives without meaningfully delaying real alerts.
  5. Assuming a passing uptime check means the service is healthy. A 200 response from your health endpoint means the service is reachable. It says nothing about whether application logic, background jobs, or downstream dependencies are working. Pair uptime checks with application metrics and log monitoring for real coverage.
  6. Not configuring content matching on critical endpoints. Without content matching, a misconfigured service that returns 200 with an error page passes the check. Add a simple content match on a string like “ok” or “status” in your health endpoint response body to catch this class of failure.

Frequently asked questions

Do uptime checks test application health?

No. Uptime checks test reachability. They send a request and check the response code, and optionally the response body. They do not know whether your application logic is correct, your database is responding, or your service is degraded but still returning 200. For deeper health checking, pair uptime checks with application-level metrics and a dedicated health endpoint.

What is the difference between a public and private uptime check?

Public uptime checks probe publicly accessible endpoints from Google-managed global infrastructure. Private uptime checks probe internal VPC endpoints using a private checker deployed inside your network. Use private checks for internal services not exposed to the internet.

How do I avoid false positives from uptime check alerts?

Require at least 2 locations to fail before your alerting policy fires. A single-location failure is often a transient network blip, not a real outage. Requiring 2 of 6 regions is a common threshold.

How often can uptime checks run?

The minimum interval is 1 minute. You can also configure 5, 10, or 15-minute intervals.

What is the difference between an uptime check and a synthetic monitor?

Uptime checks test a single HTTP or TCP endpoint for reachability. Synthetic monitors run a Node.js script that simulates multi-step user flows, handles authentication, and validates response payloads in detail. Use synthetic monitors when you need to test a user journey, not just whether an endpoint is up.

Last verified: 25 March 2026 Cloud services change frequently. Verify details against official documentation before making infrastructure decisions.