Monitors / TCP
TCP
Dial a host and port. Optionally write a payload after connect.
How it works
The probe opens a TCP connection. If you set a request body, it is written after the socket is up and any reply is stored as [BODY]. Use this for databases that are not MySQL/Postgres/Redis, mail ports, or custom protocols.
Target
host:port, or a URL such as tcp://db.example.com:5432. IPv6 must be bracketed: [2001:db8::1]:5432.
tcp://db.example.com:5432Type fields
| Field | What it does |
|---|---|
request_body | Optional payload written after connect. The reply, if any, is [BODY]. |
proxy_url | HTTP or SOCKS proxy for the outbound dial. |
Placeholders
Available on this type. See conditions for operators and pat() / has() / len() / any().
[CONNECTED] [RESPONSE_TIME] [IP] [BODY] [DOMAIN_EXPIRATION]
Defaults
New monitors of this type start with:
[CONNECTED] == true[RESPONSE_TIME] < 50Example conditions
[CONNECTED] == true[RESPONSE_TIME] < 200GraphQL
type is Tcp. Same fields as the admin, camelCase in the input (intervalSeconds, requestBody, probeIds).
mutation {
createMonitor(input: {
name: "Postgres port"
type: Tcp
target: "tcp://db.example.com:5432"
conditions: ["[CONNECTED] == true"]
}) { id }
}Terraform
Resource is nominal_monitor from returnearly/nominal. type is Tcp. Shared arguments match the shared fields in snake_case (name, target, interval_seconds, probe_ids, channel_ids). Omitted conditions use the type defaults.
Type arguments: request_body, proxy_url. proxy_url is sensitive.
resource "nominal_monitor" "postgres_port" {
name = "Postgres port"
type = "Tcp"
target = "tcp://db.example.com:5432"
conditions = ["[CONNECTED] == true"]
}