【New Relic】NerdGraphを使ってAPMのトランザクション情報を取得してみる

# はじめに
アプリからNRQLを実行する際に「Insights API」を使っていたが、現在はdeprecatedになっている。

ドキュメントにあるように、現在は「NerdGraph」を利用することが推奨されている。

>このAPIは、今ではNew Relicデータをクエリする優先方法ではありません。NerdGraphを使用してクエリしてください。
>引用 : https://docs.newrelic.com/jp/docs/apis/insights-apis/query-insights-event-data-api/

NerdGraphを利用した形に置き換えるために、今回はこのNerdGraphを使ったNRQLの実行について調べたことをまとめる。

# NerdGraphとは
New Relicのデータの参照や各種機能の設定を行うための、GraphQL形式のAPI。

参考: https://docs.newrelic.com/jp/docs/apis/nerdgraph/get-started/introduction-new-relic-nerdgraph/

## NerdGraphでできること
1. NRDB内の情報を取得するクエリの実行。
2. New Relicの各機能 (アカウント設定、アラート、ダッシュボード等) の設定

NerdGraphではイベントデータの取り込みはできない。別のAPI (データインジェスト用API) を利用する。
https://docs.newrelic.com/jp/docs/apis/intro-apis/introduction-new-relic-apis/#data-type-apis 

今回は上記1の、データ取得のためのNRQL実行のリクエストを送る。

# クエリする
## APIキーの用意
NerdGraphの認証にはUser API Keyが利用される。事前このAPIキーを用意しておく。

https://docs.newrelic.com/jp/docs/apis/intro-apis/new-relic-api-keys/#user-api-key 

## 今回のNRQL文
今回は、APMのトランザクション情報を取得するクエリとして、以下のNRQLを実行する。

```sql
SELECT * FROM Transaction
```

## GraphiQLエクスプローラーでクエリ
用意されているGraphiQLエクスプローラーを利用し、ブラウザ上で実行が可能。
https://api.newrelic.com/graphiql

Query

```json
{
  actor {
    account(id: xxxxxxx) {
      nrql(query: "SELECT * FROM Transaction") {
        results
      }
    }
  }
}
```

参考: https://docs.newrelic.com/jp/docs/apis/nerdgraph/examples/nerdgraph-nrql-tutorial/

NerdGraphの各フィールド情報やdocを参照しながらクエリを作成できるため簡単にクエリの検証ができる。

参考画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241369/7485cd88-73df-01e1-f6c5-97cde037e8b3.png)

## cURLでクエリ
`https://api.newrelic.com/graphql` に対してPOSTリクエストする。

```
curl https://api.newrelic.com/graphql \
  -H 'Content-Type: application/json' \
  -H 'API-Key: NRAK-xxxx' \
  --data-binary '{"query": "{\n  actor {\n    account(id: xxxxxxx) {\n      nrql(query: \"SELECT * FROM Transaction\") {\n        results\n      }\n    }\n  }\n}\n"}'
```

※ API keyとアカウントIDを指定する。

## Pythonでクエリ
※ Python 3.8を使用

GraphQLのクライアントモジュールである `gql` を使う
https://github.com/graphql-python/gql 

```python
pip install gql==2.0.0
```

コード

```python:app.py
from gql import gql, Client
from gql.transport.requests import RequestsHTTPTransport

api_key = "XXXX"  # your nr user api key
nr_id = "xxxxxxx"  # your nr account id

query_text = "SELECT * FROM Transaction"

url = "https://api.newrelic.com/graphql"
headers = {
    "API-Key": api_key,
    "Content-type": "application/json",
}

transport = RequestsHTTPTransport(url=url, headers=headers)
client = Client(transport=transport, fetch_schema_from_transport=True)

query = gql(
"""
{
  actor {
    account(id: %s) {
      nrql(query: "%s") {
          results
      }
    }
  }
}
""" % (nr_id, query_text)
)

result = client.execute(query)

query_results = result["actor"]["account"]["nrql"]["results"]
print(query_results)
```
※ API keyとアカウントIDを指定する。

実行

```bash
python app.py
```

# まとめ
NewRelic上のデータを参照する方法として、GraphQLベースのAPIであるNerdGraphの利用が現在は推奨されている。
GraphQL形式であるため、各言語のGraphQLクライアントを使ってリクエストすることもできる。

今回はNRQLの実行に焦点を当てたが、他にもダッシュボードやアラートコンディションの作成や埋め込みURLの生成等、NerdGraphの用途はたくさんあり、それぞれチュートリアルドキュメントも用意されているため、それぞれまた活用していきたいと思う。

https://docs.newrelic.com/jp/docs/apis/nerdgraph/get-started/introduction-new-relic-nerdgraph/#tutorials