Railsをprometheus / grafanaで監視する(全部dockerで)

railsをprometheusとgrafanaで監視するための環境構築メモです。全てdockerで起動させます。

本記事はprometheusとは、grafanaとはという点には触れていません。



もくじ



環境

  • macOS Mojave
  • Docker for Mac 2.2.0.0
  • docker-compose version 1.25.2
  • ruby 2.6.3
  • rails 6.0.2.1



構成

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については、まずは雛形のアプリケーションを用意します。以下のリポジトリを使います。

github.com

上記リポジトリ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 newrails g scaffoldrails db:create db:migraterails s -b 0.0.0.0まで全て実行されます。


localhost:5000railsの初期画面が、localhost:5000/usersでscaffoldで作成したアプリケーションの雛形トップ画面が表示されます。

prometheusで使うgemを追加するため、一旦Ctrl+Crailsを停止します。


Gemfileに下記を追記し、bundle installを実行します。

gem 'prometheus-client'


これはprometheusの公式gemです。

github.com


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は一旦無視してください)。 f:id:urawa72h:20200202171023p:plain


適当にlocalhost:5000/usersの画面で何かした後、localhost:9090/graphにアクセスして以下の画像のようなhttp_server_request_duration_seconds_countというクエリを実行すると、railsへリクエストのあったアクションの回数が表示されます。

f:id:urawa72h:20200202171348p:plain

クエリを工夫すればrailsへのリクエストの状況を可視化することができます。



grafanaで可視化する

localhost:9100でgrafanaにアクセスします。ユーザー名とパスワードを適当に入力し、パスワードを変更します。


その後、DataSourceとしてprometheusを追加します。 f:id:urawa72h:20200202213506p:plain


URLにhttp://prometheus:9090と入力し、Save & Testで保存します。エラーがなければ下図のように表示されます。 f:id:urawa72h:20200202213628p:plain


これでgrafanaでprometheusのデータを表示することができます。試しにし最初から用意されているprometheus自体のダッシュボードを追加します。 f:id:urawa72h:20200202213830p:plain


すると、下図のようなダッシュボードを閲覧することができます。 f:id:urawa72h:20200202214035p:plain



railsのデータを可視化する

まだPromQLを勉強中なので別記事で・・・

次回はrailsをdockerではなくローカルで起動していた場合、node_exporterのコンテナを追加、railsの具体的な監視(custom_collector等)について書く予定です。