【自動化】NRQLとAPIでデータを自在に操る|ネットワーク可観測性エンジニアへの道

収集したデータをプログラムから自在に扱い、監視の自動化を実現するための第一歩となるNRQLとNerdGraph APIの基礎を解説します。

公開済み 所要時間:約 1分

この記事では、収集したネットワークデータをプログラムから自在に扱い、監視の自動化を実現するための第一歩となる、2つのコア技術NRQLNerdGraph APIの基礎を解説します。

本記事のゴールは、複雑な自動化パイプラインを「構築する」ことではありません。その実現に不可欠な技術の基礎をマスターし、それらがもたらす自動化の可能性を深く理解することです。

 

第1部:【実践編】NRQLクエリ入門 〜対話形式でデータから答えを引き出す〜

 

これまでの回で、私たちはSNMP、Syslog、Flowといった様々なネットワークデータをNew Relicに集めてきました。しかし、ただ集めるだけでは、データは宝の持ち腐れになってしまいます。

ここで登場するのがNRQL (New Relic Query Language) です。NRQLは、New Relic プラットフォームに蓄積された膨大なデータと「対話」し、人間が知りたい答えだけを的確に引き出すための、強力な問い合わせ言語です。SQLに似た構文なので、データベースを扱ったことがある方ならすぐに馴染めるかと思います。

それでは早速、お使いのNew Relic環境の左メニューから Query your data を開き、Query builder を起動して、これまでのデータにいくつか質問を投げかけてみましょう。

 

質問1(SNMP):「過去6時間で、CPU使用率の平均が最も高かった機器トップ5は?」

 

平常時のリソース状況を把握し、キャパシティプランニングに役立てるためのクエリです。

SELECT average(kentik.snmp.CPU) FROM Metric WHERE metricName = 'kentik.snmp.CPU' FACET device_name SINCE 6 hours ago LIMIT 5
  • SELECT average(...): kentik.snmp.CPU というメトリックの平均値を計算します。
  • FROM Metric: Metric(指標値)タイプのデータを探します。
  • WHERE metricName = 'kentik.snmp.CPU': 数あるメトリックの中から、kentik.snmp.CPU という名前のものに絞り込みます。
  • FACET device_name: device_name (機器名)で結果をグループ分けします。
  • SINCE 6 hours ago: 過去6時間に期間を絞ります。
  • LIMIT 5: 結果を上位5件に絞り込みます。

このクエリを実行すれば、機器名とCPU使用率の平均値がリストアップされるはずです。

質問2(Syslog):「"fail" または "down" という単語を含むSyslogを、機器別・重要度別に集計して」

 

障害の予兆や発生状況を、膨大なSyslogの中から素早く見つけ出すためのクエリです。

SELECT count(*) FROM Log WHERE message LIKE '%fail%' OR message LIKE '%down%' FACET device_name, severity SINCE 1 day ago
  • SELECT count(*): 条件に一致したログの件数を数えます。
  • FROM Log: Logタイプのデータを探します。
  • WHERE message LIKE ...: messageフィールドに fail または down という文字列が含まれるものを探します。
  • FACET device_name, severity: 機器名と、Syslogの重要度(severity)の2つで結果をグループ分けします。

これにより、「どの機器で、どのレベルの危険なログが、どれだけ発生しているか」が一目瞭然になります。

質問3(Flow):「社内サーバー (172.17.0.0/16) から外部への通信で、最も通信量が多い宛先国は?」

 

意図しない、あるいは不審な外部通信を発見する、セキュリティ観点でのクエリです。

 

SELECT sum(in_bytes) FROM KFlow WHERE src_addr LIKE '172.17.%' AND dst_geo != 'Private IP' FACET dst_geo SINCE 3 hours ago
  • SELECT sum(in_bytes): 通信量(バイト数)の合計を計算します。
  • FROM KFlow: Flowデータを探します。
  • WHERE src_addr LIKE '172.17.%': 送信元IPアドレスが 172.17. で始まるもの(社内)に絞り込みます。
  • AND dst_geo != 'Private IP': 宛先がプライベートIPの通信を除外します。
  • FACET dst_geo: 宛先IPアドレスの国名でグループ分けします。

このクエリは、あなたの組織のデータが、世界のどこに向けて最も多く発信されているかを明らかにします。

このように、NRQLを使えば、様々なデータを組み合わせて、ダッシュボードを眺めているだけでは得られない深い洞察を得ることが可能です。ぜひ、ご自身のデータで色々な質問を試してみてください。

 

第2部:【基礎編】NerdGraph API入門 〜自動化への扉を開ける鍵〜

 

NRQLによるデータとの「対話」がいかに強力か、お分かりいただけたかと思います。しかし、この対話を毎回人間が手で行うのは大変です。

そもそもAPI(Application Programming Interface)とは、ソフトウェアやプログラム同士が情報をやり取りするための「公式な通用口」や「接続仕様」のことです。

ここで登場するのが NerdGraph API です。これは、New Relicのほぼ全ての操作をプログラムから実行できるようにするためのAPIであり、自動化への扉を開ける鍵となります。

まずは、APIを叩くための準備をしましょう。

  1. New Relic画面右下の人型アイコンをクリックし、API keys を選択します。
  2. Create key ボタンを押し、Key typeに User を選択、名前(例: my-automation-key)を入力してキーを作成します。
  3. 表示されたAPIキー(NRAK-で始まる文字列)を必ず安全な場所にコピーしてください。この画面を閉じると二度と表示できません。

準備ができたら、ブラウザで手軽に試せる NerdGraph API Explorer を使ってみましょう。左メニューの Apps から NerdGraph API explorer を選択してください。

先ほど取得したAPIキーをUser key: 欄に入力しSubmitをクリックします。
 

先ほどのNRQLクエリを、プログラムから実行してみます。以下のクエリを左側のペインに貼り付けてください。

query {
  actor {
    account(id: YOUR_ACCOUNT_ID) {
      nrql(query: "SELECT count(*) FROM Log WHERE message LIKE '%fail%' SINCE 1 day ago") {
        results
      }
    }
  }
}

YOUR_ACCOUNT_ID の部分を、ご自身のNew RelicアカウントIDに書き換えて、▶(実行)ボタンを押してみてください。右側のペインに、クエリ結果がJSON形式で表示されれば成功です。

 

このように、APIを使えば、コマンドラインや自作のスクリプトからNew Relicのデータを自在に取得・操作できるようになります。例えば、curlコマンドを使えばこのようになります。

curl -X POST https://api.newrelic.com/graphql \
     -H "Content-Type: application/json" \
     -H "API-Key: YOUR_API_KEY" \
     -d '{ "query": "query { actor { account(id: YOUR_ACCOUNT_ID) { nrql(query: \"SELECT count(*) FROM Log\") { results } } } }" }'

第3部:【未来編】"Network Observability as Code" の世界

 

さて、NRQLとAPIという2つの強力なツールが手に入りました。これらを組み合わせると、一体どのような未来が実現できるのでしょうか。

ここでご紹介したいのが "Network Observability as Code" という考え方です。 近年のクラウドネイティブな環境では、サーバーやネットワーク機器をコードで管理する "Infrastructure as Code" (IaC) が当たり前になっています。ならば、それらを監視するための設定(ダッシュボードやアラート)も、同じようにコードで管理し、インフラの変更と完全に同期させるべきではないか、というのがこの考え方の核心です。

例えば、「Terraformで新しい仮想ルーターがプロビジョニングされたら…」というシナリオを想像してみましょう。

  1. IaC (Terraform): ネットワークエンジニアがコードを修正し、新しいルーターがクラウド環境に追加されます。
  2. CI/CD (GitHub Actions): その変更を検知して、自動化パイプラインが起動します。
  3. 自動化スクリプト: パイプラインは、今回学んだツールを使って、以下の処理を全自動で実行します。
  • ktranslateの監視対象に自動追加

 

# パイプラインからktranslateホストにSSH経由などでコマンドを実行
docker exec ktranslate-snmp /ktranslate/ktranslate -snmp_discovery

NerdGraph APIで専用ダッシュボードを自動生成

# ダッシュボード定義のJSONファイルをAPIに送信し、ダッシュボードを作成
curl -X POST https://api.newrelic.com/graphql \
     -H "API-Key: $API_KEY" \
     -d '{ "query": "mutation { dashboardCreate(accountId: 123, dashboard: { ... }) { entity { guid } } }" }'

この仕組みが実現すれば、インフラの変更と、その可観測性の確保が完全に同期し、人手による監視設定の漏れや、設定の陳腐化が原理的に発生しなくなります。これこそ、NRQLとAPIがもたらす、ネットワーク監視の未来像なのです。

 

まとめ

 

今回は、ネットワーク監視の自動化に向けた最初の、しかし最も重要な一歩として、以下の2つの技術を学びました。

  • NRQL: データと対話し、深い洞察を得るためのクエリ言語。
  • NerdGraph API: NRQLの実行などをプログラムから行い、自動化を実現するための鍵。

これらのツールは、日々の運用業務を効率化するだけでなく、最終的には "Network Observability as Code" のような先進的なアプローチを実現するための、強力な武器となります。

 

次回予告: 第8回は「【最前線】ベンダーAPI連携の実装(Meraki公式連携)」。今回学んだ「APIという仕組みを使って外部と連携する」という考え方を応用し、SNMPのような汎用プロトコルでは得られない、よりリッチな情報をベンダーのクラウドプラットフォームから直接取得する「Cisco Meraki API連携」に挑戦します。ご期待ください。

無料トライアル
New Relic Logo
記事で学んだオブザーバビリティを、今すぐ体感する。
無料アカウント作成
New Relic Now オンラインイベントで新機能を発表しました。
今すぐ登録