- 필수 기능
- 시작하기
- Glossary
- 표준 속성
- Guides
- Agent
- 통합
- 개방형텔레메트리
- 개발자
- Administrator's Guide
- API
- Datadog Mobile App
- CoScreen
- Cloudcraft
- 앱 내
- 서비스 관리
- 인프라스트럭처
- 애플리케이션 성능
- APM
- Continuous Profiler
- 스팬 시각화
- 데이터 스트림 모니터링
- 데이터 작업 모니터링
- 디지털 경험
- 소프트웨어 제공
- 보안
- AI Observability
- 로그 관리
- 관리
",t};e.buildCustomizationMenuUi=t;function n(e){let t='
",t}function s(e){let n=e.filter.currentValue||e.filter.defaultValue,t='${e.filter.label}
`,e.filter.options.forEach(s=>{let o=s.id===n;t+=``}),t+="${e.filter.label}
`,t+=`Template variables allow you to insert dynamic values from your test results and configuration into Synthetic Monitoring notification messages. Access these variables using the synthetics.attributes
prefix. For example:
Test failed at step {{synthetics.failed_step.name}} with error: {{synthetics.failed_step.failure.message}}.
{{synthetics.failed_step.name}}
Test div #title content
).{{synthetics.failed_step.failure.message}}
Element's content should match the given regex
).{{synthetics.failed_step.url}}
https://www.datadoghq.com/blog/
).{{synthetics.attributes.result.response.statusCode}}
403
).{{synthetics.result.step_count}}
4
).{{synthetics.result.duration}}
9096
).{{tags.env}}
prod
).Note: Not all variables are available for every test type. You may need to test different outputs to verify the data returned.
.test
.test.id
abc-def-ghi
).test.type
api
).test.subType
http
).location.id
aws:eu-central-1
).location.privateLocation
true
for Private LocationsApplies to browser and mobile tests.
.device.id
.device.name
.device.type
.device.resolution.width
, .device.resolution.height
.device.browser.type
.device.platform.name
, .device.platform.version
Example values:
{
"device": {
"id": "chrome.laptop_large",
"name": "Laptop Large",
"type": "laptop",
"resolution": {"width": 1440, "height": 1100},
"browser": {"type": "Chrome"},
"platform": {"name": "Android", "version": "14"}
}
}
.result.id
.result.status
.result.duration
.result.testStartedAt
, .result.testFinishedAt
, .result.testTriggeredAt
.result.failure.message
.result.failure.code
Example values:
{
"result": {
"id": "3015485096247415772",
"status": "failed",
"duration": 9096,
"testStartedAt": 1743760758904,
"testFinishedAt": 1743760772025,
"testTriggeredAt": 1743760758593,
"failure": {
"message": "Error: Element's content should match the given regex",
"code": "ASSERTION_FAILURE"
}
}
}
These are local variables configured for API tests or defined outside individual steps in step-based tests. This also includes variables created by JavaScript code execution.
Located at {{synthetics.attributes.result.variables.config}}
:
.name
.type
.secure
.value
Examples:
{
"name": "RANDOM_NUMBER",
"type": "text",
"secure": false,
"value": "133245995"
}
These are extracted variables whose value updates a global variable value.
Available only for successful test results and recovery notifications.
Located at result.variables.extracted
:
.id
.name
.secure
.val
.val
, not .value
)Examples:
{
"id": "ec734823-536e-4aba-8b5f-55733189d936",
"name": "EXTRACTED_NUMBER",
"secure": false,
"val": "250661"
}
For tests with steps, step data is contained in .steps
.
.extractedValue.name
.extractedValue.secure
.extractedValue.value
Examples:
{
"extractedValue": {
"name": "EXTRACTED_COUNT",
"secure": false,
"value": "12"
}
}
Similar to standard API tests, the variables are listed in the variables.extracted
property, but inside steps themselves. These values are available as long as the step is successful.
For multistep/browser/mobile tests:
.steps.allowFailure
.steps.duration
.steps.failure
.code
and .message
.steps.id
.steps.isCritical
.steps.status
.steps.type
Subtest information:
.steps.subTest.id
.steps.subStep.parentStep.id
.steps.subStep.parentTest.id
.steps.subStep.level
Examples:
{
"steps": [
{
"allowFailure": false,
"duration": 10955,
"failure": {
"code": "ASSERTION_FAILURE",
"message": "Element's content should not equal given value."
},
"id": "g8e-q4a-fix",
"isCritical": true,
"status": "failed",
"type": "assertElementContent",
"subTest": {
"id": "m2i-fcy-eva"
},
"subStep": {
"parentStep": {"id": "ikj-juk-z2u"},
"parentTest": {"id": "th5-wic-5mj"},
"level": 1
}
}
]
}
General:
.startUrl
Steps:
.apiTest.request
type
is runApiTest
).apiTest.result
attributes.result
for API tests).assertionResult.expected
.assertionResults.checkType
.assertionResults.actual
.browserErrors
.timings.firstByte
.timings.tcp
.description
Examples:
{
"startUrl": "https://datadoghq.com",
"apiTest": {
"request": {
"subType": "http",
"method": "GET",
"url": "https://datadoghq.com"
},
"result": {
"statusCode": 200
}
},
"assertionResults": {
"expected": "100",
"checkType": "equals",
"actual": "200"
},
"timings": {
"firstByte": 7.1,
"tcp": 5.2
}
}
Examples for .browserErrors
:
{
"name": "Console error",
"description": "Failed to load resource: the server responded with a status of 403 ()",
"type": "js"
},
{
"name": "[GET] 403 - https://accounts.google.com/v3/signin/identifier?dsh=S688774280%3A1687962864348747&conti",
"description": "https://accounts.google.com/v3/signin/identifier?dsh=S688774280%3A1687962864348747&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3D%252Fsignin_passive%26feature%3Dpassive&hl=en&ifkv=AeDOFXjMKzxp0wt-b9IzWKz6RS9Kk-VmW5z_fzLP_cjbSWd4hWeP5g53fvdrhX6b2cDVQrNtJ5B7vA&passive=true&service=youtube&uilel=3&flowName=GlifWebSignIn&flowEntry=ServiceLogin\n<html lang=en><meta charset=utf-8><meta name=viewport content=\"initial-scale=1, minimum-sca",
"type": "network",
"status": 403
},
{
"method": "POST",
"name": "https://8b61d74c.datadoghq.com/api/v2/rum?batch_time=1752830394872&dd-request-id=8c0e7b8c-3d52-4b96-",
"description": "Request was pending when step timed out: POST - https://8b61d74c.datadoghq.com/api/v2/rum?batch_time=1752830394872&dd-request-id=8c0e7b8c-3d52-4b96-b1a0-627e7070b863&dd-evp-origin=browser&dd-evp-origin-version=5.27.0&dd-api-key=pub0b466265cd4de08394d4e1979fb79787&ddtags=sdk_version%3A5.27.0%2Capi%3Abeacon%2Cenv%3Alive%2Cservice%3Acorp%2Cversion%3Ae0fdd625&ddsource=browser",
"type": "network",
"url": {
"protocol": "https:",
"search": "?batch_time=1752830394872&dd-request-id=8c0e7b8c-3d52-4b96-b1a0-627e7070b863&dd-evp-origin=browser&dd-evp-origin-version=5.27.0&dd-api-key=pub0b466265cd4de08394d4e1979fb79787&ddtags=sdk_version%3A5.27.0%2Capi%3Abeacon%2Cenv%3Alive%2Cservice%3Acorp%2Cversion%3Ae0fdd625&ddsource=browser",
"domain": "datadoghq.com",
"origin": "https://8b61d74c.datadoghq.com",
"full": "https://8b61d74c.datadoghq.com/api/v2/rum?batch_time=1752830394872&dd-request-id=8c0e7b8c-3d52-4b96-b1a0-627e7070b863&dd-evp-origin=browser&dd-evp-origin-version=5.27.0&dd-api-key=pub0b466265cd4de08394d4e1979fb79787&ddtags=sdk_version%3A5.27.0%2Capi%3Abeacon%2Cenv%3Alive%2Cservice%3Acorp%2Cversion%3Ae0fdd625&ddsource=browser",
"pathname": "/api/v2/rum"
}
},
.application.versionId
.apiTest
.description
Examples:
{
"application": {
"versionId": "4408df2e-9b7a-4665-9510-b9041b2ae1e8"
},
"description": "Tap on Button Sign In"
}
Multistep:
.name
.type
Note: Follow regular API fields per subType
Non-Multistep:
.assertions.actual
.assertions.expected
.assertions.operator
.assertions.type
.dnsResolution.resolvedIp
.dnsResolution.server
.timings.dns
.timings.tcp
.request.url
.request.host
.response.body
.response.statusCode
.response.headers
.response.httpVersion
.response.redirects
Examples:
{
"name": "Check API endpoint",
"type": "http",
"assertions": {
"actual": 1.5145,
"expected": 1000,
"operator": "moreThan",
"type": "latency"
},
"dnsResolution": {
"resolvedIp": "18.245.199.78",
"server": "8.8.4.4"
},
"timings": { //Dependent on the sub-type
"tcp": 6.9,
"download": 33.5,
"total": 75,
"dns": 7.5,
"firstByte": 17.2,
"ssl": 9.9
},
},
"request": {
"url": "https://www.datadogh.com",
"host": "datadoghq.com",
"method": "GET"
},
"response": {
"body": "Example Page Content", // Raw text (even if it's JSON, its contents can't be accessed individually), and it's truncated if too big (only the start is available)
"statusCode": 200,
"headers": { // Object/dictionary of headers, the key is the header name and the value its value
"content-type": "text/html; charset=utf-8",
"content-length": "250661"
},
"httpVersion": "1.1",
"redirects": [ // List of redirect items
{
"location": "https://datadoghq.com",
"statusCode": 302
}
]
}
.timings.open
.timings.receive
.handshake.request
.handshake.response
.request.message
.response.message
.close.reason
.close.statusCode
Examples:
{
"timings": {
"tcp": 96,
"receive": 97,
"download": 0,
"total": 201.9,
"dns": 7.7,
"firstByte": 0,
"ssl": 1,
"open": 0.2
},
"handshake": {
"response": {
"statusCode": 101
}
},
"request": {
"message": "Ping"
},
"response": {
"message": "Pong"
},
"close": {
"reason": "message_received",
"statusCode": 1000
}
}
.callType
unary
or healthcheck
).timings.rpc
.response.healthcheck.status
.request.message
.response.message
Examples:
{
"callType": "healthcheck",
"timings": {
"total": 55.3,
"rpc": 9.2,
"dns": 46.1
},
"response": {
"healthcheck": {
"status": 1
}
},
"request": {
"message": "Ping"
},
"response": {
"message": "Pong" // Responses can be truncated if too big (only the start is available)
}
}
.request.message
.response.message
.timings.message
Examples:
{
"timings": {
"total": 135.3,
"dns": 14.4,
"message": 120.9
},
"request": {
"message": "Ping"
},
"response": {
"message": "Pong"
}
}
.connectionOutcome
.netpath.routers.ip
.traceroute.latency.min
.traceroute.latency.max
.traceroute.latency.avg
.traceroute.latency.stddev
.traceroute.latency.values
Examples:
[
{
"packetLossPercentage": 1,
"packetsReceived": 0,
"packetsSent": 2,
"routers": [
{
"ip": "???"
}
]
},
{
"packetLossPercentage": 0,
"packetsReceived": 2,
"latency": {
"avg": 0.2375,
"min": 0.189,
"max": 0.286,
"values": [
0.189,
0.286
],
"stddev": 0.04849999999999999
},
"packetsSent": 2,
"routers": [
{
"ip": "10.241.134.75"
}
]
}
]
.traceroute
.request.host
.ping
.latency.min
, .latency.max
, .latency.avg
, .latency.stddev
, .latency.values
Examples:
{
"ping": {
"packetLossPercentage": 0,
"packetsReceived": 4,
"latency": {
"avg": 1.47375,
"min": 1.442,
"max": 1.516,
"values": [
1.467,
1.442,
1.47,
1.516
],
"stddev": 0.02670557057993708
},
"resolvedIp": "18.245.199.70",
"packetsSent": 4,
"packetSize": 56
}
}
.cert
.cipher
.issuer
.subject
.valid.from
.valid.to
.ocsp
.timings.handshake
Examples:
"cipher": TLS_AES_128_GCM_SHA256,
"issuer": {
"C": "US",
"CN": "DigiCert Global G2 TLS RSA SHA256 2020 CA1",
"O": "DigiCert Inc"
},
{
"issuer": {
"C": "US",
"CN": "DigiCert Global G2 TLS RSA SHA256 2020 CA1",
"O": "DigiCert Inc"
},
"valid.from": 1751414400000, //milliseconds
"valid.to": 1783036799000 //milliseconds
}
.response.records.type
.response.records.values
Examples:
{
"dns": {
"response": {
"records": {
"type": "A",
"values": ["192.0.2.1", "192.0.2.2"]
}
}
}
}
Step Summary:
.result.steps.<step_id>
.id
, .status
, .type
, .duration
, .description
, .failure.message
, .code
, .url
The step summary contains the same data as described in steps, but you can access it in several ways:
By step index (0-based):
.steps.0
- first step.steps.1
- second step.steps.-1
- last step.steps.-2
- step before lastBy step name:
.steps[Click button]
By step id:
.steps.abc-def-ghi
Then you access the data as usual, for example:
.steps.-1.status
.steps[Click button].status
.steps.abc-def-ghi.status
Summary Data:
.count.steps.{total,completed}
, .count.errors
, .count.hops
(for example, 4
)Service Tag:
If service
tag is set:
{{service.name}}
{{service.team}}
{{service.docs}}
, {{service.links}}
Examples:
{
"service.name": "API Server",
"service.team": "Backend team",
"service.docs": "https://docs.datadoghq.com/api/"
}