---
title: Migrate metric timeslice queries to NRQL
source: https://docs.newrelic.com/docs/apis/rest-api-v2/migrate-to-nrql
---

## List metric names for your app

To view the metric names available for your application:

```sql
SELECT uniques(metricTimesliceName) FROM Metric 
WHERE appId = '$APP_ID' AND newrelic.timeslice.value IS NOT NULL 
SINCE 30 MINUTES AGO LIMIT MAX
```

You can also filter using the application name:

```sql
SELECT uniques(metricTimesliceName) FROM Metric 
WHERE appName = '$APP_NAME' AND newrelic.timeslice.value IS NOT NULL 
SINCE 30 MINUTES AGO LIMIT MAX
```

Or using a specific agent (host):

```sql
SELECT uniques(metricTimesliceName) FROM Metric 
WHERE realAgentId = '$AGENT_ID' AND newrelic.timeslice.value IS NOT NULL 
SINCE 30 MINUTES AGO LIMIT MAX
```

## Get your app's metric timeslice data values

The REST API v2 accepts a list of metric names and a list of values to fetch metric timeslice data.

The metric names are the same, you can filter them with the `metricTimesliceName` field in your NRQL query.

Each API value can be mapped to a NRQL function, you can refer to the table below.

Example, for the following API request:

```bash
curl -X GET "https://api.newrelic.com/v2/applications/$APP_ID/metrics/data.json" \
     -H "X-Api-Key:$API_KEY" -i \
     -d 'names[]=HttpDispatcher&values[]=average_call_time&values[]=call_count'
```

You would use the following query:

```sql
SELECT count(newrelic.timeslice.value) AS call_count, 
       average(newrelic.timeslice.value) * 1000 AS average_call_time
FROM Metric
WHERE appId = $APP_ID AND metricTimesliceName = 'HttpDispatcher'
```

| Value (RPM)                  | NRQL Function                                                                                    |
| ---------------------------- | ------------------------------------------------------------------------------------------------ |
| `average_response_time`      | `average(newrelic.timeslice.value) * 1000`                                                       |
| `calls_per_minute`           | `rate(count(newrelic.timeslice.value), 1 minute)`                                                |
| `call_count`                 | `count(newrelic.timeslice.value)`                                                                |
| `min_response_time`          | `min(newrelic.timeslice.value) * 1000`                                                           |
| `max_response_time`          | `max(newrelic.timeslice.value) * 1000`                                                           |
| `average_exclusive_time`     | `average(newrelic.timeslice.value['totalExclusive'] / newrelic.timeslice.value['count']) * 1000` |
| `average_value`              | `average(newrelic.timeslice.value)`                                                              |
| `total_call_time_per_minute` | `rate(sum(newrelic.timeslice.value), 1 minute)`                                                  |
| `requests_per_minute`        | `rate(count(newrelic.timeslice.value), 1 minute)`                                                |
| `standard_deviation`         | `stddev(newrelic.timeslice.value) * 1000`                                                        |
| `average_time`               | `average(newrelic.timeslice.value) * 1000`                                                       |
| `count`                      | `count(newrelic.timeslice.value)`                                                                |
| `used_bytes_by_host`         | `average(newrelic.timeslice.value) * 1024 * 1024`                                                |
| `used_mb_by_host`            | `average(newrelic.timeslice.value)`                                                              |
| `total_used_mb`              | `sum(newrelic.timeslice.value)`                                                                  |
| `average_call_time`          | `average(newrelic.timeslice.value) * 1000`                                                       |
| `total_value`                | `sum(newrelic.timeslice.value)`                                                                  |
| `min_value`                  | `min(newrelic.timeslice.value)`                                                                  |
| `max_value`                  | `max(newrelic.timeslice.value)`                                                                  |
| `rate`                       | `rate(sum(newrelic.timeslice.value), 1 second)`                                                  |
| `throughput`                 | `rate(count(newrelic.timeslice.value), 1 second)`                                                |
| `as_percentage`              | `average(newrelic.timeslice.value) * 100`                                                        |
| `errors_per_minute`          | `rate(count(newrelic.timeslice.value), 1 minute)`                                                |
| `error_count`                | `count(newrelic.timeslice.value)`                                                                |
| `total_time`                 | `sum(newrelic.timeslice.value) * 1000`                                                           |
| `sessions_active`            | `average(newrelic.timeslice.value)`                                                              |
| `total_visits`               | `sum(newrelic.timeslice.value)`                                                                  |
| `percent`                    | `average(newrelic.timeslice.value) * 100`                                                        |
| `percent(CPU/User Time)`     | `100 * sum(newrelic.timeslice.value) / $TIME_WINDOW_IN_SECONDS`                                  |
| `time_percentage`            | `100 * sum(newrelic.timeslice.value) / $TIME_WINDOW_IN_SECONDS`                                  |
| `utilization`                | `100 * sum(newrelic.timeslice.value) / $TIME_WINDOW_IN_SECONDS`                                  |
| `visits_percentage`          | `100 * sum(newrelic.timeslice.value) / $TIME_WINDOW_IN_SECONDS`                                  |

If the function includes `$TIME_WINDOW_IN_SECONDS`, it means that you need to replace it with the time window you want to query.

Example, if you query a 30 minutes time window, you would replace `$TIME_WINDOW_IN_SECONDS` with `1800`.

### Apdex metrics

| Value (RPM)     | NRQL Function                                                                          |
| --------------- | -------------------------------------------------------------------------------------- |
| `score`         | `apdex(newrelic.timeslice.value)`                                                      |
| `s`             | `apdex(newrelic.timeslice.value)` or `count(newrelic.timeslice.value)`                 |
| `t`             | `apdex(newrelic.timeslice.value)` or `sum(newrelic.timeslice.value)`                   |
| `f`             | `apdex(newrelic.timeslice.value)` or `sum(newrelic.timeslice.value['totalExclusive'])` |
| `count`         | `apdex(newrelic.timeslice.value)`                                                      |
| `value`         | `apdex(newrelic.timeslice.value)`                                                      |
| `threshold`     | `max(newrelic.timeslice.value)`                                                        |
| `threshold_min` | `min(newrelic.timeslice.value)`                                                        |

### EndUser & Mobile metrics

These metrics will return the same result as what you would get from the REST API v2, but some results may differ from what you see on the New Relic UI.
This is because the UI uses events instead of timeslice data.
If you want to get the same results as the UI, you should query the events directly.

| Value (RPM)                     | NRQL Function                                                                                                                                                              |
| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `average_response_time`         | `sum(newrelic.timeslice.value) / count(newrelic.timeslice.value) * 1000  `                                                                                                 |
| `error_percentage`              | `(filter(count(newrelic.timeslice.value), WHERE metricTimesliceName = 'EndUser/errors') / filter(count(newrelic.timeslice.value), WHERE metricTimesliceName = 'Browser'))` |
| `average_fe_response_time`      | `sum(newrelic.timeslice.value['totalExclusive']) / count(newrelic.timeslice.value) * 1000`                                                                                 |
| `average_be_response_time`      | `1000 * (sum(newrelic.timeslice.value) - sum(newrelic.timeslice.value['totalExclusive'])) / count(newrelic.timeslice.value)`                                               |
| `average_network_time`          | `(sum(newrelic.timeslice.value) - sum(newrelic.timeslice.value['totalExclusive']) - sum(newrelic.timeslice.value['sumOfSquares'])) / count(newrelic.timeslice.value)`      |
| `total_network_time`            | `(sum(newrelic.timeslice.value) - sum(newrelic.timeslice.value['totalExclusive']) - sum(newrelic.timeslice.value['sumOfSquares']))`                                        |
| `network_time_percentage`       | `(sum(newrelic.timeslice.value) - sum(newrelic.timeslice.value['totalExclusive']) - sum(newrelic.timeslice.value['sumOfSquares'])) / $TIME_WINDOW_IN_SECONDS`              |
| `total_fe_time`                 | `sum(newrelic.timeslice.value['totalExclusive'])`                                                                                                                          |
| `fe_time_percentage`            | `100 * sum(newrelic.timeslice.value['totalExclusive']) / $TIME_WINDOW_IN_SECONDS`                                                                                          |
| `average_dom_content_load_time` | `average(newrelic.timeslice.value) * 1000`                                                                                                                                 |
| `average_queue_time`            | `average(newrelic.timeslice.value['totalExclusive']) * 1000`                                                                                                               |
| `total_queue_time`              | `sum(newrelic.timeslice.value['totalExclusive']) * 1000`                                                                                                                   |
| `total_dom_content_time`        | `sum(newrelic.timeslice.value) * 1000`                                                                                                                                     |
| `total_app_time`                | `sum(newrelic.timeslice.value['sumOfSquares'])`                                                                                                                            |
| `average_app_time`              | `sum(newrelic.timeslice.value['sumOfSquares']) / count(newrelic.timeslice.value)`                                                                                          |
| `average_sent_bytes`            | `sum(newrelic.timeslice.value['totalExclusive']) * 1000`                                                                                                                   |
| `average_received_bytes`        | `1000 * sum(newrelic.timeslice.value) / count(newrelic.timeslice.value)`                                                                                                   |
| `launch_count`                  | `count(newrelic.timeslice.value)`                                                                                                                                          |

### Timeseries and summaries

By default, the REST API returns a series of metric data values based. To obtain the average of these values, you would include `&summarize=true` in your API call.

In NRQL, that's the opposite. You get a summary by default, and you can get the timeseries by adding `TIMESERIES` to your query.

Another difference is that the default time window of the REST API is 30 minutes, while in NRQL, it is 1 hour.

## Query multiple metrics

You can still query multiple metrics at once with NRQL, here's an example:

```sql
SELECT
    filter(1000 * average(newrelic.timeslice.value), WHERE metricTimesliceName = 'HttpDispatcher') AS average_response_time,
    filter(count(newrelic.timeslice.value), WHERE metricTimesliceName = 'Errors/all') AS error_count,
    filter(average(newrelic.timeslice.value), WHERE metricTimesliceName = 'Memory/Heap/Max') AS used_mb_by_host
FROM Metric
WHERE appName = '$APP_NAME'
SINCE 1 day ago
```
