はじめに
New Relicでログ監視設定をしている中でNRQLにmessage 属性入れてみたいなーと思いつつもできない。ぐぬぬ..
あれ? parse rule使って属性名変更すればいけるのでは?→ いけましたという話です
(04/14追記)workflowのエンリッチメントの機能は頭から抜けてました。
多分本来のparse ruleの使い方ではないです。
NRQLとは
NewRelic社が提供するクエリ言語です。
NRQLは「New Relic Query Language」の略称で、SQL(Structured Query Language)に似た構文を持っています。
NRQLを使うことで、NewRelic上に蓄積されたデータを以下のように抽出・分析することができます。
機能 | 説明 |
---|---|
データの抽出 (SELECT句) | 取得したいデータの属性を指定します。 |
データのフィルタリング (WHERE句) | 条件に合致するデータのみを抽出します。 |
データのグループ化 (FACET句) | 属性値ごとにデータをグループ化します。 |
データの集計 (COUNT、SUM、AVG、MAX、MIN) | 集計関数を使ってデータを集計します。 |
データの並び替え (ORDER BY句) | 指定した属性でデータを昇順/降順に並び替えます。 |
データの時間範囲指定 (SINCE句) | 指定した時間範囲のデータのみを抽出します。 |
NRQLは、NewRelic上のさまざまなデータソース(アプリケーションパフォーマンス、インフラストラクチャ、ログ、トレース、カスタムイベントなど)に対して使用できるため、NewRelic上の多様なデータを統合的に分析することができます。
FACET句にmessage属性を指定できない
おそらくmessage
属性がログなどのテキストデータを表すため
FACET句で指定すると大量の情報をグループ化することになり、多数のアラート発生や分析が困難になるためmessage
属性はFACET句に指定できないと思われます
NRQLでは、デフォルトではmessage
属性をFACET句で指定することができません。
通常、FACET句では、離散的な値を持つ属性(例えば、アプリケーション名、ホスト名など)を指定するのが適切です。
message
属性のようなテキストデータは、WHERE句でフィルタリングするなどして、分析の対象を絞り込むのが一般的な使い方です。
実際にFACET句にmessage
属性を指定し、NRQLの設定をすると以下エラーが出ます。
とはいえmessage
属性をNRQLに入れてみたい
前述のように、NRQLではmessage
属性をデフォルトではFACET句で指定できません。
しかしアラート文面にmessage
属性の内容を含めたい等を理由にNRQLへ入れたい場合があります。(わたしはありました。)
そこで登場するのがparse ruleです。
parse ruleとは
NewRelicでは、ログデータなどのテキストデータを構造化された形式で取り扱うために、「parse rule」を定義することができます。
parse ruleとは、ログデータ内のテキストを解析して、特定の属性値を抽出する設定のことです。
これにより、ログデータをNRQLで効果的に分析できるようになります。
例:プレーン テキストと混在したJSONの解析
NewRelicさんのparsing rule説明ページに記載されていた例です
たとえば、ログに日付/時刻の文字列がプレフィックスとして付けられている場合:
2015-05-13T23:39:43.945958Z {"event": "TestRequest", "status": 200, "response": {"headers": {"X-Custom": "foo"}}, "request": {"headers": {"X-Custom": "bar"}}}
このログ形式から JSON データを抽出して解析するには、次のparsingルールを作成します。
%{TIMESTAMP_ISO8601:containerTimestamp} %{GREEDYDATA:my_attribute_prefix:json}
結果のログは次のとおりです。
containerTimestamp: "2015-05-13T23:39:43.945958Z"
my_attribute_prefix.event: "TestRequest"
my_attribute_prefix.status: 200
my_attribute_prefix.response.headers.X-Custom: "foo"
my_attribute_prefix.request.headers.X-Custom: "bar"
parse ruleを適用することで、ログデータ内の重要な情報を構造化された形式で取り出すことができNRQLによる分析がより効果的に行えるようになります。
parse ruleを活用?しました
(再掲)多分本来のparse ruleの使い方ではないです。
ある設定でparsingルール触っていてふと思いました。
構造化できるのであれば単純に属性名も変更できるのでは・・
例えば、message
属性をlog_message
などに変更すればNRQLにmessage
内容を導入できるのでは??
できました
parse ruleでmessage
属性を別属性に変更することでFACET句に指定できました。
実施した手順は以下の通りです:
parse ruleを作成
message
属性の内容を別の属性(log_message
)に抽出する
・Parsing ruleの内容:%{GREEDYDATA:log_message}
parsingルールを作成後にNewRelicに送られたログ情報の一部です。
message
とlog_message
(parsingルール設定した内容)した内容が含まれておりました。
{
"log_message": "20240413 parsing test test.log:ERROR",
"message": "20240413 parsing test test.log:ERROR",
}
NRQLのFACET句で、log_message
属性を指定する
問題なく設定できました(アラート文面にも記載できました
FACET句で、log_message
属性を指定できたということは・・・
Issueの内のIncident Payloadにtag情報として登録されるということですね!
これでアラート設定にもlog_message
属性の値を活用できるようになりました
まとめ
- 本来NRQLのFACET句に使用できない
message
属性を別の属性に変換することで、FACET句として使用することが出来ます(本来の使い方かは微妙ですが)