はじめに
自作アプリへのオブザーバビリティの適用、ローカル編です。
現在、おうちk8sで自作アプリを動かそうとしているわけですが、そのアプリにオブザーバビリティを実装しようと考えています。
手始めに、ローカル環境で動かしているdocker composeの検証環境にて、オブザーバビリティを試すことで、導入のハードルを下げます。
今回参考にしたサイトは以下。

オブザーバビリティとは
オブザーバビリティは「システムの内部の状態を外部から適切に把握できる能力」のことです。
サーバーやアプリが異常が発生したときに原因を特定できるかどうかが重要になります。
オブザーバビリティの3つの要素として以下があります。
- ログ(Logs) → 何が起こったかの記録
- メトリクス(Metrics) → CPU使用率やレスポンスタイムなどの数値データ
- トレース(Traces) → リクエストの流れを追跡
今回はこの中のメトリクスを取得しようと思います。
そのためにprometheusというツールを使います。
prometheusとは

prometheusはシステムやアプリのメトリクス(CPU使用率、メモリ、リクエスト数など)を収集・監視するツールです。
特徴としては以下が挙げられます。
- プル型のデータ取得
- 監視対象からデータをpullして取得します
- PromQLというクエリ言語を使って必要なデータを柔軟に抽出・可視化できます
- アラート機能があります
- Grafanaとの連携可能で監視データを見やすくダッシュボード化できます
k8s(helm)で使用した記事は以前挙げました。
本当はopentelemetryを使いたい
オブザーバビリティには相関を実装する必要があります。
相関はテレメトリーデータをIDで紐づける処理で、マイクロサービスなどの複雑なサービスをより見通しよくできます。
本当であれば以下の図のようにOpenTelemetry Collectorを使用して相関を実現させたいのですが、今回の記事はOpenTelemetry Collectorを使用しません。

引用元: https://opentelemetry.io/docs/specs/otel/logs
今後登場させます。
まずは1歩ずつステップアップをしていきます。
実装
今回の実装で目指す構成は以下です。

django側からメトリクスをpullしてきて、それをgrafanaに飛ばしてグラフを表示させます。
今回はdocker composeで
django側(backend側)への実装
requirements.txtに以下を追加します。
django-prometheus==2.2.0
settings.pyのINSTALLED_APPSにdjango_prometheusを追加します。
INSTALLED_APPS = [
...
'django_prometheus',
]
settings.pyのMIDDLEWAREには以下の2つを追加します。
MIDDLEWARE = [
...
'django_prometheus.middleware.PrometheusBeforeMiddleware',
'django_prometheus.middleware.PrometheusAfterMiddleware',
]
urls.pyのurlpatternsに以下を追記します。
urlpatterns = [
...
path('', include('django_prometheus.urls')),
]
prometheus側への設定
docker compose上の設定は以下のようになります。
go-slim-prometheus:
container_name: go-slim-prometheus
image: prom/prometheus:latest
restart: always
ports:
- "9090:9090"
command:
- "--config.file=/etc/prometheus/prometheus.yml"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
networks:
- go_slim_network
prometheus.ymlは以下の内容になります。
global:
scrape_interval: 10s
scrape_timeout: 5s
scrape_configs:
- job_name: prometheus
metrics_path: /metrics
static_configs:
- targets:
- 'go-slim-prometheus:9090'
- job_name: go-slim-backend-scraper
metrics_path: /metrics
static_configs:
- targets:
- 'go-slim-backend:8000'
labels:
app: go-slim-backend
確認
docker composeを起動したら、prometheusの画面(http://localhost:9090にアクセス)から、StatusタブのTargetsを選択して、各ジョブが起動していることを確認します。
メトリクスとして以下の値が取得できているか検索して確認してみます。
django_http_requests_total_by_method_total

grafana
docker compose上の設定は以下のようになります。
go-slim-grafana:
container_name: go-slim-grafana
image: grafana/grafana:latest
volumes:
- ./grafana/config:/etc/grafana-config
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=newuser
- GF_SECURITY_ADMIN_PASSWORD=newpassword
entrypoint:
- "/usr/share/grafana/bin/grafana-server"
- "--homepath=/usr/share/grafana"
- "--config=/etc/grafana-config/grafana.ini"
networks:
- go_slim_network
datasourceのconnectionのところでdocker composeのprometheusのサービス名(今回ならhttp://go-slim-prometheus:9090)を設定する

exploreから以下のようにdjango_http_requests_total_by_method_total確認してみます。

確認できました。
最後に
今後はopentelemtry collectorを使ってテレメトリーデータを収集できるようにします。