Usual Software Engineer

よくあるソフトウェアエンジニアのブログ

Prometheus と Grafana で Nomad メトリクスの可視化

前回つくった VagrantVM 上の Nomad と Traefik のサンプルを使用して、 Nomad のメトリクスを可視化してみます。

innossh.hatenablog.com

またも記事書くのが遅れてしまいましたが、エイプリルフールに続いてゴールデンウィークなので許してください。

さて、今回は Nomad のメトリクスを可視化するための例として、 Nomad と Prometheus と Grafana の連携方法を紹介します。 Nomad 上で何個のコンテナが動作していて、それぞれのコンテナの使用メモリはどれぐらいなのかなど、 Nomad を運用しているとそのメトリクスの可視化が気になるところです。 公式ドキュメントでは Nomad の Telemetry の設定として、 statsite, statsd, datadog, prometheus, circonus などたくさんのツールと連携できると書かれています。

telemetry Stanza - Agent Configuration - Nomad by HashiCorp

個人的には Prometheus ぐらいしか触れたことがないので、 NomadGitHub リポジトリに書かれていた方法でメトリクスの可視化を行います。 Nomad - (Consul) - Prometheus - Grafana を連携させる形です。

nomad/integrations/grafana_dashboards at v0.8.3 · hashicorp/nomad · GitHub

前回と同様のリポジトリで動作が確認できます。 Nomad v0.7 系だとおそらくメトリクスの名前が違ったり種類が少なかったりすると思うので、ついでに Nomad や Consul をアップデートしました。 コードの変更としては VM への Prometheus と Grafana のインストールが加わっていますが、やっつけのシェルなので全く頑張ってませんw真似しないでください。

github.com

Nomad の起動方法に関しては前回のエントリと変わっていないので vagrant up で一発です。 具体的な連携方法ですが、それぞれのツールを理解していれば特に難しいことはありません。 まずは Nomad で Telemetry を有効化 します。

traefik-nomad-example/server.hcl at 9da905f24dcb0a0791b27c50a19f43d2ddad67ae · innossh/traefik-nomad-example · GitHub

...
telemetry {
  publish_allocation_metrics = true
  publish_node_metrics       = true
  prometheus_metrics         = true
}

これで Prometheus が読めるフォーマットでメトリクスが取得できるようになりました。 続いて Prometheus の設定 を行うのですが、これは NomadGitHub リポジトリのサンプルそのままで正常に動作しました。

nomad/prometheus.yml at v0.8.3 · hashicorp/nomad · GitHub

server: 'localhost:8500' という設定がありますが、これは同じ VM 上で動作している Consul を指しています。 Consul の Service Discovery を利用して Nomad を参照し、 metrics_path: /v1/metrics でメトリクスを取得していると思われます。 ここまで正しく設定できていれば、次のように Prometheus で Nomad のメトリクスを確認することができますね。

f:id:innossh:20180502174543p:plain

では最後に Grafana で可視化 します。久々の Grafana 、最新版を使ってみたらログイン画面が宇宙っぽくてカッコよくなってましたw 設定はデフォルトのままなので、 http://localhost:3000 にアクセスして admin/admin でログイン可能です。まずはデータソースを登録します。

f:id:innossh:20180502174833p:plain

データソースは yaml でも設定できるようになったようですね。 ダッシュボードは NomadGitHub リポジトリのものだとメトリクス名が古いのか正しく表示できなかったので、修正したものをコミットしておきました。

traefik-nomad-example/sample_grafana_dashboard-nomad0_8_3-grafana5_1_0.json at 9da905f24dcb0a0791b27c50a19f43d2ddad67ae · innossh/traefik-nomad-example · GitHub

json をインポートしてあげれば完了です。さあいよいよグラフ表示です。こんな感じになります。

f:id:innossh:20180502180230p:plain

公式のサンプルだけだと質素ですが、もちろんこれ以外にもたくさんのメトリクスが取得可能です。ただかっこいいグラフを作ろうとすると Prometheus のクエリの知識が必要になります。お目当ての Nomad のタスクごとのメモリ RSS のグラフの例はこちらです。クエリは単純に nomad_client_allocs_memory_rss だけで良いです。

f:id:innossh:20180502181809p:plain

Nomad の Job がたくさんある場合には Nomad の Web UI だと一覧するにはあまり見やすいものではないので、今回のように可視化をすると Nomad を運用する上で重要かつ便利になってくると思います。 OSS のコンテナマネージメントプラットフォームを運用するのはなかなか大変ですが、必要なところに必要なツールを組み合わせて対処していく他なさそうです。

Effective DevOps ―4本柱による持続可能な組織文化の育て方

Effective DevOps ―4本柱による持続可能な組織文化の育て方

コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤

コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤