🍏

New Relic × AWS × Terraform Tips集

に公開

はじめに ✨

この記事では、New Relic初心者🔰の私が New Relic × AWS × Terraform を組み合わせて監視環境を構築する中で直面した課題や学びをまとめました。

「NRQL の構文がよくわからない…」という基本的なつまずきから、「New Relicでどこを見ればいいの?」「Terraform で管理するには?」といった内容を、実際に試行錯誤した内容をベースに紹介しています。

同じようにNew Relicの導入や設定で悩んでいる方の参考になればうれしいです☺️

前提: Entity と NRQL の基礎 🐣

New Relic の設定を進めるうえで避けて通れないのが「Entity」と「NRQL」の理解です。
まずはこの2つの基本的な概念を押さえておきましょう。

Entity とは❓

New Relicでは、監視対象のリソースを「Entity」という単位で管理しています。
NRQLでのデータ取得や、Terraformでの設定対象もこのEntityをベースに指定します。

たとえば以下のようなリソースが該当します。

リソースの種類 Entity の例
アプリケーション APM で監視している Web アプリなど
インフラ EC2、オンプレサーバー等

それぞれの Entity には GUID(一意のID) が割り当てられており、NRQL や Terraform の中でこの GUID を使って特定できます。

Entity を理解しておくことで、対象の絞り込みやタグ管理、Terraformによる構成管理もやりやすくなります。

NRQL とは❓

NRQLは「New Relic Query Language」の略で、New Relicに格納されているさまざまなデータを調査、カウント、監視するためのクエリ言語です。

SQLに似た構文を持ちながら、時系列データの可視化やイベントドリブンの分析に特化しています。

以下の表は、SQLとNRQLの主な違いを示しています。
SQLの知識があれば、SQLとNRQLの主な類似点と相違点を理解することで、比較的スムーズに理解できるかと思います🎉

機能 SQL NRQL 解説
基本構文 SELECT, FROM, WHERE SELECT, FROM, WHERE 基本的な構文は似ている
データ対象 リレーショナルデータベースのテーブル イベント(Logs, Metrics など) NRQLは時系列データに特化
時間指定 BETWEEN '2023-01-01' AND '2023-01-02' SINCE 1 day ago UNTIL now NRQLでは直感的な時間指定が可能
集計関数 COUNT(), AVG(), SUM() など count(), average(), sum() など NRQLには時系列分析向けの特別な関数がある
グループ化 GROUP BY FACET 基本的には同様の機能
時系列分析 ウィンドウ関数や複雑なサブクエリを利用 TIMESERIES 句で簡単に可視化用の折れ線グラフ形式にできる NRQLでは時系列データの分析が非常に簡単
リレーション JOIN でテーブル結合 JOINは不可(異なるイベントタイプ間の関連付けはできない) イベントは基本的にフラットな構造の単体で扱う
データ制限 LIMIT LIMIT 結果数を制限する用途として同様に使用可能

このあとの記事本編では、この前提知識をもとに、実践で役立ったノウハウをご紹介していきます。

New Relicで苦戦したところ 😵‍💫

New Relicを使い始めて最初にぶつかった壁は、NRQLのクエリ作成でした。

なぜ難しい❓

NRQLのデータ対象の書き方にバリエーションが多く、生成AI先生に聞いてもなかなかいい回答がかえってこないことがあります🥹

同じようなデータを取得したい場合でも、データソースや連携方法(例:Infrastructureエージェント/CloudWatch Metric Streams/旧APIポーリング方式)によって、NRQLの属性名が異なります。

生成AIを使っても、New Relicの古い仕組みと最新の情報が混在しているため、回答が現在の推奨パターンではないNRQLであったり、前提となるデータ取得方法を明確にしないと、求めていたのとは違うクエリが返ってくることがあります。

バリエーションが多い、とは❓

たとえば「EC2インスタンスのCPU使用率を取得したい」という目的が同じでも、データの連携方法によって異なるクエリを書く必要があります。

  1. Infrastructureエージェントを使用した場合
SELECT average(`host.cpuPercent`) FROM Metric 

または

SELECT average(`cpuPercent`) FROM SystemSample

→ New RelicのInfrastructureエージェントを直接EC2にインストールしている場合の例です。詳細なホストメトリクスを取得できます。

host.cpuPercentは次元メトリクス移行で導入された属性で、SystemSamplecpuPercentを再構成しています。現在のNew Relic公式ドキュメントでは、新規実装にはhost.cpuPercent(Metricイベント)の使用を推奨しています。

  1. CloudWatch Metric Streamsを使用した場合
SELECT average(`aws.ec2.CPUUtilization`) FROM Metric 

→ AWSとNew RelicをCloudWatch Metric Streamsで連携しているケースです。EC2だけでなく他のAWSサービスのメトリクスも統一的に取得できるメリットがあります。

  1. APIポーリング方式を使用した場合
SELECT average(`aws.ec2.instance.cpuUtilization`) FROM Metric 

→ これは従来のAWS APIポーリング方式で連携している場合のクエリ例です。CloudWatch Metric Streamsと比較すると、ポーリング間隔が5分と長く、API制限の問題もあるため、現在は推奨されていません。

このように、「EC2のCPU値」を取得する場合でも、データの連携方法や新旧どちらの属性を利用するかによってNRQLの書き方が異なります。

Data explorer を活用する 🚀

Data explorerを使用すると、New Relic データベース (NRDB) に保存されているすべてのデータにアクセスできます。

New Relicで受け取っているイベントやログ、メトリクスなどのデータソースを一覧で確認できるため、「どんなデータ、どの属性が利用可能か」が分かります🔍

Data explorerを確認する方法

  1. New Relicの「Query Builder」画面に移動します
  2. 左のタブにある「Data explorer」を選択すると、取得しているLogやメトリクスの値が表示されます

サンプルの Dashboards の活用 📊

Dashboards とは、New Relicで特定のリソース(例:EC2、RDSなど)に紐づいたメトリクスを可視化するためのダッシュボードです。

New Relic の画面 Dashboards > Recommended Dashboards > View all より、さまざまなサンプルダッシュボードが確認できます。

ダッシュボードの各ウィジェットにNRQLクエリが使われており、これらをそのまま再利用したり、必要に応じてカスタマイズできます。

ダッシュボードのNRQLを確認する方法

  1. New Relicのダッシュボードに移動します
  2. 興味のあるウィジェットの右上にある「...」メニューをクリック
  3. 「Edit」を選択すると、そのウィジェットで使用されているNRQLクエリが表示されます

Terraform化 お役立ちポイント 📕

コードを確認する 👀

New RelicからリソースIDを特定し、そのIDを使ってterraform importすることで、既存のリソースをTerraformで管理できるようになります。

しかし、New Relicで定義するTerraformのリソース名(例:newrelic_alert_policy.foo)などがわからない場合があります。

そんなときには、New Relicの画面にある「</> View as code」ボタンが役立ちます。

このボタンをクリックすると、対象リソースをTerraformで構築した場合のコードが表示されます。これにより、必要なリソースタイプや属性名が明確になり、Terraformファイル作成の助けになります。

Entity にタグをつける 🏷️

タグとは、New Relic内のリソース(Entity)に対して自由に付与できるメタデータです。たとえば、environment: prod のようにタグを設定することで、クエリ上での絞り込みやアラート通知のON/OFFなどの制御がしやすくなります。

Terraformでタグを付与する際には、対象のEntityのGUID(一意のID)やタイプ、ドメインなどを特定する必要があります。
そこで役に立つのが NerdGraph API Explorer です。

NerdGraph API Explorerは、New Relicが提供するGraphQLベースのインターフェースで、Terraformで扱いたいEntityの情報を事前に調べるのに役立ちます。

以下は、Entity名に「azunyan」を含むリソースを検索し、その属性を一覧表示するクエリの例です。

{
  actor {
    entitySearch(queryBuilder: { name: "azunyan"}) {
      query
      results {
        entities {
          name
          type
          guid
          domain
        }
      }
    }
  }
}

このようにして取得した guid, type, domain などを Terraform 側で指定することで、該当のリソースに正確にタグを付与できます。

data "newrelic_entity" "foo" {
  name   = "Example application"
  type   = "APPLICATION"
  domain = "APM"
}

resource "newrelic_entity_tags" "foo" {
  guid = data.newrelic_entity.foo.guid

  tag {
    key    = "neko"
    values = ["nyaa", "nyaaaa-"]
  }
}

NerdGraph API Explorerへのアクセス方法

  1. New Relic画面上部のメニューから
     「All capabilities」→「Apps」→「NerdGraph API Explorer」 に移動します
  2. 「User key」フィールドに APIユーザーキー を入力し、「Submit」をクリック

APIキーは New Relic の Account settings → API keys から取得可能です。

参考🔗:NEWRELIC DOCUMENTATION - Resource: newrelic_entity_tags

おまけ:AWS と NewRelic のデータ連携がうまくいかないとき ☑️

この記事では NRQLやTerraform 化について中心に書いてきましたが、そもそも New Relic にデータが届いていないと何も始まりません。

設定は正しく行っているつもりでも、なぜかデータが連携されない…。
そんな予期せぬつまずきに遭遇することもあります。

そういうときは、原因を深掘りし続けるよりも、いったん落ち着いて距離を置くのもひとつの選択肢です。

つまり、そんな日は思い切って諦めてみましょう😇

🔷 実際に経験したケース

  • EC2へのInfrastructureエージェントのインストールが失敗(imcomplete)する
  • CloudWatch Metric StreamsとNewRelicを連携するCloudFormationでエラーが発生する

これらは翌日、同じ手順で再実行したら正常に完了したということがありました。

それでも解決しない場合は、設定の見直しや、New Relic公式ドキュメントの最新版を確認してみてください ✅

以上、この記事がどなたかの参考になれば幸いです 🙌
えみり〜でした|ωΦ)ฅ

参考 🔗

Discussion