ログ分析をより便利に!Datadogパイプラインの活用法【プロセッサー・後編】

この記事は「ウィルゲート Advent Calendar 2024」の 4日目の記事です。 adventar.org

こんにちは、インフラユニット所属の加藤です。

前編と後編分けてパイプラインの主要機能をご紹介しています。

後編の今回は、プロセッサー機能を紹介します。プロセッサー機能をマスターしてログから特定の情報を抽出したり、属性のリマッピング、データの変換、タグの追加などできるようになりましょう。

※前編はこちらのページをご覧ください。

プロセッサー機能とは

前編ではパイプラインの使い方として下記をご紹介しました。

1. フィルターで処理対象のログを絞り込む

2. プロセッサーを使用してログに必要な属性を付加する

後編の本記事では、2. プロセッサーを使用してログに必要な属性を付加する方法をご紹介します。

各プロセス

プロセッサーを使ったログの処理

それではプロセッサーの使い方を見ていきましょう。以下は、今回紹介するプロセッサーです。

プロセッサー 説明
Grokパーサー 非構造化ログを構造化ログへ変換するために利用します。例えば、Apacheアクセスログを構造化するには、DatadogのGrokパーサー設定で正規表現を定義して、必要な属性を抽出します。
ユーザーエージェントパーサー 構造化されたログ内のユーザーエージェント情報からOS、ブラウザ、デバイスなどの詳細を自動で抽出します。
カテゴリープロセッサー 特定の条件に応じてログに新しい属性(カテゴリ)を設定するプロセッサーです。主に、ステータスコードや特定のメタデータに基づいてログレベル(INFO、WARNINGなど)を割り当て、分類やフィルタリングをしやすくします。これにより、ログの分析やアラート設定が容易になります。
ログステータスリマッパー ログに公式のステータス属性を設定し、色分け表示や視覚的な区別ができるようにするプロセッサーです。たとえば、ERRORやWARNINGのログを強調表示することで、異常検知や迅速な対応が可能になります。

それでは、プロセッサーの設定方法を個別に見ていきましょう。

Grokパーサー

Grokパーサーは、非構造化ログを構造化ログに変換するためのパーサーです。

今回は、Apacheのアクセスログの例を使用して、設定方法を解説します。

127.0.0.1 - - [07/Nov/2024:14:00:01 +0900] "GET /index.html HTTP/1.1" 200 1024 "https://example.com/home" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"

まず、先ほど作成したパイプライン内でAdd Processorをクリックします。

Add Processor

次に、Select the processor typeGrok Parserを選択します。

Grok Parserを選択

Grok Parserの設定画面が表示されます。

Grok Parser作成画面

各項目について説明しましょう。

項目 説明
Name the processor プロセッサーの名前
log samples サンプルログを貼り付け、パースルールが正しく動作するか確認します。
Define parsing rules パースルールを定義し、非構造化ログから属性を抽出できるようにします。

次はAdvanced settingsです。

項目 説明
Name the processor デフォルトは message 属性の値をパースしますが、別の属性を指定できます。
Helper Rules パースルールで再利用するための補助ルールを定義できます。

設定が完了したら、サンプルログを log samples に貼り付けましょう。すると、現状ではNOT MATCHと表示され、パースルールが未定義のためログが構造化されていないことがわかります。

127.0.0.1 - - [07/Nov/2024:14:00:01 +0900] "GET /index.html HTTP/1.1" 200 1024 "https://example.com/home" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"

パースできていない

ここでは公式が提供するApache用のパースルールを流用します。

Define parsing rules

access.common %{_client_ip} %{_ident} %{_auth} \[%{_date_access}\] "(?>%{_method} |)%{_url}(?> %{_version}|)" %{_status_code} (?>%{_bytes_written}|-)

access.combined %{access.common} "%{_referer}" "%{_user_agent}"

Helper Rules

_auth %{notSpace:http.auth:nullIf("-")}
_bytes_written %{integer:network.bytes_written}
_client_ip %{ipOrHost:network.client.ip}
_version HTTP\/%{regex("\\d+\\.\\d+"):http.version}
_url %{notSpace:http.url}
_ident %{notSpace:http.ident:nullIf("-")}
_user_agent %{regex("[^\\\"]*"):http.useragent}
_referer %{notSpace:http.referer}
_status_code %{integer:http.status_code}
_method %{word:http.method}
_date_access %{date("dd/MMM/yyyy:HH:mm:ss Z"):date_access}

ここで、Define parsing rulesHelper Rulesの関係を見てください。

Helper Rulesで定義された_auth_bytes_writtenが、Define parsing rules%{_auth} %{_bytes_written}と再利用されているのが分かります。

Helper Rulesを使用することで、共通のパースルールを一度定義し、複数の場所で再利用できるため、設定の簡潔化や保守性の向上が図れます。

設定するとパースできました。

パースできた

これで設定が完了したので、Createをクリックしてパイプラインにプロセッサーを追加しましょう。

Apache access log Grok Parser追加

Log Explorerから対象のログを確認してみましょう。

Log Explorerからログを確認

ログが構造化され、Attributesにさまざまな属性が追加されたことを確認できました。このように、Grokパーサーを活用することで、ログを簡単に構造化できます。

Grok パーサーによってAttributesが追加された

ユーザーエージェントパーサー

ユーザーエージェントパーサーを使用して、構造化ログ内のhttp.useragent属性からOS、ブラウザ、デバイス情報を抽出する方法も試してみましょう。

"attributes": {
    "http": {
        "useragent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
        }
}

http.useragentの該当箇所

パイプラインにUser-Agent Parserを追加し、以下の設定を行います。

項目 説明
Set User-Agent attribute ユーザーエージェントの属性を指定します。
Set target attribute path 抽出したOS、ブラウザ、デバイス情報を設定する属性を指定します。

User-Agent Parser作成

User-Agent Parserがパイプラインに追加されました。

パイプラインにUser-Agent Parser追加

Log Explorerで確認すると、http.useragent_details属性が追加されているのが確認できます!

"attributes": {
    "http": {
        "useragent_details": {
            "os": {
                "major": "10",
                "family": "Windows"
            },
            "browser": {
                "patch": "0",
                "patch_minor": "0",
                "major": "114",
                "minor": "0",
                "family": "Chrome"
            },
            "device": {
                "family": "Other",
                "category": "Desktop"
            }
        }
}

http.useragent_detailsの該当箇所を抜粋。 また、画像だと分かりづらいため、テキストを張り付けています。

このように、Datadogのプロセッサーを利用することで、さまざまな属性を自動的に付加でき、ログの可視性と分析力が向上します。

カテゴリープロセッサーとログステータスリマッパーの合わせ技

最後に、カテゴリプロセッサーとログステータスリマッパーを組み合わせて使用する方法をご紹介します。

この設定により、ログにステータスを付与して、視覚的に分析しやすくなります。まずは、ステータスが設定されていない状態と設定されている状態を比較してみましょう。

Statusが紐づけられていない状態
Statusが紐づけられている

このように、ステータスを設定することでログレベルが色で表現されるため、視覚的にわかりやすくなります。

それでは、カテゴリープロセッサーとログステータスリマッパーを順に設定方法を説明します。

カテゴリープロセッサー

カテゴリープロセッサーを使用すると、条件に応じて新しい属性を設定できます。今回は、ステータスコードに応じてログレベルを設定します。

ステータス ログレベル
200番台 INFO
300番台 NOTICE
400番台 WARNING
500番台 ERROR

まずはパイプラインにCategory Processorを追加します。主な設定項目は以下の通りです。

項目 説明
Set target category attribute カテゴリープロセッサーで分類した値を設定する属性を指定します。
Populate category 条件式と一致した場合に設定する値を指定します。
Review added entries 追加されたエントリ一覧が表示されます。

また、Populate categoryの設定項目は以下の通りです。

項目 説明
All events that match ここには条件式を指定します。この条件に一致するログイベントが処理対象となります。たとえば、@http.status_code:2*は、HTTPステータスコードが200番台のすべてのイベントを対象とすることを意味します。
Appear under the value name 条件に一致したログに設定する値やラベルを指定します。この例では、HTTPステータスコードが200番台のイベントにINFOというログレベルが付与されます。

それでは、200番台のステータスコードをINFOレベルに紐づけましょう。設定値は以下の通りです。

All events that match Appear under the value name
@http.status_code:2* INFO

設定後、Addをクリックすると、エントリが追加されます。

Category Processorの設定方法

残りのエントリも同様に追加し、Createをクリックしてプロセッサーを作成します。

All events that match Appear under the value name
@http.status_code:3* NOTICE
@http.status_code:4* WARNING
@http.status_code:5* ERROR

Category Processorのエントリ追加完了

パイプラインにCategory Proccessorを追加

これで、log_level属性が作成されたことを確認できます。

"attributes": {
    "log_level": "ERROR",
}

log_levelの該当箇所を抜粋

しかし、この時点ではログの色は変わりません。これは、公式なステータスとしてlog_levelがまだ紐づけられていないためです。

Errorでも色が変わらない

ステータスとlog_levelを紐づけるためにログステータスリマッパーを使いましょう。

ログステータスリマッパー

次に、ログステータスリマッパーを使用してlog_levelを公式なステータスとして紐づけます。

項目 説明
Set status attribute(s) 公式ステータスとしてセットする属性を指定します。

Status Remapperを設定

パイプラインにログステータスリマッパーが追加されました。

パイプラインにStatus Remapperを追加

それではLog Explorerを見てみましょう。

Log Explorerで確認すると、ログが色分けされて表示されています!

ステータスが設定されたログ一覧

個別のログも、各ログレベルが一目でわかるようになっています。

WARNINGレベルのログ

ERRORレベルのログ

その他のプロセッサー

今回、代表的なGrokパーサーといくつかプロセッサーを紹介しましたが、Datadogには他にも便利なプロセッサーが多数用意されています。

公式ドキュメントを参考にして、ぜひ他のプロセッサーも試してみてください。

まとめ

前編と後編を通じて、Datadogのパイプライン機能を活用し、ログの構造化や属性を追加する方法を解説しました。パイプラインを使用することで、非構造化ログを解析しやすい形式に変換し、Datadogでのフィルタリングや可視化、アラート設定を効果的に行えるようになります。

ご紹介したプロセッサー以外に、Datadogには公式ドキュメントで紹介されている多様なプロセッサーが用意されているため、用途に応じて組み合わせることで、ログ管理をより効率的に行うことができます。

ぜひ、パイプラインを活用して分析を便利にしていきましょう。

「ウィルゲート Advent Calendar 2024(https://adventar.org/calendars/10272)」、翌日は大嶋さんによる「 保守開発チームの効果的な目標設定と実績管理法 」です。 お楽しみに!

参考文献

docs.datadoghq.com

docs.datadoghq.com

zenn.dev