do_su_0805's blog

dairyquestions は typo です。

Mackerelの公式メトリックプラグインとOpenTelemetry Receiverの取得内容の比較 : NGINX 編

Mackerel - Qiita Advent Calendar 2024 - Qiita 3日目の記事です。 2日目は id:missasanMackerel CREチーム ディレクターが育休復帰3ヶ月でやったこと - missasan's notebook でした。id:missasan が復帰してから、そのブランクを感じさせない大立ち回りっぷりを見せており、さすがだなぁと同じチームメンバーとして感じていたのですが、そのまとめと背景についての記事となっておりました。ここ最近のMackerelの活動まとめにもなっております。ぜひご一読いただければと思います。


こんにちは、id:do-su-0805 です。仕事では id:do-su-0805 を利用していますが、普段は id:do_su_0805 として生活しています。
はてなでは約5年ほど Platform SRE を担当した後、2023/05 よりMackerel CREチームでテクニカルサポートを担当しております。

2024年3月にOpenTelemetry 対応(パブリックベータ)提供開始 - Mackerel ブログ #mackerelioでのお知らせ以後、2024年11月、Mackerelのメトリックがオブザーバビリティ標準であるOpenTelemetryに正式対応し、あわせて価格体系を全面的に改定します - Mackerel ブログ #mackerelioや、Mackerelはオブザーバビリティプラットフォームとして進化していきます - Mackerel ブログ #mackerelio などでもお知らせしているように、MackerelはOpenTelemetryに対応する機能を公開・拡充し続けています。

opentelemetry.io

詳しくは過去の公開記事等を参照いただけたらと思いますが、今回はOpenTelemetry Metricsに関するお話です。
OpenTelemetry Metricsに対応しました!といっても「いままでmackerel-agentで監視していたものから移行できるのかな?」という不安・懸念へのご案内の一つとして、NGINXの監視を題材とし、Mackerel公式プラグインである mackerel-plugin-nginx と、OpenTelemetry Collector の Receiver である NGINX Receiver での取得方法や取得内容を比較してみました。
mackerel-plugin-nginxを利用したメトリック取得設定の方法や、NGINX Receiver を利用したメトリック取得設定の方法については、以下をご参照ください。

NGINX のメトリック取得に必要な NGINX の設定について

取得に関しては、いずれも取得用の機構(プラグイン,Receiver)実行時に、ngx_http_stub_status_moduleの結果を提供するパスにアクセスする仕組みになっており、差分はありません。

mackerel-plugin-nginx

メトリックプラグイン - mackerel-plugin-nginx - Mackerel ヘルプ

mackerel-plugin-nginxは、実行された際にngx_http_stub_status_moduleの結果をパースしメトリックとして投稿しています。

NGINX Receiver

opentelemetry-collector-contrib/receiver/nginxreceiver/README.md at main · open-telemetry/opentelemetry-collector-contrib

NGINX Receiverは、Receiverとして設定を有効にしたCollectorが起動した場合に、ngx_http_stub_status_moduleの結果をパースしメトリックとして投稿しています。

投稿されるメトリックについて

投稿されるメトリックに関しては、mackerel-plugin-nginxとNGINX Receiverではグルーピングの違いや差分値計算の有無といった違いがあります。*1

mackerel-plugin-nginx

プラグインヘルプ内監視できるメトリックに記載の通り、"Nginx Connections","Nginx requests","Nginx connection status"の3種類にグルーピングされた状態で投稿されます。

mackerel-plugin-nginxにて取得したメトリックの様子

NGINX Receiver

opentelemetry-collector-contrib/receiver/nginxreceiver/documentation.md at main · open-telemetry/opentelemetry-collector-contrib に記載の通り、"nginx.connections_accepted","nginx.connections_current","nginx.connections_handled"の3種類にグルーピングされた状態で投稿されます。

NGINX Receiverにて取得したメトリックの様子

投稿されるメトリックの比較

グルーピングの違い

現在の接続数を示すメトリックは、mackerel-plugin-nginxでは"Nginx Connection"に含まれる"Active connections"(custom.nginx.connections.connections)として投稿されていますが、NGINX Receiverでは"nginx.connections_current"として投稿される4本のうちstate="active"である1本になっています。

現在の接続数を示すメトリックの表示例(plugin,Receiver全体,Receiverの結果を `state="active"` で絞り込んだもの)
グラフウィジェットにて `state="active"`で絞り込んだ状態にする例

現在の接続数の内訳を示すメトリックは、mackerel-plugin-nginxでは"Nginx connection status"に含まれる"Reading"(custom.nginx.queue.reading),"Writing"(custom.nginx.queue.writing),"Waiting"(custom.nginx.queue.waiting)としてグルーピングされ投稿されており、NGINX Reveiverでも"nginx.connections_current"として投稿される4本のうちstate="reading",state="writing","state="waiting" の3本になっています。

現在の接続数の内訳を示すメトリックの表示例(plugin,Receiver全体,Receiverの結果を`state != "active"` で絞り込んだもの)

受け付けたクライアント数や処理した接続数などを示すメトリックは、mackerel-plugin-nginxでは"Nginx requests"に含まれる"Accepted connections"(custom.nginx.requests.accepts),"Handled connections"(custom.nginx.requests.handled),"Handled requests"(custom.nginx.requests.requests)としてグルーピングされ投稿されていますが、NGINX Receiverでは"nginx.connections_accepted","nginx.connections_handled","nginx.requests"として投稿される1本のメトリックとして分かれて投稿されています。

受け付けたクライアント数や処理した数などを示すメトリックの表示例(plugin,ReceiverでのAccepted,ReceiverでのHandled,ReceiverでのRequests)

確認できるメトリックの差分

上記「グルーピングの違い」に示した図を見ていただくと分かるように、受け付けたクライアント数や処理した接続数などを示すRequest,Accepts,Handledを表現するメトリックのみ、mackerel-plugin-nginxとNGINX Receiverでは値が異なっています。 mackerel-plugin-nginxでは差分値(前回の取得値との差分)となっており、NGINX Receiverでは累積値(ngx_http_stub_status_moduleが返す値をそのまま利用)となっています。

ただし、当方の検証環境では NGINX Receiver を利用した ngx_http_stub_status_module の結果取得をするためのリクエストにて"accepts"ならびに"handled"が増加せず、"requests"のみが増加する様子を確認しており*2、 実際に利用する際にはご自身の環境での出力の様子を併せてご確認いただき、必要な差分計算等をCollectorや利用時のPromQLにて実施いただくとよいと思います。

監視設定例

NGINX への現在の接続数が100を超えた場合にアラートを上げる例を紹介します。

mackerel-plugin-nginxを利用している場合は、以下のように custom.nginx.connections.connections メトリックに対してホストメトリック監視を作成いただくことで監視が可能です。

ホストメトリック監視にて cutom.nginx.connections.connections を対象に 100 以上の際にアラートを上げる設定例

NGINX Receiverを利用している場合は、以下のように nginx.connections_current{state="active"} を対象にクエリによる監視を作成いただくことで監視が可能です。必要に応じてさらにラベルによる絞り込みなどを設定してください。

クエリによる監視を利用して nginx.connection_current{state="active"} を対象に監視を設定する例

まとめ

Mackerelの公式メトリックプラグインであるmackerel-plugin-nginxと、OpenTelemetry Receiverである NGINX Receiver での取得内容について見ていきました。 一部、NGINX Receiverを利用する際は差分計算が必要な点は調整が必要となるかもしれませんが、取得内容としては同様の内容であるため、既存の監視から ためしにシフトしやすいものなのではないかと思います。

CREは仲間を探しています

CREは仲間になってくれる人を探しています。気になった人はぜひお声がけください。

hatena.co.jp

明日の Mackerel Advent Calendar 2024 は id:RyuGoo の記事です。12/02時点で書き終えているとのことでしたので、お楽しみに。

*1: 簡単のため、Mackerelにおいて同じグラフ定義にまとめられるメトリックと、Opentelemetry Metricsにおいて同一メトリック名にて投稿されラベルにてフィルタリング可能な状態のことをグルーピングと称しています。

*2: 仕組みが分からなかった...