Preview
Network availability monitoring enables you create synthetic network availability monitors of type ICMP, TCP, or DNS.
The Synthetic - Network availability monitors API is part of the Environment API v2. Check the API Explorer (section-api#api-explorer) for more information.
The maximum number of requests executed per network availability monitor is 1000.
If a monitor uses target filter, it might not be possible to precisely predict the number of requests in advance of execution (for example, when monitoring an entire host group or a subnet with a wide IP range). In such cases, the limit is applied when target filter is resolved before the monitor's execution into the actual list of addresses.
Network availability monitors are not supported on Synthetic-enabled ActiveGate on Windows hosts.
Network availability monitors are supported only on private Synthetic locations.
Network availability monitors are supported on containerized Synthetic-enabled ActiveGate deployments, but additional permissions are required.
ICMP monitors use the ping
executable, which requires the CAP_NET_RAW
capability set for the container executing the requests (synthetic-vuc
). Additionally, the allowPrivilegeEscalation
property of securityContext
for this container has to be set to true
, because the process that launches the ping
executable does not have the required privileges set by default.
The entire securityContext
for the synthetic-vuc
container with enabled network availability monitors should look as follows.
securityContext:readOnlyRootFilesystem: trueprivileged: falseallowPrivilegeEscalation: truerunAsNonRoot: truecapabilities:drop: ["all"]add: ["NET_RAW"]
SyntheticMultiProtocolMonitorUpdateDto
required
MULTI_PROTOCOL
.true
. If false
, the monitor is disabled.syntheticMonitorOutageHandlingSettings
schema.steps
schema SyntheticMultiProtocolMonitorStepDto
ICMP
, TCP
, or DNS
constraints
schema.requestConfigurations
schema SyntheticMultiProtocolRequestConfigurationDto
constraints
schema.constraints
schema SyntheticMultiProtocolMonitorConstraintDto
syntheticMonitorOutageHandlingSettings
schema SyntheticMonitorOutageHandlingSettingsDto
globalConsecutiveOutageCountThreshold
or more consecutive executions at all configured locations.localConsecutiveOutageCountThreshold
or more consecutive executions at localLocationOutageCountThreshold
or more locations.{"name": "Sample NAM monitor with ICMP step","type": "MULTI_PROTOCOL","frequencyMin": "1","locations": ["SYNTHETIC_LOCATION-8A91FE7982E24C06"],"active": "true","steps": [{"name": "ICMP step 1","requestType": "ICMP","targetFilter": null,"targetList": ["127.0.0.1","127.0.0.2","127.0.0.3","127.0.0.4"],"name": "ICMP step 1","requestType": "ICMP","targetFilter": null,"targetList": ["127.0.0.1","127.0.0.2","127.0.0.3","127.0.0.4"],"constraints": [{"type": "SUCCESS_RATE_PERCENT","properties": {"value": "49","operator": ">"}}],"properties": {"ICMP_NUMBER_OF_PACKETS": "3","ICMP_TIMEOUT_FOR_REPLY": "PT1S","ICMP_TIMEOUT_FOR_REPLY": "PT1S"},"requestConfigurations": [{"constraints": [{"type": "ICMP_SUCCESS_RATE_PERCENT","properties": {"value": "100"}}]}]}],"syntheticMonitorOutageHandlingSettings": {"globalOutages": true,"localOutages": false,"globalConsecutiveOutageCountThreshold": 1,"localLocationOutageCountThreshold": null,"localConsecutiveOutageCountThreshold": null},"tags": [{"key": "my-icmp-monitor"},{"key": "env","value": "UAT"}]}
{"name": "Sample NAM monitor with TCP step","type": "MULTI_PROTOCOL","frequencyMin": "1","locations": ["SYNTHETIC_LOCATION-8A91FE7982E24C06"],"active": "true","steps": [{"name": "TCP step 1","requestType": "TCP","targetFilter": "hostGroup == my-host-group0 and ipRange == 45-55.*.*.*","targetList": [],"name": "TCP step 1","requestType": "TCP","targetFilter": "hostGroup == my-host-group0 and ipRange == 45-55.*.*.*","targetList": [],"constraints": [{"type": "SUCCESS_RATE_PERCENT","properties": {"value": "66","operator": ">="}}],"properties": {"TCP_PORT_RANGES": "22,443,5501-5509"},"requestConfigurations": [{"constraints": []}]}],"syntheticMonitorOutageHandlingSettings": {"globalOutages": true,"localOutages": false,"globalConsecutiveOutageCountThreshold": 1,"localLocationOutageCountThreshold": null,"localConsecutiveOutageCountThreshold": null},"tags": [{"key": "my-tcp-monitor"},{"key": "env","value": "UAT"}]}
{"name": "Sample NAM monitor with DNS step","type": "MULTI_PROTOCOL","frequencyMin": 1,"locations": ["SYNTHETIC_LOCATION-6F3084B1ECD81DE1"],"active": true,"steps": [{"name": "DNS step 1","requestType": "DNS","targetFilter": null,"targetList": ["dynatrace.com"],"name": "DNS step 1","requestType": "DNS","targetFilter": null,"targetList": ["dynatrace.com"],"constraints": [{"type": "SUCCESS_RATE_PERCENT","properties": {"value": "90","operator": ">="}}],"properties": {"DNS_RECORD_TYPES": "A,AAAA","DNS_SERVER": "10.102.40.11"},"requestConfigurations": [{"constraints": [{"type": "DNS_STATUS_CODE","properties": {"status": "NOERROR","operator": "="}}]}]}],"syntheticMonitorOutageHandlingSettings": {"globalOutages": true,"localOutages": false,"globalConsecutiveOutageCountThreshold": 1,"localLocationOutageCountThreshold": null,"localConsecutiveOutageCountThreshold": null},"tags": [{"key": "my-dns-monitor"},{"key": "env","value": "UAT"}]}
PT0.1S
PT0.5S
PT1S
PT10S
PT1M30S
PT1M
PT2M
PT5M
EXECUTION_TIMEOUT
PT1S
ICMP_NUMBER_OF_PACKETS
× ICMP_TIMEOUT_FOR_REPLY
+ defaultTimeout
defaultTimeout
= 1s
0
–PT2M
ICMP_NUMBER_OF_PACKETS
-c
(Linux) and -n
(Windows) parameters.1
1
–10
ICMP_PACKET_SIZE
-s
(Linux) and -l
(Windows) parameters.32
0
–65500
ICMP_TIME_TO_LIVE
-t
(Linux) and -i
(Windows) parameters.1
–255
ICMP_TYPE_OF_SERVICE
-Q
(Linux) and -v
(Windows) parameters.0
–255
ICMP_DO_NOT_FRAGMENT_DATA
-M do
(Linux) and -f
(Windows) parameters.true
or false
ICMP_TIMEOUT_FOR_REPLY
-W
(Linux) and -w
(Windows) parameters.PT1S
PT0.1S
are accepted.PT1S
are required.PT1S
PT1S
–PT2S
Name
Type
Description
Values
TCP_PORT_RANGES
string
Comma-separated list of port ranges
A single range can be either a single port number or a range of ports, defined as two port numbers with a hyphen.
The final list of requests to be executed is the product of all defined ports and target hosts. For example, if a step has two target hosts (1.1.1.1
and 2.2.2.2
) and a range of two ports (80-81
), four requests are executed within such a step.
1.1.1.1
on port 80
1.1.1.1
on port 81
2.2.2.2
on port 80
2.2.2.2
on port 81
Sample values
8080
8000-9000
80,443,90-100
EXECUTION_TIMEOUT
string:duration
Connection timeout
Valid duration, for example, PT1S
Default timeout = 1s
Range = 0
–PT2M
Name
Type
Description
Values
DNS_RECORD_TYPES
string
Comma-separated list of DNS record types
The final list of requests executed is the product of all defined record types and target hosts. For example, if a step has two record types (A,AAAA
) and two target hosts (host1.domain.com
and host2.domain.com
), four requests are executed within such a step.
A
record contents for host1.domain.com
AAAA
record contents for host1.domain.com
A
record contents for host2.domain.com
AAAA
record contents for host2.domain.com
Sample values
A
A,AAAA
A,AAAA,CNAME
EXECUTION_TIMEOUT
string:duration
Connection timeout
Valid duration, for example, PT1S
Default timeout = 2s
Range = 0
–PT2M
DNS_SERVER
string
Address of the DNS server to query, with optional port
If a hostname is provided, it's resolved to an IP address using the system default DNS server.
Valid address, such as:
1.1.1.1
8.4.4.8:53
dns.google
dns9.quad9.net:53
If only host is provided, the default port 53
is used.
If no value is provided, the system default DNS server and port are used.
DNS_FORCE_TCP
boolean
By default, the DNS server is queried over a UDP connection, unless the message is too large to fit the UDP datagram. This option allows you to specify a TCP connection instead.
true
or false
Default value = false
Constraints describe success conditions.
SUCCESS_RATE_PERCENT
Percentage of successful requests in a step
Actual success rate = ratio of the number of requests that didn't fail (successful + skipped requests) to all requests
For example, if 1 request has failed, 2 requests are skipped, and 3 requests are successful, the ratio is (2+3)/6 = 83.33%.
operator
>=
, >
, <=
, <
, =
, or !=
>=
value
0
0
–100
{"type": "SUCCESS_RATE_PERCENT","properties": {"value": "83","operator": ">"}}
ICMP_SUCCESS_RATE_PERCENT
Percentage of successful pings (echo requests) in a request
Actual success rate = ratio of number of the packets received to number of packets sent
For example, if 5 packets were sent and 4 packets were received, the ratio is 4/5 = 80.00%.
operator
>=
, >
, <=
, <
, =
, or !=
>=
value
0
0
–100
{"type": "ICMP_SUCCESS_RATE_PERCENT","properties": {"value": "79","operator": ">"}}
TCP_PORT_UNREACHABLE
This is a special constraint that inverts the execution status for TCP requests. It should be applied if it's expected that the port being checked is unreachable.
This constraint has no configuration properties.
If this constraint is applied:
Execution timeout (12033)
and TCP socket connection error (22000)
statuses are detected after performing a connection attempt, they are interpreted as HEALTHY (0)
.HEALTHY (0)
connection status is interpreted as CONSTRAINT_VIOLATED (1401)
because we expected a failure.UNEXPECTED_ERROR (-1)
and UNKNOWN_HOST (12013)
statuses are preserved and reported as is.{"type": "TCP_PORT_UNREACHABLE","properties": {}}
DNS_STATUS_CODE
Verifies the DNS response status code, which indicates whether a query was successful or not.
operator
=
or !=
=
statusCode
status
0
0
0
–65535
status
statusCode
NOERROR
NOERROR
{"type": "DNS_STATUS_CODE","properties": {"operator": "=","statusCode": "0"}}
{"type": "DNS_STATUS_CODE","properties": {"operator": "=","status": "NOERROR"}}
DNS_IP_ADDRESS
Verifies the IP address value returned in A/AAAA records.
quantifier
any
(at least one) or all
any
operator
=
, !=
or in
=
for an addressin
for a subnetrecordType
A
or AAAA
A
if address/subnet is IPv4AAAA
if address/subnet is IPv6address
=
, !=
subnet
192.168.0.1
, 2001:db8::2:1
subnet
in
address
172.22.80.0/20
, 2001:db8:85a3::0/48
{"constraintType": "DNS_IP_ADDRESS","attributes": {"quantifier": "any","recordType": "A","operator": "=","address": "54.208.9.71"}}
{"constraintType": "DNS_IP_ADDRESS","attributes": {"quantifier": "all","recordType": "A","operator": "in","subnet": "10.102.44.0/24"}}
DNS_RECORD_COUNT
Verifies the count of records of a given type.
operator
>=
, >
, <=
, <
, =
, or !=
>
recordType
MX
value
2
0
0
–65535
{"constraintType": "DNS_RECORD_COUNT","attributes": {"recordType": "A","operator": ">","value": "0"}}
DNS_TIME_TO_LIVE
Verifies the time to live (TTL) of records of a given type.
quantifier
any
(at least one) or all
any
operator
>=
, >
, <=
, <
, =
, or !=
>
recordType
NS
value
3600
0
0
–2147483647
{"constraintType": "DNS_TIME_TO_LIVE","attributes": {"quantifier": "any","recordType": "A","operator": ">=","value": "30"}}
DNS_RECORD_VALUE
Verifies the raw value of records of a given type, with the value format depending on the record type.
Constraints process all records in a response, regardless of the section to which they belong (answer
, authority
, or additional
).
quantifier
any
(at least one) or all
any
operator
contains
checks if the record value contains a given sequence.matches
checks if record value matches a given pattern.contains
or matches
contains
recordType
TXT
sequence
contains
pattern
ms71815323
pattern
*
denoting 0 or more charactersmatches
sequence
"v=spf1 include:*
{"constraintType": "DNS_RECORD_VALUE","attributes": {"quantifier": "any","recordType": "TXT","operator": "contains","sequence": "ms71815323"}}
{"constraintType": "DNS_RECORD_VALUE","attributes": {"quantifier": "any","recordType": "TXT","operator": "matches","pattern": "\"v=spf1 include:*"}}
With the target filter, you can select hosts monitored by Dynatrace based on tags (tag
), host ID (hostId
), host ID (hostId
), host groups (hostGroup
), management zones (managementZone
), IP mask (ipMask
) and IP range (ipRange
).
AND
and OR
(case insensitive)==
and !=
!=
.*
—select all hosts monitored by Dynatrace.tag == tagname or hostGroup == group1
(tag == tagname1 or tag == tagname2) and (hostGroup == group1 or managementZone == zone1)
tag != tagname1 and tag != tagname2:tagvalue
tag == tagname:tagvalue and (managementZone == zone1 or managementZone == zone2)
hostGroup == my-trunk-group and ipRange == 32-55.*.*.*
ipMask == 127.0.0.1/24
multi_protocol.request.type
icmp
, tcp
multi_protocol.request.target_address
54.171.216.19
dt.entity.host
HOST-024C103F7F86A290
dt.entity.synthetic_location
SYNTHETIC_LOCATION-A4F834D72840EFC1
dt.entity.multiprotocol_monitor
MULTIPROTOCOL_MONITOR-3F6C9D500287BBAF
multi_protocol.step.id
1
multi_protocol.request.id
2
multi_protocol.result.status
HEALTHY
, CONSTRAINT_VIOLATED
multi_protocol.result.status.code
0
, 1401
dt.synthetic.multi_protocol.execution_time
builtin:synthetic.multiProtocol.executionTime
dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
dt.synthetic.multi_protocol.success_rate
builtin:synthetic.multiProtocol.successRate
dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
dt.synthetic.multi_protocol.availability
builtin:synthetic.multiProtocol.availability
dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
0
: HEALTHY
, SCRIPT_FINISH
, SKIPPED
1401 - CONSTRAINT_VIOLATED
dt.synthetic.multi_protocol.executions
builtin:synthetic.multiProtocol.executions
dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.result.status
multi_protocol.result.status.code
dt.synthetic.multi_protocol.availability.excluding_maintenance_windows
builtin:synthetic.multiProtocol.availability.excludingMaintenanceWindows
dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
0
: HEALTHY
, SCRIPT_FINISH
, SKIPPED
1401 - CONSTRAINT_VIOLATED
dt.synthetic.multi_protocol.step.execution_time
builtin:synthetic.multiProtocol.step.executionTime
multi_protocol.request.type
dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
dt.synthetic.multi_protocol.step.success_rate
builtin:synthetic.multiProtocol.step.successRate
multi_protocol.request.type
dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
SCRIPT_FINISH
), we return the value 0%
(for failures) or 100%
(for finished).dt.synthetic.multi_protocol.step.availability
builtin:synthetic.multiProtocol.step.availability
multi_protocol.request.type
dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
0
: HEALTHY
, SCRIPT_FINISH
, SKIPPED
1401 - CONSTRAINT_VIOLATED
dt.synthetic.multi_protocol.step.executions
builtin:synthetic.multiProtocol.step.executions
multi_protocol.request.type
dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
multi_protocol.result.status
multi_protocol.result.status.code
dt.synthetic.multi_protocol.step.availability.excluding_maintenance_windows
builtin:synthetic.multiProtocol.step.availability.excludingMaintenanceWindows
multi_protocol.request.type
dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
0
: HEALTHY
, SCRIPT_FINISH
, SKIPPED
1401 - CONSTRAINT_VIOLATED
dt.synthetic.multi_protocol.request.availability
builtin:synthetic.multiProtocol.request.availability
multi_protocol.request.type
multi_protocol.request.target_address
dt.entity.host
(only for monitors with filter
defined)dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
multi_protocol.request.id
0
: HEALTHY
, SCRIPT_FINISH
, SKIPPED
1401 - CONSTRAINT_VIOLATED
dt.synthetic.multi_protocol.request.executions
builtin:synthetic.multiProtocol.request.executions
multi_protocol.request.type
multi_protocol.request.target_address
dt.entity.host
(only for monitors with filter
defined)dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
multi_protocol.request.id
multi_protocol.result.status
multi_protocol.result.status.code
dt.synthetic.multi_protocol.request.availability.excluding_maintenance_windows
builtin:synthetic.multiProtocol.request.availability.excludingMaintenanceWindows
multi_protocol.request.type
multi_protocol.request.target_address
dt.entity.host
(only for monitors with filter
defined)dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
multi_protocol.request.id
0
: HEALTHY
, SCRIPT_FINISH
, SKIPPED
1401 - CONSTRAINT_VIOLATED
dt.synthetic.multi_protocol.icmp.success_rate
builtin:synthetic.multiProtocol.icmp.successRate
multi_protocol.request.type
multi_protocol.request.target_address
dt.entity.host
(only for monitors with filter defined)dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
multi_protocol.request.id
dt.synthetic.multi_protocol.icmp.packets_sent
builtin:synthetic.multiProtocol.icmp.packetsSent
multi_protocol.request.type
multi_protocol.request.target_address
dt.entity.host
(only for monitors with filter defined)dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
multi_protocol.request.id
dt.synthetic.multi_protocol.icmp.packets_received
builtin:synthetic.multiProtocol.icmp.packetsReceived
multi_protocol.request.type
multi_protocol.request.target_address
dt.entity.host
(only for monitors with filter defined)dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
multi_protocol.request.id
dt.synthetic.multi_protocol.icmp.average_round_trip_time
builtin:synthetic.multiProtocol.icmp.averageRoundTripTime
multi_protocol.request.type
multi_protocol.request.target_address
dt.entity.host
(only for monitors with filter defined)dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
multi_protocol.request.id
dt.synthetic.multi_protocol.icmp.min_round_trip_time
builtin:synthetic.multiProtocol.icmp.minRoundTripTime
multi_protocol.request.type
multi_protocol.request.target_address
dt.entity.host
(only for monitors with filter defined)dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
multi_protocol.request.id
dt.synthetic.multi_protocol.icmp.max_round_trip_time
builtin:synthetic.multiProtocol.icmp.maxRoundTripTime
multi_protocol.request.type
multi_protocol.request.target_address
dt.entity.host
(only for monitors with filter defined)dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
multi_protocol.request.id
dt.synthetic.multi_protocol.icmp.request_execution_time
builtin:synthetic.multiProtocol.icmp.requestExecutionTime
multi_protocol.request.type
multi_protocol.request.target_address
dt.entity.host
(only for monitors with filter defined)dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
multi_protocol.request.id
multi_protocol.request.tcp_port_number
665
dt.synthetic.multi_protocol.tcp.connection_time
builtin:synthetic.multiProtocol.tcp.connectionTime
multi_protocol.request.type
multi_protocol.request.target_address
dt.entity.host
(only for monitors with filter defined)dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
multi_protocol.request.id
multi_protocol.request.tcp_port_number
multi_protocol.request.dns_record_type
A
, AAAA
, CNAME
dt.synthetic.multi_protocol.dns.resolution_time
builtin:synthetic.multiProtocol.dns.resolutionTime
multi_protocol.request.type
multi_protocol.request.target_address
dt.entity.host
(only for monitors with filter defined)dt.entity.synthetic_location
dt.entity.multiprotocol_monitor
multi_protocol.step.id
multi_protocol.request.id
0 HEALTHY
-1 UNEXPECTED_ERROR
1401 CONSTRAINT_VIOLATED
1604 VALIDATION_ERROR
12013 UNKNOWN_HOST
12033 Execution timeout
22000 TCP socket connection error
java.net.SocketException
is thrown during the connection attempt. There can be several issues that can cause this error.Latest Dynatrace
These examples use Notebooks and demonstrate how to work with the results of network availability monitors. They use result metrics as a starting point to explore possibilities of extracting and interpreting data with DQL.
The monitor MULTIPROTOCOL_MONITOR-5C2F92334DF71A90
executes ICMP requests and filters monitored hosts with "targetFilter": "hostGroup == e2e-synthetic-private-location"
(which resolves to about 26 hosts). By using the dt.synthetic.multi_protocol.request.executions
metric and splitting it by the dt.entity.host
and multi_protocol.result.status
dimensions, we can display the status of the connection to a particular monitored host entity in this host group. Some hosts do not fulfill expected success rate; instead of being HEALTHY
, their requests are marked as CONSTRAINT_VIOLATED
.
Timeseries status = avg(dt.synthetic.multi_protocol.request.executions),by:{dt.entity.host, multi_protocol.result.status},filter: dt.entity.multiprotocol_monitor == "MULTIPROTOCOL_MONITOR-5C2F92334DF71A90"
The monitor MULTIPROTOCOL_MONITOR-548C3CD54183CED9
executes ICMP requests to hosts with the explicitly defined IP addresses, 18.x.x.x
, 10.x.x.x
, and 34.x.x.x
. Each of these IP addresses maps to a distinct host. We use the sum of the dt.synthetic.multi_protocol.icmp.packets_sent
and the sum of the dt.synthetic.multi_protocol.icmp.packets_received
metrics to get insight into how many packets were sent and received. We split results by the multi_protocol.request.target_address
dimension and filter data for 18.x.x.x
and 10.x.x.x
only. For 18.x.x.x
, the same number of packets were received as were sent, but for 10.x.x.x
, all packets are lost and none were received.
timeseries {packets_sent = sum(dt.synthetic.multi_protocol.icmp.packets_sent),packets_received= sum(dt.synthetic.multi_protocol.icmp.packets_received)},by:{multi_protocol.request.target_address},filter: dt.entity.multiprotocol_monitor == "MULTIPROTOCOL_MONITOR-548C3CD54183CED9"AND (multi_protocol.request.target_address == "18.x.x.x"OR multi_protocol.request.target_address == "10.x.x.x")
The monitor MULTIPROTOCOL_MONITOR-74E68F22FF5E9227
executes TCP requests to hosts from a host group that resolves to the IP addresses 18.x.x.x
, 34.x.x.x
, and 44.x.x.x
. By using the dt.synthetic.multi_protocol.request.executions
metric and splitting it by the multi_protocol.request.target_address
, multi_protocol.request.tcp_port_number
, and multi_protocol.result.status
dimensions, we can display the status of the TCP connection for an IP-port pair. Each host has the ports 22
(SSH) and 8080
(HTTP server) open, and each connection to the hosts on these ports succeeds with the HEALTHY
status. No service uses the standard HTTP port 80
. Therefore, connections to all hosts on that port fail with the TCP socket connection error
status. Note that results of this query can be limited to just successful requests by filtering by the multi_protocol.result.status.code
dimension (code == 0
).
timeseries status = sum(dt.synthetic.multi_protocol.request.executions),by: {multi_protocol.request.target_address, multi_protocol.request.tcp_port_number, multi_protocol.result.status},filter: dt.entity.multiprotocol_monitor == "MULTIPROTOCOL_MONITOR-74E68F22FF5E9227"// and multi_protocol.result.status.code == 0
The monitor MULTIPROTOCOL_MONITOR-74E68F22FF5E9227
executes TCP requests to hosts from a host group that resolves to the IP addresses 18.x.x.x
, 34.x.x.x
, and 44.x.x.x
. In this example, instead of IP addresses, we split the results by monitored host entity IDs. We use average of the dt.synthetic.multi_protocol.tcp.connection_time
metric split by the dt.entity.host
, multi_protocol.request.target_address
, and multi_protocol.request.tcp_port_number
dimensions to check typical time taken for a successful connection to the target port for a host. Only ports 22
(SSH) and 8080
(HTTP server) are open, and these are the only ports for which dt.synthetic.multi_protocol.tcp.connection_time
is available. The hosts are effectively in different geographical locations (Ohio, Oregon, and North Virginia in the United States), a difference in connection times is expected.
timeseries duration = avg(dt.synthetic.multi_protocol.tcp.connection_time),by:{dt.entity.host, multi_protocol.request.target_address, multi_protocol.request.tcp_port_number},filter: dt.entity.multiprotocol_monitor == "MULTIPROTOCOL_MONITOR-74E68F22FF5E9227"