Use this guide to convert Classic service metric selectors to Dynatrace Query Language (DQL) and understand how each service metric maps to its Grail equivalent, so you can smoothly transition to Latest Dynatrace.
Notebooks,
Dashboards, and other Dynatrace apps, giving you additional analysis and visualization options.endpoint.name directly in your query.
Notebooks or
Dashboards to test and validate your converted DQL queries.
Notebooks or
Dashboards.To upgrade your Classic service metric selectors to DQL:
Because there isn't an exact, one-to-one mapping between Classic metric selectors and DQL queries, some queries will require manual adjustments during the conversion.
Use
Data Explorer and
Dashboards to convert your existing Classic metric selector queries into DQL.
Go to
Data Explorer to create and run your query.

Select Open with… in the upper-right corner of the Result section.
Follow the displayed instructions to:
View the query in
Dashboards or
Notebooks and verify the output.

Here is a before-and-after of the Classic metric selector and the DQL query:
Classic metric selector
builtin:host.cpu.usage:splitBy("dt.entity.host"):sort(value(auto,descending)):limit(20)
Equivalent DQL query
timeseries usage = avg(dt.host.cpu.usage), by: { dt.entity.host }| fieldsAdd entityName(dt.entity.host)| sort arrayAvg(usage) desc| limit 20
If your Classic metric selector is not automatically convertible, you can manually convert your Classic metric selector to a DQL query.
Whether you've automatically or manually converted your Classic metrics, run your DQL queries in
Notebooks or
Dashboards and verify that the results align with your expected Classic metric data.
The following tables list Classic service metric keys and their Grail equivalents, when available.
For information about metric mapping, see New concepts.
The sections below group together different convergent metrics, with a DQL example showing how to filter by the relevant dimension and a mapping table listing the Classic keys.
If you don't find the required Classic metric key in the tables below, refer to Built-in Metrics on Grail.
To convert Classic service metrics for HTTP 4xx and HTTP 5xx error responses, use the dt.service.request.count Grail-based metric filtered by http.response.status_code.
The following DQL query returns the rate of requests with an HTTP 4xx response status code. This is equivalent to the Classic metric builtin:service.errors.fourxx.rate.
// calculate HTTP 4xx response status code request ratetimeseries {total = sum(dt.service.request.count), interval:1m}| join [timeseries {fourXX = sum(dt.service.request.count, default: 0.0), interval:1m},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
The following DQL query returns the rate of requests with HTTP response status code 5xx. This is equivalent to the Classic metric builtin:service.errors.fivexx.rate.
// calculate HTTP 5xx response status code request ratetimeseries {total = sum(dt.service.request.count), interval:1m}| join [timeseries {fiveXX = sum(dt.service.request.count, default: 0.0), interval:1m},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
| Metric key (Classic) | Metric key (Grail) | Filter by |
|---|---|---|
|
|
|
|
|
|
To convert the Classic service metrics that track the count and rate of successful versus failed requests, use the dt.service.request.count Grail-based metric filtered by failed == false or failed == true.
The following DQL query returns the count of successful requests to MY_SERVICE-00000—an equivalent of builtin:service.errors.total.successCount.
timeseries sum(dt.service.request.count), interval:1m,by:{dt.entity.service, failed},filter:{dt.entity.service == "<MY_SERVICE-00000>"and failed == false}
| Metric key (Classic) | Metric key (Grail) | Filter by |
|---|---|---|
|
|
|
To convert Classic service metrics that track the count of HTTP error responses and their complements (non-error requests), use the dt.service.request.count Grail-based metric filtered by both failed and http.response.status_code.
The following DQL query returns the count of failed requests to MY_SERVICE-00000 with HTTP response status code 4xx—an equivalent of builtin:service.errors.fourxx.count.
timeseries sum(dt.service.request.count), interval:1m,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 (Classic) | Metric key (Grail) | Filter by |
|---|---|---|
|
| Use both filters:
|
To convert Classic service metrics related to key requests, use the dt.service.request.failure_count, dt.service.request.response_time, and dt.service.request.count Grail-based metrics filtered by different parameters.
Endpoints replace key requests in Grail. To learn more about endpoint.name, see Semantic Dictionary.
The following DQL query example returns the total number of failed requests to /orange.jsf with an HTTP 5xx response status code. This is the equivalent of builtin:service.keyRequest.errors.fivexx.rate.
timeseries sum(dt.service.request.count), interval:1m,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 (Classic) | Metric key (Grail) | Filter by |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
To convert the builtin:service.dbChildCallCount metric, use the dt.service.database.query.count Grail metric.
The following DQL query returns the number of database calls made by MY_SERVICE-00000. This is the equivalent of builtin:service.dbChildCallCount.
timeseries calls = sum(dt.service.database.query.count), interval:1m,by: { dt.smartscape.service, db.system, db.namespace },filter: { dt.smartscape.service == "<MY_SERVICE-00000>" }
| Metric key (Classic) | Metric key (Grail) | Filter by |
|---|---|---|
|
| None |
The Classic service metrics in this section have no direct equivalent in Grail.
To approximate some of these metrics, you can use OpenPipeline to extract custom metrics from span data. For details, see Extract metrics from spans and distributed traces.
The database metrics can be approximated using spans.
The following DQL query returns the count and the duration of database spans for each database service, and can be used similarly to the Classic metric builtin:service.dbChildCallTime.
fetch spans, samplingRatio:1// get only database client span| filter span.kind == "client" and isNotNull(db.query.text)// 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 }
builtin:service.dbChildCallTimebuiltin:service.keyRequest.dbChildCallCountbuiltin:service.keyRequest.dbChildCallTimebuiltin:service.keyRequest.nonDbChildCallCountbuiltin:service.keyRequest.nonDbChildCallTimebuiltin:service.nonDbChildCallCountbuiltin:service.nonDbChildCallTimebuiltin:service.cpu.instancebuiltin:service.cpu.perRequestbuiltin:service.cpu.timebuiltin:service.ioTimebuiltin:service.keyRequest.cpu.perRequestbuiltin:service.keyRequest.cpu.timebuiltin:service.keyRequest.ioTimebuiltin:service.keyRequest.lockTimebuiltin:service.keyRequest.waitTimebuiltin:service.lockTimebuiltin:service.waitTimebuiltin:service.cpu.group.perRequestbuiltin:service.cpu.group.timebuiltin:service.errors.group.client.countbuiltin:service.errors.group.client.ratebuiltin:service.errors.group.client.successCountbuiltin:service.errors.group.server.countbuiltin:service.errors.group.server.ratebuiltin:service.errors.group.server.successCountbuiltin:service.errors.group.total.countbuiltin:service.errors.group.total.ratebuiltin:service.errors.group.total.successCountbuiltin:service.response.group.clientbuiltin:service.response.group.serverbuiltin:service.totalProcessingTime.group.totalProcessingTimebuiltin:service.calledFromNetworksCountbuiltin:service.keyRequest.totalProcessingTimebuiltin:service.totalProcessingTime