本ブログは「How to parse logs with Grok patterns in New Relic」の抄訳となります。
このブログ記事の手順は、こちらのビデオを見ながらすすめることができます: Creating Log Parsing Rules in New Relic.
英語で火星人に由来する言葉はGrokだけかもしれません。Grokは、ロバート・A・ハインラインが1961年に発表したSF小説『異星の客』に登場します。しかし、この記事では、ログメッセージを解析するための業界標準としてのGrokに焦点を当て、それがNew Relicでどのように機能するかを説明します。
その前に、一般的にGrok解析がどのように機能するかについて少し説明します。
どのようなプラットフォームにおいても、ログの遠隔測定から最大限の価値を引き出すためには、ロギングバックエンドに送られる、構造化されていないメッセージを解析する能力が必要です。
以下のログと
{
“message”: “54.3.120.2 2048 0”
}
以下のログの違いについて考えてみましょう。
{
“host_ip”: “54.3.120.2”,
“bytes_received”: 2048,
“bytes_sent”: 0
}
3つの独立したフィールドを持つエンティティは、フリーテキストの塊よりも観察可能性の面で大きなメリットがあり、Grokではこの種の絞り込みを比較的容易に行うことができます。
Grokパターン %{SYNTAX:SEMANTIC}
を定義することで、ログメッセージ内の特定のデータを検索することができます。
SYNTAX
は、テキストにマッチするパターンの名前です。SYNTAX
ログに入る可能性のあるパターンには、NUMBER
、INT
、IP
など、非常によく使われるものがあります。NUMBER
パターンは、4.55、4、8、その他のあらゆる数字にマッチします。IPパターンは、54.3.120.2や174.49.99.1などにマッチします。 SEMANTIC
は、マッチしたテキストに与えられる識別子です。パターンがあなたのテキストにマッチした場合、識別子を持つフィールドがログレコードに作成されます。
つまり、"[IP address] [Bytes Received] [Bytes Sent]"
という形式のログメッセージ(例えば:"54.3.120.2 2048 0"
)があった場合、以下のGrokパターンを使ってその形式にマッチさせ、3つの有用なフィールドを抽出することができます。
"%{IP:host_ip} %{INT:bytes_received} %{INT:bytes_sent}"
処理後のログレコードには、host_ip
、bytes_received
、bytes_sent
の3つの新しいフィールドが追加されます。 これらのフィールドを オブザーバビリティプラットフォーム で使用することで、ログデータのフィルタリング、ファセット化、統計処理を行うことができます。
New RelicにおけるGrok解析の動作について
構文解析は、ログパイプラインのフォワーディング層またはバックエンドのいずれかで適用されます。New Relic はバックエンド解析を使用し、特定の指定されたログタイプに対する組み込み解析を提供していますが、解析 UI で任意の解析ルールを作成することもできます。
ビルトインの解析ルールもカスタムルールも、Grok パターンを使って、フリーテキストの文字列から有用な情報を抽出する方法を指定します。解析によって、バリューフィールドの統計分析、ファセット検索、フィルタなどの高度な機能を使用することができます。もし、データを分類して別々のフィールドに分けることができなければ、ワイルドカードや正規表現を使った煩雑な全文検索に頼ることになり、定量的な価値は低くなってしまいます。
New RelicにおけるビルトインGrokパターン
logtype
フィールドを持つすべての受信ログは、そのlogtype
に関連するビルトインパターンのリストと照合されます。 可能な場合、次の例で示すように、関連する内蔵のGrokパターンがそのログに適用されます。
ビルトイン解析に関するドキュメントはこちらをご参照ください。
New RelicでGrokのカスタムパターンを作成する
権限を持っていれば、Manage Parsing UIを使ってNew RelicでGrokパターンを作成、テスト、有効化することができます。
例えば、"Inventory Service "という名前のマイクロサービスがあるとします。 このサービスは、有用な情報を含む自由で構造化されていないテキストを含む特定のエラーログを出力します。
例えば次のような:
{
"entity.name": "Inventory Management",
"entity.type": "SERVICE",
"fb.input": "tail",
"fb.source": "nri-agent",
"hostname": "inventory-host-1",
"label": "inventory",
"level": "error",
"message": "Inventory error: out of memory processing thumbnail for product 7186",
"plugin.source": "BARE-METAL",
"plugin.type": "fluent-bit",
"plugin.version": "1.1.4",
"span.id": "e2056adfcaf06c15",
"timestamp": 1598046141558,
"trace.id": "3c517a62483f66ef5943143b4165c62e"
}
繰り返しになりますが、これは有用な情報です。しかし、もっと構造を持ったものにしたいものです。
フリーテキストのクエリを使ってUIでそのようなログを探すことはできますが、複雑で計算コストのかかる正規表現を使わずにNRQLでこのようなクエリを使うのは難しいでしょう。
その代わりに、必要な情報を抽出するための解析ルールを作成することができます。
Manage parsing > Create New Parsing Rule をクリックし、以下の手順を実行します。
- ルールに、"InventoryService Error Parsing "のような便利な名前を付けます。
- プレフィルターとして機能する属性/値のペアを入力します。これにより、このルールで処理する必要のあるログが絞り込まれ、不要な処理が削除されます。 ここでは、属性として "entity.name"、値として "Inventory Service "を選択します。
- Grokの解析ルールを追加します。この場合、次のようになります。
Inventory error: %{DATA:error_message} for product %{INT:product_id}
- Test Grokをクリックすると、Grokルールがシステムに入ってくるログのどれかにマッチするかどうかが表示されます。
- ルールを有効にし、Save parsing rule をクリックします。
すぐに、システムに入ってくるInventory Serviceのログに、error_message
とproduct_id
という2つの新しいフィールドが追加され、強化されていることがわかります。
これで、これらのフィールドを使ったクエリを使用して、データエクスプローラーにビジュアライゼーションを作成することができます。
Grokパターンを開発するためのツールとリソース
Grok Debuggerは、Grokパターンを実験するための非常に便利なUIです。これは、New Relic で使用できる本番用の Grok パターンを作成するための IDE のようなものだと考えてください。
次のようにサンプルのログの内容と、マッチさせたいパターンを入力します。
パターンがサンプルの内容と一致すれば、抽出されたフィールドが表示されます。
構文に関しては、解析ルールを作成する際に頻繁に使用する必要がある、より便利なGrokパターンのサブセットをご紹介します。
SYNTAX | データ例 (クォートは除外) |
---|---|
SYNTAX%{IP} | データ例 (クォートは除外)“73.241.172.237” |
SYNTAX%{IPV4} | データ例 (クォートは除外)“73.241.172.237” |
SYNTAX%{IPV6} | データ例 (クォートは除外)“2001:0db8:85a3:0000:0000:8a2e:0370:7334” |
SYNTAX%{IPORHOST} | データ例 (クォートは除外)“cache1.acme.com” |
SYNTAX%{INT} | データ例 (クォートは除外)-365 |
SYNTAX%{POSINT} | データ例 (クォートは除外)77 |
SYNTAX%{NUMBER} | データ例 (クォートは除外)44.5 |
SYNTAX%{WORD} | データ例 (クォートは除外)SOMEWORD |
SYNTAX%{DATA} | データ例 (クォートは除外)“SOME DATA” |
SYNTAX%{NOTSPACE} | データ例 (クォートは除外)“&XYZSOMETEXT&” |
SYNTAX%{SPACE} | データ例 (クォートは除外)" " |
SYNTAX%{TIMESTAMP_ISO8601} | データ例 (クォートは除外)“2020-08-19T15:59:49.439513Z” |
SYNTAX%{UNIXPATH} | データ例 (クォートは除外)“/tmp/mypath” |
Grok Debuggerには、Grokパターンとその基礎となる正規表現の定義のより詳細なリストがあります。
まとめ
お客様のログのメッセージフィールドに、有用で人間が読める情報が含まれており、何らかの明白な構造を持っている場合、Grok の解析でそのデータを正規化することをご検討ください。そうすることで、ログがファーストクラスのエンティティになり、APM やインフラストラクチャ・モニタリング・エージェントからの他のイベントと同じように、NRQL でクエリしたり、ダッシュボードやアラートで使用したりすることができます。
次のステップ
ログデータからそのような価値を引き出す方法がわかったところで、New Relicの無料アカウントにサインアップし、Full-Stack Observabilityの一部であるLogs in Contextを手に入れましょう。
本ブログに掲載されている見解は著者に所属するものであり、必ずしも New Relic 株式会社の公式見解であるわけではありません。また、本ブログには、外部サイトにアクセスするリンクが含まれる場合があります。それらリンク先の内容について、New Relic がいかなる保証も提供することはありません。