New Relicのクエリ言語で使い勝手が増す便利な関数が４つも登場！！

# はじめに
New Relicのクエリ言語NRQLの2024年1月のアップデートで、JSONを柔軟に解析できる関数の他にも便利な関数が４つも登場しましたので使い方を紹介します！JSONを解析する関数の使い方についてはこちらの[Qiita記事](https://qiita.com/nr-mito/private/d7f9f838d1c6ddeb8d70)で紹介しておりますので是非ご確認ください。

:::note info
このアップデートの詳細はこちら
[What's new
](https://docs.newrelic.com/jp/whats-new/2024/01/whats-new-01-18-nrql-q3-functions/  "What's new")その他アップデートの詳細はこちら
[New Relic アップデート(2024年1月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202401 "New Relic アップデート(2024年1月)")
[New Relic アップデート一覧
](https://newrelic.com/jp/blog/nerdlog/new-relic-update "New Relic アップデート一覧")
:::

# 新関数の使い方を確認
今回、登場した関数は以下になります。

| 関数名 | 機能内容 |
| ---- | ---- |
| convert()|あるメトリック単位から別のメトリック単位に変換します (例：ミリ秒から秒)|
| cidrAddress()| IPアドレスのベースネットワークアドレスを取得します |
| toTimestamp()|datetime文字列をエポックタイムに変換します |
| toDatetime()|エポックタイムをdatetime文字列に変換します|

各関数の使い方を見ていきます！

## convert()
convert() は、 指定された入力値に対して指定された単位間の単位変換を実行します。時間、長さ、重量、体積、データの一般的な単位と略語は、OpenTelemetryの仕様に合わせて[UCUM標準](https://ucum.org/ucum)を使用してサポートされています。

https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#func-convert

例ではトランザクションのduratonをミリ秒から秒に変換します。関数で簡単に単位を変換できるので便利です。
```sql
SELECT convert(duration, 'ms', 'min') AS durationMin FROM Transaction
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/be674d93-e0c4-0fb9-bbeb-16dcdc8d33a7.png" width="１50%">

## cidrAddress()
cidrAddress()は、CIDR IPアドレスからベースネットワークアドレスを取得します。

https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#func-cidraddress

例では、AWS VPC フローログからパケットの送信先となるEC2インスタンス毎に送信元となるCloudFrontのエッジのサブネットの件数を返しています。CDNやWebサーバーのアクセスログなどからサーバーやアプリケーションに対してどのサブネットからのアクセスが多いのか傾向を把握したいときに便利です。
```sql
SELECT count(*) FROM Log_VPC_Flows_AWS WHERE `pkt_src_aws_service` = 'CLOUDFRONT'
facet cidrAddress(srcaddr, 24),instance_id since 7 days ago
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/acf21975-77e6-9dff-5bb1-d95f164706fa.png" width="１50%">

指定したCIDR範囲内に存在するIPアドレスのみリストで取得することもできます。
```sql
SELECT uniques(srcaddr) FROM Log_VPC_Flows_AWS
WHERE `pkt_src_aws_service` = 'CLOUDFRONT' and cidrAddress(srcaddr, 24) = 'IPADDRESS/CIDR' 
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/035eb80d-ab7c-5aeb-8a07-3c9b42c69a9f.png" width="85%">

## toTimestamp()
続いて、datetime文字列からタイムスタンプをエポックミリ秒単位に変換できるtoTimestamp()の紹介です。

https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#func-toTimestamp

toTimestamp()では解析するdatetimeの日時パターンを関数内で指定することができ、デフォルトでは```yyyy-MM-dd'T'HH:mm:ss[.SSS][XXX]```を解析するようになっています。対応しているパターンは[リファレンス](https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#partial-datetime-interpretation)に記載されています。

デフォルトのパターン```yyyy-MM-dd'T'HH:mm:ss[.SSS][XXX]```を使用して、datetime文字列```2024-03-24T12:00:00.000Z```を解析しています。これにより、タイムスタンプ値```1711281600000```が返されます。

```sql
SELECT toTimestamp('2024-03-24T12:00:00.000Z') FROM Event
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/cf7d04f8-42f1-3427-901d-b33f5d88deb3.png" width="90%">

Timezoneを指定することも可能で、以下例ではタイムゾーンを```Asia/Tokyo```に指定して、datetimeのパターンも指定しています。これにより、タイムスタンプ値```1711332032000```が返されます。
```sql
SELECT toTimestamp('2024-03-25 11:00:32', 'yyyy-MM-dd HH:mm:ss', timezone:'Asia/Tokyo') FROM Event
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/84e60ba8-3d23-c107-48d2-8faf29aa01f6.png" width="90%">

## toDatetime()
エポックタイムをdatetime文字列に変換する関数も登場しました。

https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#func-toDatetime

toTimestamp()と同じくデフォルトのdatetimeのパターンは、```yyyy-MM-dd'T'HH:mm:ss[.SSS][XXX]```を使用して、変換します。
```sql
SELECT toDatetime(timestampValue) WITH 1711281600000 AS timestampValue 
```
※上記、NRQLクエリの例では[WITH AS句](https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#with-as-nrql-var)で```エポックタイム（1711281600000）```を```timestampValue```に環境変数として格納して、```SELECT toDatetime(timestampValue)```で呼び出すようにしています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/9da10c91-a59a-dda7-8929-55a2fd1e366c.png" width="90%">

以下例では、タイムゾーンを```Asia/Tokyo```、```yyyy-MM-dd```を指定して、 datetime文字列に変換しています。
```sql
SELECT toDatetime(timestampValue, 'yyyy-MM-dd', timezone:'Asia/Tokyo') WITH 1711332032000 AS timestampValue 
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/649b401a-b6c9-b0ce-7039-1a00d09571b6.png" width="90%">


# まとめ
この記事では、２０２４年１月の機能アップデートで登場した[convert()](https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#func-convert) 、[cidrAddress()](https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#func-cidraddress) 、[toTimestamp()](https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#func-toTimestamp) 、 [toDatetime()](https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#func-toDatetime)のNQRLクエリ関数の使い方を紹介させていただきました。どれも便利な関数でNRQLクエリの使い勝手がさらに向上しました。特に、エポックタイムからdatetime文字列への変換はNew Relicに送る前の変換が不要になる便利な関数です！是非ご活用ください！また、同じタイミングでアップデート機能として登場したJSONを解析する関数の使い方についてはこちらの[Qiita記事](https://qiita.com/nr-mito/private/d7f9f838d1c6ddeb8d70)で紹介しておりますので是非ご確認ください。

:::note info
このアップデートの詳細はこちら
[What's new
](https://docs.newrelic.com/jp/whats-new/2024/01/whats-new-01-18-nrql-q3-functions/  "What's new")その他アップデートの詳細はこちら
[New Relic アップデート(2024年1月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202401 "New Relic アップデート(2024年1月)")
[New Relic アップデート一覧
](https://newrelic.com/jp/blog/nerdlog/new-relic-update "New Relic アップデート一覧")
:::
:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::
:::note info
[New Relic株式会社のQiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::