みなさんこんにちは。
マネージドサービス部の福田です。
New Relicを触っているとNerdGraphについて
知りたいなーと思うようになりました。
そこでNerdGraphについて軽く検証してみたので
備忘録として検証内容を記事にまとめたいと思います。
NerdGraphとは
NerdGraphとは、New Relicが提供するGraphQLベースのAPIになります。
NerdGraphで出来ること
NerdGraphで出来ることは以下になります
NewRelicのGUIで設定できることはほとんどNerdGraphで実現できるかと思います。
NewRelicに収集した情報を取得するクエリの実行。
New Relicの各機能 (アカウント設定、アラート、ダッシュボート)等 の設定
NerdGraphの詳細はNew Relicの公式ドキュメントをご確認ください。
NerdGraphのクエリ(GraphQL)の生成方法
自身で一からGraphQLのクエリを作成することも可能ですが
NewRelicが用意しているGraphiQL explorerを使用するとGraphQLの知識がなくても直感的にクエリを生成することができ簡単にクエリ実行が可能です。
以下クエリはCondition設定のCondition名およびConditionIDを取得する内容です。
(左がクエリ内容 右がクエリ実行結果)
下記 query の部分にGraphQL としてのクエリを指定することで
curlコマンドを使用してクエリを実行することも可能です。
curl -X POST https://api.newrelic.com/graphql \<br> -H 'Content-Type: application/json' \<br> -H 'API-Key: YOUR_NEW_RELIC_USER_KEY' \<br> -d '{ "query": "{ requestContext { userId apiKey } }" }'
また、既存の設定からGraphQL 情報を確認することも可能です。
以下はCondition情報からGraphQL を取得する方法
view as codeをクリックする
確認したいGraphQL情報を選択する(Terraformコードも確認できる)
検証内容
今回NerdGraphを用いて検証した内容
NewRelic内の情報を取得できるか
監視設定できるか
なお、今回は以下内容もあわせて確認したかったため
単純なcurlコマンドを使用したクエリ実行だけでなく
クエリを含んだスクリプトファイルを作成した検証も実施しております。
- 汎用的な作りにし、なるべく使いまわせるようにしたい
- 複数のクエリを一括で実行したい
検証結果
NewRelic内の情報を取得できるか
今回は既に設定しているMuting Rulesの情報を取得できるかを確認します
既存設定内容
クエリ結果
監視設定できるか
既存の情報を取得することはできたので今度は設定を作成できるか確認するため
Muting Rulesを新しく作成することにしました。
(ConditionやPolicyも同様の方法で作成可能でした)
GraphiQL explorerを使用せずにcurlコマンドを記載したスクリプトファイルを作成し設定をしていきます。
スクリプトファイルの内容も実行コマンドに変数を持たせてクエリ文を変更しないような作りにしてみました。
(検証ということで変数情報はファイルを分けずにスクリプトファイルに直接記載します)
##Test-muting-rules.sh #共通設定 API_KEY=YOUR_NEW_RELIC_USER_KEY ACCOUNT_ID=YOUR_NEW_RELIC_ACCOUNT_ID #一つ目の設定 NAME01="01" # DESCRIPTION01="https://docs.newrelic.com/jp/docs/apis/nerdgraph/get-started/nerdgraph-explorer/" ATTRIBUTE01="policyName" OPERATOR01="EQUALS" VALUES01="テスト1" START_TIME01="2020-12-01T14:00:00" END_TIME01="2024-11-01T12:00:00" REPEAT01="null" NERD_GRAPH01="mutation { alertsMutingRuleCreate(accountId: ${ACCOUNT_ID}, rule: {condition: {conditions: [{attribute: \\\"${ATTRIBUTE01}\\\", operator: ${OPERATOR01}, values: \\\"${VALUES01}\\\"}], operator: AND}, description: \\\"${DESCRIPTION01}\\\", enabled: true, name: \\\"${NAME01}\\\", schedule: {endTime: \\\"${END_TIME01}\\\", startTime: \\\"${START_TIME01}\\\", repeat: ${REPEAT01}, timeZone: \\\"Japan\\\"}}) {id}}" curl -s https://api.newrelic.com/graphql \ -H 'Content-Type: application/json' \ -H "API-Key: ${API_KEY}" \ --data-binary "{\"query\": \"${NERD_GRAPH01}\"}" #二つ目の設定 NAME02="02" DESCRIPTION02="https://docs.newrelic.com/jp/docs/apis/nerdgraph/get-started/nerdgraph-explorer/" ATTRIBUTE02="policyName" OPERATOR02="EQUALS" VALUES02="テスト2" START_TIME02="2022-12-02T14:00:00" END_TIME02="2026-11-02T12:00:00" REPEAT02="null" NERD_GRAPH02="mutation { alertsMutingRuleCreate(accountId: ${ACCOUNT_ID}, rule: {condition: {conditions: [{attribute: \\\"${ATTRIBUTE02}\\\", operator: ${OPERATOR02}, values: \\\"${VALUES02}\\\"}], operator: AND}, description: \\\"${DESCRIPTION02}\\\", enabled: true, name: \\\"${NAME02}\\\", schedule: {endTime: \\\"${END_TIME02}\\\", startTime: \\\"${START_TIME02}\\\", repeat: ${REPEAT02}, timeZone: \\\"Japan\\\"}}) {id}}" curl -s https://api.newrelic.com/graphql \ -H 'Content-Type: application/json' \ -H "API-Key: ${API_KEY}" \ --data-binary "{\"query\": \"${NERD_GRAPH02}\"}"
スクリプト実行結果
sudo sh Test-muting-rules.sh {"data":{"alertsMutingRuleCreate":{"id":"作成されたMutingRuleID"}}}{"data":{"alertsMutingRuleCreate":{"id":"作成されたMutingRuleID"}}}
作成されたMuting Rules一覧画面
作成されたMuting Rulesの詳細画面
(おまけ)Condition情報の取得結果を見やすくしてみた。
MutingRuleと同じようにcurlコマンドを記載したスクリプトファイルを用いてCondition情報を取得してみると
スクリプトの実行結果が羅列しており見づらかったです。
クエリで出力情報を多く指定するほど出力された結果は見づらくなるかと思います。
sudo sh Test-Condition-CPUGet01.sh {"data":{"actor":{"account":{"alerts":{"nrqlConditionsSearch":{"nextCursor":null,"nrqlConditions":[{"description":"value: key\r\nvalue: key \r\n","enabled":false,"entityGuid":"xxxxxxxxxxxx","expiration":{"closeViolationsOnExpiration":false,"expirationDuration":null,"openViolationOnExpiration":false},"name":"[テスト]CPU使用率のアラート,"nrql":{"query":"SELECT xxxxxxxxxxxx"},"policyId":"xxxxxxxxxxxx","signal":{"aggregationDelay":120,"aggregationMethod":"EVENT_FLOW","aggregationTimer":null,"aggregationWindow":60,"evaluationDelay":null,"evaluationOffset":null,"fillOption":"NONE","fillValue":null,"slideBy":null},"terms":[{"operator":"ABOVE","priority":"CRITICAL","threshold":90.0,"thresholdDuration":600,"thresholdOccurrences":"ALL"}],"type":"STATIC","violationTimeLimit":"THIRTY_DAYS","violationTimeLimitSeconds":2592000}],"totalCount":1}}}}}}
なのでPolicy内のCondition情報を取得するスクリプトに以下処理内容を追加してみました。
- クエリの結果が出力されたテキストファイルを作成
- テキストファイル内で文字列を整形する。
- 整形後テキストファイルを上書き保存する。
##Test-Condition-CPU-Get02.sh API_KEY=YOUR_NEW_RELIC_USER_KEY ACCOUNT_ID=YOUR_NEW_RELIC_ACCOUNT_ID POLICY_ID="YOUR_NEW_RELIC_POLICY_ID" NAME_LIKE="Condition名に含まれる文字列" NERD_GRAPH="{\"query\":\"{actor{account(id:${ACCOUNT_ID}){alerts{nrqlConditionsSearch(searchCriteria:{nameLike:\\\"${NAME_LIKE}\\\",policyId:\\\"${POLICY_ID}\\\"}){nextCursor nrqlConditions{name nrql{query} expiration{closeViolationsOnExpiration expirationDuration openViolationOnExpiration} policyId signal{aggregationDelay aggregationMethod aggregationTimer aggregationWindow evaluationDelay fillOption evaluationOffset fillValue slideBy} terms{operator priority threshold thresholdDuration thresholdOccurrences} type violationTimeLimitSeconds violationTimeLimit enabled description entityGuid } totalCount}}}}}\", \"variables\":\"\"}" # APIリクエストを実行し、結果を Test-CPUused.txtに保存 echo "${NERD_GRAPH}" | curl -s -X POST https://api.newrelic.com/graphql \ -H 'Content-Type: application/json' \ -H "API-Key: ${API_KEY}" \ -d @- > Test-CPUused.txt ###以下はクエリ結果を整形する処理(長いので省略)###
すると以下のように比較的見やすい結果を確認することができました。
また結果をテキストファイルに記載するので設定情報のテンプレートファイルを用意することで
差分チェックなどに活用できそうだなーと思いました。
sudo sh Condition-CPU-Get02.sh description:value:key value:key enabled:false entityGuid:xxxxxxxxxxxx expiration: closeViolationsOnExpiration:false, expirationDuration:null, openViolationOnExpiration:false Name: [テスト]CPU使用率のアラート query:SELECT xxxxxxxxxxxx aggregationDelay:120 aggregationMethod:EVENT_FLOW aggregationTimer:null aggregationWindow:60 evaluationDelay:null evaluationOffset:null fillOption:NONE slideBy:null operator:ABOVE priority:CRITICAL threshold:90.0 thresholdDuration:600 thresholdOccurrences:ALL type:STATIC violationTimeLimit:THIRTY_DAYS violationTimeLimitSeconds:2592000
まとめ
NerdGraphではNewRelicの情報取得から設定作業まで様々なことが実現可能です。
今まで画面上から設定していた作業もコマンドにより設定ができ業務の効率化にも繋がりそうです。
普段スクリプトをほとんどいじらない私がとりあえずのごり押しスクリプトファイルを用いて検証してみてもNerdGraphの可能性を感じることができたので
NerdGraphの機能をしっかりと活用できるよう引き続き色々試してみたいなと思いました。