New Relicのクエリ言語でJSONの解析が簡単にできるようになった！！

# はじめに
New Relicのクエリ言語NRQLの2024年1月のアップデートで、JSONを柔軟に解析できる新しい関数が登場しました！この記事ではそれぞれの関数の使い方を紹介します！


:::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 アップデート一覧")
:::

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

| 関数名 | 機能内容 |
| ---- | ---- |
| jparse() |JSONを解析し、値のマップ/リスト（またはネストされた構造）を生成します|
| mapKeys() | 解析されたJSONからキーを返します |
| mapValues() | 解析されたJSONから値を返します |

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

## jparse()
jparse() は、 文字列値を受け取り、値のマップまたはリスト (またはネストされた構造) を生成します。

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

例えば、下記のクエリでは、指定されたJSONデータから ID、名前、および特定の値を抽出します。
```sql
WITH '{"users": [{"name": "Hello", "id": 435}, {"name": "World", "id": 436}, {"name": "GetThisName", "id": 500}]}' as jsonString, 
     jparse(jsonString, 'users[*].id') as ids, 
     jparse(jsonString, 'users[*].name') as names, 
     jparse(jsonString, 'users[2].name') as getSpecificValue
SELECT ids, names, getSpecificValue
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/4f6139e1-926c-19c7-bc83-c3cbe81a6eb3.png" width="１50%">

[aparse()](https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#func-aparse) を使って、ログのmessageからJSONデータを抽出し、jparse()で特定の値を抽出してみます。

```sql
WITH '1693242121842: value=\'{"user": {"name": "John", "id": 5}}\', useless=stuff' as logMessage,
       aparse(logMessage, '%: value=\'*\'%') AS jsonString
SELECT jparse(jsonString, 'user.name') AS Name
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/cc909733-230c-4aa9-512a-7de024debaf6.png" width="１50%">

## mapKeys()
mapKeys()は、 マップが渡されると、すべてのキーのリストを抽出します。 

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


```sql
WITH '{"Field1": "exampleString", "Field2": false, "Field3": 100}' AS jsonString 
SELECT mapKeys(jparse(jsonString)) AS keys
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/3770ad18-767d-f322-c12f-e8bc0288c515.png" width="１50%">

ネストされたキーを含むJSONデータからキーのリストを抽出します。

```sql
WITH '{"value1": "test", "value2": {"nestedValue1": [1, 2, 3], "nestedValue2": 100}}' as jsonString
SELECT mapKeys(jparse(jsonString)) AS keys
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/f3236d53-d461-cb21-fb20-16e5882dafe1.png" width="１50%">

## mapValues()
mapValues() は、マップが入力として渡されると、すべての値のリストを抽出します。

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

```sql
WITH '{"Field1": "exampleString", "Field2": false, "Field3": 100}' AS jsonString 
SELECT mapKeys(jparse(jsonString)) as values
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/77bba3b7-fecf-25c8-a955-c8343276523e.png" width="１50%">

ネストされたキーを含むJSONデータから値のリストを抽出します。

```sql
WITH '{"value1": "test", "value2": {"nestedValue1": [1, 2, 3], "nestedValue2": 100}}' as jsonString
SELECT mapValues(jparse(jsonString)) AS values
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/cca91a9e-5fdd-2c7b-c4b2-71e006408014.png" width="１50%">

# まとめ
今回、２０２４年１月の機能アップデートで登場した[jparse()](https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#func-jparse) 、[mapKeys()](https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#func-mapKeys) 、[mapValues()](https://docs.newrelic.com/jp/docs/nrql/nrql-syntax-clauses-functions/#func-mapValues)のNQRLクエリ関数の使い方を紹介させていただきました。ログに含まれるJSONから必要なデータを簡単に抽出して、ダッシュボードで分析したり、アラート条件に指定するなどできますのでご活用ください！！


:::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株式会社のQiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::