Try it free

Upgrade from classic service metrics to Grail

  • Latest Dynatrace
  • Upgrade guide
  • 5-min read

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.

Why upgrade?

  • Simplified metric landscape: Over 100 classic service metrics are consolidated into a handful of Metrics on Grail. Instead of tracking separate metric keys for each variant, you use a single metric with dimensions and filters to reach the same level of detail.
  • Advanced query capabilities: Metrics on Grail use DQL, which lets you filter, aggregate, join, and transform data in a single query.
  • Access in latest Dynatrace apps: Metrics on Grail work natively in Notebooks Notebooks, Dashboards Dashboards, and other Dynatrace apps, giving you additional analysis and visualization options.
  • Flexible endpoint analysis: Endpoints replace key requests in Grail. Unlike key requests, endpoints don't require upfront configuration, as you filter by endpoint.name directly in your query.

What will you do?

  • Look up your classic service metric key and find its Grail equivalent.
  • Adapt your metric selector queries to DQL using the provided examples.
  • For convergent metrics, apply dimensions and filters to a single Grail-based metric to reach the same granularity as your classic metric.
  • Identify which classic metrics are unsupported and explore the available DQL approximations.

Before you begin

Prerequisites

  • A list of your existing classic metric selectors that use classic service metrics
  • Access to Notebooks Notebooks or Dashboards Dashboards to test and validate your converted DQL queries

Prior knowledge

  • Familiarity with Metrics Classic and metric selector syntax
  • Basic understanding of DQL concepts

Metric mapping types

Typically, a metric on Grail is equivalent to a Metrics Classic metric. In some cases, however, there's no one-to-one relation.

  • Convergent metrics: A single metric on Grail represents multiple Metrics Classic metrics of a similar scope.
  • Unsupported metrics: No metric on Grail is planned to represent the Metrics Classic metric.

How to upgrade

To upgrade from classic service metrics to Metrics on Grail

  1. Before converting manually, try the automatic metric selector converter, as it converts many Classic metric selectors to DQL in one step.
  2. For service metrics that need a more specific approach, find your Classic metric key in Built-in Metrics on Grail and the tables below, identify its Grail equivalent, and replace your metric selector with the corresponding DQL query. For DQL query examples, see Convergent metrics and Unsupported metrics.
  3. After replacing your metric selectors, run your DQL queries in Notebooks Notebooks or Dashboards Dashboards and verify that the results align with your expected Classic metric data.

Convergent metrics

When a single Grail-based metric represents multiple Metrics Classic metrics, you can obtain comparable results for individual metric values through metric dimensions.

The sections below cover a group of related classic 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.

HTTP 4xx and HTTP 5xx status codes

To convert the classic service metrics that track the rate of HTTP error responses, use the dt.service.request.count Grail-based metric filtered by http.response.status_code.

The following DQL queries return the rate of requests with HTTP response status code 5xx or 4xx—an equivalent of builtin:service.errors.fivexx.rate and builtin:service.errors.fourxx.rate.

DQL query example for 5xx status code

// calculate HTTP 5xx response status code request rate
timeseries {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

DQL query example for 4xx status code

// calculate HTTP 4xx response status code request rate
timeseries {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

Mapping table

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

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.

The following DQL query returns the count of successful requests to MY_SERVICE-00000—an equivalent of builtin:service.errors.total.successCount.

DQL query example

timeseries sum(dt.service.request.count), interval:1m,
by:{dt.entity.service, failed},
filter:{
dt.entity.service == "<MY_SERVICE-00000>"
and failed == false
}

Mapping table

Metric key (Grail)Filter by Metric key (Classic)

dt.service.request.count

failed (false or true)

  • builtin:service.errors.client.successCount
  • builtin:service.errors.server.successCount
  • builtin:service.errors.total.successCount
  • builtin:service.successes.server.rate
  • builtin:service.errors.server.count
  • builtin:service.errors.server.rate
  • builtin:service.errors.total.rate

Failure and success of HTTP 4xx and HTTP 5xx

To convert the classic service metrics that track the count of HTTP 4xx and 5xx error responses and their complements (non-error requests), use the dt.service.request.count Grail-based metric filtered by 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.

DQL query example

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 == true
and http.response.status_code >= 400
and http.response.status_code <= 499
}

Mapping table

Metric key (Grail)Filter by Metric key (Classic)

dt.service.request.count

failed (false or true) AND
http.response.status_code (5xx or 4xx)

  • builtin:service.errors.fivexx.successCount
  • builtin:service.errors.fivexx.count
  • builtin:service.errors.fourxx.successCount
  • builtin:service.errors.fourxx.count

Key requests

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.

From key requests to endpoints

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 HTTP response status code 5xx (equivalent of builtin:service.keyRequest.errors.fivexx.rate).

DQL query example

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 >= 500
and http.response.status_code <= 599
}

Mapping table

Metric key (Grail)Filter by Metric key (Classic)

dt.service.request.failure_count

endpoint.name (<Key request name>)

  • builtin:service.keyRequest.errors.client.count
  • builtin:service.keyRequest.errors.client.rate

dt.service.request.response_time

endpoint.name (<Key request name>)

  • builtin:service.keyRequest.response.client
  • builtin:service.keyRequest.response.server
  • builtin:service.keyRequest.response.time

dt.service.request.count

endpoint.name (<Key request name>)

  • builtin:service.keyRequest.count.client
  • builtin:service.keyRequest.count.server
  • builtin:service.keyRequest.count.total

dt.service.request.count

endpoint.name (<Key request name>) AND
failed (false or true)

  • builtin:service.keyRequest.errors.client.successCount
  • builtin:service.keyRequest.errors.server.successCount
  • builtin:service.keyRequest.successes.server.rate
  • builtin:service.keyRequest.errors.server.count
  • builtin:service.keyRequest.errors.server.rate

dt.service.request.count

endpoint.name (<Key request name>) AND
http.response.status_code (5xx or 4xx)

  • builtin:service.keyRequest.errors.fivexx.rate
  • builtin:service.keyRequest.errors.fourxx.rate

dt.service.request.count

endpoint.name (<Key request name>) AND
failed (false or true) AND
http.response.status_code (5xx or 4xx)

  • builtin:service.keyRequest.errors.fivexx.successCount
  • builtin:service.keyRequest.errors.fivexx.count
  • builtin:service.keyRequest.errors.fourxx.successCount
  • builtin:service.keyRequest.errors.fourxx.count

Database child call count

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—an equivalent of builtin:service.dbChildCallCount.

DQL query example

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>" }

Mapping table

Metric key (Grail)Filter by Metric key (Classic)

dt.service.database.query.count

None

  • builtin:service.dbChildCallCount

Unsupported metrics

The following classic service metrics have no direct Grail equivalent. 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 section includes a DQL approximation using spans. For other categories, the classic metric keys are listed for reference—no DQL equivalent is currently available.

Database

  • builtin:service.dbChildCallTime
  • builtin:service.keyRequest.dbChildCallCount
  • builtin:service.keyRequest.dbChildCallTime
  • builtin:service.keyRequest.nonDbChildCallCount
  • builtin:service.keyRequest.nonDbChildCallTime
  • builtin:service.nonDbChildCallCount
  • builtin:service.nonDbChildCallTime

The following DQL query returns the count and the duration of database spans for each database service, similarly to builtin:service.dbChildCallTime.

DQL query example

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

  • builtin:service.cpu.instance
  • builtin:service.cpu.perRequest
  • builtin:service.cpu.time
  • builtin:service.ioTime
  • builtin:service.keyRequest.cpu.perRequest
  • builtin:service.keyRequest.cpu.time
  • builtin:service.keyRequest.ioTime
  • builtin:service.keyRequest.lockTime
  • builtin:service.keyRequest.waitTime
  • builtin:service.lockTime
  • builtin:service.waitTime

Service method groups

  • builtin:service.cpu.group.perRequest
  • builtin:service.cpu.group.time
  • builtin:service.errors.group.client.count
  • builtin:service.errors.group.client.rate
  • builtin:service.errors.group.client.successCount
  • builtin:service.errors.group.server.count
  • builtin:service.errors.group.server.rate
  • builtin:service.errors.group.server.successCount
  • builtin:service.errors.group.total.count
  • builtin:service.errors.group.total.rate
  • builtin:service.errors.group.total.successCount
  • builtin:service.response.group.client
  • builtin:service.response.group.server
  • builtin:service.totalProcessingTime.group.totalProcessingTime

Other

  • builtin:service.calledFromNetworksCount
  • builtin:service.keyRequest.totalProcessingTime
  • builtin:service.totalProcessingTime

Related topics

  • Use DQL queries
  • Notebooks
Related tags
Dynatrace Platform