自作アプリ、オブザーバビリティへの道①(Docker Compose, Prometheus、Grafana)

スポンサーリンク
個人開発
スポンサーリンク

はじめに

自作アプリへのオブザーバビリティの適用、ローカル編です。

現在、おうちk8sで自作アプリを動かそうとしているわけですが、そのアプリにオブザーバビリティを実装しようと考えています。

手始めに、ローカル環境で動かしているdocker composeの検証環境にて、オブザーバビリティを試すことで、導入のハードルを下げます。

今回参考にしたサイトは以下。

Django Metrics, Logs & Traces Observability with Opentelemetry and Grafana
Metrics, Logs and Traces (MLT) are the three pillars of observability that can provide us with complete visibility of a software system. In this article, w

オブザーバビリティとは

オブザーバビリティは「システムの内部の状態を外部から適切に把握できる能力」のことです。

サーバーやアプリが異常が発生したときに原因を特定できるかどうかが重要になります。

オブザーバビリティの3つの要素として以下があります。

  • ログ(Logs) → 何が起こったかの記録
  • メトリクス(Metrics) → CPU使用率やレスポンスタイムなどの数値データ
  • トレース(Traces) → リクエストの流れを追跡

今回はこの中のメトリクスを取得しようと思います。

そのためにprometheusというツールを使います。

prometheusとは

prometheusはシステムやアプリのメトリクス(CPU使用率、メモリ、リクエスト数など)を収集・監視するツールです。

特徴としては以下が挙げられます。

  • プル型のデータ取得
    • 監視対象からデータをpullして取得します
  • PromQLというクエリ言語を使って必要なデータを柔軟に抽出・可視化できます
  • アラート機能があります
  • Grafanaとの連携可能で監視データを見やすくダッシュボード化できます

k8s(helm)で使用した記事は以前挙げました。

https://apao-m-appare99999.com/?p=14209

本当は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を使ってテレメトリーデータを収集できるようにします。

タイトルとURLをコピーしました