---
title: Synthetic Monitoring & Continuous Testing Metrics
description: These metrics are generated by Synthetic Monitoring tests.
breadcrumbs: >-
  Docs > Synthetic Testing and Monitoring > Platform > Synthetic Monitoring &
  Continuous Testing Metrics
---

# Synthetic Monitoring & Continuous Testing Metrics

## Overview{% #overview %}

The following metrics are generated by Synthetic Monitoring tests and Continuous Testing settings.

Metrics starting with:

- `synthetics.test_runs` come from all your Synthetic tests
- `datadog.estimated_usage.synthetics.*` return relevant usage data from your Synthetic tests
- `synthetics.on_demand` return relevant usage data for Continuous Testing

Metrics starting with:

- `synthetics.api.*` come from your [API tests](https://docs.datadoghq.com/synthetics/api_tests/)
  - `synthetics.http.*` come from your API [HTTP tests](https://docs.datadoghq.com/synthetics/api_tests/http_tests)
  - `synthetics.ssl.*` come from your API [SSL tests](https://docs.datadoghq.com/synthetics/api_tests/ssl_tests)
  - `synthetics.dns.*` come from your API [DNS tests](https://docs.datadoghq.com/synthetics/api_tests/dns_tests)
  - `synthetics.websocket.*` come from your API [WebSocket tests](https://docs.datadoghq.com/synthetics/api_tests/websocket_tests)
  - `synthetics.tcp.*` come from your API [TCP tests](https://docs.datadoghq.com/synthetics/api_tests/tcp_tests)
  - `synthetics.udp.*` come from your API [UDP tests](https://docs.datadoghq.com/synthetics/api_tests/udp_tests)
  - `synthetics.icmp.*` come from your API [ICMP tests](https://docs.datadoghq.com/synthetics/api_tests/icmp_tests)
- `synthetics.multi.*` come from your [multistep API tests](https://docs.datadoghq.com/synthetics/multistep/)
- `synthetics.browser.*` come from your [browser tests](https://docs.datadoghq.com/synthetics/browser_tests/)
- `synthetics.mobile.*` come from your [mobile app tests](https://docs.datadoghq.com/mobile_app_testing/)
- `synthetics.pl.*`come from your [private locations](https://docs.datadoghq.com/synthetics/private_locations/)

### General metrics{% #general-metrics %}

| **datadog.estimated\_usage.synthetics.api\_test\_runs**(count)     | Estimated usage for API tests.*Shown as run*       |
| ------------------------------------------------------------------ | -------------------------------------------------- |
| **datadog.estimated\_usage.synthetics.browser\_test\_runs**(count) | Estimated usage for browser tests.*Shown as run*   |
| **datadog.estimated\_usage.synthetics.mobile\_test\_runs**(count)  | Estimated usage for mobile tests.*Shown as run*    |
| **synthetics.test\_runs**(count)                                   | The number of Synthetic test runs.*Shown as run*   |
| **synthetics.test\_run\_steps**(count)                             | The number of Synthetic test steps.*Shown as step* |

### API tests{% #api-tests %}

| **synthetics.api.response**(count) | The count of API responses we receive.*Shown as request* |
| ---------------------------------- | -------------------------------------------------------- |

#### HTTP tests{% #http-tests %}

| **synthetics.http.response.time**(gauge)          | The overall time the request took to be processed.*Shown as millisecond*                                                    |
| ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| **synthetics.http.response.size**(gauge)          | The size of the response in bytes.*Shown as byte*                                                                           |
| **synthetics.http.redirect.time**(gauge)          | The time spent during redirections.*Shown as millisecond*                                                                   |
| **synthetics.http.dns.time**(gauge)               | The time spent resolving the DNS name of the last request.*Shown as millisecond*                                            |
| **synthetics.http.connect.time**(gauge)           | The time to establish the TCP connection to the server.*Shown as millisecond*                                               |
| **synthetics.http.ssl.time**(gauge)               | The duration of the TLS handshake. This metric does not appear if the last request is not over HTTPS.*Shown as millisecond* |
| **synthetics.http.send.time**(gauge)              | The time to send the request.*Shown as millisecond*                                                                         |
| **synthetics.http.firstbyte.time**(gauge)         | The time spent waiting for the first byte of response to be received.*Shown as millisecond*                                 |
| **synthetics.http.download.time**(gauge)          | The time spent downloading the response.*Shown as millisecond*                                                              |
| **synthetics.http.response**(count)               | The count of HTTP responses we receive.*Shown as request*                                                                   |
| **synthetics.http.response.time.distrib**(gauge)  | The overall time the request took to be processed.*Shown as millisecond*                                                    |
| **synthetics.http.firstbyte.time.distrib**(gauge) | The time spent waiting for the first byte of response to be received.*Shown as millisecond*                                 |
| **synthetics.http.redirect.time.distrib**(gauge)  | The time spent during redirections.*Shown as millisecond*                                                                   |
| **synthetics.http.dns.time.distrib**(gauge)       | The time spent resolving the DNS name of the last request.*Shown as millisecond*                                            |
| **synthetics.http.connect.time.distrib**(gauge)   | The time to establish the TCP connection to the server.*Shown as millisecond*                                               |
| **synthetics.http.ssl.time.distrib**(gauge)       | The duration of the TLS handshake. This metric does not appear if the last request is not over HTTPS.*Shown as millisecond* |
| **synthetics.http.download.time.distrib**(gauge)  | The time spent downloading the response.*Shown as millisecond*                                                              |

#### SSL tests{% #ssl-tests %}

| **synthetics.ssl.dns.time**(gauge)              | The duration of the DNS lookup.*Shown as millisecond*                    |
| ----------------------------------------------- | ------------------------------------------------------------------------ |
| **synthetics.ssl.handshake.time**(gauge)        | The duration of the TLS handshake.*Shown as millisecond*                 |
| **synthetics.ssl.response.time**(gauge)         | The overall time the request took to be processed.*Shown as millisecond* |
| **synthetics.ssl.time\_to\_expiry**(gauge)      | The remaining time before the SSL certificate expires.*Shown as minute*  |
| **synthetics.ssl.response**(count)              | The count of SSL responses we receive.*Shown as request*                 |
| **synthetics.ssl.response.time.distrib**(gauge) | The overall time the request took to be processed.*Shown as millisecond* |

#### DNS tests{% #dns-tests %}

| **synthetics.dns.response.time**(gauge)         | The overall time the request took to be processed.*Shown as millisecond* |
| ----------------------------------------------- | ------------------------------------------------------------------------ |
| **synthetics.dns.response.time.distrib**(gauge) | The overall time the request took to be processed.*Shown as millisecond* |

#### WebSocket tests{% #websocket-tests %}

| **synthetics.websocket.response.time**(gauge)          | The overall time the websocket request took to be processed.*Shown as millisecond*          |
| ------------------------------------------------------ | ------------------------------------------------------------------------------------------- |
| **synthetics.websocket.redirect.time**(gauge)          | The time spent during redirections.*Shown as millisecond*                                   |
| **synthetics.websocket.dns.time**(gauge)               | The duration of the DNS lookup.*Shown as millisecond*                                       |
| **synthetics.websocket.connect.time**(gauge)           | The overall connection time for the websocket request.*Shown as millisecond*                |
| **synthetics.websocket.ssl.time**(gauge)               | The duration of the TLS handshake.*Shown as millisecond*                                    |
| **synthetics.websocket.firstbyte.time**(gauge)         | The time spent waiting for the first byte of response to be received.*Shown as millisecond* |
| **synthetics.websocket.download.time**(gauge)          | The time spent downloading the response.*Shown as millisecond*                              |
| **synthetics.websocket.open.time**(gauge)              | The overall time the websocket remained open.*Shown as millisecond*                         |
| **synthetics.websocket.receive.time**(gauge)           | The overall time the websocket connection spent receiving data.*Shown as millisecond*       |
| **synthetics.websocket.response.time.distrib**(gauge)  | The overall time the websocket request took to be processed.*Shown as millisecond*          |
| **synthetics.websocket.firstbyte.time.distrib**(gauge) | The time spent waiting for the first byte of response to be received.*Shown as millisecond* |

#### TCP tests{% #tcp-tests %}

| **synthetics.tcp.response.time**(gauge)         | The overall time the request took to be processed.*Shown as millisecond* |
| ----------------------------------------------- | ------------------------------------------------------------------------ |
| **synthetics.tcp.dns.time**(gauge)              | The duration of the DNS lookup.*Shown as millisecond*                    |
| **synthetics.tcp.connect.time**(gauge)          | The time to establish the TCP connection.*Shown as millisecond*          |
| **synthetics.tcp.response.time.distrib**(gauge) | The overall time the request took to be processed.*Shown as millisecond* |

#### UDP tests{% #udp-tests %}

| **synthetics.udp.response.time**(gauge)         | The overall time the UDP request took to be processed.*Shown as millisecond*                         |
| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| **synthetics.udp.dns.time**(gauge)              | The duration of the DNS lookup.*Shown as millisecond*                                                |
| **synthetics.udp.message.time**(gauge)          | The overall time for a message to be received. This does not include DNS time.*Shown as millisecond* |
| **synthetics.udp.response.time.distrib**(gauge) | The overall time the UDP request took to be processed.*Shown as millisecond*                         |

#### ICMP tests{% #icmp-tests %}

| **synthetics.icmp.hops**(gauge)                     | The number of hops associated with the traceroute execution.*Shown as hop*     |
| --------------------------------------------------- | ------------------------------------------------------------------------------ |
| **synthetics.icmp.packet\_loss\_percentage**(gauge) | The percentage of packet loss associated with the last ping.*Shown as percent* |
| **synthetics.icmp.latency\_avg**(gauge)             | The average latency across all pings.*Shown as millisecond*                    |
| **synthetics.icmp.latency\_max**(gauge)             | The maximum latency across all pings.*Shown as millisecond*                    |
| **synthetics.icmp.latency\_min**(gauge)             | The minimum latency across all pings.*Shown as millisecond*                    |
| **synthetics.icmp.latency\_stddev**(gauge)          | The standard deviation latency across all pings.*Shown as millisecond*         |
| **synthetics.icmp.packets\_received**(gauge)        | The number of packets successfully received.*Shown as packet*                  |
| **synthetics.icmp.packets\_sent**(gauge)            | The number of packets sent.*Shown as packet*                                   |

For more information on API test timings, read the guide on [API Test Timings and Variations](https://docs.datadoghq.com/synthetics/guide/api_test_timing_variations/).

### Multistep API tests{% #multistep-api-tests %}

| **synthetics.multi.response.time**(gauge)         | The overall time the multistep request took to be processed.*Shown as millisecond* |
| ------------------------------------------------- | ---------------------------------------------------------------------------------- |
| **synthetics.multi.response.time.distrib**(gauge) | The overall time the multistep request took to be processed.*Shown as millisecond* |

### Browser tests{% #browser-tests %}

| **synthetics.browser.test\_duration**(gauge)                          | The total time it took to execute the browser test.*Shown as millisecond*                                             |
| --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| **synthetics.browser.time\_to\_interactive**(gauge)                   | The time until a page can be interacted with. Calculated from the first page in a browser test.*Shown as millisecond* |
| **synthetics.browser.number\_of\_buckets**(count)                     | The number of buckets in a browser test. Every 25 steps in a browser test is a single bucket.                         |
| **synthetics.browser.step.largest\_contentful\_paint**(gauge)         | The Largest Contentful Paint (core web vital) in a browser test step.*Shown as millisecond*                           |
| **synthetics.browser.step.cumulative\_layout\_shift**(gauge)          | The Cumulative Layout Shift (core web vital) in a browser test step.                                                  |
| **synthetics.browser.step.duration**(gauge)                           | The total time it took to execute a browser test step.*Shown as millisecond*                                          |
| **synthetics.browser.time\_to\_interactive.distrib**(gauge)           | The time until a page can be interacted with. Calculated from the first page in a browser test.*Shown as millisecond* |
| **synthetics.browser.step.largest\_contentful\_paint.distrib**(gauge) | The Largest Contentful Paint (core web vital) in a browser test step.*Shown as millisecond*                           |
| **synthetics.browser.step.cumulative\_layout\_shift.distrib**(gauge)  | The Cumulative Layout Shift (core web vital) in a browser test step.                                                  |
| **synthetics.browser.test\_duration.distrib**(gauge)                  | The total time it took to execute the browser test.*Shown as millisecond*                                             |
| **synthetics.browser.step.duration.distrib**(gauge)                   | The total time it took to execute a browser test step.*Shown as millisecond*                                          |

### Mobile app tests{% #mobile-app-tests %}

| **synthetics.mobile.test\_duration.distrib**(gauge) | The total time it took to execute the mobile test.*Shown as millisecond*                    |
| --------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| **synthetics.mobile.step.duration.distrib**(gauge)  | The total time it took to execute a mobile test step.*Shown as millisecond*                 |
| **synthetics.mobile.number\_of\_buckets**(count)    | The number of buckets in a mobile test. Every 25 steps in a mobile test is a single bucket. |

### Private locations{% #private-locations %}

| **synthetics.pl.awaiting\_tests**(gauge)         | The number of tests awaiting to be polled on the private location to be executed. This value depends on the maxNumberMessagesToFetch parameter of a private location. |
| ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **synthetics.pl.worker.running**(gauge)          | The number of worker containers available for a private location to run tests.*Shown as worker*                                                                       |
| **synthetics.pl.worker.outdated**(gauge)         | The number of worker containers running an old image version that can now be upgraded.*Shown as worker*                                                               |
| **synthetics.pl.worker.pulled\_tests**(gauge)    | The number of tests pulled by a worker container for a private location.                                                                                              |
| **synthetics.pl.worker.remaining\_slots**(gauge) | The available worker slots to run Synthetic tests. This value depends on the concurrency parameter of a private location.                                             |
| **synthetics.pl.worker.concurrency**(count)      | The average worker concurrency value.                                                                                                                                 |
| **synthetics.pl.time\_to\_poll**(gauge)          | The time difference between when a test was scheduled to run and when it was polled by a worker.*Shown as second*                                                     |

### Continuous Testing{% #continuous-testing %}

| **synthetics.on\_demand.concurrency**(count) | The average parallelization for Continuous Testing. |
| -------------------------------------------- | --------------------------------------------------- |

For more information about parallelization, see [Continuous Testing Settings](https://docs.datadoghq.com/continuous_testing/settings/#parallelization).

## Further Reading{% #further-reading %}

- [Learn about API Test Timings and Variations](https://docs.datadoghq.com/synthetics/guide/api_test_timing_variations/)
- [Learn about using Synthetic metrics in monitors](https://docs.datadoghq.com/synthetics/guide/using-synthetic-metrics/)
- [Learn about parallelization for Continuous Testing](https://docs.datadoghq.com/continuous_testing/settings)
