Ubuntu16.04でPrometheus1.xをPrometheus2.0にアップグレードする方法
著者は、 Diversity in Tech 基金を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
Prometheus は、サービスから指標を収集するオープンソースの監視システムです。 Prometheus 2.0は、新しい時系列データベース、より優れたリソース使用量、アラートの新しい構成形式、より優れたAlertmanager検出など、多くの変更と改善をもたらします。
このチュートリアルでは、既存のPrometheus1.xインストールをPrometheus2.0にアップグレードします。 tsdb
と呼ばれるPrometheus2.0の新しい時系列データベースは、Prometheus 1.xと互換性がありません。つまり、Prometheus2を使用してPrometheus1.xインスタンスからデータを読み取ることはできません。 この制限を回避するには、Prometheus 1.xを読み取り専用のデータストアとして機能するように構成して、古いデータを利用できるようにします。
Prometheus 2はアラートルールに新しい形式を使用するため、既存のアラートルールを新しい形式に更新し、Alertmanagerを使用します。
最後に、Web UIを使用して、Prometheusが意図したとおりに機能していることを確認します。
このチュートリアルでは、最も重要な変更のみを取り上げます。 最新バージョンにアップグレードする前に、 Prometheus 2.0の発表を読んで、他の変更の影響を受けていないことを確認する必要があります。
前提条件
このチュートリアルに従うには、次のものが必要です。
- Ubuntu 16.04チュートリアルを使用した初期サーバーセットアップ(sudo非rootユーザーとファイアウォールを含む)に従ってセットアップされた1つのUbuntu16.04サーバー。
- PrometheusWebUIを含むサーバーにインストールされたPrometheus1.x。
prometheus -version
コマンドを実行すると、Prometheusのバージョンを確認できます。 出力には、Prometheusバージョンとビルド情報が含まれます。
このチュートリアルでは、Prometheusのインストールについて次のことを前提としています。
- prometheusユーザーを作成しました。
- Prometheusの構成ファイルを保持するディレクトリ
/etc/prometheus
を作成しました。 - Prometheusのデータを保持するディレクトリ
/var/lib/prometheus
を作成しました。 prometheus
およびpromtool
実行可能ファイルは/usr/local/bin
にあります。prometheus
と呼ばれるsystemdサービスとして実行するようにPrometheusを構成しました。
ステップ1—Prometheusを1.8.2にアップグレードする
Prometheus 2.0を使用して古いデータにアクセスするには、現在のPrometheusインストールをバージョン1.8.2
にアップグレードしてから、remote_read
機能を使用して古いデータから読み取るようにPrometheus2.0を設定する必要があります。 。
prometheus -version
コマンドを使用して、現在のPrometheusバージョンを確認します。 出力には、バージョンとビルド情報が含まれます。 すでにバージョン1.8.2
を実行している場合は、この手順をスキップしてください。
- prometheus -version
prometheus -version outputprometheus, version 1.7.1 (branch: master, revision: 3afb3fffa3a29c3de865e1172fb740442e9d0133)
build user: root@0aa1b7fc430d
build date: 20170612-11:44:05
go version: go1.8.3
先に進む前に、Prometheusを停止して、ファイルを置き換えることができるようにします。
- sudo systemctl stop prometheus
Prometheus 1.8.2とチェックサムは、プロジェクトの GitHubReleasesページにあります。 prometheus-1.8.2.linux-amd64.tar.gz
というファイルが必要です。 次のcurl
コマンドを使用して、Prometheusアーカイブとチェックサムをホームディレクトリにダウンロードします。
- cd ~
- curl -LO https://github.com/prometheus/prometheus/releases/download/v1.8.2/prometheus-1.8.2.linux-amd64.tar.gz
- curl -LO https://github.com/prometheus/prometheus/releases/download/v1.8.2/sha256sums.txt
破損していない本物のアーカイブがあることを確認するには、sha256sum
コマンドを使用してアーカイブのチェックサムを生成し、sha256sums.txt
ファイルと比較します。
- sha256sum -c sha256sums.txt 2>&1 | grep OK
Checksums checkprometheus-1.8.2.linux-amd64.tar.gz: OK
出力にOK
が表示されない場合は、ダウンロードしたアーカイブを削除し、前の手順に戻って再度ダウンロードしてください。
次に、アーカイブを解凍します。
- tar xvf prometheus-1.8.2.linux-amd64.tar.gz
prometheus
およびpromtool
実行可能ファイルを/usr/local/bin
ディレクトリにコピーします。
- sudo cp prometheus-1.8.2.linux-amd64/prometheus /usr/local/bin
- sudo cp prometheus-1.8.2.linux-amd64/promtool /usr/local/bin
ファイルのユーザーとグループの所有権をprometheusユーザーに設定します。
- sudo chown prometheus:prometheus /usr/local/bin/prometheus
- sudo chown prometheus:prometheus /usr/local/bin/promtool
最後に、Prometheusを起動して、意図したとおりに機能していることを確認します。
- sudo systemctl start prometheus
最後に、サービスのステータスを確認します。
- sudo systemctl status prometheus
次の出力が表示されます。
Prometheus service status● prometheus.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2018-01-01 21:44:52 UTC; 2s ago
Main PID: 1646 (prometheus)
Tasks: 6
Memory: 17.7M
CPU: 333ms
CGroup: /system.slice/prometheus.service
└─1646 /usr/local/bin/prometheus -config.file /etc/prometheus/prometheus.yml -storage.local.path /var/lib/prometheus/
...
サービスステータスがactive
でない場合は、チュートリアルを続行する前に、画面上のログに従い、前の手順をたどって問題を解決してください。
Prometheusのバージョンを確認して、バージョン1.8.2
を実行していることを確認します。
- prometheus -version
prometheus -version outputprometheus, version 1.8.2 (branch: HEAD, revision: 5211b96d4d1291c3dd1a569f711d3b301b635ecb)
build user: root@1412e937e4ad
build date: 20171104-16:09:14
go version: go1.9.2
version 1.8.2
が表示されない場合は、正しいファイルをダウンロードしたことを確認して、このセクションの手順を繰り返してください。
最後に、ダウンロードしたファイルは不要になったため、削除します。
- rm -rf prometheus-1.8.2.linux-amd64.tar.gz prometheus-1.8.2.linux-amd64
次に、既存のインストールを再構成して、インストール後にPrometheus2.0に干渉しないようにします。
ステップ2—Prometheus1.8.2を個別のサービスとして構成する
古いデータにアクセスできるようにPrometheus1.8.2を維持したいのですが、古いインストールがPrometheus2に干渉しないようにする必要があります。 そのために、Prometheus関連のすべてのディレクトリと実行可能ファイルの名前に1
を追加します。 たとえば、prometheus
実行可能ファイルはprometheus1
になります。 また、サービス定義を更新し、別のポートで実行するように設定します。
続行する前に、Prometheusを停止して、ファイルとディレクトリの名前を変更できるようにします。
- sudo systemctl stop prometheus
/usr/local/bin
ディレクトリには、prometheus
とpromtool
の2つのPrometheus実行可能ファイルがあります。 これらの名前をそれぞれprometheus1
とpromtool1
に変更します。
- sudo mv /usr/local/bin/prometheus /usr/local/bin/prometheus1
- sudo mv /usr/local/bin/promtool /usr/local/bin/promtool1
Prometheusには、構成ファイルを保存するための/etc/prometheus
と、データを保存するための/var/lib/prometheus
の2つのディレクトリが関連付けられています。 これらのディレクトリの名前も変更します。
- sudo mv /etc/prometheus /etc/prometheus1
- sudo mv /var/lib/prometheus /var/lib/prometheus1
Prometheus 1.8.2を読み取り専用のデータストアとして実行するため、エクスポーターからデータを収集するためにPrometheus1.8.2を実行する必要はありません。 これを確実にするために、次のtruncate
コマンドを使用して、構成ファイルからすべてのコンテンツを削除します。 ファイルの内容を削除する前に、ファイルのバックアップを作成して、後でPrometheus2.0の構成に使用できるようにします。
- sudo cp /etc/prometheus1/prometheus.yml /etc/prometheus1/prometheus.yml.bak
次に、truncate
を使用して構成ファイルの内容を空にします。
- sudo truncate -s 0 /etc/prometheus1/prometheus.yml
次に、サービスファイルの名前をprometheus
からprometheus1
に変更します。
- sudo mv /etc/systemd/system/prometheus.service /etc/systemd/system/prometheus1.service
テキストエディタでPrometheusサービスファイルを開きます。
- sudo nano /etc/systemd/system/prometheus1.service
9090
のデフォルトポートでPrometheus2.0を実行するので、Prometheus1.8.2がポート9089
をリッスンするポートを変更します。 ExecStart
ディレクティブを次の構成に置き換えます。
...
ExecStart=/usr/local/bin/prometheus1 \
-config.file /etc/prometheus1/prometheus.yml \
-storage.local.path /var/lib/prometheus1/ \
-web.listen-address ":9089"
...
ファイルを保存して、テキストエディタを閉じます。 systemd
をリロードして、変更を適用します。
- sudo systemctl daemon-reload
prometheus1
サービスを開始します。
- sudo systemctl start prometheus1
意図したとおりに機能していることを確認するには、サービスのステータスを確認してください。
- sudo systemctl status prometheus1
以前と同様に、出力には、PID、ステータスなどのプロセスに関する情報が含まれます。
Service status output● prometheus1.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus1.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2018-01-01 21:46:42 UTC; 3s ago
Main PID: 1718 (prometheus1)
Tasks: 6
Memory: 35.7M
CPU: 223ms
CGroup: /system.slice/prometheus1.service
└─1718 /usr/local/bin/prometheus1 -config.file /etc/prometheus1/prometheus.yml -storage.local.path /var/lib/prometheus1/
...
サービスステータスがactive
でない場合は、チュートリアルを続行する前に、画面上のログに従い、前の手順をたどって問題を解決してください。
サービスを有効にして、システムの起動時にサービスが開始されることを確認します。
- sudo systemctl enable prometheus1
この時点で、Prometheus1.8.2はエクスポーターをスクレイプしません。 これにより、Prometheus 2.0をセットアップすると、データの一貫性が確保されます。Prometheus2.0は、現在のインストールを古いデータの読み取り専用データストアとして使用します。 次のステップでは、Prometheus 2.0をインストールし、Prometheus1.8.2を使用して古いデータにアクセスします。
ステップ3—Prometheus2.0の構成
このステップでは、エクスポーターをスクレイプするようにPrometheus 2.0を構成し、Prometheus 1.8.2を読み取り専用のデータストアとして使用して、既存のデータにアクセスできるようにします。
チュートリアルを続行する前に、 Ubuntu16.04チュートリアルにPrometheusをインストールする方法のステップ1と2に従ってPrometheus2をインストールしてください。
Prometheusをインストールしたら、新しい構成ファイルを作成します。 構成ファイルの形式は変更されていないため、Prometheus1.x構成ファイルをPrometheus2で使用できます。 前の手順で作成した既存のPrometheus構成のバックアップを/etc/prometheus/
ディレクトリにコピーします。
- sudo cp /etc/prometheus1/prometheus.yml.bak /etc/prometheus/prometheus.yml
新しく作成した構成ファイルのユーザーとグループの所有権をprometheusユーザーに設定します。
- sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml
このファイルに加える唯一の変更は、Prometheus 2.0に読み取り専用データストアとしてPrometheus1.8.2を使用するように指示して、古いデータにアクセスできるようにすることです。 テキストエディタで設定ファイルを開きます。
- sudo nano /etc/prometheus/prometheus.yml
構成ファイルの最後に、リモートPrometheusインスタンスから読み取るremote_read
ディレクティブを追加します。 Prometheus1.8.2インスタンスであるlocalhst:9089
から読み取るように指示します。
...
remote_read:
- url: http://localhost:9089/api/v1/read
完了したら、ファイルを保存してテキストエディタを閉じます。
Prometheus 2.0を初めて実行する前に、アラートルールを更新し、Prometheusと連携するようにAlertmanagerを構成します。 アラートルールまたはAlertmanagerを使用しない場合は、次の手順をスキップしてください。
ステップ4—アラートの構成(オプション)
Prometheus 1.xアラートルールは、カスタム構文を使用して定義されました。 バージョン2.0以降、YAMLを使用してアラートルールを定義します。 移行を容易にするために、Prometheusのpromtool
コマンドは、古いルールファイルを新しい形式に変換できます。 アラートルールを使用しない場合は、この手順をスキップできます。
まず、/etc/prometheus1
ディレクトリから/etc/prometheus
ディレクトリにすべてのルールをコピーします。
- sudo cp /etc/prometheus1/*.rules /etc/prometheus/
また、次のコマンドを実行して、promtool
バージョン2.0を使用していることを確認してください。
- promtool --version
出力には、promtool
のバージョンとビルド情報が含まれています。
promtool --versionpromtool, version 2.0.0 (branch: HEAD, revision: 0a74f98628a0463dddc90528220c94de5032d1a0)
build user: root@615b82cb36b6
build date: 20171108-07:11:59
go version: go1.9.2
バージョンが2.0でない場合は、promtool
実行可能ファイルを正しい場所にコピーしたことを確認してください。
次に、/etc/prometheus
ディレクトリに移動します。
- cd /etc/prometheus
ディレクトリにある.rules
ファイルごとに、次のpromtool
コマンドを実行します。
- sudo promtool update rules file-name.rules
これにより、提供されたファイルからfile-name.rules.yml
ファイルと呼ばれる新しいファイルが生成されます。 画面にエラーメッセージが表示された場合は、チュートリアルを続行する前に、画面上のログに従って問題を解決してください。
promtool
によって作成されたファイルにユーザーとグループの所有権が正しく設定されていることを確認してください。
- sudo chown prometheus:prometheus file-name.rules
最後に、Prometheus構成ファイルを更新して、古いルールファイルの代わりに新しく作成したルールファイルを使用します。 エディターで構成ファイルを開きます。
- sudo nano /etc/prometheus/prometheus.yml
次のように、rule_files
ディレクティブの下のすべてのエントリに.yml
サフィックスを追加します。
...
rule_files:
- alert1.rules.yml
- alert2.rules.yml
...
ファイルを保存して、エディターを終了します。
古いアラートルールファイルは不要になったため、削除します。
- sudo rm alert1.rules alert2.rules
次に、Alertmanagerを検出するようにPrometheusを構成しましょう。 -alertmanager.url
フラグはもう存在しません。 代わりに、Prometheus2.0はAlertmanagerService Discoveryを導入しました。これは、多くの新機能とKubernetesなどのサービスとのより良い統合をもたらします。 Alertmanagerを使用しない場合は、このステップの残りをスキップしてください。
エディターでprometheus.yml
ファイルを再度開きます。
- sudo nano /etc/prometheus/prometheus.yml
次のalerting
ディレクティブは、Dropletのポート:9093
で実行されているAlertmanagerを使用するようにPrometheusに指示します。 次のコンテンツをファイルのどこにでも追加できます。
global:
...
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
rule_files:
...
ファイルを保存して、テキストエディタを閉じます。
これで、Prometheusはアラートルールを使用してAlertmanagerと通信できるようになり、初めて実行する準備が整いました。
ステップ5—Prometheus2.0を実行する
Prometheus 2.0をサービスとして実行できるようにするには、サービスファイルを作成する必要があります。 ExecStart
コマンド以外はほとんど同じであるため、Prometheus1.8.2で使用したサービスファイルから始めることができます。
既存のサービスファイルをコピーして、新しいサービスファイルを作成します。
- sudo cp /etc/systemd/system/prometheus1.service /etc/systemd/system/prometheus.service
新しく作成したサービスファイルをエディターで開きます。
- sudo nano /etc/systemd/system/prometheus.service
Prometheus 2.0は、フラグシステムに次のようないくつかの重要な変更をもたらします。
- フラグには、一点鎖線ではなく二点鎖線(
--
)を使用して接頭辞が付けられるようになりました。 - すべての
-storage.local
および-storage.remote
フラグが削除され、--storage.tsdb
フラグに置き換えられました。 -alertmanager.url
は削除され、前の手順で説明したAlertmanagerServiceDiscoveryに置き換えられました。
ExecStart
ディレクティブを次のディレクティブに置き換えます。
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
--config.file
ディレクティブは、/etc/prometheus
ディレクトリにあるprometheus.yml
ファイルを使用するようにPrometheusに指示します。 --storage.local.path
の代わりに、--storage.tsdb.path
を使用します。 また、2つの--web.
フラグを追加したため、組み込みのWebテンプレートにアクセスできます。
完了したら、ファイルを保存してテキストエディタを閉じます。
最後に、systemdをリロードして、新しく作成したサービスを使用できるようにします。
- sudo systemctl daemon-reload
次に、Prometheusを起動します。
- sudo systemctl start prometheus
サービスのステータスをチェックして、意図したとおりに機能していることを確認します。
- sudo systemctl status prometheus
Prometheus service status● prometheus.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2018-01-01 20:15:09 UTC; 1h 20min ago
Main PID: 1947 (prometheus)
Tasks: 7
Memory: 54.3M
CPU: 15.626s
CGroup: /system.slice/prometheus.service
└─1947 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/
...
サービスステータスがactive
でない場合は、チュートリアルを続行する前に、画面上のログに従い、前の手順をたどって問題を解決してください。
サービスが機能することがわかったので、システムの起動時にサービスを開始できるようにします。
- sudo systemctl enable prometheus
PrometheusのWebUIにアクセスするには、Webブラウザでhttp://your_server_ip
に移動し、Prometheusのインストール時に構成した資格情報を使用して認証します。 次のステップでWebUIを使用して、Prometheusが意図したとおりに機能していることを確認します。
ステップ6—プロメテウスのテスト
Prometheus 2が意図したとおりにすべてのエクスポーターをスクレイピングしていることを確認し、Prometheusの以前のインストールからのデータにアクセスできることを確認しましょう。
Webブラウザでhttp://your_server_ip
に移動して、PrometheusWebUIにアクセスします。 Prometheusを最初にインストールしたときに設定したユーザー名とパスワードを入力するように求められます。
クレデンシャルを入力すると、グラフページが表示されます。このページでは、クエリを実行して視覚化できます。
クエリを実行する前に、Prometheusのバージョンとエクスポーターのステータスを確認しましょう。 クリックしてください状態ナビゲーションバーのリンクをクリックして、 ランタイムとビルド情報ボタン。 Prometheusサーバーに関する情報を含むページが表示されます。
次に、ステータスリンクをもう一度クリックし、ターゲットボタンをクリックして、エクスポーターが意図したとおりに実行されていることを確認します。 Webページには、エクスポーターが稼働しているかどうかなど、エクスポーターに関する詳細が含まれています。
エラーが表示された場合は、チュートリアルを続行する前に、画面の指示に従ってエラーを解決してください。
Prometheus 1.8.2データソースは、エクスポーターとしてではなくデータストアとして使用されるため、表示されません。 それでは、古いデータと新しいデータの両方にアクセスできることを確認しましょう。 グラフボタンをクリックします。
Expression フィールドにnode_memory_MemAvailable/1024/1024
と入力して、サーバーで使用可能なメモリをメガバイト単位で取得します。 実行ボタンをクリックします。
画面に結果が表示されます。
グラフタブをクリックして、使用可能なメモリを時間の経過とともに視覚化します。 グラフには、以前のデータと、Prometheusが動作していないときに休憩した後の最新のデータが表示されます。
古いデータが表示されない場合は、サービスのステータスを確認してPrometheus 1.8.2が起動していること、およびリモートデータベースとして使用するようにPrometheus2.0を構成したことを確認してください。
Prometheusが機能し、データを正しく報告していることを確認しました。 次に、Prometheus 1.8.2と、使用されなくなった古いデータを削除する方法を見てみましょう。
手順7—古いデータの削除(オプション)
Prometheus 1.8.2と古いデータが不要になったら、削除することをお勧めします。 次の手順に従って、すべてをクリーンアップします。
警告:これは元に戻せない操作です。 古いデータを削除すると、バックアップしない限り、データを復元することはできません。
まず、Prometheus2構成ファイルからremote_read
ディレクティブを削除します。 エディターでPrometheus2.0構成ファイルを開きます。
- sudo nano /etc/prometheus/prometheus.yml
ファイルの最後にあるremote_read
ディレクティブを見つけて削除します。
remote_read:
- url: http://localhost:9089/api/v1/read
ファイルを保存して、テキストエディタを閉じます。 Prometheusを再起動して、変更を適用します。
- sudo systemctl restart prometheus
サービスが正しく実行されていることを確認します。
- sudo systemctl status prometheus
Prometheus service status● prometheus.service - Prometheus
Loaded: loaded (/etc/systemd/system/prometheus.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2018-01-01 20:15:09 UTC; 1h 20min ago
Main PID: 1947 (prometheus)
Tasks: 7
Memory: 54.3M
CPU: 15.626s
CGroup: /system.slice/prometheus.service
└─1947 /usr/local/bin/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus/
...
サービスステータスがactive
でない場合は、チュートリアルを続行する前に、画面上のログに従い、前の手順をたどって問題を解決してください。
次に、prometheus1
サービスを無効にして削除し、Prometheus1.8.2に関連するすべてのディレクトリとファイルをクリーンアップします。
サービスを無効にして、自動的に起動しないようにします。
- sudo systemctl disable prometheus1
次に、サービスを停止します。
- sudo systemctl stop prometheus1
出力がない場合は、操作が正常に完了したことを示しています。
次に、prometheus1
サービスファイルを削除します。
- sudo rm /etc/systemd/system/prometheus1.service
最後に、残ったファイルは不要になったので削除します。 まず、/usr/local/bin
ディレクトリにあるprometheus1
およびpromtool1
実行可能ファイルを削除します。
- sudo rm /usr/local/bin/prometheus1 /usr/local/bin/promtool1
次に、データと構成の保存に使用した/etc/prometheus1
および/var/lib/prometheus1
ディレクトリを削除します。
- sudo rm -r /etc/prometheus1 /var/lib/prometheus1
Prometheus 1.8.2がシステムから削除され、古いデータが失われます。
結論
このチュートリアルでは、Prometheus1.xをPrometheus2.0にアップグレードし、すべてのルールファイルを更新し、Alertmanagerが存在する場合はそれを検出するようにPrometheusを構成しました。
Prometheus 2.0に含まれるすべての変更について詳しくは、 Prometheus2.0の公式投稿とプロジェクトの変更ログをご覧ください。