
サーバー・パフォーマンスを監視するPythonサイドカーの構築
軽量なPythonサイドカーでサーバー監視を強化する
最近のクラウドやマイクロサービス・アーキテクチャでは、メイン・アプリケーションから補助的なタスクをオフロードすることで、サイドカーが重要な役割を果たす。Pythonサイドカーは、プライマリアプリケーションに負担をかけずにシステムの健全性を監視するのに特に役立ちます。このガイドでは、サーバーのパフォーマンスメトリクスを継続的に収集し、ログに記録し、オプションで閾値を超えたときにアラートを送信する、軽量のPythonスクリプトの作成方法を説明します。

Python ベースのサイドカーは、サーバーのパフォーマンスをリアルタイムで監視するシンプルで効果的な方法です。アラートやリモートログのような拡張機能を使うことで、システムの安定性とプロアクティブな問題解決を保証することができます。コアサービスに影響を与えることなく観測可能性を高めるために、これをあなたのインフラに統合してみてください。
私がこのスクリプトを書いたのは、Dockerコンテナを実行している大量のホスト(30,000以上のコンテナを実行している約600台のX-Large)を監視しなければならない環境で働いていたときで、オープンソースのものであっても既存の監視ソフトウェアを使うことは許されなかった。しかし、これがPythonの力なのです。数行のコードで、本当に長い道のりを歩むことができるのです。
依存関係
このスクリプトはpsutilライブラリに依存しており、CPU負荷、メモリ使用量、ディスク・アクティビティなどのシステム・パフォーマンス・メトリクスを取得することができる。Linuxのフレーバーによっては、このライブラリをインストールするのが厄介な場合があるが、OSのパケットマネージャー・リポジトリをインストールするための古いバージョンがあるかもしれない。
また、このスクリプトはスケジュール・ライブラリに依存し、スレッドを使用する。こうすることで、スクリプトは継続的に実行され、特定の条件をチェックする頻度をスクリプト内で調整することができる。
私は、特定のチャンネルにメッセージを投稿することで、Slackを使ってアラートを出すことにした。また、自分のニーズに合わせて調整することもできるだろう。このバージョンはAWSのEC2インスタンス上で動作しているので、SlackのURLはBoto3ライブラリを使ってParameter Storeから取得している。
特徴
このスクリプトは、ディスク、CPU、メモリーの使用状況を監視するもので、基本的なものです。しきい値と頻度は調整できる。
あるサーバーで実行されているプロセスのひとつが、これまで遭遇した中で最大のメモリー・リークを起こし、1日あたり約1GBを使用していた。その結果、このスクリプトは、2GB以上使用している各プロセスのメモリ使用量を経時的にログに記録している。これは、このような状況を特定する良い方法です。ログを grep して、メモリ使用量が時間とともに増えていくのを見ることができます。
また、スクリプトにネットワーク接続の切断をチェックさせたかったのだが、これはアラートが多すぎて、もしかしたら環境で起きているより大きな問題の兆候かもしれない。
CPUをモニターするのは難しい。CPU使用率が一時的に急上昇するのは問題ないが、CPU使用率が90~100%近い状態が長く続くのは、AIモデルをトレーニングしているのでない限り、絶対によくない。もう一度言いますが、必要に応じて調整してください!
パイソンコード
完全なコードはGitHubで公開されている:
https://github.com/Christophe-Gauge/python/blob/main/sidecar_monitor.py
各チェックのスケジュールは、スクリプトの一番下で設定される。schedule.every(5).to(15).minutes構文は、このタスクが5分から15分ごとに実行されることを意味する。
schedule.every(5).to(15).minutes.do(run_threaded, Check_Disk_Usage)
schedule.every(15).to(45).minutes.do(run_threaded, Check_Memory_Usage)
schedule.every(10).to(20).minutes.do(run_threaded, Check_Required_Containers)
# schedule.every(4).to(6).hours.do(run_threaded, Check_Network_Drops)
schedule.every(1).to(2).hours.do(run_threaded, Check_CPU_Usage)
schedule.every(24).hours.do(resetSlackCount)
watch_and_notify_events関数はスレッドとして実行され、非常に強力だ。Docker Socketにアタッチして、監視したいコンテナのイベントをリッスンする。コンテナの状態が変わるたびにSlackメッセージを送信する。継続的にクラッシュや再起動を繰り返す "バウンシング "コンテナがある場合、大量のアラートが発生するため、アラートに溺れないように、1日のSlack通知数の上限も設定されている。
スクリプトの使用
バックグラウンドサービスとしての実行
サイドカー・スクリプトをバックグラウンドで実行するには、次のようにする:
nohup python sidecar_monitor.py &
サービスとしての運営
本番環境で使用する場合は、OSの設定に従ってサービスとして実行してください。
ライセンス
このプロジェクトのライセンスはGNU Lesser General Public License v3.0 (LGPL-3.0)です。
免責事項
本ソフトウェアは「現状のまま」提供され、明示または黙示を問わず、商品性、特定目的への適合性、および非侵害の保証を含むがこれに限定されない、いかなる種類の保証もありません。本ソフトウェアの著作者または著作権者は、契約、不法行為、その他を問わず、本ソフトウェアまたは本ソフトウェアの使用またはその他の取引に起因、起因、または関連して生じたいかなる請求、損害、またはその他の責任についても一切責任を負いません。
Tagged with:
Python notification linux networking