dt-obs-ext-monitors
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
By dynatrace · 509 installs
npx skills add dynatrace/dynatrace-for-ai --skill dt-obs-ext-monitors
Source repository · Upstream listing
External Monitor Ingestion
Send 3rd party test and monitor results to Dynatrace Grail using the events ingest API.
This is the canonical replacement for the deprecated POST /api/v1/synthetic/ext/tests endpoint.
Overview
Events posted to /platform/ingest/custom/events/{endpoint} land in Grail and are processed
by OpenPipeline, which:
Extracts metrics ( external.test.availability , external.test.duration ) for alerting and SLOs
Registers each unique test.id as an EXT TEST Smartscape node — enabling Davis Problems to
attach to a named entity ("External test X went down") rather than floating without topology context
Adds result.status.category to step events ( SUCCESS / SKIPPED / FAIL ) for dashboard filtering
Two event types form a test result:
Type Purpose
external test run Overall pass/fail result for one test execution
external test step One step within that run (optional; enables step level metrics)
Authentication
Two token types are accepted:
Token type Scope
Classic Api Token openpipeline.events.custom
Platform Token / OAuth openpipeline:events.custom:ingest
Common wrong guess that does NOT work: events.ingest .
Quick Start
Prerequisite: The ingest endpoint must be created in OpenPipeline before sending events.
The external.tests endpoint is provisioned automatically by the
default Dynatrace 3rd party monitors Monaco bundle.
See references/event ingestion.md for setup details and custom endpoint creation.
Send one minimal test result (replace external.tests with your configured endpoint name):
Expected response: HTTP 200 (empty body).
Full event schema, step events, extended examples with error fields and CI metadata,
Java DTO shapes, and DQL queries: references/event ingestion.md
Verify in Grail
After sending, confirm the event appears:
Key Constraints
Body must be a JSON array ( [{...}] ), not an object wrapper ( {"events":[...]} ).
A single request can mix run events and step events in the same array.
timestamp must be ISO 8601 UTC (e.g. "2024 01 15T10:30:00Z" ).
test.run.availability must be integer 1 or 0 , not a string.
All step events in a run must share the same test.run.id and test.id as the parent run event.
Step events must include test.step.id (unique within the run) in addition to test.run.id .
event.kind: "EXTERNAL TEST EVENT" must be present — used by Grail for event classification.
Routing to the correct pipeline is driven by event.type , not event.kind .
Do not send dt.smartscape.ext test or result.status.category — these are written by
the pipeline after ingestion and will be overwritten if included.
dt.security context controls data access policies; it’s recommended to set it on every event to enable
per team access control and cost attribution in multi team tenants.
Multi Location Tests
Send the same test.id from multiple locations — each with a different test.run.location
value — to build a multi location test. OpenPipeline creates one EXT TEST node per test.id
and one availability metric timeseries per (test.id, location) pair.
This enables two alerting tiers out of the box:
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)
Threshold maths for a 3 location test: 1 location failing → avg 0.67 (no alert at 0.5 threshold);
2 failing → avg 0.33 (fires); all 3 failing → avg ≈ 0 (fires immediately).
Keep test.id stable across all locations — changing it creates a new Smartscape node and
breaks metric history.
Related Skills
dt dql essentials — DQL syntax for querying ingested events and building analysis queries
dt obs frontends — Link test runs to frontend entities via dt.smartscape.frontend to
draw EXT TEST → FRONTEND dependency edges in Smartscape