New Relicに限らずだけど、なにかしらの作業を行なっている時に、UI上で表示されている複数のデータを取得したいけど、UI上の内容をコピー&ペーストしてもうまくいかないし…取得できても変な改行が入ったり、逆に全部が一行になってしまったり…なんて経験したことがある人は多いんじゃないかな?直接データをコマンドで取得できれば、エンジニアのみんななら、そのあとはコマンドを駆使して頑張れるんじゃないかな?そのための方法を簡単にまとめてみたよ。
はじめに
『インフラエンジニアが押さえておくべきコマンドTop10はなに?』とGeminiにきいてみたところ、以下の回答が。
- ip (またはifconfig
- ping
- ss (またはnetstat)
- curl
- dig (またはnslookup)
- top (またはhtop)
- df
- free
- grep
- tail
とのこと。非常に見慣れたメンツだよね。なんかトラブルシューティングを連想させるコマンドばかりで過去の辛い思い出がフラッシュバックしちゃうけど。。
今回は、インフラエンジニアが知らないといけないcurlコマンドを使ってNew Relicが提供しているNerdGraph API(Graph QLをベースにしたAPI)を叩いてみたよ。curlコマンドとAPI経由でサーバ情報を確認したり、発生したアラートの情報を取得するための簡単なステップをまとめてみたよ。
Terraform社からNew Relic Providerが提供されているよ。
設定作業を行う場合は、Terraformの本格導入を検討してね。
以下も参考にしてね
さっそく問題
問題1: New Relicに登録されているサーバ(Host)一覧を取得して
問題2: 特定のサーバのCPUとメモリの負荷を確認して
問題3: 特定のサーバに関連して発生したアラートを取得して
用意してほしいもの
無料のアカウントで試してみよう!
New Relic フリープランで始めるオブザーバビリティ!
New Relicの環境
- もし持っていない場合は、上記のQiita記事を参考にFreeの環境を取得してね
- 業務で既にNew Relicを使っているなら、その時に使っている業務用のメールアドレス以外のものでFreeの環境を取得してね
- New Relicの環境を取得したら、以下の情報を取得してね
curlコマンド + 使いやすいターミナル
これは日頃使い慣れている環境で用意してくれればいいよ。
環境に合わせて、セットアップ方法を確認してね。
さぁやってみよう
公式ドキュメントを確認すると、curlコマンドの場合、以下の形でリクエストを流ればいいことがわかるよね。
curl -X POST https://api.newrelic.com/graphql \
-H 'Content-Type: application/json' \
-H 'API-Key: YOUR_NEW_RELIC_USER_KEY' \
-d '{ "query": "{ requestContext { userId apiKey } }" }'
Content-TypeヘッダやAPI-Keyヘッダの値は固定の値になるから、POSTするbodyの中を気にすればいいということだよね。
もしcurlコマンドを試してもうまくいかない場合は、 -v のオプションを追加して、デバッグしてみてね。
curl -v -X POST ...
みたいな使い方だよ。
問題1: New Relicに登録されているサーバ(Host)一覧を取得して
サーバ一覧を取得するには以下の内容を送信する必要があるよ。
{
actor {
entitySearch(queryBuilder: {domain: INFRA, type: HOST}) {
results {
entities {
name
}
}
}
}
}
上記を一行に直すと...
{ actor { entitySearch(queryBuilder: {domain: INFRA, type: HOST}) { results { entities { name } } } } }
これをcurlコマンドのパラメータに直すと以下の通りだね。早速実行してみてね。
curl -X POST https://api.newrelic.com/graphql \
-H 'Content-Type: application/json' \
-H 'API-Key: <ここにAPIキーの値を入れてね>' \
-d '{ "query": "{ actor { entitySearch(queryBuilder: {domain: INFRA, type: HOST}) { results { entities { name } } } } }" }'
このスクリーンショットは、curlコマンドの結果をjqコマンドで整形したものだよ。

New RelicのUI上で表示される管理対象名(entity名)が一覧で表示されるよ。
New Relicにログインして、メニューからCacalogs -> Infrastructure --> Computeにアクセスして、curlコマンドの出力結果と比較してみてね。
問題2: 特定のサーバのCPUとメモリの負荷を確認して
FROM SystemSample
SELECT max(cpuPercent), average(cpuPercent), min(cpuPercent)
WHERE entityName = '取得したい対象のサーバ名'
SINCE 1 minutes ago
LIMIT MAX
上の例の'取得したい対象のサーバ名'は、問題1-1で得られたサーバ名を指定すればいいよ。
このQiita記事を書くために試した手元の環境はmacなのだけど、'取得したい対象のサーバ名'の'(シングルクォーテーション)の解釈が自動で行われてしまったので、curlコマンドの引数として渡すために少し工夫が必要だったよ。
もっと簡単にやる方法をご存知の方は、教えてね。
{
actor {
account(id: あなたのアカウントID) {
nrql(query: "実行したいNRQL") {
results
}
}
}
}
curl -X POST https://api.newrelic.com/graphql \
-H 'Content-Type: application/json' \
-H 'API-Key: <ここにAPIキーの値を入れてね>' \
-d '{ "query": "{ actor { account(id: あなたのアカウントID) { nrql(query: \"FROM SystemSample SELECT max(cpuPercent), average(cpuPercent), min(cpuPercent) WHERE entityName = '\'対象のentity名\'' SINCE 1 minutes ago LIMIT MAX\") { results } } } }" }'
"{ actor { account(id: 12345678) { nrql(query: \"FROM SystemSample SELECT max(cpuPercent), average(cpuPercent), min(cpuPercent) WHERE entityName = '\'hogehoge.example.com\'' SINCE 1 minutes ago LIMIT MAX\") { results } } } }"
NRQLで
WHERE entityName = 'hogehoge.example.com'
と記載するところを、
WHERE entityName = '\'hogehoge.example.com\''
と記載しているよ。
全体が ' (シングルクォーテーション)で囲まれているから、対象のホスト名を記載する手前で一旦シングルクォーテーションを使って閉じているよ。その後、すぐにシングルクォーテーションで後続の内容を囲んでいるよ。
SELECT句で記載した順ではなくて、アルファベット順で結果が表示されているね。
自分の環境で試してたのに、うまくいかない場合は、-dオプションに渡す文字列をechoコマンドとかを使ってどのような表示になるかを確認してね。コマンドラインでどんな風に解釈されているかが確認できるよ。
問題3: 特定のサーバに関連して発生したアラートを取得して
FROM NrAiIssue
SELECT toDatetime(createTime, timezone:'Asia/Tokyo') AS CreateTime, title, issueLink
WHERE event = 'create' and contains(entity.names,'取得したい対象のサーバ名')
SINCE 7 days ago
LIMIT MAX
entity.names属性が配列で値を持っているよ。例えば、対象アラートが複数のサーバで起きた場合には複数の値を配列として持っていることになるよ。
そのため、
WHERE ... and contains(entity.names,'取得したい対象のサーバ名')
と記述することで、気にしているサーバが対象のアラートを取得する様にしているよ。
curlコマンドとして送信したいqueryのValueとして送信したい内容は、問題2と同じだよ。
なので、その部分は割愛して、curlコマンド例を表示すると以下の通りだよ。
curl -X POST https://api.newrelic.com/graphql \
-H 'Content-Type: application/json' \
-H 'API-Key: <ここにAPIキーの値を入れてね>' \
-d '{ "query": "{ actor { account(id: あなたのアカウントID) { nrql(query: \"FROM NrAiIssue SELECT toDatetime(createTime, timezone:'\'Asia/Tokyo\'') AS CreateTime, title, issueLink WHERE event = '\'create\'' and contains(entity.names,'\'対象のentity名\'') SINCE 7 days ago LIMIT MAX\") { results } } } }" }'
"{ actor { account(id: 12345678) { nrql(query: \"FROM NrAiIssue SELECT toDatetime(createTime, timezone:'\'Asia/Tokyo\'') AS CreateTime, title, issueLink WHERE event = '\'create\'' and contains(entity.names,'\'hogehoge.example.com\'') SINCE 7 days ago LIMIT MAX\") { results } } } }"
以下が実行結果で、属性名をAS句で変えると更新された名前でソートされて表示されているね。
アラートが発生した日本時間やアラートの詳細を確認できるURLが表示されるのでレポートを作成する時とか便利そうだよね。

さいごに
試してみてどうだったかな?いつも参照しているNew RelicのUIとはまた違った自由があるよね。UIで参照ている情報を簡単に手元で使いたいなという場合に、curlコマンドを使う利点はあるんじゃないかな。
今回はデータを参照する方法を紹介したけど、次回はアラートをコピーする方法とかを紹介できればと思っているよ。結論としては...terraformの方が便利だけど、インフラエンジニアはcurlコマンドを使えないとね(うーーん)。
あとは...、頻繁に使う様だと思った、ダッシュボード化を検討してみてね。
New Relic株式会社のQiita Organizationでは、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
