えいのうにっき

a-knowの日記です

Webサーバーアクセスログの分析と監視 〜 mackerel-plugin-accesslog を読み解く

この記事は、Mackerel アドベントカレンダー(全部CRE)の13日目の記事です。

今回は、昨年の「全部CRE」アドベントカレンダーに敬意を表して、そのフォーマットにならい、Mackerelの公式プラグインのうちのひとつ・mackerel-plugin-accesslog について解説をしていきたいと思います!

github.com

当記事が前提とするバージョン

この記事を書いている今の最新版である、mackerel-agent-plugins の v0.53.0 を前提としています。

Releases · mackerelio/mackerel-agent-plugins · GitHub

どんなプラグイン?

mackerel-plugin-accesslog は、Apacheログフォーマット、もしくはLTSV形式で出力されたアクセスログを解析し、各種グラフを出力できるプラグインです。いわゆる nginx や Apache などのWebサーバーのアクセスログの解析にもってこいのプラグインです。

https://user-images.githubusercontent.com/177122/27474076-22f7defc-583c-11e7-84ee-1679e5164358.png

インストールと設定手順

mackerel-plugin-accesslog プラグインは、プラグイン集として提供しているパッケージ、 mackerel-agent-plugins に含まれています。以下のようなコマンドでインストールすることができます。

$ yum install mackerel-agent-plugins
$ apt-get install mackerel-agent-plugins

詳細は下記ヘルプページも参照してください。

https://mackerel.io/ja/docs/entry/howto/mackerel-agent-plugins

インストール先は /usr/bin/mackerel-plugin-accesslog です(他のプラグインも同じ場所にインストールされています)。

このプラグインに限らず、Mackerelのプラグインは要はコマンドですので、手動で実行する事ができます。

$ mackerel-plugin-accesslog /var/log/nginx/access.log
accesslog.access_rate.5xx_percentage    0  1544513887
accesslog.access_rate.4xx_percentage    0  1544513887
accesslog.access_rate.3xx_percentage    0  1544513887
accesslog.access_rate.2xx_percentage    100    1544513887
accesslog.latency.99_percentile 0.001000  1544513887
accesslog.latency.95_percentile 0.001000  1544513887
accesslog.latency.90_percentile 0.001000  1544513887
accesslog.latency.average   0.000600  1544513887
accesslog.access_num.total_count    5  1544513887
accesslog.access_num.5xx_count  0  1544513887
accesslog.access_num.4xx_count  0  1544513887
accesslog.access_num.3xx_count  0  1544513887
accesslog.access_num.2xx_count  5  1544513887

設定ファイルである mackerel-agent.conf は、デフォルトでは /etc/mackerel-agent/mackerel-agent.conf にインストールされます。mackerel-plugin-acceslog を使う際の conf への追記内容などは、README.md に記載されていますので、ご確認ください。

mackerel-agent-plugins/README.md at master · mackerelio/mackerel-agent-plugins · GitHub

conf への追記ができたら、mackerel-agentを再起動することで設定完了です。

取得されるメトリック

このプラグインにより取得され、Mackerelにグラフ描画されるメトリックについて、以下に各グラフ定義ごとに説明します。

Access Num

ラベル名 メトリック名 説明
total_count custom.accesslog.access_num.total_count 1分間での総アクセス回数。
5xx_count custom.accesslog.access_num.5xx_count 1分間にあったアクセスのうち、ステータスコード 5xx で返したものの数。
4xx_count custom.accesslog.access_num.4xx_count 1分間にあったアクセスのうち、ステータスコード 4xx で返したものの数。
3xx_count custom.accesslog.access_num.3xx_count 1分間にあったアクセスのうち、ステータスコード 3xx で返したものの数。
2xx_count custom.accesslog.access_num.2xx_count 1分間にあったアクセスのうち、ステータスコード 2xx で返したものの数。

グラフはこんなかんじなものが描画されます。

f:id:a-know:20181211171253p:plain

Access Rate

ラベル名 メトリック名 説明
5xx_rate custom.accesslog.access_rate.5xx_percentage 1分間にあったアクセスのうち、ステータスコード 5xx で返したものの割合。
4xx_rate custom.accesslog.access_rate.4xx_percentage 1分間にあったアクセスのうち、ステータスコード 4xx で返したものの割合。
3xx_rate custom.accesslog.access_rate.3xx_percentage 1分間にあったアクセスのうち、ステータスコード 3xx で返したものの割合。
2xx_rate custom.accesslog.access_rate.2xx_percentage 1分間にあったアクセスのうち、ステータスコード 2xx で返したものの割合。

グラフはこんなん↓です。

f:id:a-know:20181211171325p:plain

Latency

ラベル名 メトリック名 説明
Average custom.accesslog.latency.average 1分間にあったアクセスのレイテンシの平均値。
90 Percentile custom.accesslog.latency.90_percentile 1分間にあったアクセスのレイテンシの、90パーセンタイル値。
95 Percentile custom.accesslog.latency.95_percentile 1分間にあったアクセスのレイテンシの、95パーセンタイル値。
99 Percentile custom.accesslog.latency.99_percentile 1分間にあったアクセスのレイテンシの、99パーセンタイル値。

こちらもグラフをどうぞ!

f:id:a-know:20181211171354p:plain

利用可能なオプション

-metric-key-prefix

このプラグインで取得されるメトリック、描画されるグラフのラベルなどに prefix を付与することができます。これを活用することにより、ひとつのホスト内で複数のアクセスログを解析することも可能です。こんな↓かんじ。

[plugin.metrics.accesslog]
command = "mackerel-plugin-accesslog /var/log/nginx/access.log"

[plugin.metrics.accesslog_test]
command = "mackerel-plugin-accesslog -metric-key-prefix test /var/log/nginx/access_test.log"

パース対象のアクセスログファイルは必ず最後に指定しなければいけない(ログファイルは引数として指定されることを期待している(最初の引数を対象ファイルとする))ので、その点は要注意です。

-format

ちょっと内部実装の話になってしまいますが、このプラグインが対象のログファイルを読み込む際、その内容のパースだけでなく「これは Apache ログフォーマットか」「LTSVフォーマットか」というところの類推も含めて、Songmu/axslogparser を用いています。

フォーマットの類推は意外に(?)シンプルで、 \thost:\ttime: の文字列が含まれていれば LTSV フォーマット・それ以外なら Apache ログフォーマット、としてパースを試みます。もしこれでうまく識別ができない、といった場合には、-format オプションを使って監視対象ログファイルの形式を外部から指定することができます。

[plugin.metrics.accesslog]
command = "mackerel-plugin-accesslog -format ltsv /var/log/nginx/access.log"

Apache ログフォーマットとして指定したい場合は -format apache と指定してください。

-no-posfile

mackerel-agent に設定された mackerel-plugin-accesslog は、基本的に毎分、エージェントにより起動され、前回走査した位置(これを posfile として tmp に出力しています)から最後に出力されている情報までを対象に各種メトリックを計算して出力しています。

このオプションを指定すると、posfile を使わなくなります。つまり、毎回の走査をアクセスログ全件に対して実施する形になります。

[plugin.metrics.accesslog]
command = "mackerel-plugin-accesslog -no-posfile /var/log/nginx/access.log"

基本的には使用しないオプションかと思いますが、動作確認にはご利用いただけるかと思います。

まとめ

Webサーバーのアクセスログを解析するのに便利なプラグイン、mackerel-plugin-accesslog を解説しました。そのサーバーへのアクセス状況がカラフルなグラフで描画される様子は、見ているだけでとても楽しいものです。知らなかった・導入していなかった、という方は、ぜひこの機会にお試しいただけたらと思います!