PrometheusでElixir Plugを監視する(Grafara設定付き)

最近、Prometheusを触り始めました。

なので何か監視したいと思い、サンプルとしてElixirのPlugの設定をし、Erlang VMの監視をしたいと思います。

今回使ったライブラリのリポジトリは下記になるので、設定とか参考にしてみてください。

github.com

また、監視として見れるものは以下に記載されていますので、確認してみてください。

hexdocs.pm

目次

  1. 環境情報
  2. Plugの設定
  3. Prometheusの設定
  4. Grafanaで可視化
  5. 終わりに

1. 環境情報

  • Elixir: 1.9.1
  • Plug: 2.0
  • prometheus_plugs: 1.1.1
  • Prometheus: 2.15.1
  • Grafana: 6.5.2

2. Plugの設定

まずはPlugの設定をしていきます。 とりあえず、ルーティングの設定をしたものになります。

また、今回はPlugについての説明は省いていくのでご了承くださいな。

defmodule SampleWeb.Router do
  use Plug.Router

  plug SampleWeb.MetricsExporter
  plug :match
  plug :dispatch

  get "/" do
    send_resp(conn, 200, "Welcome")
  end

  match _ do
    send_resp(conn, 404, "Oops!")
  end
end

Plugが起動できて、HTTPリクエストが受けられるか確認するため / にアクセスが来たら Welcome を返すだけのものを作成しました。

ここでは plug SampleWeb.MetricsExporter を追加しました。 これは /metrics にアクセスが来たらメトリクスを返すような設定になります。

では、 SampleWeb.MetricsExporter の中を見てみましょう。

defmodule SampleWeb.MetricsExporter do
  use Prometheus.PlugExporter
end

設定としてはこれだけです。 use Prometheus.PlugExporter を記載するだけという非常にシンプルなものになります。

次に Application での設定をしていきます。

defmodule SampleWeb.Application do
  
  use Application

  def start(_type, _args) do
    children = [
      {Plug.Cowboy, scheme: :http, plug: SampleWeb.Router, options: [port: 8080]}
    ]

    SampleWeb.MetricsExporter.setup()
    
    opts = [strategy: :one_for_one, name: SampleWeb.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

ここでは SampleWeb.MetricsExporter.setup() を呼び出すだけで完了になります。これでPlugの設定が完了しましたので、次にPrometheusの設定をしていきます。

3. Prometheusの設定

Prometheusでは以下の設定をしていきます。

scrape_configs:
  - job_name: 'elixir_plug'
    metrics_path: /metrics
    static_configs:
     - targets: ['192.168.33.101:8080']

これでひとまず準備完了。では実際にPrometheusの画面で見てみましょう。

f:id:bakotako:20200103004106p:plain

無事にメトリクスが見れるようになりましたね。

4. Grafanaで可視化

Prometheusで集めたメトリクス情報をGrafarで可視化したいと思います。 まずは、Grafaraにログインし、データソースを追加します。

f:id:bakotako:20200103000252p:plain

Name には Elixir Plug とし、URL 部分に起動中のPrometheusのURLを入れます。

f:id:bakotako:20200103000656p:plain

これで設定が完了しました。

では早速、可視化してみましょう。とりあえず、 erlang_vm_allocatorsinstance_no=0 のものを見てみたいと思います。

f:id:bakotako:20200103001740p:plain

とりあえず、可視化することに成功しました。やったぜ。

次に erlang_vm_memory_bytes_totalkind="processes" を見てみたいと思います。これで現在割り当てられているメモリの量が確認することができます。

f:id:bakotako:20200103002155p:plain

Erlang VMのいろんなメトリクス情報を可視化することができました。

5. 終わりに

簡単ではありましたが、PrometheusでErlang VM監視用のElixir Plugの設定とGrafanaの可視化までやってみました。 可視化については簡単にどのように使うかまでしか見てませんので、実運用になってきたらメモリ関係はしっかりと監視したいですね。

Prometheusではいろんな言語でClientライブラリがあり、その中でElixirのメトリクス監視をやってみました。Plugの設定箇所は少なかったのですが、ちょっと苦戦してしまいました。 特にElixirですとPhoenixを使いたいところですが、今回の設定をそのままやってみてもうまくいきませんでした。。。

機会があるときにPhoenixでの設定に挑戦してみたいと思います。