The gcp:monitoring/uptimeCheckConfig:UptimeCheckConfig resource, part of the Pulumi GCP provider, defines uptime checks that probe endpoints or services at regular intervals to verify availability. This guide focuses on three capabilities: HTTP/HTTPS endpoint monitoring with content validation, TCP port availability checks, and synthetic monitoring with Cloud Functions.
Uptime checks reference GCP projects, monitoring groups, or Cloud Functions that must exist separately. The examples are intentionally small. Combine them with your own alerting policies and notification channels.
Monitor HTTP endpoints with content validation
Most uptime checks probe HTTP endpoints at regular intervals to detect outages before users report them.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const http = new gcp.monitoring.UptimeCheckConfig("http", {
displayName: "http-uptime-check",
timeout: "60s",
logCheckFailures: true,
userLabels: {
"example-key": "example-value",
},
httpCheck: {
path: "some-path",
port: 8010,
requestMethod: "POST",
contentType: "USER_PROVIDED",
customContentType: "application/json",
body: "Zm9vJTI1M0RiYXI=",
pingConfig: {
pingsCount: 1,
},
},
monitoredResource: {
type: "uptime_url",
labels: {
project_id: "my-project-name",
host: "192.168.1.1",
},
},
contentMatchers: [{
content: "\"example\"",
matcher: "MATCHES_JSON_PATH",
jsonPathMatcher: {
jsonPath: "$.path",
jsonMatcher: "EXACT_MATCH",
},
}],
checkerType: "STATIC_IP_CHECKERS",
});
import pulumi
import pulumi_gcp as gcp
http = gcp.monitoring.UptimeCheckConfig("http",
display_name="http-uptime-check",
timeout="60s",
log_check_failures=True,
user_labels={
"example-key": "example-value",
},
http_check={
"path": "some-path",
"port": 8010,
"request_method": "POST",
"content_type": "USER_PROVIDED",
"custom_content_type": "application/json",
"body": "Zm9vJTI1M0RiYXI=",
"ping_config": {
"pings_count": 1,
},
},
monitored_resource={
"type": "uptime_url",
"labels": {
"project_id": "my-project-name",
"host": "192.168.1.1",
},
},
content_matchers=[{
"content": "\"example\"",
"matcher": "MATCHES_JSON_PATH",
"json_path_matcher": {
"json_path": "$.path",
"json_matcher": "EXACT_MATCH",
},
}],
checker_type="STATIC_IP_CHECKERS")
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/monitoring"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := monitoring.NewUptimeCheckConfig(ctx, "http", &monitoring.UptimeCheckConfigArgs{
DisplayName: pulumi.String("http-uptime-check"),
Timeout: pulumi.String("60s"),
LogCheckFailures: pulumi.Bool(true),
UserLabels: pulumi.StringMap{
"example-key": pulumi.String("example-value"),
},
HttpCheck: &monitoring.UptimeCheckConfigHttpCheckArgs{
Path: pulumi.String("some-path"),
Port: pulumi.Int(8010),
RequestMethod: pulumi.String("POST"),
ContentType: pulumi.String("USER_PROVIDED"),
CustomContentType: pulumi.String("application/json"),
Body: pulumi.String("Zm9vJTI1M0RiYXI="),
PingConfig: &monitoring.UptimeCheckConfigHttpCheckPingConfigArgs{
PingsCount: pulumi.Int(1),
},
},
MonitoredResource: &monitoring.UptimeCheckConfigMonitoredResourceArgs{
Type: pulumi.String("uptime_url"),
Labels: pulumi.StringMap{
"project_id": pulumi.String("my-project-name"),
"host": pulumi.String("192.168.1.1"),
},
},
ContentMatchers: monitoring.UptimeCheckConfigContentMatcherArray{
&monitoring.UptimeCheckConfigContentMatcherArgs{
Content: pulumi.String("\"example\""),
Matcher: pulumi.String("MATCHES_JSON_PATH"),
JsonPathMatcher: &monitoring.UptimeCheckConfigContentMatcherJsonPathMatcherArgs{
JsonPath: pulumi.String("$.path"),
JsonMatcher: pulumi.String("EXACT_MATCH"),
},
},
},
CheckerType: pulumi.String("STATIC_IP_CHECKERS"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var http = new Gcp.Monitoring.UptimeCheckConfig("http", new()
{
DisplayName = "http-uptime-check",
Timeout = "60s",
LogCheckFailures = true,
UserLabels =
{
{ "example-key", "example-value" },
},
HttpCheck = new Gcp.Monitoring.Inputs.UptimeCheckConfigHttpCheckArgs
{
Path = "some-path",
Port = 8010,
RequestMethod = "POST",
ContentType = "USER_PROVIDED",
CustomContentType = "application/json",
Body = "Zm9vJTI1M0RiYXI=",
PingConfig = new Gcp.Monitoring.Inputs.UptimeCheckConfigHttpCheckPingConfigArgs
{
PingsCount = 1,
},
},
MonitoredResource = new Gcp.Monitoring.Inputs.UptimeCheckConfigMonitoredResourceArgs
{
Type = "uptime_url",
Labels =
{
{ "project_id", "my-project-name" },
{ "host", "192.168.1.1" },
},
},
ContentMatchers = new[]
{
new Gcp.Monitoring.Inputs.UptimeCheckConfigContentMatcherArgs
{
Content = "\"example\"",
Matcher = "MATCHES_JSON_PATH",
JsonPathMatcher = new Gcp.Monitoring.Inputs.UptimeCheckConfigContentMatcherJsonPathMatcherArgs
{
JsonPath = "$.path",
JsonMatcher = "EXACT_MATCH",
},
},
},
CheckerType = "STATIC_IP_CHECKERS",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.monitoring.UptimeCheckConfig;
import com.pulumi.gcp.monitoring.UptimeCheckConfigArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigHttpCheckArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigHttpCheckPingConfigArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigMonitoredResourceArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigContentMatcherArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigContentMatcherJsonPathMatcherArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var http = new UptimeCheckConfig("http", UptimeCheckConfigArgs.builder()
.displayName("http-uptime-check")
.timeout("60s")
.logCheckFailures(true)
.userLabels(Map.of("example-key", "example-value"))
.httpCheck(UptimeCheckConfigHttpCheckArgs.builder()
.path("some-path")
.port(8010)
.requestMethod("POST")
.contentType("USER_PROVIDED")
.customContentType("application/json")
.body("Zm9vJTI1M0RiYXI=")
.pingConfig(UptimeCheckConfigHttpCheckPingConfigArgs.builder()
.pingsCount(1)
.build())
.build())
.monitoredResource(UptimeCheckConfigMonitoredResourceArgs.builder()
.type("uptime_url")
.labels(Map.ofEntries(
Map.entry("project_id", "my-project-name"),
Map.entry("host", "192.168.1.1")
))
.build())
.contentMatchers(UptimeCheckConfigContentMatcherArgs.builder()
.content("\"example\"")
.matcher("MATCHES_JSON_PATH")
.jsonPathMatcher(UptimeCheckConfigContentMatcherJsonPathMatcherArgs.builder()
.jsonPath("$.path")
.jsonMatcher("EXACT_MATCH")
.build())
.build())
.checkerType("STATIC_IP_CHECKERS")
.build());
}
}
resources:
http:
type: gcp:monitoring:UptimeCheckConfig
properties:
displayName: http-uptime-check
timeout: 60s
logCheckFailures: true
userLabels:
example-key: example-value
httpCheck:
path: some-path
port: '8010'
requestMethod: POST
contentType: USER_PROVIDED
customContentType: application/json
body: Zm9vJTI1M0RiYXI=
pingConfig:
pingsCount: 1
monitoredResource:
type: uptime_url
labels:
project_id: my-project-name
host: 192.168.1.1
contentMatchers:
- content: '"example"'
matcher: MATCHES_JSON_PATH
jsonPathMatcher:
jsonPath: $.path
jsonMatcher: EXACT_MATCH
checkerType: STATIC_IP_CHECKERS
When the check runs, Cloud Monitoring sends an HTTP POST request to the specified host and path, then validates the response against the content matcher. The httpCheck property defines the request details (method, headers, body), while contentMatchers uses JSON path expressions to verify response structure. The checkerType determines whether checks run from Google’s static IP addresses or from within your VPC. The timeout property sets the maximum wait time for responses.
Add basic authentication to HTTP checks
Protected endpoints require credentials to verify availability.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const http = new gcp.monitoring.UptimeCheckConfig("http", {
displayName: "http-uptime-check",
timeout: "60s",
userLabels: {
"example-key": "example-value",
},
httpCheck: {
path: "some-path",
port: 8010,
requestMethod: "POST",
contentType: "USER_PROVIDED",
customContentType: "application/json",
body: "Zm9vJTI1M0RiYXI=",
pingConfig: {
pingsCount: 1,
},
authInfo: {
username: "name",
passwordWo: "password1",
passwordWoVersion: "1",
},
},
monitoredResource: {
type: "uptime_url",
labels: {
project_id: "my-project-name",
host: "192.168.1.1",
},
},
contentMatchers: [{
content: "\"example\"",
matcher: "MATCHES_JSON_PATH",
jsonPathMatcher: {
jsonPath: "$.path",
jsonMatcher: "EXACT_MATCH",
},
}],
checkerType: "STATIC_IP_CHECKERS",
});
import pulumi
import pulumi_gcp as gcp
http = gcp.monitoring.UptimeCheckConfig("http",
display_name="http-uptime-check",
timeout="60s",
user_labels={
"example-key": "example-value",
},
http_check={
"path": "some-path",
"port": 8010,
"request_method": "POST",
"content_type": "USER_PROVIDED",
"custom_content_type": "application/json",
"body": "Zm9vJTI1M0RiYXI=",
"ping_config": {
"pings_count": 1,
},
"auth_info": {
"username": "name",
"password_wo": "password1",
"password_wo_version": "1",
},
},
monitored_resource={
"type": "uptime_url",
"labels": {
"project_id": "my-project-name",
"host": "192.168.1.1",
},
},
content_matchers=[{
"content": "\"example\"",
"matcher": "MATCHES_JSON_PATH",
"json_path_matcher": {
"json_path": "$.path",
"json_matcher": "EXACT_MATCH",
},
}],
checker_type="STATIC_IP_CHECKERS")
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/monitoring"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := monitoring.NewUptimeCheckConfig(ctx, "http", &monitoring.UptimeCheckConfigArgs{
DisplayName: pulumi.String("http-uptime-check"),
Timeout: pulumi.String("60s"),
UserLabels: pulumi.StringMap{
"example-key": pulumi.String("example-value"),
},
HttpCheck: &monitoring.UptimeCheckConfigHttpCheckArgs{
Path: pulumi.String("some-path"),
Port: pulumi.Int(8010),
RequestMethod: pulumi.String("POST"),
ContentType: pulumi.String("USER_PROVIDED"),
CustomContentType: pulumi.String("application/json"),
Body: pulumi.String("Zm9vJTI1M0RiYXI="),
PingConfig: &monitoring.UptimeCheckConfigHttpCheckPingConfigArgs{
PingsCount: pulumi.Int(1),
},
AuthInfo: &monitoring.UptimeCheckConfigHttpCheckAuthInfoArgs{
Username: pulumi.String("name"),
PasswordWo: pulumi.String("password1"),
PasswordWoVersion: pulumi.String("1"),
},
},
MonitoredResource: &monitoring.UptimeCheckConfigMonitoredResourceArgs{
Type: pulumi.String("uptime_url"),
Labels: pulumi.StringMap{
"project_id": pulumi.String("my-project-name"),
"host": pulumi.String("192.168.1.1"),
},
},
ContentMatchers: monitoring.UptimeCheckConfigContentMatcherArray{
&monitoring.UptimeCheckConfigContentMatcherArgs{
Content: pulumi.String("\"example\""),
Matcher: pulumi.String("MATCHES_JSON_PATH"),
JsonPathMatcher: &monitoring.UptimeCheckConfigContentMatcherJsonPathMatcherArgs{
JsonPath: pulumi.String("$.path"),
JsonMatcher: pulumi.String("EXACT_MATCH"),
},
},
},
CheckerType: pulumi.String("STATIC_IP_CHECKERS"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var http = new Gcp.Monitoring.UptimeCheckConfig("http", new()
{
DisplayName = "http-uptime-check",
Timeout = "60s",
UserLabels =
{
{ "example-key", "example-value" },
},
HttpCheck = new Gcp.Monitoring.Inputs.UptimeCheckConfigHttpCheckArgs
{
Path = "some-path",
Port = 8010,
RequestMethod = "POST",
ContentType = "USER_PROVIDED",
CustomContentType = "application/json",
Body = "Zm9vJTI1M0RiYXI=",
PingConfig = new Gcp.Monitoring.Inputs.UptimeCheckConfigHttpCheckPingConfigArgs
{
PingsCount = 1,
},
AuthInfo = new Gcp.Monitoring.Inputs.UptimeCheckConfigHttpCheckAuthInfoArgs
{
Username = "name",
PasswordWo = "password1",
PasswordWoVersion = "1",
},
},
MonitoredResource = new Gcp.Monitoring.Inputs.UptimeCheckConfigMonitoredResourceArgs
{
Type = "uptime_url",
Labels =
{
{ "project_id", "my-project-name" },
{ "host", "192.168.1.1" },
},
},
ContentMatchers = new[]
{
new Gcp.Monitoring.Inputs.UptimeCheckConfigContentMatcherArgs
{
Content = "\"example\"",
Matcher = "MATCHES_JSON_PATH",
JsonPathMatcher = new Gcp.Monitoring.Inputs.UptimeCheckConfigContentMatcherJsonPathMatcherArgs
{
JsonPath = "$.path",
JsonMatcher = "EXACT_MATCH",
},
},
},
CheckerType = "STATIC_IP_CHECKERS",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.monitoring.UptimeCheckConfig;
import com.pulumi.gcp.monitoring.UptimeCheckConfigArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigHttpCheckArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigHttpCheckPingConfigArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigHttpCheckAuthInfoArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigMonitoredResourceArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigContentMatcherArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigContentMatcherJsonPathMatcherArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var http = new UptimeCheckConfig("http", UptimeCheckConfigArgs.builder()
.displayName("http-uptime-check")
.timeout("60s")
.userLabels(Map.of("example-key", "example-value"))
.httpCheck(UptimeCheckConfigHttpCheckArgs.builder()
.path("some-path")
.port(8010)
.requestMethod("POST")
.contentType("USER_PROVIDED")
.customContentType("application/json")
.body("Zm9vJTI1M0RiYXI=")
.pingConfig(UptimeCheckConfigHttpCheckPingConfigArgs.builder()
.pingsCount(1)
.build())
.authInfo(UptimeCheckConfigHttpCheckAuthInfoArgs.builder()
.username("name")
.passwordWo("password1")
.passwordWoVersion("1")
.build())
.build())
.monitoredResource(UptimeCheckConfigMonitoredResourceArgs.builder()
.type("uptime_url")
.labels(Map.ofEntries(
Map.entry("project_id", "my-project-name"),
Map.entry("host", "192.168.1.1")
))
.build())
.contentMatchers(UptimeCheckConfigContentMatcherArgs.builder()
.content("\"example\"")
.matcher("MATCHES_JSON_PATH")
.jsonPathMatcher(UptimeCheckConfigContentMatcherJsonPathMatcherArgs.builder()
.jsonPath("$.path")
.jsonMatcher("EXACT_MATCH")
.build())
.build())
.checkerType("STATIC_IP_CHECKERS")
.build());
}
}
resources:
http:
type: gcp:monitoring:UptimeCheckConfig
properties:
displayName: http-uptime-check
timeout: 60s
userLabels:
example-key: example-value
httpCheck:
path: some-path
port: '8010'
requestMethod: POST
contentType: USER_PROVIDED
customContentType: application/json
body: Zm9vJTI1M0RiYXI=
pingConfig:
pingsCount: 1
authInfo:
username: name
passwordWo: password1
passwordWoVersion: '1'
monitoredResource:
type: uptime_url
labels:
project_id: my-project-name
host: 192.168.1.1
contentMatchers:
- content: '"example"'
matcher: MATCHES_JSON_PATH
jsonPathMatcher:
jsonPath: $.path
jsonMatcher: EXACT_MATCH
checkerType: STATIC_IP_CHECKERS
The authInfo block adds basic authentication to the HTTP request. The passwordWo property stores the password (write-only), and passwordWoVersion tracks credential updates. This extends the basic HTTP check pattern with authentication while keeping the same content validation and timeout configuration.
Validate HTTP status codes and redirects
Some endpoints return non-200 status codes intentionally, such as redirects or specific success codes.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const statusCode = new gcp.monitoring.UptimeCheckConfig("status_code", {
displayName: "http-uptime-check",
timeout: "60s",
httpCheck: {
path: "some-path",
port: 8010,
requestMethod: "POST",
contentType: "URL_ENCODED",
body: "Zm9vJTI1M0RiYXI=",
acceptedResponseStatusCodes: [
{
statusClass: "STATUS_CLASS_2XX",
},
{
statusValue: 301,
},
{
statusValue: 302,
},
],
},
monitoredResource: {
type: "uptime_url",
labels: {
project_id: "my-project-name",
host: "192.168.1.1",
},
},
contentMatchers: [{
content: "\"example\"",
matcher: "MATCHES_JSON_PATH",
jsonPathMatcher: {
jsonPath: "$.path",
jsonMatcher: "EXACT_MATCH",
},
}],
checkerType: "STATIC_IP_CHECKERS",
});
import pulumi
import pulumi_gcp as gcp
status_code = gcp.monitoring.UptimeCheckConfig("status_code",
display_name="http-uptime-check",
timeout="60s",
http_check={
"path": "some-path",
"port": 8010,
"request_method": "POST",
"content_type": "URL_ENCODED",
"body": "Zm9vJTI1M0RiYXI=",
"accepted_response_status_codes": [
{
"status_class": "STATUS_CLASS_2XX",
},
{
"status_value": 301,
},
{
"status_value": 302,
},
],
},
monitored_resource={
"type": "uptime_url",
"labels": {
"project_id": "my-project-name",
"host": "192.168.1.1",
},
},
content_matchers=[{
"content": "\"example\"",
"matcher": "MATCHES_JSON_PATH",
"json_path_matcher": {
"json_path": "$.path",
"json_matcher": "EXACT_MATCH",
},
}],
checker_type="STATIC_IP_CHECKERS")
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/monitoring"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := monitoring.NewUptimeCheckConfig(ctx, "status_code", &monitoring.UptimeCheckConfigArgs{
DisplayName: pulumi.String("http-uptime-check"),
Timeout: pulumi.String("60s"),
HttpCheck: &monitoring.UptimeCheckConfigHttpCheckArgs{
Path: pulumi.String("some-path"),
Port: pulumi.Int(8010),
RequestMethod: pulumi.String("POST"),
ContentType: pulumi.String("URL_ENCODED"),
Body: pulumi.String("Zm9vJTI1M0RiYXI="),
AcceptedResponseStatusCodes: monitoring.UptimeCheckConfigHttpCheckAcceptedResponseStatusCodeArray{
&monitoring.UptimeCheckConfigHttpCheckAcceptedResponseStatusCodeArgs{
StatusClass: pulumi.String("STATUS_CLASS_2XX"),
},
&monitoring.UptimeCheckConfigHttpCheckAcceptedResponseStatusCodeArgs{
StatusValue: pulumi.Int(301),
},
&monitoring.UptimeCheckConfigHttpCheckAcceptedResponseStatusCodeArgs{
StatusValue: pulumi.Int(302),
},
},
},
MonitoredResource: &monitoring.UptimeCheckConfigMonitoredResourceArgs{
Type: pulumi.String("uptime_url"),
Labels: pulumi.StringMap{
"project_id": pulumi.String("my-project-name"),
"host": pulumi.String("192.168.1.1"),
},
},
ContentMatchers: monitoring.UptimeCheckConfigContentMatcherArray{
&monitoring.UptimeCheckConfigContentMatcherArgs{
Content: pulumi.String("\"example\""),
Matcher: pulumi.String("MATCHES_JSON_PATH"),
JsonPathMatcher: &monitoring.UptimeCheckConfigContentMatcherJsonPathMatcherArgs{
JsonPath: pulumi.String("$.path"),
JsonMatcher: pulumi.String("EXACT_MATCH"),
},
},
},
CheckerType: pulumi.String("STATIC_IP_CHECKERS"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var statusCode = new Gcp.Monitoring.UptimeCheckConfig("status_code", new()
{
DisplayName = "http-uptime-check",
Timeout = "60s",
HttpCheck = new Gcp.Monitoring.Inputs.UptimeCheckConfigHttpCheckArgs
{
Path = "some-path",
Port = 8010,
RequestMethod = "POST",
ContentType = "URL_ENCODED",
Body = "Zm9vJTI1M0RiYXI=",
AcceptedResponseStatusCodes = new[]
{
new Gcp.Monitoring.Inputs.UptimeCheckConfigHttpCheckAcceptedResponseStatusCodeArgs
{
StatusClass = "STATUS_CLASS_2XX",
},
new Gcp.Monitoring.Inputs.UptimeCheckConfigHttpCheckAcceptedResponseStatusCodeArgs
{
StatusValue = 301,
},
new Gcp.Monitoring.Inputs.UptimeCheckConfigHttpCheckAcceptedResponseStatusCodeArgs
{
StatusValue = 302,
},
},
},
MonitoredResource = new Gcp.Monitoring.Inputs.UptimeCheckConfigMonitoredResourceArgs
{
Type = "uptime_url",
Labels =
{
{ "project_id", "my-project-name" },
{ "host", "192.168.1.1" },
},
},
ContentMatchers = new[]
{
new Gcp.Monitoring.Inputs.UptimeCheckConfigContentMatcherArgs
{
Content = "\"example\"",
Matcher = "MATCHES_JSON_PATH",
JsonPathMatcher = new Gcp.Monitoring.Inputs.UptimeCheckConfigContentMatcherJsonPathMatcherArgs
{
JsonPath = "$.path",
JsonMatcher = "EXACT_MATCH",
},
},
},
CheckerType = "STATIC_IP_CHECKERS",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.monitoring.UptimeCheckConfig;
import com.pulumi.gcp.monitoring.UptimeCheckConfigArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigHttpCheckArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigMonitoredResourceArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigContentMatcherArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigContentMatcherJsonPathMatcherArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var statusCode = new UptimeCheckConfig("statusCode", UptimeCheckConfigArgs.builder()
.displayName("http-uptime-check")
.timeout("60s")
.httpCheck(UptimeCheckConfigHttpCheckArgs.builder()
.path("some-path")
.port(8010)
.requestMethod("POST")
.contentType("URL_ENCODED")
.body("Zm9vJTI1M0RiYXI=")
.acceptedResponseStatusCodes(
UptimeCheckConfigHttpCheckAcceptedResponseStatusCodeArgs.builder()
.statusClass("STATUS_CLASS_2XX")
.build(),
UptimeCheckConfigHttpCheckAcceptedResponseStatusCodeArgs.builder()
.statusValue(301)
.build(),
UptimeCheckConfigHttpCheckAcceptedResponseStatusCodeArgs.builder()
.statusValue(302)
.build())
.build())
.monitoredResource(UptimeCheckConfigMonitoredResourceArgs.builder()
.type("uptime_url")
.labels(Map.ofEntries(
Map.entry("project_id", "my-project-name"),
Map.entry("host", "192.168.1.1")
))
.build())
.contentMatchers(UptimeCheckConfigContentMatcherArgs.builder()
.content("\"example\"")
.matcher("MATCHES_JSON_PATH")
.jsonPathMatcher(UptimeCheckConfigContentMatcherJsonPathMatcherArgs.builder()
.jsonPath("$.path")
.jsonMatcher("EXACT_MATCH")
.build())
.build())
.checkerType("STATIC_IP_CHECKERS")
.build());
}
}
resources:
statusCode:
type: gcp:monitoring:UptimeCheckConfig
name: status_code
properties:
displayName: http-uptime-check
timeout: 60s
httpCheck:
path: some-path
port: '8010'
requestMethod: POST
contentType: URL_ENCODED
body: Zm9vJTI1M0RiYXI=
acceptedResponseStatusCodes:
- statusClass: STATUS_CLASS_2XX
- statusValue: 301
- statusValue: 302
monitoredResource:
type: uptime_url
labels:
project_id: my-project-name
host: 192.168.1.1
contentMatchers:
- content: '"example"'
matcher: MATCHES_JSON_PATH
jsonPathMatcher:
jsonPath: $.path
jsonMatcher: EXACT_MATCH
checkerType: STATIC_IP_CHECKERS
The acceptedResponseStatusCodes array defines which status codes indicate success. You can specify entire classes (STATUS_CLASS_2XX) or individual codes (301, 302). This replaces content matching with status code validation, useful when response bodies vary but status codes remain consistent.
Monitor HTTPS endpoints with SSL validation
Production endpoints typically use HTTPS with SSL certificates that must remain valid.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const https = new gcp.monitoring.UptimeCheckConfig("https", {
displayName: "https-uptime-check",
timeout: "60s",
httpCheck: {
path: "/some-path",
port: 443,
useSsl: true,
validateSsl: true,
serviceAgentAuthentication: {
type: "OIDC_TOKEN",
},
},
monitoredResource: {
type: "uptime_url",
labels: {
project_id: "my-project-name",
host: "192.168.1.1",
},
},
contentMatchers: [{
content: "example",
matcher: "MATCHES_JSON_PATH",
jsonPathMatcher: {
jsonPath: "$.path",
jsonMatcher: "REGEX_MATCH",
},
}],
});
import pulumi
import pulumi_gcp as gcp
https = gcp.monitoring.UptimeCheckConfig("https",
display_name="https-uptime-check",
timeout="60s",
http_check={
"path": "/some-path",
"port": 443,
"use_ssl": True,
"validate_ssl": True,
"service_agent_authentication": {
"type": "OIDC_TOKEN",
},
},
monitored_resource={
"type": "uptime_url",
"labels": {
"project_id": "my-project-name",
"host": "192.168.1.1",
},
},
content_matchers=[{
"content": "example",
"matcher": "MATCHES_JSON_PATH",
"json_path_matcher": {
"json_path": "$.path",
"json_matcher": "REGEX_MATCH",
},
}])
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/monitoring"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := monitoring.NewUptimeCheckConfig(ctx, "https", &monitoring.UptimeCheckConfigArgs{
DisplayName: pulumi.String("https-uptime-check"),
Timeout: pulumi.String("60s"),
HttpCheck: &monitoring.UptimeCheckConfigHttpCheckArgs{
Path: pulumi.String("/some-path"),
Port: pulumi.Int(443),
UseSsl: pulumi.Bool(true),
ValidateSsl: pulumi.Bool(true),
ServiceAgentAuthentication: &monitoring.UptimeCheckConfigHttpCheckServiceAgentAuthenticationArgs{
Type: pulumi.String("OIDC_TOKEN"),
},
},
MonitoredResource: &monitoring.UptimeCheckConfigMonitoredResourceArgs{
Type: pulumi.String("uptime_url"),
Labels: pulumi.StringMap{
"project_id": pulumi.String("my-project-name"),
"host": pulumi.String("192.168.1.1"),
},
},
ContentMatchers: monitoring.UptimeCheckConfigContentMatcherArray{
&monitoring.UptimeCheckConfigContentMatcherArgs{
Content: pulumi.String("example"),
Matcher: pulumi.String("MATCHES_JSON_PATH"),
JsonPathMatcher: &monitoring.UptimeCheckConfigContentMatcherJsonPathMatcherArgs{
JsonPath: pulumi.String("$.path"),
JsonMatcher: pulumi.String("REGEX_MATCH"),
},
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var https = new Gcp.Monitoring.UptimeCheckConfig("https", new()
{
DisplayName = "https-uptime-check",
Timeout = "60s",
HttpCheck = new Gcp.Monitoring.Inputs.UptimeCheckConfigHttpCheckArgs
{
Path = "/some-path",
Port = 443,
UseSsl = true,
ValidateSsl = true,
ServiceAgentAuthentication = new Gcp.Monitoring.Inputs.UptimeCheckConfigHttpCheckServiceAgentAuthenticationArgs
{
Type = "OIDC_TOKEN",
},
},
MonitoredResource = new Gcp.Monitoring.Inputs.UptimeCheckConfigMonitoredResourceArgs
{
Type = "uptime_url",
Labels =
{
{ "project_id", "my-project-name" },
{ "host", "192.168.1.1" },
},
},
ContentMatchers = new[]
{
new Gcp.Monitoring.Inputs.UptimeCheckConfigContentMatcherArgs
{
Content = "example",
Matcher = "MATCHES_JSON_PATH",
JsonPathMatcher = new Gcp.Monitoring.Inputs.UptimeCheckConfigContentMatcherJsonPathMatcherArgs
{
JsonPath = "$.path",
JsonMatcher = "REGEX_MATCH",
},
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.monitoring.UptimeCheckConfig;
import com.pulumi.gcp.monitoring.UptimeCheckConfigArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigHttpCheckArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigHttpCheckServiceAgentAuthenticationArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigMonitoredResourceArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigContentMatcherArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigContentMatcherJsonPathMatcherArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var https = new UptimeCheckConfig("https", UptimeCheckConfigArgs.builder()
.displayName("https-uptime-check")
.timeout("60s")
.httpCheck(UptimeCheckConfigHttpCheckArgs.builder()
.path("/some-path")
.port(443)
.useSsl(true)
.validateSsl(true)
.serviceAgentAuthentication(UptimeCheckConfigHttpCheckServiceAgentAuthenticationArgs.builder()
.type("OIDC_TOKEN")
.build())
.build())
.monitoredResource(UptimeCheckConfigMonitoredResourceArgs.builder()
.type("uptime_url")
.labels(Map.ofEntries(
Map.entry("project_id", "my-project-name"),
Map.entry("host", "192.168.1.1")
))
.build())
.contentMatchers(UptimeCheckConfigContentMatcherArgs.builder()
.content("example")
.matcher("MATCHES_JSON_PATH")
.jsonPathMatcher(UptimeCheckConfigContentMatcherJsonPathMatcherArgs.builder()
.jsonPath("$.path")
.jsonMatcher("REGEX_MATCH")
.build())
.build())
.build());
}
}
resources:
https:
type: gcp:monitoring:UptimeCheckConfig
properties:
displayName: https-uptime-check
timeout: 60s
httpCheck:
path: /some-path
port: '443'
useSsl: true
validateSsl: true
serviceAgentAuthentication:
type: OIDC_TOKEN
monitoredResource:
type: uptime_url
labels:
project_id: my-project-name
host: 192.168.1.1
contentMatchers:
- content: example
matcher: MATCHES_JSON_PATH
jsonPathMatcher:
jsonPath: $.path
jsonMatcher: REGEX_MATCH
Setting useSsl to true switches the check to HTTPS, and validateSsl verifies the certificate chain. The serviceAgentAuthentication block configures how the monitoring service authenticates to your endpoint, using OIDC tokens for secure access. This adds SSL validation and service agent authentication to the basic HTTP check pattern.
Check TCP port availability for resource groups
Non-HTTP services like databases or custom protocols require TCP-level health checks.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const check = new gcp.monitoring.Group("check", {
displayName: "uptime-check-group",
filter: "resource.metadata.name=has_substring(\"foo\")",
});
const tcpGroup = new gcp.monitoring.UptimeCheckConfig("tcp_group", {
displayName: "tcp-uptime-check",
timeout: "60s",
tcpCheck: {
port: 888,
pingConfig: {
pingsCount: 2,
},
},
resourceGroup: {
resourceType: "INSTANCE",
groupId: check.name,
},
});
import pulumi
import pulumi_gcp as gcp
check = gcp.monitoring.Group("check",
display_name="uptime-check-group",
filter="resource.metadata.name=has_substring(\"foo\")")
tcp_group = gcp.monitoring.UptimeCheckConfig("tcp_group",
display_name="tcp-uptime-check",
timeout="60s",
tcp_check={
"port": 888,
"ping_config": {
"pings_count": 2,
},
},
resource_group={
"resource_type": "INSTANCE",
"group_id": check.name,
})
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/monitoring"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
check, err := monitoring.NewGroup(ctx, "check", &monitoring.GroupArgs{
DisplayName: pulumi.String("uptime-check-group"),
Filter: pulumi.String("resource.metadata.name=has_substring(\"foo\")"),
})
if err != nil {
return err
}
_, err = monitoring.NewUptimeCheckConfig(ctx, "tcp_group", &monitoring.UptimeCheckConfigArgs{
DisplayName: pulumi.String("tcp-uptime-check"),
Timeout: pulumi.String("60s"),
TcpCheck: &monitoring.UptimeCheckConfigTcpCheckArgs{
Port: pulumi.Int(888),
PingConfig: &monitoring.UptimeCheckConfigTcpCheckPingConfigArgs{
PingsCount: pulumi.Int(2),
},
},
ResourceGroup: &monitoring.UptimeCheckConfigResourceGroupArgs{
ResourceType: pulumi.String("INSTANCE"),
GroupId: check.Name,
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var check = new Gcp.Monitoring.Group("check", new()
{
DisplayName = "uptime-check-group",
Filter = "resource.metadata.name=has_substring(\"foo\")",
});
var tcpGroup = new Gcp.Monitoring.UptimeCheckConfig("tcp_group", new()
{
DisplayName = "tcp-uptime-check",
Timeout = "60s",
TcpCheck = new Gcp.Monitoring.Inputs.UptimeCheckConfigTcpCheckArgs
{
Port = 888,
PingConfig = new Gcp.Monitoring.Inputs.UptimeCheckConfigTcpCheckPingConfigArgs
{
PingsCount = 2,
},
},
ResourceGroup = new Gcp.Monitoring.Inputs.UptimeCheckConfigResourceGroupArgs
{
ResourceType = "INSTANCE",
GroupId = check.Name,
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.monitoring.Group;
import com.pulumi.gcp.monitoring.GroupArgs;
import com.pulumi.gcp.monitoring.UptimeCheckConfig;
import com.pulumi.gcp.monitoring.UptimeCheckConfigArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigTcpCheckArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigTcpCheckPingConfigArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigResourceGroupArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var check = new Group("check", GroupArgs.builder()
.displayName("uptime-check-group")
.filter("resource.metadata.name=has_substring(\"foo\")")
.build());
var tcpGroup = new UptimeCheckConfig("tcpGroup", UptimeCheckConfigArgs.builder()
.displayName("tcp-uptime-check")
.timeout("60s")
.tcpCheck(UptimeCheckConfigTcpCheckArgs.builder()
.port(888)
.pingConfig(UptimeCheckConfigTcpCheckPingConfigArgs.builder()
.pingsCount(2)
.build())
.build())
.resourceGroup(UptimeCheckConfigResourceGroupArgs.builder()
.resourceType("INSTANCE")
.groupId(check.name())
.build())
.build());
}
}
resources:
tcpGroup:
type: gcp:monitoring:UptimeCheckConfig
name: tcp_group
properties:
displayName: tcp-uptime-check
timeout: 60s
tcpCheck:
port: 888
pingConfig:
pingsCount: 2
resourceGroup:
resourceType: INSTANCE
groupId: ${check.name}
check:
type: gcp:monitoring:Group
properties:
displayName: uptime-check-group
filter: resource.metadata.name=has_substring("foo")
The tcpCheck property defines port-level monitoring without HTTP semantics. The resourceGroup property targets multiple instances matching a filter, rather than a single monitored resource. The pingConfig controls how many connection attempts to make per check. This pattern works for any TCP service, not just HTTP endpoints.
Run custom monitoring logic with Cloud Functions
Complex monitoring scenarios require custom logic beyond simple HTTP or TCP checks.
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const bucket = new gcp.storage.Bucket("bucket", {
name: "my-project-name-gcf-source",
location: "US",
uniformBucketLevelAccess: true,
});
const object = new gcp.storage.BucketObject("object", {
name: "function-source.zip",
bucket: bucket.name,
source: new pulumi.asset.FileAsset("synthetic-fn-source.zip"),
});
const _function = new gcp.cloudfunctionsv2.Function("function", {
name: "synthetic_function",
location: "us-central1",
buildConfig: {
runtime: "nodejs20",
entryPoint: "SyntheticFunction",
source: {
storageSource: {
bucket: bucket.name,
object: object.name,
},
},
},
serviceConfig: {
maxInstanceCount: 1,
availableMemory: "256M",
timeoutSeconds: 60,
},
});
const syntheticMonitor = new gcp.monitoring.UptimeCheckConfig("synthetic_monitor", {
displayName: "synthetic_monitor",
timeout: "60s",
syntheticMonitor: {
cloudFunctionV2: {
name: _function.id,
},
},
});
import pulumi
import pulumi_gcp as gcp
bucket = gcp.storage.Bucket("bucket",
name="my-project-name-gcf-source",
location="US",
uniform_bucket_level_access=True)
object = gcp.storage.BucketObject("object",
name="function-source.zip",
bucket=bucket.name,
source=pulumi.FileAsset("synthetic-fn-source.zip"))
function = gcp.cloudfunctionsv2.Function("function",
name="synthetic_function",
location="us-central1",
build_config={
"runtime": "nodejs20",
"entry_point": "SyntheticFunction",
"source": {
"storage_source": {
"bucket": bucket.name,
"object": object.name,
},
},
},
service_config={
"max_instance_count": 1,
"available_memory": "256M",
"timeout_seconds": 60,
})
synthetic_monitor = gcp.monitoring.UptimeCheckConfig("synthetic_monitor",
display_name="synthetic_monitor",
timeout="60s",
synthetic_monitor={
"cloud_function_v2": {
"name": function.id,
},
})
package main
import (
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/cloudfunctionsv2"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/monitoring"
"github.com/pulumi/pulumi-gcp/sdk/v9/go/gcp/storage"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
bucket, err := storage.NewBucket(ctx, "bucket", &storage.BucketArgs{
Name: pulumi.String("my-project-name-gcf-source"),
Location: pulumi.String("US"),
UniformBucketLevelAccess: pulumi.Bool(true),
})
if err != nil {
return err
}
object, err := storage.NewBucketObject(ctx, "object", &storage.BucketObjectArgs{
Name: pulumi.String("function-source.zip"),
Bucket: bucket.Name,
Source: pulumi.NewFileAsset("synthetic-fn-source.zip"),
})
if err != nil {
return err
}
function, err := cloudfunctionsv2.NewFunction(ctx, "function", &cloudfunctionsv2.FunctionArgs{
Name: pulumi.String("synthetic_function"),
Location: pulumi.String("us-central1"),
BuildConfig: &cloudfunctionsv2.FunctionBuildConfigArgs{
Runtime: pulumi.String("nodejs20"),
EntryPoint: pulumi.String("SyntheticFunction"),
Source: &cloudfunctionsv2.FunctionBuildConfigSourceArgs{
StorageSource: &cloudfunctionsv2.FunctionBuildConfigSourceStorageSourceArgs{
Bucket: bucket.Name,
Object: object.Name,
},
},
},
ServiceConfig: &cloudfunctionsv2.FunctionServiceConfigArgs{
MaxInstanceCount: pulumi.Int(1),
AvailableMemory: pulumi.String("256M"),
TimeoutSeconds: pulumi.Int(60),
},
})
if err != nil {
return err
}
_, err = monitoring.NewUptimeCheckConfig(ctx, "synthetic_monitor", &monitoring.UptimeCheckConfigArgs{
DisplayName: pulumi.String("synthetic_monitor"),
Timeout: pulumi.String("60s"),
SyntheticMonitor: &monitoring.UptimeCheckConfigSyntheticMonitorArgs{
CloudFunctionV2: &monitoring.UptimeCheckConfigSyntheticMonitorCloudFunctionV2Args{
Name: function.ID(),
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var bucket = new Gcp.Storage.Bucket("bucket", new()
{
Name = "my-project-name-gcf-source",
Location = "US",
UniformBucketLevelAccess = true,
});
var @object = new Gcp.Storage.BucketObject("object", new()
{
Name = "function-source.zip",
Bucket = bucket.Name,
Source = new FileAsset("synthetic-fn-source.zip"),
});
var function = new Gcp.CloudFunctionsV2.Function("function", new()
{
Name = "synthetic_function",
Location = "us-central1",
BuildConfig = new Gcp.CloudFunctionsV2.Inputs.FunctionBuildConfigArgs
{
Runtime = "nodejs20",
EntryPoint = "SyntheticFunction",
Source = new Gcp.CloudFunctionsV2.Inputs.FunctionBuildConfigSourceArgs
{
StorageSource = new Gcp.CloudFunctionsV2.Inputs.FunctionBuildConfigSourceStorageSourceArgs
{
Bucket = bucket.Name,
Object = @object.Name,
},
},
},
ServiceConfig = new Gcp.CloudFunctionsV2.Inputs.FunctionServiceConfigArgs
{
MaxInstanceCount = 1,
AvailableMemory = "256M",
TimeoutSeconds = 60,
},
});
var syntheticMonitor = new Gcp.Monitoring.UptimeCheckConfig("synthetic_monitor", new()
{
DisplayName = "synthetic_monitor",
Timeout = "60s",
SyntheticMonitor = new Gcp.Monitoring.Inputs.UptimeCheckConfigSyntheticMonitorArgs
{
CloudFunctionV2 = new Gcp.Monitoring.Inputs.UptimeCheckConfigSyntheticMonitorCloudFunctionV2Args
{
Name = function.Id,
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.gcp.storage.Bucket;
import com.pulumi.gcp.storage.BucketArgs;
import com.pulumi.gcp.storage.BucketObject;
import com.pulumi.gcp.storage.BucketObjectArgs;
import com.pulumi.gcp.cloudfunctionsv2.Function;
import com.pulumi.gcp.cloudfunctionsv2.FunctionArgs;
import com.pulumi.gcp.cloudfunctionsv2.inputs.FunctionBuildConfigArgs;
import com.pulumi.gcp.cloudfunctionsv2.inputs.FunctionBuildConfigSourceArgs;
import com.pulumi.gcp.cloudfunctionsv2.inputs.FunctionBuildConfigSourceStorageSourceArgs;
import com.pulumi.gcp.cloudfunctionsv2.inputs.FunctionServiceConfigArgs;
import com.pulumi.gcp.monitoring.UptimeCheckConfig;
import com.pulumi.gcp.monitoring.UptimeCheckConfigArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigSyntheticMonitorArgs;
import com.pulumi.gcp.monitoring.inputs.UptimeCheckConfigSyntheticMonitorCloudFunctionV2Args;
import com.pulumi.asset.FileAsset;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var bucket = new Bucket("bucket", BucketArgs.builder()
.name("my-project-name-gcf-source")
.location("US")
.uniformBucketLevelAccess(true)
.build());
var object = new BucketObject("object", BucketObjectArgs.builder()
.name("function-source.zip")
.bucket(bucket.name())
.source(new FileAsset("synthetic-fn-source.zip"))
.build());
var function = new Function("function", FunctionArgs.builder()
.name("synthetic_function")
.location("us-central1")
.buildConfig(FunctionBuildConfigArgs.builder()
.runtime("nodejs20")
.entryPoint("SyntheticFunction")
.source(FunctionBuildConfigSourceArgs.builder()
.storageSource(FunctionBuildConfigSourceStorageSourceArgs.builder()
.bucket(bucket.name())
.object(object.name())
.build())
.build())
.build())
.serviceConfig(FunctionServiceConfigArgs.builder()
.maxInstanceCount(1)
.availableMemory("256M")
.timeoutSeconds(60)
.build())
.build());
var syntheticMonitor = new UptimeCheckConfig("syntheticMonitor", UptimeCheckConfigArgs.builder()
.displayName("synthetic_monitor")
.timeout("60s")
.syntheticMonitor(UptimeCheckConfigSyntheticMonitorArgs.builder()
.cloudFunctionV2(UptimeCheckConfigSyntheticMonitorCloudFunctionV2Args.builder()
.name(function.id())
.build())
.build())
.build());
}
}
resources:
bucket:
type: gcp:storage:Bucket
properties:
name: my-project-name-gcf-source
location: US
uniformBucketLevelAccess: true
object:
type: gcp:storage:BucketObject
properties:
name: function-source.zip
bucket: ${bucket.name}
source:
fn::FileAsset: synthetic-fn-source.zip
function:
type: gcp:cloudfunctionsv2:Function
properties:
name: synthetic_function
location: us-central1
buildConfig:
runtime: nodejs20
entryPoint: SyntheticFunction
source:
storageSource:
bucket: ${bucket.name}
object: ${object.name}
serviceConfig:
maxInstanceCount: 1
availableMemory: 256M
timeoutSeconds: 60
syntheticMonitor:
type: gcp:monitoring:UptimeCheckConfig
name: synthetic_monitor
properties:
displayName: synthetic_monitor
timeout: 60s
syntheticMonitor:
cloudFunctionV2:
name: ${function.id}
The syntheticMonitor property references a Cloud Functions V2 function that executes your custom monitoring logic. The function can perform multi-step validations, interact with APIs, or check complex business logic. Cloud Monitoring invokes the function at the configured interval and records success or failure based on the function’s response.
Beyond these examples
These snippets focus on specific uptime check features: HTTP/HTTPS and TCP protocol checks, content validation and status code matching, and synthetic monitoring with Cloud Functions. They’re intentionally minimal rather than full monitoring solutions.
The examples may reference pre-existing infrastructure such as GCP projects with monitoring enabled, monitoring groups for resource group checks, and Cloud Functions source code and storage buckets for synthetic monitors. They focus on configuring the check rather than provisioning everything around it.
To keep things focused, common uptime check patterns are omitted, including:
- Regional selection (selectedRegions for geographic distribution)
- Check frequency tuning (period property, defaults to 5 minutes)
- Failure logging configuration (logCheckFailures)
- Custom user labels for organization
These omissions are intentional: the goal is to illustrate how each uptime check feature is wired, not provide drop-in monitoring modules. See the UptimeCheckConfig resource reference for all available configuration options.
Let's configure GCP Uptime Check Monitoring
Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.
Try Pulumi Cloud for FREEFrequently Asked Questions
Common Issues & Limitations
contentMatchers array currently supports only the first entry; additional entries are ignored. Specify only one content matcher in your configuration.selectedRegions, you must include enough regions to cover at least 3 locations, or you’ll get an error. Omitting selectedRegions runs checks from all available regions.checkerType, project, monitoredResource, resourceGroup, and syntheticMonitor. You’ll need to recreate the check to modify these.Check Types & Configuration
checkerType to VPC_CHECKERS when monitoring servicedirectory_service resources. For other resource types, you can use STATIC_IP_CHECKERS.period property supports 60s (1 minute), 300s (5 minutes), 600s (10 minutes), and 900s (15 minutes). The default is 300s if not specified.monitoredResource to target a specific resource like a URL (uptime_url type). Use resourceGroup to monitor multiple resources in a group, such as checking TCP connectivity across instance groups.timeout property is required and must be between 1 and 60 seconds.Content Validation & Authentication
acceptedResponseStatusCodes within httpCheck. You can specify status classes (like STATUS_CLASS_2XX) or specific values (like 301 or 302).authInfo within httpCheck with username, passwordWo, and passwordWoVersion properties.Advanced Features
useSsl: true and validateSsl: true within httpCheck. You can also configure serviceAgentAuthentication for OIDC token authentication.syntheticMonitor with cloudFunctionV2 pointing to your Cloud Functions V2 instance name. Note that syntheticMonitor is immutable after creation.Using a different cloud?
Explore monitoring guides for other cloud providers: