Loading...
Loading...
3rd-party test and monitor result ingestion into Dynatrace Grail via the platform events ingest API (platform/ingest/custom/events/). Use when sending external synthetic test outcomes, CI monitor data, or third-party check results to Dynatrace. Covers token scope, full event schema for external_test_run and external_test_step (including dt.security_context, ci.*, trace correlation, and pipeline-added fields), curl and Java DTO examples, and DQL verification. Trigger: "ingest test results", "send monitor results", "third party monitor", "external test ingestion", "send synthetic results to Grail", "push external test data to Dynatrace", "external monitor results", "external test run event schema". Do NOT use for Dynatrace-native Synthetic Monitoring browser/HTTP checks, or Real User Monitoring (use dt-obs-frontends for RUM).
npx skill4agent add dynatrace/dynatrace-for-ai dt-obs-ext-monitorsPOST /api/v1/synthetic/ext/tests/platform/ingest/custom/events/{endpoint}external.test.availabilityexternal.test.durationtest.idEXT_TESTresult.status.categorySUCCESSSKIPPEDFAIL| Type | Purpose |
|---|---|
| Overall pass/fail result for one test execution |
| One step within that run (optional; enables step-level metrics) |
| Token type | Scope |
|---|---|
| Classic Api-Token | |
| Platform Token / OAuth | |
events.ingestPrerequisite: The ingest endpoint must be created in OpenPipeline before sending events. Theendpoint is provisioned automatically by the default Dynatrace 3rd-party monitors Monaco bundle. Seeexternal.testsfor setup details and custom endpoint creation.references/event-ingestion.md
external.testscurl -X POST "https://{env-id}.live.dynatrace.com/platform/ingest/custom/events/external.tests" \
-H "Authorization: Api-Token {token}" \
-H "Content-Type: application/json" \
-d '[{
"event.kind": "EXTERNAL_TEST_EVENT",
"event.type": "external_test_run",
"test.id": "my-api-health-check",
"test.run.id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"test.name": "My API Health Check",
"test.type": "api",
"test.run.status": "passed",
"test.run.availability": 1,
"test.run.duration_ms": 245,
"test.run.location": "us-east-1",
"dt.security_context": "team-checkout",
"timestamp": "2024-01-15T10:30:00Z"
}]'Full event schema, step events, extended examples with error fields and CI metadata, Java DTO shapes, and DQL queries:references/event-ingestion.md
fetch events, from:now()-1h
| filter event.type == "external_test_run"
| fields timestamp, test.id, test.name, test.run.status, test.run.duration_ms, test.run.location
| sort timestamp desc
| limit 20[{...}]{"events":[...]}timestamp"2024-01-15T10:30:00Z"test.run.availability10test.run.idtest.idtest.step.idtest.run.idevent.kind: "EXTERNAL_TEST_EVENT"event.typeevent.kinddt.smartscape.ext_testresult.status.categorydt.security_contexttest.idtest.run.locationEXT_TESTtest.id(test.id, location)| Alert type | Fires when |
|---|---|
| Local outage | A single location's availability drops (per-location timeseries) |
| Global outage | Average across all locations drops below threshold (e.g. majority failing) |
test.iddt.smartscape.frontend