継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

ECS Fatgate の FastAPI 関連プロセスを Mackerel で監視する

タダです.

前回の記事で Mackerel のカスタムプラグインを使った監視をやってみたんですが,EC2 の Uvicorn プロセス数の取得とプロセスの監視をしてみました.今回は前回のカスタムプラグインを使って ECS Fargate 上のプロセス監視をいれていきます.

sadayoshi-tada.hatenablog.com

監視のための準備

1, アプリケーション のコンテナ側での設定

FastAPI を動かすコンテナ側で Mackerel の監視設定とカスタムプラグインスクリプトを追加していきます.ディレクトリとして mackerelを追加してそこに設定ファイルとスクリプトを入れていきます.

.
├── app ・・・アプリケーション のコードが格納されているディレクトリ 
├── mackerel ・・・Mackerel の設定及びカスタムプラグインのスクリプトが格納されているディレクトリ 
├── ecs_setting・・・タスク定義が格納されているディレクトリ 

まず設定ファイルとしてmackerel.yamlを作ります.この中でカスタムプラグインのどのスクリプト がメトリックの取得をし,プロセス監視をするのかを設定していきます.

apikey: "YOUR_MACKEREL_APIKEY"
plugin:
  metrics:
    uvicorn:
      command: sh /xxx/mackerel/uvicorn-ps-count.sh ・・・メトリック監視
  checks:
    check_uvicorn:
      command: sh /xxx/mackerel/uvicorn-ps-check.sh・・・プロセス監視
ignoreContainer: '\Amackerel-container-agent\z'

mackerel.io

次にスクリプトの配置ですが,次のスクリプト を配置し,実行権限を与えています.

uvicorn-ps-count.sh

#!/bin/sh
metric_name='uvicorn.process.counts'
metric=`ps aux |grep uvicorn | grep -v grep | wc -l`
date=`date +%s`

echo "${metric_name}\t${metric}\t${date}"

uvicorn-ps-check.sh

#!/bin/sh
count=`ps aux |grep uvicorn | grep -v grep | wc -l`
counts=`printf "%d\n" $count`
if [ $counts -ge (正常なプロセスの数) ]; then
  exit 0
else
  exit 2
fi

最後にアプリケーションコンテナの Dockerfile とタスク定義に追加の設定を行います.Dockerfile では Mackerel のサイドカーコンテナから設定ファイルやスクリプトにアクセスできるようにVOLUMEの設定をし,タスク定義には設定ファイルのパスとマウント設定を記載していきます.

Dockerfile の該当箇所抜粋

WORKDIR /xxx/
COPY . .
VOLUME /xxx/mackerel

タスク定義の該当箇所抜粋

    {
      "name": "mackerel-container-agent",
      "volumesFrom": [
        {
          "sourceContainer": "アプリケーションコンテナ名"
        }
      ],
      "environment": [
        {
          "value": "fargate",
          "name": "MACKEREL_CONTAINER_PLATFORM"
        },
        {
          "value": "/xxx/mackerel/mackerel.yaml",
          "name": "MACKEREL_AGENT_CONFIG"
        }
      ],
    }

関連記事

sadayoshi-tada.hatenablog.com

2, mackerel-container-agent のカスタム設定

今回で,mackerel-container-agentのコンテナから監視のシェルを叩いてもps: not foundが表示されていたため,ps コマンドをいれていきます.

2021/07/05 11:28:03 INFO <main> starting mackerel-container-agent (version:0.5.0, revision:e1a219c)
2021/07/05 11:28:03 INFO <agent> wait for the platform status to be running
2021/07/05 11:28:07 INFO <agent> start the agent: host id = xxxx, host name = xxxx
2021/07/05 11:28:07 INFO <metric> plugin fastapi (sh /xxx/mackerel/uvicorn-ps-count.sh): "/xxx/mackerel/uvicorn-ps-count.sh: 1: /xxx/mackerel/uvicorn-ps-count.sh: ps: not found\n"

mackerel-container-agent では公開されているコンテナイメージを使ったカスタマイズが可能です.mackerel-container-agentDebian ベースのため ps コマンド実行に必要な処理を Dockerfile に記述し,ECR に格納していきます.

hub.docker.com

Dockerfile は次の定義をして ECR に格納しました.

FROM mackerel/mackerel-container-agent:plugins
RUN apt update && apt install -y procps

コンテナ起動後の動作確認

コンテナを起動して意図したプロセス数の収集とプロセス監視ができているかを確認します.両方の設定が画面から確認できたのとプロセス監視はアラートが飛ぶことも確認できました.

プロセス数収集

f:id:sadayoshi_tada:20210707133143p:plain

プロセス監視

f:id:sadayoshi_tada:20210707134136p:plain f:id:sadayoshi_tada:20210707133405p:plain

まとめ

ECS Fargate でmackerel-container-agentにないプロセス監視をやってみました.今回の設定を確認していくにあたって Mackerel サポートの方に助けていただきました.ありがとうございました!同じように ECS Fargate 環境でのカスタムプラグインによる監視をされたい方の参考になれば嬉しいです!