アプリの監視について、調査する機会があったので備忘録としてまとめます。
コンテナアプリの監視について
例えば、ECS上で稼働するアプリケーションの場合、監視用エージェントをサイドカーで同梱して、
外部サービスにログ・メトリクスを連携することが多いと思います。
サイドカーパターンを採用する理由としては以下などがあるかと思います。
・メインコンテナに優先的にリソースを割り当て、低レイテンシで応答させることができる
・ログのルーティング設定を変更する際にアプリに手を加える必要がなくなる
この時、同梱した監視用エージェントが頻繁に外部サービスにログ・メトリクスを送信していると、
リソースを食いつぶしてしまって、メインの機能に影響が出る可能性があります。
そのため、多くの場合、アプリコンテナから送信されたログ・メトリクスをエージェントが
バッファリングしてまとめて外部サービスに送信するといった手法をとります。
例えば、Datadogを使用する場合は、Datadogが提供するコンテナイメージを利用することで
手軽にコンテナ監視を実現することができます。
Lambdaの監視について
Lambdaの場合はECSのように、実行環境に好きなコンテナを同梱することができません。Lambdaの場合、
Lambda Extensionsを用いるのがよいと考えられます。Lambda Extensionsを用いることで
関数とは別のプロセスとしてモニタリング用エージェントなどの配置などが可能になります。
Lambda Extensionsについてはこちらの記事が非常に分かりやすく参考になりました。
例えば、Datadogの場合、Datadog Lambda 拡張機能というものが提供されています。
これをアプリが動くLambdaに対して、Lambdaレイヤーとして追加することで
関数実行中のカスタムメトリクスおよびログの同期的送信が可能になります。
なおもう一つ似たものとしてDatadog Lambdaライブラリがありますが、
こちらはライブラリとしてプログラムの中にインポートすることで、カスタムメトリクスの送信を
可能にするもので、ログの送信には対応していないようです。
現状、ログの送信に対応しているDatadog Lambda 拡張機能の方が使い勝手が良さそうですね。