Prometheusを使用してPythonアプリケーションを監視する４つの方法を紹介

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/edac6904-39ba-73a8-d0f4-d64feea75e63.png)

#はじめに
Prometheusはもともとマルチプロセスではなくシングルプロセスマルチスレッドアプリケーション用に設計されていたにもかかわらず、現在[Pythonアプリケーション](https://www.courseduck.com/programming/python/)を監視するための人気のツールになりつつあります。

PrometheusはSoundcloud環境で開発され、[GoogleのBorgmon](https://landing.google.com/sre/sre-book/chapters/practical-alerting/)に触発されました。 元の環境では、[Borgmon](https://research.google/pubs/pub43438/)は[サービス検出](https://en.wikipedia.org/wiki/Service_discovery)の単純な方法に依存しており、クラスターで実行されているすべてのジョブを簡単に見つけることができます。

Prometheusはこれらの前提を継承するため、1つのターゲットが単一のマルチスレッドプロセスであると想定しています。 Prometheusのクライアントライブラリは、メトリックが共有アドレススペースで実行されている複数の実行スレッドのさまざまなライブラリおよびサブシステムからのものであるという前提で話を進めていきます。

開始するには、[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=How%20to%20monitor%20Python%20Applications%20with%20Prometheus)の[無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=How%20to%20monitor%20Python%20Applications%20with%20Prometheus)にサインアップしてください。このトライアルでは、プラットフォームでPrometheusの使用をすぐに開始でき、この記事から学んだことを実践することができます。


#PrometheusをPython WSGIアプリケーションに統合する際の問題
WSGIアプリケーションサーバーでPythonアプリを実行すると、問題が発生し始めます。 WSGIアプリケーションでは、リクエストは単一のプロセスではなく、多くの異なるワーカーに割り当てられます。 これらの各ワーカーは、複数のプロセスを使用して展開されることにより、マルチプロセスアプリケーションになります。

この種のアプリケーションがPrometheusにエクスポートされると、Prometheusはスクレイプ要求に応答する複数の異なるワーカーを取得します。 ワーカーはそれぞれ、知っている価値観で対応するため、Prometheusはカウンターメトリックをスクレイピングして100として返し、それが200として返された直後に返すことができます。各ワーカーは独自の値をエクスポートしているため、カウンターメトリックはジョブ全体ではなくランダムな情報を測定します。

これらの問題を処理するために、以下の4つのソリューションがあります。

###1. すべてのワーカーノードを合計する
各メトリックに一意のラベルを付けると、それらすべてを一度にクエリでき、ジョブ全体を効率的にクエリできます。 たとえば、各ワーカーにworker_nameなどのラベルを付けると、次のようなクエリを記述できます。

```
sum by (instance, http_status) (sum without (worker_name) (rate(request_count[5m])))
```

これにより、1つのジョブのすべてのワーカーノードが一度に集約されます。 ただし、これの問題点は、あなたが所持するメトリックの数が急増してしまうことです。

###2. マルチプロセスモード
このメソッドは、私たちMetricFireがオススメする方法です。 この方法では、gunicornアプリケーションサーバー上のマルチプロセスアプリを処理する[Prometheus Pythonクライアント](https://github.com/prometheus/client_python)を使用し、Prometheusで独自のアプリケーションを監視します。

MetricFireでPythonクライアントを使用して独自のサービスを監視する方法に関しては、[Prometheusを使ってPython Webアプリの監視](https://qiita.com/MetricFire/items/57b95f6de1f608ef7c44)の記事を確認してみてください。 その記事では、Prometheusを使用してPython Webアプリを監視する各手順を説明しています。

#3. Django Prometheusクライアント
このメソッドは、各ワーカーを完全に別個のターゲットとして指定します。 [Django Prometheusクライアント](Django Prometheus client)は、各ワーカーが独自のポートを介してPrometheusのスクレイプリクエストをリッスンするように設定します。

#4. StatsDエクスポーター
この方法は、Prometheusがアプリケーションを直接こする必要があるという概念を拒否します。 代わりに、アプリからローカルで実行されているStatsDインスタンスにメトリックをエクスポートし、アプリケーションの代わりにStatsDインスタンスを取得するようにPrometheusを設定します。 これにより、各カウンターが何をカウントするかをより詳細に制御できます。

#まとめ
マルチプロセスアプリケーションをPrometheusでネイティブに監視することはできませんが、これらの4つのソリューションは優れた回避策です。 これにより、ITリソースとAPMの両方に対して、Prometheusを企業全体の主要な監視ツールとして使用できます。

Prometheusを使用してPythonアプリを監視する方法の詳細については、[Pythonベースのエクスポーター](https://www.metricfire.com/blog/first-contact-with-prometheus)に関する記事と、[Kubernetesを使用したPython APIの開発とデプロイ](https://www.metricfire.com/blog/develop-and-deploy-a-python-api-with-kubernetes-and-docker)に関するシリーズをご覧ください。

Prometheusを試して、この記事から学んだことを実践するには、[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=How%20to%20monitor%20Python%20Applications%20with%20Prometheus)の[無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=How%20to%20monitor%20Python%20Applications%20with%20Prometheus)をチェックしてください。 私たちのプラットフォームで直接Prometheusを使用して、セットアップなしでメトリックを監視を開始できます。 また、[デモを予約](https://calendly.com/metricfire-chatwithus/chat?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=How%20to%20monitor%20Python%20Applications%20with%20Prometheus)して直接お問い合わせください。お客様の会社の監視ニーズについて、いつでも喜んでお話を伺います。

それでは、またの記事で！