.extractedValue.value
+ description: Variable value (if step was successful)
+
+# =============================================================================
+# VARIABLES EXTRACTED BY STEPS
+# =============================================================================
+step_extracted_variables:
+ description: For multistep API, browser, and mobile tests, extracted variables are available at the step level within the `synthetics.attributes.variables.extracted` property. These values are only available when the step completes successfully.
+ categories:
+ - name: General steps
+ note: For multistep/browser/mobile tests
+ groups:
+ - name: Step properties
+ variables:
+ - path: synthetics.attributes.variables.extracted.steps.allowFailure
+ description: Whether the step is allowed to fail without failing the entire test
+ - path: synthetics.attributes.variables.extracted.steps.duration
+ description: Step execution duration in milliseconds
+ - path: synthetics.attributes.variables.extracted.steps.failure
+ description: Failure information object containing `.code` and `.message`
+ - path: synthetics.attributes.variables.extracted.steps.id
+ description: Unique step identifier
+ - path: synthetics.attributes.variables.extracted.steps.isCritical
+ description: Whether the step is critical to the test
+ - path: synthetics.attributes.variables.extracted.steps.status
+ description: Step execution status
+ - path: synthetics.attributes.variables.extracted.steps.type
+ description: Type of step being executed
+ - name: Subtest information
+ variables:
+ - path: synthetics.attributes.variables.extracted.steps.subTest.id
+ description: Subtest identifier
+ - path: synthetics.attributes.variables.extracted.steps.subStep.parentStep.id
+ description: Parent step identifier
+ - path: synthetics.attributes.variables.extracted.steps.subStep.parentTest.id
+ description: Parent test identifier
+ - path: synthetics.attributes.variables.extracted.steps.subStep.level
+ description: "Nesting level (1 for subtests, 2 for subtests of subtests)"
+
+ - name: Browser Tests
+ groups:
+ - name: General
+ variables:
+ - path: synthetics.attributes.result.startUrl
+ description: URL from test configuration
+ - name: Steps
+ variables:
+ - path: synthetics.attributes.variables.extracted.apiTest.request
+ description: "API test request configuration (only for \"Run API Test\" steps where `type` is `runApiTest`)"
+ - path: synthetics.attributes.variables.extracted.apiTest.result
+ description: API test result data (similar to `attributes.result` for API tests)
+ - path: synthetics.attributes.variables.extracted.assertionResult.expected
+ description: Expected value for assertions
+ - path: synthetics.attributes.variables.extracted.assertionResults.checkType
+ description: Type of assertion check
+ - path: synthetics.attributes.variables.extracted.assertionResults.actual
+ description: Actual value found during assertion
+ - path: synthetics.attributes.variables.extracted.browserErrors
+ description: List of browser errors encountered
+ - path: synthetics.attributes.variables.extracted.timings.firstByte
+ description: Time to first byte
+ - path: synthetics.attributes.variables.extracted.timings.tcp
+ description: TCP connection timing
+ - path: synthetics.attributes.variables.extracted.description
+ description: Step description
+
+ - name: Mobile Tests
+ variables:
+ - path: synthetics.attributes.variables.extracted.application.versionId
+ description: Mobile application version identifier
+ - path: synthetics.attributes.variables.extracted.apiTest
+ description: API test data (for API test steps within mobile tests)
+ - path: synthetics.attributes.variables.extracted.description
+ description: Step description
+
+ - name: API Tests
+ groups:
+ - name: Multistep
+ note: "Follow regular API fields per subType"
+ variables:
+ - path: synthetics.attributes.variables.extracted.name
+ description: Step name
+ - path: synthetics.attributes.variables.extracted.type
+ description: Step type
+ - name: Non-Multistep
+ variables:
+ - path: synthetics.attributes.variables.extracted.assertions.actual
+ description: Actual value from assertion
+ - path: synthetics.attributes.variables.extracted.assertions.expected
+ description: Expected value for assertion
+ - path: synthetics.attributes.variables.extracted.assertions.operator
+ description: Assertion operator
+ - path: synthetics.attributes.variables.extracted.assertions.type
+ description: Assertion type
+ - path: synthetics.attributes.variables.extracted.dnsResolution.resolvedIp
+ description: Resolved IP address
+ - path: synthetics.attributes.variables.extracted.dnsResolution.server
+ description: DNS server used
+ - path: synthetics.attributes.variables.extracted.timings.dns
+ description: DNS resolution time
+ - path: synthetics.attributes.variables.extracted.timings.tcp
+ description: TCP connection time
+ - path: synthetics.attributes.variables.extracted.request.url
+ description: Request URL
+ - path: synthetics.attributes.variables.extracted.request.host
+ description: Request host
+ - path: synthetics.attributes.variables.extracted.response.body
+ description: Response body content
+ - path: synthetics.attributes.variables.extracted.response.statusCode
+ description: HTTP status code
+ - path: synthetics.attributes.variables.extracted.response.headers
+ description: Response headers
+ - path: synthetics.attributes.variables.extracted.response.httpVersion
+ description: HTTP version
+ - path: synthetics.attributes.variables.extracted.response.redirects
+ description: Redirect information
+
+ - name: Network tests
+ subtypes:
+ - name: WebSocket
+ variables:
+ - path: synthetics.attributes.variables.extracted.timings.open
+ description: Time to open connection (in milliseconds)
+ - path: synthetics.attributes.variables.extracted.timings.receive
+ description: Time to receive response
+ - path: synthetics.attributes.variables.extracted.handshake.request
+ description: Handshake request data
+ - path: synthetics.attributes.variables.extracted.handshake.response
+ description: Handshake response data
+ - path: synthetics.attributes.variables.extracted.request.message
+ description: WebSocket request message
+ - path: synthetics.attributes.variables.extracted.response.message
+ description: WebSocket response message
+ - path: synthetics.attributes.variables.extracted.close.reason
+ description: Connection close reason
+ - path: synthetics.attributes.variables.extracted.close.statusCode
+ description: Connection close status code
+ - name: gRPC
+ variables:
+ - path: synthetics.attributes.variables.extracted.callType
+ description: "Call type (`unary` or `healthcheck`)"
+ - path: synthetics.attributes.variables.extracted.timings.rpc
+ description: RPC call timing
+ - path: synthetics.attributes.variables.extracted.response.healthcheck.status
+ description: Health check status
+ - path: synthetics.attributes.variables.extracted.request.message
+ description: gRPC request message
+ - path: synthetics.attributes.variables.extracted.response.message
+ description: gRPC response message
+ - name: UDP
+ variables:
+ - path: synthetics.attributes.variables.extracted.request.message
+ description: UDP request message
+ - path: synthetics.attributes.variables.extracted.response.message
+ description: UDP response message
+ - path: synthetics.attributes.variables.extracted.timings.message
+ description: Message timing
+ - name: TCP
+ variables:
+ - path: synthetics.attributes.variables.extracted.connectionOutcome
+ description: Connection result
+ - path: synthetics.attributes.variables.extracted.netpath.routers.ip
+ description: Router IP addresses
+ - path: synthetics.attributes.variables.extracted.traceroute.latency.min
+ description: Minimum latency
+ - path: synthetics.attributes.variables.extracted.traceroute.latency.max
+ description: Maximum latency
+ - path: synthetics.attributes.variables.extracted.traceroute.latency.avg
+ description: Average latency
+ - path: synthetics.attributes.variables.extracted.traceroute.latency.stddev
+ description: Standard deviation
+ - path: synthetics.attributes.variables.extracted.traceroute.latency.values
+ description: Latency values array
+ - name: ICMP
+ variables:
+ - path: synthetics.attributes.variables.extracted.traceroute
+ description: Same structure as TCP traceroute
+ - path: synthetics.attributes.variables.extracted.request.host
+ description: Target host
+ - path: synthetics.attributes.variables.extracted.ping
+ description: Ping results
+ - path: synthetics.attributes.variables.extracted.latency.min
+ description: Minimum latency
+ - path: synthetics.attributes.variables.extracted.latency.max
+ description: Maximum latency
+ - path: synthetics.attributes.variables.extracted.latency.avg
+ description: Average latency
+ - path: synthetics.attributes.variables.extracted.latency.stddev
+ description: Latency standard deviation
+ - path: synthetics.attributes.variables.extracted.latency.values
+ description: Latency values array
+
+ - name: Protocol tests
+ subtypes:
+ - name: SSL
+ variables:
+ - path: synthetics.attributes.variables.extracted.cert
+ description: SSL certificate information
+ - path: synthetics.attributes.variables.extracted.cipher
+ description: Cipher suite used
+ - path: synthetics.attributes.variables.extracted.issuer
+ description: Certificate issuer
+ - path: synthetics.attributes.variables.extracted.subject
+ description: Certificate subject
+ - path: synthetics.attributes.variables.extracted.valid.from
+ description: Certificate valid from date
+ - path: synthetics.attributes.variables.extracted.valid.to
+ description: Certificate valid to date
+ - path: synthetics.attributes.variables.extracted.ocsp
+ description: OCSP (Online Certificate Status Protocol) information
+ - path: synthetics.attributes.variables.extracted.timings.handshake
+ description: SSL handshake timing
+ - name: DNS
+ variables:
+ - path: synthetics.attributes.variables.extracted.response.records.type
+ description: DNS record type
+ - path: synthetics.attributes.variables.extracted.response.records.values
+ description: DNS record values
+ - name: HTTP
+ variables:
+ # Request
+ - path: synthetics.attributes.variables.extracted.request
+ description: Information about the request
+ - path: synthetics.attributes.variables.extracted.request.method
+ description: The HTTP method
+ - path: synthetics.attributes.variables.extracted.request.body
+ description: The request body if set
+ - path: synthetics.attributes.variables.extracted.request.headers
+ description: The request headers
+ # Response
+ - path: synthetics.attributes.variables.extracted.response
+ description: Information about the response
+ - path: synthetics.attributes.variables.extracted.response.body
+ description: The response body as string (truncated if too big)
+ - path: synthetics.attributes.variables.extracted.response.bodySize
+ description: The size of the full response body
+ - path: synthetics.attributes.variables.extracted.response.cacheHeaders
+ description: A dictionary of caching-related headers
+ - path: synthetics.attributes.variables.extracted.response.cdn
+ description: The response CDN info if any
+ - path: synthetics.attributes.variables.extracted.response.cdn.provider
+ description: "The CDN provider name (for example, `akamai`, `cloudflare`)"
+ - path: synthetics.attributes.variables.extracted.response.cdn.cache
+ description: The cache info
+ - path: synthetics.attributes.variables.extracted.response.cdn.cache.cached
+ description: If the data was cached
+ - path: synthetics.attributes.variables.extracted.response.cdn.cache.status
+ description: The cache status as provided in associated cache header
+ - path: synthetics.attributes.variables.extracted.response.headers
+ description: The response headers
+ - path: synthetics.attributes.variables.extracted.response.httpVersion
+ description: The HTTP version
+ - path: synthetics.attributes.variables.extracted.response.redirects
+ description: A list of redirections if any
+ - path: synthetics.attributes.variables.extracted.response.redirects.statusCode
+ description: The HTTP status code for the redirect
+ - path: synthetics.attributes.variables.extracted.response.redirects.location
+ description: The returned location to redirect to
+ - path: synthetics.attributes.variables.extracted.response.statusCode
+ description: The response HTTP status code
+ # Timings
+ - path: synthetics.attributes.variables.extracted.timings.authentication
+ description: "The time spent for the authentication challenge (for example, NTLM)"
+ - path: synthetics.attributes.variables.extracted.timings.download
+ description: The time spent downloading the response
+ - path: synthetics.attributes.variables.extracted.timings.firstByte
+ description: The time spent waiting for the first byte of response to be received
+ - path: synthetics.attributes.variables.extracted.timings.redirect
+ description: The time spent in HTTP redirections
+ - path: synthetics.attributes.variables.extracted.timings.ssl
+ description: The duration of the TLS handshake (only when testing an HTTPS endpoint)
+
+# =============================================================================
+# STEP SUMMARY
+# =============================================================================
+step_summary:
+ description: Access step data by index, name, or ID to reference specific steps in your notification messages. This section also includes summary counts for total steps, completed steps, and errors.
+ step_properties:
+ - ".id"
+ - ".status"
+ - ".type"
+ - ".duration"
+ - ".description"
+ - ".failure.message"
+ - ".code"
+ - ".url"
+ reference_methods:
+ - name: By index (0-based)
+ description: Use positive numbers to count from the beginning, or negative numbers to count from the end
+ examples:
+ - syntax: synthetics.attributes.result.steps.0
+ description: First step
+ - syntax: synthetics.attributes.result.steps.1
+ description: Second step
+ - syntax: synthetics.attributes.result.steps.-1
+ description: Last step
+ - syntax: synthetics.attributes.result.steps.-2
+ description: Second to last step
+ - name: By step name
+ description: Use the step name in brackets
+ example: ".steps[Click button]"
+ - name: By step ID
+ description: Use the step's unique identifier
+ example: ".steps.abc-def-ghi"
+ usage_examples:
+ - path: synthetics.attributes.result.steps.-1.status
+ description: Status of the last step
+ - path: synthetics.attributes.result.steps[Click button].status
+ description: Status of the step named "Click button"
+ - path: synthetics.attributes.result.steps.abc-def-ghi.status
+ description: Status of the step with step ID "abc-def-ghi"
+
diff --git a/layouts/partials/synthetics/template-variables-execution.html b/layouts/partials/synthetics/template-variables-execution.html
new file mode 100644
index 00000000000..f5b633770d4
--- /dev/null
+++ b/layouts/partials/synthetics/template-variables-execution.html
@@ -0,0 +1,28 @@
+{{/*
+ Renders Test Execution Variables from data/synthetics/template_variables.yaml
+ Usage: {{ partial "synthetics/template-variables-execution.html" . }}
+*/}}
+
+{{ $data := .Site.Data.synthetics.template_variables }}
+
+{{ with $data.test_execution }}
+{{ .description | markdownify }}
+
+
+
+
+ {{ range $idx, $cat := .categories }}
+
+ {{ with $cat.note }}
{{ . | markdownify }}
{{ end }}
+
+ {{ range $cat.variables }}
+ {{ printf "{{%s}}" .path }}
+ - {{ .description | markdownify }}
+ {{ end }}
+
+
+ {{ end }}
+
+
+{{ end }}
+
diff --git a/layouts/partials/synthetics/template-variables-result.html b/layouts/partials/synthetics/template-variables-result.html
new file mode 100644
index 00000000000..20480531c02
--- /dev/null
+++ b/layouts/partials/synthetics/template-variables-result.html
@@ -0,0 +1,29 @@
+{{/*
+ Renders Result Variables from data/synthetics/template_variables.yaml
+ Usage: {{ partial "synthetics/template-variables-result.html" . }}
+*/}}
+
+{{ $data := .Site.Data.synthetics.template_variables }}
+
+{{ with $data.result_variables }}
+{{ .description | markdownify }}
+
+
+
+
+ {{ range $idx, $cat := .categories }}
+
+ {{ with $cat.note }}
{{ . | markdownify }}
{{ end }}
+ {{ with $cat.location }}
Located at {{ printf "{{%s}}" . }}:
{{ end }}
+
+ {{ range $cat.variables }}
+ {{ .path }}
+ - {{ .description | markdownify }}
+ {{ end }}
+
+
+ {{ end }}
+
+
+{{ end }}
+
diff --git a/layouts/partials/synthetics/template-variables-steps.html b/layouts/partials/synthetics/template-variables-steps.html
new file mode 100644
index 00000000000..853353128aa
--- /dev/null
+++ b/layouts/partials/synthetics/template-variables-steps.html
@@ -0,0 +1,63 @@
+{{/*
+ Renders Step Extracted Variables from data/synthetics/template_variables.yaml
+ Usage: {{ partial "synthetics/template-variables-steps.html" . }}
+*/}}
+
+{{ $data := .Site.Data.synthetics.template_variables }}
+
+{{ with $data.step_extracted_variables }}
+{{ .description | markdownify }}
+
+
+
+
+ {{ range $idx, $cat := .categories }}
+
+
+ {{ with $cat.note }}
{{ . | markdownify }}
{{ end }}
+
+ {{/* Handle categories with groups */}}
+ {{ with $cat.groups }}
+ {{ range . }}
+
{{ .name }}
+ {{ with .note }}
{{ . | markdownify }}
{{ end }}
+
+ {{ range .variables }}
+ {{ .path }}
+ - {{ .description | markdownify }}
+ {{ end }}
+
+ {{ end }}
+ {{ end }}
+
+ {{/* Handle categories with direct variables (no groups) */}}
+ {{ with $cat.variables }}
+
+ {{ range . }}
+ {{ .path }}
+ - {{ .description | markdownify }}
+ {{ end }}
+
+ {{ end }}
+
+ {{/* Handle categories with subtypes (Network tests, Protocol tests) */}}
+ {{ with $cat.subtypes }}
+ {{ range . }}
+
+ {{ .name }}
+
+ {{ range .variables }}
+ {{ .path }}
+ - {{ .description | markdownify }}
+ {{ end }}
+
+
+ {{ end }}
+ {{ end }}
+
+
+ {{ end }}
+
+
+{{ end }}
+
diff --git a/layouts/partials/synthetics/template-variables-summary.html b/layouts/partials/synthetics/template-variables-summary.html
new file mode 100644
index 00000000000..23d99da3bf8
--- /dev/null
+++ b/layouts/partials/synthetics/template-variables-summary.html
@@ -0,0 +1,49 @@
+{{/*
+ Renders Step Summary from data/synthetics/template_variables.yaml
+ Usage: {{ partial "synthetics/template-variables-summary.html" . }}
+*/}}
+
+{{ $data := .Site.Data.synthetics.template_variables }}
+
+{{ with $data.step_summary }}
+{{ .description | markdownify }}
+
+Each step exposes the following properties:
+{{ range $idx, $prop := .step_properties }}{{ if $idx }}, {{ end }}{{ $prop }}{{ end }}.
+
+
+You can reference steps in three ways:
+
+{{ range .reference_methods }}
+{{ .name }}
+{{ .description | markdownify }}{{ if .example }}: {{ .example }}{{ end }}
+
+{{ with .examples }}
+
+
+
+ | Syntax |
+ Description |
+
+
+
+ {{ range . }}
+
+ {{ .syntax }} |
+ {{ .description | markdownify }} |
+
+ {{ end }}
+
+
+{{ end }}
+{{ end }}
+
+Accessing step properties
+Combine any reference method with a property:
+
+{{ range .usage_examples }}
+ {{ printf "{{%s}}" .path }} - {{ .description | markdownify }}
+{{ end }}
+
+{{ end }}
+
diff --git a/layouts/partials/synthetics/template-variables.html b/layouts/partials/synthetics/template-variables.html
new file mode 100644
index 00000000000..eb7f5d77e5c
--- /dev/null
+++ b/layouts/partials/synthetics/template-variables.html
@@ -0,0 +1,155 @@
+{{/*
+ Renders Synthetics template variables from data/synthetics/template_variables.yaml
+ Usage: {{ partial "synthetics/template-variables.html" . }}
+*/}}
+
+{{ $data := .Site.Data.synthetics.template_variables }}
+
+{{/* Test Execution Variables */}}
+{{ with $data.test_execution }}
+Test execution variables
+{{ .description | markdownify }}
+
+
+
+
+ {{ range $idx, $cat := .categories }}
+
+ {{ with $cat.note }}
{{ . | markdownify }}
{{ end }}
+
+ {{ range $cat.variables }}
+ {{ printf "{{%s}}" .path }}
+ - {{ .description | markdownify }}
+ {{ end }}
+
+
+ {{ end }}
+
+
+{{ end }}
+
+{{/* Result Variables */}}
+{{ with $data.result_variables }}
+Result variables
+{{ .description | markdownify }}
+
+
+
+
+ {{ range $idx, $cat := .categories }}
+
+ {{ with $cat.note }}
{{ . | markdownify }}
{{ end }}
+ {{ with $cat.location }}
Located at {{ printf "{{%s}}" . }}:
{{ end }}
+
+ {{ range $cat.variables }}
+ {{ .path }}
+ - {{ .description | markdownify }}
+ {{ end }}
+
+
+ {{ end }}
+
+
+{{ end }}
+
+{{/* Step Extracted Variables */}}
+{{ with $data.step_extracted_variables }}
+
+{{ .description | markdownify }}
+
+
+
+
+ {{ range $idx, $cat := .categories }}
+
+
+ {{ with $cat.note }}
{{ . | markdownify }}
{{ end }}
+
+ {{/* Handle categories with groups */}}
+ {{ with $cat.groups }}
+ {{ range . }}
+
{{ .name }}
+ {{ with .note }}
{{ . | markdownify }}
{{ end }}
+
+ {{ range .variables }}
+ {{ .path }}
+ - {{ .description | markdownify }}
+ {{ end }}
+
+ {{ end }}
+ {{ end }}
+
+ {{/* Handle categories with direct variables (no groups) */}}
+ {{ with $cat.variables }}
+
+ {{ range . }}
+ {{ .path }}
+ - {{ .description | markdownify }}
+ {{ end }}
+
+ {{ end }}
+
+ {{/* Handle categories with subtypes (Network tests, Protocol tests) */}}
+ {{ with $cat.subtypes }}
+ {{ range . }}
+
+ {{ .name }}
+
+ {{ range .variables }}
+ {{ .path }}
+ - {{ .description | markdownify }}
+ {{ end }}
+
+
+ {{ end }}
+ {{ end }}
+
+
+ {{ end }}
+
+
+{{ end }}
+
+{{/* Step Summary */}}
+{{ with $data.step_summary }}
+Step summary
+{{ .description | markdownify }}
+
+Each step exposes the following properties:
+{{ range $idx, $prop := .step_properties }}{{ if $idx }}, {{ end }}{{ $prop }}{{ end }}.
+
+
+You can reference steps in three ways:
+
+{{ range .reference_methods }}
+{{ .name }}
+{{ .description | markdownify }}{{ if .example }}: {{ .example }}{{ end }}
+
+{{ with .examples }}
+
+
+
+ | Syntax |
+ Description |
+
+
+
+ {{ range . }}
+
+ {{ .syntax }} |
+ {{ .description | markdownify }} |
+
+ {{ end }}
+
+
+{{ end }}
+{{ end }}
+
+Accessing step properties
+Combine any reference method with a property:
+
+{{ range .usage_examples }}
+ {{ printf "{{%s}}" .path }} - {{ .description | markdownify }}
+{{ end }}
+
+{{ end }}
diff --git a/static/images/synthetics/notifications/action_tab.png b/static/images/synthetics/notifications/action_tab.png
new file mode 100644
index 00000000000..17d48e9f733
Binary files /dev/null and b/static/images/synthetics/notifications/action_tab.png differ