Latest Dynatrace
This guide provides insights into migrating service metrics to Grail. Typically, a Grail metric is equivalent to a Metrics Classic metric. In some cases, however, there's no one-to-one relation:
When a single Grail metric provides support for multiple Metrics Classic metrics, you can obtain comparable results for values of individual metrics through metric dimensions.
HTTP 4xx and HTTP 5xx
Example: The following DQL queries return respectively the rate of requests with HTTP response status code 5xx and 4xx—an equivalent of builtin:service.errors.fivexx.rate
and builtin:service.errors.fourxx.rate
.
// calculate HTTP 5xx response status code request ratetimeseries {total = sum(dt.service.request.count)}| join [timeseries {fiveXX = sum(dt.service.request.count, default: 0.0)},filter:http.response.status_code >= 500 and http.response.status_code <= 599], kind:leftOuter, prefix: "httpState.", on:{ timeframe }| fieldsAdd {rate5xx = httpState.fiveXX[] / total[] * 100}| fields rate5xx, timeframe, interval
// calculate HTTP 4xx response status code request ratetimeseries {total = sum(dt.service.request.count)}| join [timeseries {fourXX = sum(dt.service.request.count, default: 0.0)},filter: http.response.status_code >= 400 and http.response.status_code<=499], kind:leftOuter, prefix: "httpState.", on:{ timeframe }| fieldsAdd {rate4xx = httpState.fourXX[] / total[] * 100}| fields rate4xx, timeframe, interval
Metric key (Grail) | Filter by | Metric key (Classic) |
---|---|---|
dt.service.request.count | http.response.status_code (5xx or 4xx) | builtin:service.errors.fivexx.rate builtin:service.errors.fourxx.rate |
Failure and success
Example: The following DQL query returns the average number of successful requests to MY_SERVICE-00000
—an equivalent ofbuiltin:service.errors.total.successCount
.
timeseries sum(dt.service.request.count),by:{dt.entity.service, failed},filter:{dt.entity.service == "<MY_SERVICE-00000>"and failed == false}
Metric key (Grail) | Filter by | Metric key (Classic) |
---|---|---|
dt.service.request.count | failed ( | builtin:service.errors.client.successCount |
Failure and success of HTTP 4xx and HTTP 5xx
Example: The following DQL query returns the average number of failed requests to MY_SERVICE-00000
with HTTP response status code 4xx—an equivalent ofbuiltin:service.errors.fourxx.count
.
timeseries sum(dt.service.request.count),by:{dt.entity.service, failed, http.response.status_code},filter:{dt.entity.service == "<MY_SERVICE-00000>"and failed == trueand http.response.status_code >= 400and http.response.status_code <= 499}
Metric key (Grail) | Filter by | Metric key (Classic) |
---|---|---|
dt.service.request.count | failed ( | builtin:service.errors.fivexx.successCount |
Key requests
Endpoints replace key requests in Grail. To learn more about endpoint.name, see the Semantic dictionary.
Example: The following DQL query example returns the sum of the number of requests of the request /orange.jsf
with HTTP response status code 5xx, as builtin:service.keyRequest.errors.fivexx.rate
.
timeseries sum(dt.service.request.count),by:{endpoint.name, http.response.status_code},filter:{endpoint.name == "/orange.jsf"and http.response.status_code >= 500and http.response.status_code <= 599}
Metric key (Grail) | Filter by | Metric key (Classic) |
---|---|---|
dt.service.request.failure_count | endpoint.name ( | builtin:service.keyRequest.errors.client.count |
dt.service.request.response_time | endpoint.name ( | builtin:service.keyRequest.response.client |
dt.service.request.count | endpoint.name ( | builtin:service.keyRequest.count.client |
endpoint.name ( | builtin:service.keyRequest.errors.client.successCount | |
endpoint.name ( | builtin:service.keyRequest.errors.fivexx.rate | |
endpoint.name ( | builtin:service.keyRequest.errors.fivexx.successCount |
The following Metrics Classic metrics don't have a dedicated Grail metric. Support is planned with Traces in Grail. To learn more about what's coming, see Blog post: Expanded Grail data lakehouse and new Dynatrace user experience unlock boundless analytics.
Database
Example: The following DQL query returns the amount and the duration of database spans for each database service, similarly to builtin:service.dbChildCallCount
and builtin:service.dbChildCallTime
.
fetch spans, samplingRatio:1// get only database client span| filter span.kind == "client" and isNotNull(db.statement)// calculate how frequently each span is sampled| fieldsAdd sampling.probability = (power(2, 56) - coalesce(sampling.threshold, 0)) * power(2, -56)| fieldsAdd sampling.multiplicity = 1/sampling.probability// calculate the number of database spans after sampling| fieldsAdd multiplicity = coalesce(sampling.multiplicity, 1)* coalesce(aggregation.count, 1)* dt.system.sampling_ratio// calculate the duration of database spans after sampling| fieldsAdd duration = coalesce(aggregation.duration_sum / aggregation.count, duration)// aggregate records with the same values, by service ID| summarize {operation_count_extrapolated = sum(multiplicity),operation_duration_avg_extrapolated = sum(duration * multiplicity) / sum(multiplicity)}, by: { entityName(dt.entity.service), db.namespace }
CPU
Service method groups
Other