Amazon Linux 2023 に導入した CloudWatch Agent で collectd を使用し、 Apache HTTP Server の統計情報を可視化してみる。

記事タイトルとURLをコピーする

こんにちは。😺
カスタマーサクセス部の山本です。

12月25 日の記事です。メリークリスマス!😀
Qiita のアドベントカレンダー、25 日目のお題です。

背景

2日くらい前に、以下の記事を執筆しました。

Amazon Linux 2023 のストレージ空き容量を CloudWatch Agent で監視する。 - サーバーワークスエンジニアブログ

その際に公式ドキュメントを読んでいると、
サーバー上の Apache の統計情報を、 CloudWatch メトリクスとして取得できることを発見しました。
具体的には、mod_status モジュールの出力する Apache HTTP Server の統計情報を CloudWatch のメトリクスにできるようです。

関連ブログ

調べてみると、CloudWatch エージェントで collectd を使用して、ロードアベレージを取得する弊社のブログ記事がありました。

CloudWatchとcollectdでLoadAverageのグラフを作成する - サーバーワークスエンジニアブログ

ドキュメント

前提

Apache のインストール

検証のため、まず Apache のインストールをします。

インストール:sudo yum install httpd

Apache 有効化:systemctl enable httpd
確認:sudo systemctl status httpd

Apache 起動:sudo systemctl start httpd
確認:sudo systemctl status httpd

localhost に curl すると、It works と返るようになりました。
curl http://localhost/

mod_statusを有効化

mod_status は、Apache HTTP Server におけるモジュールの一つで、パフォーマンスやリソース使用状況を監視するための便利なインターフェースを提供します。 CloudWatch Agent と連携する collectd では、この mod_status の情報をメトリクスにします。

sudo vi /etc/httpd/conf/httpd.conf

ファイル末尾に以下を追記

ExtendedStatus on
  
<IfModule mod_status.c>
  <Location /mod_status>
    SetHandler server-status
  </Location>
</IfModule>

mod_status を有効にします。
Apache 再起動:sudo systemctl restart httpd
確認:sudo systemctl status httpd

パス /mod_status に、クエリ auto を付与して curl すると、統計情報を取得できるようになりました。

curl localhost/mod_status?auto

collectd をインストール

mod_status の情報を CloudWatch Agent に連携するパイプ役を担う collectd をインストールします。

sudo yum install collectd

collectd の apache プラグインをインストール

collectd が mod_status の情報を CloudWatch Agent に連携するには、 apache プラグインも必要です。

sudo yum -y install collectd-apache

collectd の設定・起動

collectd の設定ファイルを編集します。
sudo vi /etc/collectd.conf

94行目に LoadPlugin apache のコメントアウト部分などもありますが、分かりにくいので、ファイル末尾にまとめて追記します。

LoadPlugin logfile
<Plugin "logfile">
    LogLevel info
    File "/var/log/collectd.log"
    Timestamp true
    PrintSeverity false
</Plugin>
  
LoadPlugin apache
<Plugin "apache">
  <Instance "localhost">
    URL "http://127.0.0.1/mod_status?auto"
  </Instance>
</Plugin>
  
LoadPlugin network
<Plugin network>
        <Server "127.0.0.1" "25826">
                SecurityLevel "Encrypt"
                Username "user"
                Password "secret"
        </Server>
</Plugin>

1 行目:LoadPlugin logfile

collectd のログを有効にします。
/var/log/collectd.log に出力します。

9 行目:LoadPlugin apache

Apache HTTP Server の mod_status モジュールの情報を collectd で取得します。
http://127.0.0.1/mod_status?auto にアクセスし、情報を取得します。

16 行目:LoadPlugin network

CloudWatch エージェントが udp://127.0.0.1:25826 で待ち受けているため、送信先に指定します。
UsernamePassword で認証するようにします。

collectd の起動

collectd を有効化し起動します。

collectd 有効化:sudo systemctl enable collectd
collectd 起動:sudo systemctl start collectd
確認:systemctl status collectd.service

/var/log/collectd.logInitialization complete, entering read-loop.と出ていれば正常に起動しています。

CloudWatch Agent 側の設定変更

CloudWatch Agent が参照するユーザー・パスワードのファイルを作成します。
collectd の network プラグインに指定したUsernamePasswordと同一のものを記載します。

vi /etc/collectd.d/auth_file

user: secret

CloudWatch エージェント の設定ファイル用ディレクトリに、collectd 用の設定ファイルを追加します。

vi /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/collectd_20241225

{
  "metrics":{
     "metrics_collected": {
          "collectd": {
            "collectd_security_level":"encrypt",
            "collectd_auth_file":"/etc/collectd.d/auth_file",
            "metrics_aggregation_interval": 60
        }
     }
  }
}

CloudWatch Agent を再起動します。

sudo systemctl restart amazon-cloudwatch-agent

CloudWatch Agent のログを見ると、正しく読み込まれたようです。

vi /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log

読み込まれた複数のコンフィグファイルは、以下のファイルに yaml 形式でまとめられています。

vi /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml

CloudWatch エージェントは、udp://127.0.0.1:25826 で collectd からの情報をリッスンしています。

確認

CloudWatch メトリクスの CWAgent 名前空間に、mod_status の提供するメトリクスが出ています。

ワーカーの状態に関するメトリクス

メトリクス 説明
Waiting ワーカーは新しい接続を待機中です。
Sending ワーカーはクライアントに応答を送信中です。
Open 接続が開いている状態です。
Starting ワーカーが起動中です。
Idle Cleanup アイドル状態で不要なリソースをクリーンアップ中です。
KeepAlive Keep-Alive接続を維持しています。
Closing 接続を閉じている状態です。
Reading クライアントからのリクエストを読み込み中です。
DNS Lookup DNSルックアップを実行中です。
Logging ログを記録中です。
Finishing ワーカーが優雅に終了中です。

これらの状態を確認して、Apache のワーカープロセスを増やすか、サーバーのスペックを上げるか、などの検討ができます。

"metrics_aggregation_interval": 60 に設定しているので、1 分間隔のメトリクスまでドリルダウンして見れます。

Apache の状態に関するメトリクス

メトリクス 説明
apache_idle_workers アイドル状態のワーカーの数を示します。
apache_bytes 送受信したデータの総バイト数を示します。
apache_connections 現在アクティブな接続の総数を示します。
apache_requests 処理したリクエストの総数を示します。

Apache HTTP Server 全体の負荷状況が分かります。

留意点

/var/log/collectd.log のローテーションなど、collectd が起因して、メモリやストレージを圧迫する可能性があるので、要注視かなと思います。

まとめ

collectdを用いて Apache の統計情報を集約し、CloudWatch Agent を介して AWS CloudWatch にメトリクスを送信する手順を書いてみました。

  • Apache のセットアップとmod_statusの有効化:
    • Apache をインストールし、mod_statusを有効化することで、サーバーの状態情報を取得可能にしました。
  • collectdの導入:
    • collectdapacheプラグインをインストールし、Apache のパフォーマンスデータを収集する設定を行いました。
  • CloudWatch Agent の設定:
    • collectdからのデータを CloudWatch Agent が受信し、AWS CloudWatch にメトリクスとして送信するための設定を行いました。
  • CloudWatch メトリクスの確認:
    • CloudWatchのCWAgent名前空間に、Apache のワーカー状態や全体の統計情報が正しくメトリクスとして表示されていることを確認しました。

Apache の各ワーカーの状態や Apache 全体のパフォーマンスメトリクスを監視することで、サーバーリソースの最適化に役立てることができそうです。

余談

そろそろ雪山登山に行きたいです。

山本 哲也 (記事一覧)

カスタマーサクセス部のエンジニア。2024 Japan AWS Top Engineers に選んでもらいました。

今年の目標は Advanced Networking – Specialty と Machine Learning - Specialty を取得することです。

山を走るのが趣味です。今年の目標は 100 km と 100 mile を完走することです。 100 km は Gran Trail みなかみで完走しました。OSJ koumi 100 で 100 mile 砕け散りました。どこかで 100 mile やりたいです。

基本的にのんびりした性格です。座右の銘は「いつか着く」