Prometheusの共同作成者であるJuliusVolzの記事

序章

Prometheusは、オープンソースの監視システムおよび時系列データベースです。 メトリックの生成と収集、ダッシュボードでの結果データのグラフ化、異常のアラートなど、監視の多くの側面に対応します。 これを実現するために、個別に実行されるが組み合わせて使用されるさまざまなコンポーネントを提供します。

Dockerは、Linuxコンテナー(または他のカプセル化テクノロジー)を使用してサーバープロセスをカプセル化する方法を提供します。これにより、サーバープロセスをより簡単に管理し、相互に分離できます。 Dockerの詳細については、 Dockerエコシステム:一般的なコンポーネントの概要を参照してください。

このチュートリアルでは、DockerでPrometheusを使用するための3つの主要コンポーネントをインストールする方法を学習します。 これらは:

  • メトリックを収集してクエリするPrometheusサーバー
  • Prometheus互換形式でシステムメトリックをエクスポートするノードエクスポータ
  • Grafana、他のバックエンドの中でもPrometheusをサポートするWebベースのグラフィカルダッシュボードビルダー

Prometheusエコシステムにはさらに多くのコンポーネントがありますが、これら3つはPrometheusを使用するための良い出発点を提供します。

前提条件

このチュートリアルに従うには、次のものが必要です。

  • CentOS7.1ドロップレット
  • のユーザー sudo アクセス(詳細については、 CentOS 7 チュートリアルを使用したサーバーの初期設定を参照してください)
  • CentOS7にDockerComposeをインストールして使用する方法のステップ1の手順でインストールされたDocker

注:この記事は、1 CPU / 512 MB RAMCentOS7.1ドロップレットでテストされています。 Prometheusの構成は、この記事のステップ2で説明されているように、利用可能なリソースの量に合わせて調整する必要があります。

ステップ1—Prometheusをインストールする

このセクションでは、Dockerを使用してメインのPrometheusサーバーをインストールする方法について説明します。 続行する前に、前提条件セクションに従ってDockerをインストールしてください。 Prometheusサーバーは、Prometheusエコシステムの中心的な部分であり、メトリックの収集と保存、および式クエリの処理とアラートの生成を担当します。

すべてのPrometheusコンポーネントのDockerコンテナイメージは、DockerHubのprom組織でホストされています。 の実行 prom/prometheus これ以上のオプションがないDockerイメージは、次の場所にある構成ファイルの例を使用してPrometheusサーバーを起動します。 /etc/prometheus/prometheus.yml コンテナ内。 また、にマウントされたDockerデータボリュームを使用します /prometheus 収集されたメトリックデータを格納するためのコンテナ内。 このデータボリュームディレクトリは、実際には、コンテナが最初に起動されたときにDockerが自動作成するホスト上のディレクトリです。 その中のデータは、同じコンテナーの再起動間で保持されます。

デフォルトの構成ファイルをオーバーライドするには、複数の方法があります。 たとえば、カスタム構成ファイルをホストファイルシステムからDockerデータボリュームとしてコンテナーに渡すことも、独自の構成ファイルをコンテナーイメージにベイクして派生したDockerコンテナーを構築することもできます。 このチュートリアルでは、ホストシステムから構成ファイルを渡すことを選択します。

メトリックのストレージを整理するためのさまざまなパターンもあります。 このチュートリアルでは、Dockerイメージのデフォルトの動作であるDockerデータボリュームを使用してメトリックを保存します。 または、ニーズに適している場合は、データボリュームコンテナの作成を検討することもできます。

注: Dockerデータボリュームを作成する方法については、 Ubuntu 14.04でDockerデータボリュームを操作する方法をお読みください(この記事の関連部分はUbuntu固有ではありません)。

まず、ホストファイルシステムに最小限のPrometheus構成ファイルを作成します。 ~/prometheus.yml:

  1. nano ~/prometheus.yml

次の内容をファイルに追加します(置換 your_server_ip ドロップレットのIPアドレスを使用):

〜/ prometheus.yml
# A scrape configuration scraping a Node Exporter and the Prometheus server
# itself.
scrape_configs:
  # Scrape Prometheus itself every 5 seconds.
  - job_name: 'prometheus'
    scrape_interval: 5s
    target_groups:
      - targets: ['localhost:9090']

  # Scrape the Node Exporter every 5 seconds.
  - job_name: 'node'
    scrape_interval: 5s
    target_groups:
      - targets: ['your_server_ip:9100']

この構成例では、Prometheusがそれ自体から(PrometheusはPrometheus互換形式でそれ自体に関するメトリックも公開するため)、および後で設定するNodeExporterからメトリックをスクレイプします。 Prometheusは、コンテナ内でPrometheusを使用して自分自身に接続できます。 localhost ホスト名の場合、ノードエクスポーターは別のネットワーク名前空間を持つ別のコンテナーで実行されるため、サーバーの外部IPを使用してノードエクスポーターをスクレイピングする必要があります。

外部構成ファイルを使用してPrometheusDockerコンテナーを起動します。

  1. docker run -d -p 9090:9090 -v ~/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus -config.file=/etc/prometheus/prometheus.yml -storage.local.path=/prometheus -storage.local.memory-chunks=10000

このコマンドを初めて実行すると、DockerHubからDockerイメージがプルされます。

このコマンドは非常に長く、多くのコマンドラインオプションが含まれています。 それをもっと詳しく見てみましょう:

  • The -d オプションは、Prometheusコンテナをデタッチモードで開始します。つまり、コンテナはバックグラウンドで開始され、を押しても終了しません。 CTRL+C.
  • The -p 9090:9090 オプションは、PrometheusのWebポート(9090)を公開し、ホストシステムの外部IPアドレスを介して到達可能にします。
  • The -v [...] オプションはマウントします prometheus.yml ホストファイルシステムからPrometheusが期待するコンテナ内の場所への構成ファイル(/etc/prometheus/prometheus.yml).
  • The -config.file オプションは、コンテナ内のPrometheus構成ファイルの場所に応じて設定されます。
  • The -storage.local.path オプションは、コンテナ内のメトリックの保存場所を構成します。
  • 最後に、 -storage.local.memory-chunks オプションは、Prometheusのメモリ使用量をホストシステムの非常に少量のRAM(512MBのみ)およびこのチュートリアルで保存されている少数の時系列(1000未満)に調整します。 これは、デフォルトの1048576ではなく、10000サンプルチャンク(シリーズごとに約10チャンク)のみをメモリに保持するようにPrometheusに指示します。 これは、より多くのRAMを搭載したマシンでPrometheusを実行する場合、およびより多くの時系列を保存する場合に、必ず調整する必要がある値です。 これに関する詳細については、Prometheusのストレージドキュメントを参照してください。

次のコマンドを使用して、実行中のすべてのDockerコンテナーを一覧表示できます。

  1. docker ps

たとえば、PrometheusDockerコンテナの場合は次のようになります。

Output of `docker ps`
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6a89ac39911e prom/prometheus "/bin/prometheus -con" 2 hours ago Up 2 hours 0.0.0.0:9090->9090/tcp stoic_pike

に示されているコンテナIDを使用する docker ps 出力では、次のコマンドを使用して、実行中のPrometheusサーバーのログを調べることができます。

  1. docker logs container_id

この例では、コマンドは次のようになります。

  1. docker logs 6a89ac39911e

ホストのファイルシステムのどこにメトリックストレージボリュームが保存されているかを確認するには、container_idを使用して次のコマンドを実行できます。

  1. docker inspect container_id

これにより、マウントされたDockerボリュームのホストパスなど、コンテナーの構成に関する情報が出力されます。

次のような出力のセクションを見つけます。

Output of `docker inspect ...`
... "Mounts": [ { "Source": "/home/sammy/prometheus.yml", "Destination": "/etc/prometheus/prometheus.yml", "Mode": "", "RW": true }, { "Name": "821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c", "Source": "/var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data", "Destination": "/prometheus", "Driver": "local", "Mode": "", "RW": true } ], ...

この例では、メトリックはに格納されています /var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data ホストシステム上。 このディレクトリは、Prometheusコンテナを最初に起動したときにDockerによって自動的に作成されました。 にマッピングされます /prometheus コンテナ内のディレクトリ。 このディレクトリ内のデータは、同じコンテナを再起動しても保持されます。 必要に応じて、メトリックデータを保存するための既存のホストディレクトリをマウントすることもできます。 これを実現する方法については、 Ubuntu14.04でDockerデータボリュームを操作する方法を参照してください。 この記事はUbuntu14.04向けに書かれていますが、Dockerコマンドと構成ファイルはCentOS7でも同じです。

これで、Prometheusサーバーにアクセスできるようになります。 http://your_server_ip:9090/. 次のURLにアクセスして、自分自身に関する指標を収集していることを確認します。 http://your_server_ip:9090/status とを見つける http://localhost:9090/metrics のエンドポイント prometheus ターゲットセクションのジョブ。 このターゲットのState列には、ターゲットの状態がHEALTHYと表示されます。 対照的に、 http://localhost:9100/metrics (ノードエクスポータ)エンドポイントは、ノードエクスポータがまだ開始されておらず、スクレイプできないため、UNHEALTHYとして表示されます。

要約すると、カスタムPrometheus構成ファイルを使用してPrometheusをDockerコンテナーとして実行することができます。 ~/prometheus.yml、ホストファイルシステムにあります。 メトリックストレージはにあります /prometheus コンテナ内のディレクトリ。これは、ホストシステム上で、 docker inspect このセクションで説明するコマンド。

ステップ2—ノードエクスポーターの設定

このセクションでは、PrometheusNodeExporterをインストールします。 Node Exporterは、実行中のホストマシン(ノード)に関するPrometheusメトリックを公開するサーバーです。 これには、マシンのファイルシステム、ネットワークデバイス、プロセッサ使用量、メモリ使用量などに関するメトリックが含まれます。

DockerでNodeExporterを実行すると、実行しているホストに関するメトリックを公開することが全体の目的であるため、いくつかの課題が発生することに注意してください。 それ以上のオプションなしでDockerで実行すると、ファイルシステムやネットワークデバイスなどのリソースのDockerの名前空間により、ホストの環境とは異なるコンテナの環境に関するメトリックのみがエクスポートされます。 したがって、通常は、Dockerの外部のホストシステムで直接NodeExporterを実行することをお勧めします。 ただし、Dockerを使用してすべてのプロセスを管理する必要がある場合は、Docker内からホストメトリックをエクスポートするための妥当な概算を提供する回避策について説明します。

Dockerを使用してポート9100でNodeExporterを起動するには:

  1. docker run -d -p 9100:9100 -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" --net="host" prom/node-exporter -collector.procfs /host/proc -collector.sysfs /host/proc -collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"

次のDockerフラグとNodeExporterフラグは、hostメトリックの妥当な概算を提供するために使用されます。

  • Linuxでは、NodeExporterはそのメトリックのほとんどを /proc/sys ファイルシステム。 これらのファイルシステムは、ホストから下のコンテナにマウントされます。 /host Dockerのディレクトリを使用 -v 国旗。
  • ノードエクスポータを介して -collector.procfs-collector.sysfs フラグの場合、ノードエクスポータに /proc/sys 非標準の場所にあるファイルシステム。
  • ホストファイルシステムのメトリックを報告するために、ルート全体をマウントします(/)ファイルシステムをコンテナに( /rootfs)、再びDockerを使用 -v 国旗。
  • ノードエクスポータを使用する -collector.filesystem.ignored-mount-points ホストシステムに属していないコンテナ内の他のファイルシステムを無視するフラグ。 このオプションは、報告されたメトリックから除外するマウントポイントの正規表現を取ります。
  • を使用して --net=host Dockerフラグ、コンテナをホストと同じネットワークスタックに配置して、次のようなファイルから読み取るようにします。 /proc/net/dev ホスト上と同じ結果が得られます( /proc ホストからマウントされたファイルシステムでは不十分です)。

一部のメトリックは、ホスト上で直接実行されているノードエクスポーターと比較すると依然として異なることに注意してください。 具体的には、ファイルシステムの使用状況について報告されるメトリックには、 /rootfs それらの値のプレフィックス mountpoint コンテナ内のこのプレフィックスの下でルートファイルシステムにマウントするため、ラベル。 また、説明されている回避策が将来のNode Exporter機能に十分であるという保証もありません。そのため、独自の裁量でDocker上でNodeExporterを実行してください。

これで、Prometheusサーバーはノードエクスポーターのスクレイピングを自動的に開始するはずです。 Prometheusサーバーのステータスページに移動します。 http://your_server_ip:9090/status そして、 http://your_server_ip:9100/metrics のターゲット node ジョブはHEALTHY状態を示しています。

ステップ3—Grafanaを設定する

最後に、Grafanaをセットアップします。 Grafanaは、グラフ化するデータをクエリするためのバックエンドとしてPrometheusをサポートするグラフィカルダッシュボードビルダーです。

Grafanaは、ダッシュボードのメタデータ(存在するダッシュボードや表示するグラフなど)を構成可能なSQLベースのデータベースに保存します。 Grafanaは、ローカルのファイルベースのSQLite3データベースと、MySQLやPostgreSQLなどの外部データベースサーバーの使用をサポートしています。

このチュートリアルでは、Dockerデータボリュームに支えられたSQLite3データベースを使用します。 詳細については、Sqliteの使用方法と使用時期を参照してください。

管理者パスワードを使用してDockerコンテナとしてGrafanaを起動します(admin_password)お好きなもの:

  1. docker run -d -p 3000:3000 -e "GF_SECURITY_ADMIN_PASSWORD=admin_password" -v ~/grafana_db:/var/lib/grafana grafana/grafana

これにより、DockerHubからGrafanaDockerイメージがダウンロードされ、次の場所に配置された新しいDockerボリュームが作成されます。 ~/grafana_db ホストシステム上および /var/lib/grafana コンテナファイルシステム内。 コンテナ内で、GrafanaはSQLite3データベースを自動的に作成して初期化します。 /var/lib/grafana/grafana.db.

The -e フラグを使用すると、Dockerコンテナ内で起動されたプロセスに環境変数を渡すことができます。 ここでは、それを使用して設定します GF_SECURITY_ADMIN_PASSWORD 環境変数を目的のダッシュボード管理者パスワードに変更し、デフォルトのパスワードを上書きします admin. 環境変数を使用して、他のGrafana構成設定をオーバーライドすることもできます。 詳細については、環境変数の使用を参照してください。

Grafanaが正しく実行されていることを確認するには、 http://your_server_ip:3000/. 管理者のユーザー名は admin パスワードは、以前にDockerコンテナを起動したときに選択したものです。

ログインすると、Grafanaのメインビューが表示されます。

Grafanaの使用を開始する方法の詳細については、Grafanaのドキュメントを参照してください。 Prometheus Grafanaのドキュメントには、GrafanaをPrometheusと組み合わせて使用する方法も示されています。

結論

おめでとう! Prometheusサーバー、ノードエクスポーター、Grafanaをセットアップしました。すべてDockerを使用しています。 これらは現在すべて同じマシンで実行されていますが、これはデモンストレーションのみを目的としています。 本番環境では、通常、監視対象のすべてのマシン、複数のPrometheusサーバー(組織の必要に応じて)、およびこれらのサーバーからのデータをグラフ化するための単一のGrafanaサーバーでNodeExporterを実行します。

Prometheusの一般的な使用方法の詳細については、そのドキュメントを参照してください。