Railsをprometheus / grafanaで監視する(全部dockerで)
railsをprometheusとgrafanaで監視するための環境構築メモです。全てdockerで起動させます。
本記事はprometheusとは、grafanaとはという点には触れていません。
もくじ
環境
構成
prometheus/grafanaのコンテナを起動するdocker-compose.yml
と、railsを起動するdocker-compose.yml
を分ける想定です。
1つのdocker-compose.yml
で全てのサービスを起動しても良いのですが、railsとは分けてprometheus/grafanaを管理したいため下記のような構成にしています。
root ├── prometheus │ └── docker-compose.yml └── rails └── docker-compose.yml
準備
prometheus/grafanaとrailsで共通のネットワークに所属させるため、あらかじめネットワークを作成しておきます。
docker network create prom_base_network # 適当な名前で
prometheus、grafanaのdocker-compose.yml
はほぼ下記の参考記事の通りです。container_name
は個人の好みで変更してください。
networks
で先ほど作成したネットワークを指定します。
version: '3' services: prometheus: image: prom/prometheus container_name: prometheus_test volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml ports: - 9090:9090 grafana: image: grafana/grafana container_name: grafana_test ports: - 3100:3100 env_file: - ./grafana.env networks: default: external: name: prom_base_network
railsについては、まずは雛形のアプリケーションを用意します。以下のリポジトリを使います。
上記リポジトリのdocker-compose.yml
の下部に、prometheus/grafanaと同様にnetworks
を追記します。
version: '3' services: db: image: mysql:5.7 container_name: mysql command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci environment: MYSQL_ROOT_PASSWORD: root MYSQL_USER: root ports: - 3306:3306 # データ永続化する場合はmysql_dataディレクトリを作って保存 # volumes: # - ./mysql_data:/var/lib/mysql app: build: . container_name: rails volumes: - ./src:/myapp ports: - 5000:3000 - 3035:3035 tty: true stdin_open: true networks: default: external: name: prom_base_network
prometheus/grafana・railsともにdocker-compose build
後にdocker-compose up -d
でコンテナを起動します。
railsの初期設定
railsのコンテナに入りアプリケーションの初期設定をします。
docker-compose exec app bash init.sh
上記のリポジトリにあらかじめ用意したinit.sh
により、rails new
、rails g scaffold
、rails db:create db:migrate
、rails s -b 0.0.0.0
まで全て実行されます。
localhost:5000
でrailsの初期画面が、localhost:5000/users
でscaffoldで作成したアプリケーションの雛形トップ画面が表示されます。
prometheusで使うgemを追加するため、一旦Ctrl+C
でrailsを停止します。
Gemfileに下記を追記し、bundle install
を実行します。
gem 'prometheus-client'
これはprometheusの公式gemです。
config/initializers
にprometheusの設定ファイルを配置します。
# returns a default registry prometheus = Prometheus::Client.registry # create a new counter metric http_requests = Prometheus::Client::Counter.new(:http_requests, docstring: 'A counter of HTTP requests made') # register the metric prometheus.register(http_requests)
config.ru
にも以下を追記します。
require_relative 'config/environment' # 追記開始 require 'rack' require 'prometheus/middleware/collector' require 'prometheus/middleware/exporter' use Rack::Deflater use Prometheus::Middleware::Collector use Prometheus::Middleware::Exporter # 追記終了 run Rails.application
以上でprometheusがrailsを認識します。
prometheusのtargetsで確認
localhost:9090/targets
にアクセスすると、prometheusが認識している対象ホスト・サービスが表示されます。
railsもちゃんと認識しています(一番上の9100は一旦無視してください)。
適当にlocalhost:5000/users
の画面で何かした後、localhost:9090/graph
にアクセスして以下の画像のようなhttp_server_request_duration_seconds_count
というクエリを実行すると、railsへリクエストのあったアクションの回数が表示されます。
クエリを工夫すればrailsへのリクエストの状況を可視化することができます。
grafanaで可視化する
localhost:9100
でgrafanaにアクセスします。ユーザー名とパスワードを適当に入力し、パスワードを変更します。
その後、DataSourceとしてprometheusを追加します。
URLにhttp://prometheus:9090
と入力し、Save & Testで保存します。エラーがなければ下図のように表示されます。
これでgrafanaでprometheusのデータを表示することができます。試しにし最初から用意されているprometheus自体のダッシュボードを追加します。
すると、下図のようなダッシュボードを閲覧することができます。
railsのデータを可視化する
まだPromQLを勉強中なので別記事で・・・
次回はrailsをdockerではなくローカルで起動していた場合、node_exporter
のコンテナを追加、railsの具体的な監視(custom_collector等)について書く予定です。