AlertmanagerとBlackboxExporterを使用してUbuntu16.04でWebサーバーを監視する方法
著者は、技術教育基金を選択して、 Write forDOnationsプログラムの一環として300ドルの寄付を受け取りました。
序章
問題が発生した場合、適切なチームにアラートを送信すると、問題の根本原因の特定が大幅にスピードアップし、チームがインシデントを迅速に解決できるようになります。
Prometheus は、サービスからメトリックを収集し、それらを時系列データベースに保存するオープンソースの監視システムです。 Alertmanager は、アラートを処理するためのツールであり、アラートを重複排除し、グループ化し、適切な受信者に送信します。 Prometheusなどのクライアントアプリケーションからのアラートを処理でき、電子メール、 PagerDuty 、 OpsGenie 、Slackを含む多くの受信者をサポートします。
利用可能な多くのPrometheusエクスポーターのおかげで、ウェブおよびデータベースサーバー、メッセージングシステムまたは APIを含む、インフラストラクチャのすべての部分のアラートを構成できます。
Blackbox Exporter は、HTTP、HTTPS、DNS、TCP、またはICMPプロトコルを介してエンドポイントをプローブし、成功したかどうかや応答の受信にかかった時間など、要求に関する詳細なメトリックを返します。
このチュートリアルでは、AlertmanagerとBlackbox Exporterをインストールして構成し、NginxWebサーバーの応答性を監視します。 次に、サーバーが応答しない場合に電子メールとSlackで通知するようにAlertmanagerを構成します。
前提条件
このチュートリアルでは、次のものが必要です。
- sudo非rootユーザーとファイアウォールを含むUbuntu16.04チュートリアルを使用した初期サーバーセットアップに従ってセットアップされた1つのUbuntu16.04サーバー。
- Ubuntu 16.04にNginxをインストールする方法チュートリアルの最初の2つの手順に従って、Nginxをインストールします。
- ポート
8080
でリッスンしているNginxサーバーブロック。これは、 Ubuntu 16.04 チュートリアルでNginxサーバーブロック(仮想ホスト)を設定する方法に従って構成できます。 このチュートリアルでは、これを監視するエンドポイントとして使用します。listenディレクティブを80から8080に変更して、ポートを変更します。 ドメインまたはサブドメインを使用できますが、チュートリアルを通じてエンドポイントアドレスを必ず置き換えてください。 - チュートリアルUbuntu16.04にPrometheusをインストールする方法に従ってインストールされたPrometheus2.x。
- 電子メールを送信するためのSMTPサーバー。 任意のSMTPサーバーを使用することも、チュートリアル Ubuntu16.04でPostfixを送信専用SMTPサーバーとしてインストールおよび構成する方法]に従って独自にセットアップすることもできます。
- オプションで、Slackを介してAlertmanagerからアラートを受信する場合は、Slackアカウントとワークスペース。
ステップ1—サービスユーザーの作成
セキュリティ上の理由から、blackbox_exporterとalertmanagerの2つの新しいユーザーアカウントを作成します。 チュートリアル全体でこれらのアカウントを使用して、Blackbox ExporterとAlertmanagerを実行し、適切なコアファイルとディレクトリの所有権を分離します。 これにより、Blackbox ExporterとAlertmanagerは、所有していないデータにアクセスして変更することができなくなります。
--no-create-home
および--shell /bin/false
フラグを使用して、useradd
コマンドでこれらのユーザーを作成し、これらのユーザーがサーバーにログインできないようにします。
- sudo useradd --no-create-home --shell /bin/false blackbox_exporter
- sudo useradd --no-create-home --shell /bin/false alertmanager
ユーザーを配置したら、BlackboxExporterをダウンロードして構成しましょう。
ステップ2—BlackboxExporterのインストール
まず、BlackboxExporterの最新の安定バージョンをホームディレクトリにダウンロードします。 最新のバイナリとそのチェックサムは、Prometheusダウンロードページで見つけることができます。
- cd ~
- curl -LO https://github.com/prometheus/blackbox_exporter/releases/download/v0.12.0/blackbox_exporter-0.12.0.linux-amd64.tar.gz
アーカイブを解凍する前に、次のsha256sum
コマンドを使用してファイルのチェックサムを確認してください。
- sha256sum blackbox_exporter-0.12.0.linux-amd64.tar.gz
このコマンドの出力をPrometheusダウンロードページのチェックサムと比較して、ファイルが本物であり、破損していないことを確認します。
Outputc5d8ba7d91101524fa7c3f5e17256d467d44d5e1d243e251fd795e0ab4a83605 blackbox_exporter-0.12.0.linux-amd64.tar.gz
チェックサムが一致しない場合は、ダウンロードしたファイルを削除し、前の手順を繰り返してファイルを再ダウンロードします。
チェックサムが一致することを確認したら、アーカイブを解凍します。
- tar xvf blackbox_exporter-0.12.0.linux-amd64.tar.gz
これにより、blackbox_exporter-0.12.0.linux-amd64
というディレクトリが作成され、blackbox_exporter
バイナリファイル、ライセンス、およびサンプルファイルが含まれます。
バイナリファイルを/usr/local/bin
ディレクトリにコピーします。
- sudo mv ./blackbox_exporter-0.12.0.linux-amd64/blackbox_exporter /usr/local/bin
バイナリのユーザーとグループの所有権をblackbox_exporterユーザーに設定し、root以外のユーザーがファイルを変更または置換できないようにします。
- sudo chown blackbox_exporter:blackbox_exporter /usr/local/bin/blackbox_exporter
最後に、アーカイブと解凍されたディレクトリは不要になったため、削除します。
- rm -rf ~/blackbox_exporter-0.12.0.linux-amd64.tar.gz ~/blackbox_exporter-0.12.0.linux-amd64
次に、HTTPプロトコルを介してエンドポイントをプローブし、それを実行するようにBlackboxExporterを構成しましょう。
ステップ3—BlackboxExporterの構成と実行
BlackboxExporterがエンドポイントをチェックする方法を定義する構成ファイルを作成しましょう。 systemd
を使用してBlackboxのサービスを管理できるように、systemdユニットファイルも作成します。
次のステップで、Prometheus構成でプローブするエンドポイントのリストを指定します。
まず、BlackboxExporterの構成用のディレクトリを作成します。 Linuxの規則に従い、構成ファイルは/etc
ディレクトリに配置されるため、このディレクトリを使用してBlackboxExporter構成ファイルも保持します。
- sudo mkdir /etc/blackbox_exporter
次に、このディレクトリの所有権を、手順1で作成したblackbox_exporterユーザーに設定します。
- sudo chown blackbox_exporter:blackbox_exporter /etc/blackbox_exporter
新しく作成したディレクトリに、BlackboxExporterの構成設定を保持するblackbox.yml
ファイルを作成します。
- sudo nano /etc/blackbox_exporter/blackbox.yml
デフォルトのhttp
プローバーを使用してエンドポイントをプローブするようにBlackboxExporterを構成します。 Probers は、BlackboxExporterがエンドポイントが実行されているかどうかを確認する方法を定義します。 http
プローバーは、エンドポイントにHTTPリクエストを送信し、その応答コードをテストすることでエンドポイントをチェックします。 プローブに使用するHTTPメソッドと、成功した応答として受け入れるステータスコードを選択できます。 その他の一般的なプローバーには、TCPプロトコルを介してプロービングするためのtcp
プローバー、ICMPプロトコルを介してプロービングするためのicmp
プローバー、DNSエントリをチェックするためのdns
プローバーがあります。
このチュートリアルでは、http
プローバーを使用して、HTTPGET
メソッドを介してポート8080
で実行されているエンドポイントをプローブします。 デフォルトでは、プローバーは2xx
範囲の有効なステータスコードが有効であると想定しているため、有効なステータスコードのリストを提供する必要はありません。
5 秒のタイムアウトを構成します。これは、BlackboxExporterが応答を5秒待ってから障害を報告することを意味します。 アプリケーションの種類に応じて、ニーズに合った値を選択してください。
注: BlackboxExporterの構成ファイルはYAML形式を使用します。これはタブの使用を禁止し、インデントに2つのスペースを使用する必要があります。 構成ファイルの形式が正しくない場合、BlackboxExporterは起動に失敗します。
次の構成をファイルに追加します。
modules:
http_2xx:
prober: http
timeout: 5s
http:
valid_status_codes: []
method: GET
構成オプションの詳細については、BlackboxExporterのドキュメントを参照してください。
ファイルを保存して、テキストエディタを終了します。
サービスファイルを作成する前に、構成ファイルのユーザーとグループの所有権を、手順1で作成したblackbox_exporterユーザーに設定します。
- sudo chown blackbox_exporter:blackbox_exporter /etc/blackbox_exporter/blackbox.yml
次に、systemd
を使用してBlackboxExporterを管理できるように、サービスファイルを作成します。
- sudo nano /etc/systemd/system/blackbox_exporter.service
次のコンテンツをファイルに追加します。
[Unit]
Description=Blackbox Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=blackbox_exporter
Group=blackbox_exporter
Type=simple
ExecStart=/usr/local/bin/blackbox_exporter --config.file /etc/blackbox_exporter/blackbox.yml
[Install]
WantedBy=multi-user.target
このサービスファイルは、systemd
に、/etc/blackbox_exporter/blackbox.yml
にある構成ファイルを使用してblackbox_exporterユーザーとしてBlackboxExporterを実行するように指示します。 systemd
サービスファイルの詳細はこのチュートリアルの範囲を超えていますが、詳細については、Systemdユニットとユニットファイルについてチュートリアルを参照してください。
ファイルを保存して、テキストエディタを終了します。
最後に、systemd
をリロードして、新しく作成したサービスファイルを使用します。
- sudo systemctl daemon-reload
次に、BlackboxExporterを起動します。
- sudo systemctl start blackbox_exporter
サービスのステータスを確認して、正常に開始されたことを確認します。
- sudo systemctl status blackbox_exporter
出力には、メインプロセス識別子(PID)、メモリ使用量、ログなど、BlackboxExporterのプロセスに関する情報が含まれます。
Output● blackbox_exporter.service - Blackbox Exporter
Loaded: loaded (/etc/systemd/system/blackbox_exporter.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2018-04-05 17:48:58 UTC; 5s ago
Main PID: 5869 (blackbox_export)
Tasks: 4
Memory: 968.0K
CPU: 9ms
CGroup: /system.slice/blackbox_exporter.service
└─5869 /usr/local/bin/blackbox_exporter --config.file /etc/blackbox_exporter/blackbox.yml
サービスのステータスがactive (running)
でない場合は、チュートリアルを続行する前に、画面上のログに従い、前の手順をたどって問題を解決してください。
最後に、サービスを有効にして、サーバーの再起動時にBlackboxExporterが起動することを確認します。
- sudo systemctl enable blackbox_exporter
Blackbox Exporterが完全に構成されて実行されたので、エンドポイントへのプロービング要求に関するメトリックを収集するようにPrometheusを構成できるため、これらのメトリックに基づいてアラートを作成し、Alertmanagerを使用してアラートの通知を設定できます。
ステップ4—ブラックボックスエクスポーターをスクレイプするためのPrometheusの構成
手順3で説明したように、プローブされるエンドポイントのリストは、BlackboxExporterのtargets
ディレクティブの一部としてPrometheus構成ファイルにあります。 このステップでは、Blackbox Exporterを使用して、前提条件のチュートリアルで構成したポート8080
で実行されているNginxWebサーバーをスクレイプするようにPrometheusを構成します。
エディターでPrometheus構成ファイルを開きます。
- sudo nano /etc/prometheus/prometheus.yml
この時点で、次のようになります。
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100']
scrape_configs
ディレクティブの最後に、次のエントリを追加します。これにより、Prometheusは、構成されたBlackboxExporterのモジュールhttp_2xx
を使用して、ローカルポート8080
で実行されているエンドポイントをプローブします。ステップ3で。
...
- job_name: 'blackbox'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- http://localhost:8080
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:9115
デフォルトでは、BlackboxExporterはポート9115
で実行され、メトリックは/probe
エンドポイントで使用できます。
BlackboxExporterのscrape_configs
構成は、他のエクスポーターの構成とは異なります。 最も顕著な違いは、targets
ディレクティブです。これは、エクスポーターのアドレスの代わりに、プローブされているエンドポイントを一覧表示します。 エクスポータのアドレスは、__address__
ラベルの適切なセットを使用して指定されます。
relabel
ディレクティブの詳細な説明は、Prometheusドキュメントにあります。
Prometheus構成ファイルは次のようになります。
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100']
- job_name: 'blackbox'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- http://localhost:8080
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:9115
ファイルを保存して、テキストエディタを閉じます。
Prometheusを再起動して、変更を有効にします。
- sudo systemctl restart prometheus
Prometheusサービスのステータスを確認して、期待どおりに実行されていることを確認します。
- sudo systemctl status prometheus
サービスのステータスがactive (running)
でない場合は、チュートリアルを続行する前に、画面上のログに従い、前の手順をたどって問題を解決してください。
この時点で、BlackboxExporterからメトリックを取得するようにPrometheusを構成しました。 Alertmanagerからアラートを受信するには、次のステップで適切なPrometheusアラートルールのセットを作成します。
ステップ5—アラートルールの作成
PrometheusAlertingは2つの部分に分かれています。 最初の部分はPrometheusサーバーによって処理され、アラートルールに基づいてアラートを生成してAlertmanagerに送信します。 2番目の部分は、Alertmanagerによって実行されます。Alertmanagerは、受信したアラートを管理し、構成に応じて適切な受信者に送信します。
このステップでは、サーバーが使用可能かどうかを確認するアラートルールを作成するときに、アラートルールの基本的な構文を学習します。
まず、アラートを保存するファイルを作成します。 /etc/prometheus
ディレクトリにalert.rules.yml
という名前の空のファイルを作成します。
- sudo touch /etc/prometheus/alert.rules.yml
このファイルはPrometheus構成の一部であるため、所有権が、前提条件のPrometheusチュートリアルで作成したprometheusユーザーに設定されていることを確認してください。
- sudo chown prometheus:prometheus /etc/prometheus/alert.rules.yml
アラートファイルを配置したら、構成ファイルに適切なディレクティブを追加して、Prometheusに通知する必要があります。
エディターでPrometheus構成ファイルを開きます。
- sudo nano /etc/prometheus/prometheus.yml
global
ディレクティブの後にrule_files
ディレクティブを追加して、Prometheusの起動時に新しく作成されたアラートファイルをPrometheusにロードさせます。
global:
scrape_interval: 15s
rule_files:
- alert.rules.yml
scrape_configs:
...
ファイルを保存して、テキストエディタを終了します。
次に、エンドポイントがダウンしているかどうかをチェックするルールを作成しましょう。
アラートルールを作成するには、BlackboxExporterのprobe_success
メトリックを使用します。このメトリックは、エンドポイントが稼働している場合は 1 を返し、稼働していない場合は0を返します。
probe_success
メトリックには、エンドポイントのアドレスが記載されたinstance
ラベルと、メトリックを収集したエクスポーターの名前が記載されたjob
ラベルの2つのラベルが含まれています。
エディターでアラートルールファイルを開きます。
- sudo nano /etc/prometheus/alert.rules.yml
Prometheus構成ファイルと同様に、アラートルールファイルはYAML形式を使用します。これは、タブを厳密に禁止し、インデントのために2つのスペースを必要とします。 ファイルの形式が正しくないと、Prometheusの起動に失敗します。
まず、EndpointDown
というアラートルールを作成して、probe_sucess
メトリックが0と10秒の期間で等しいかどうかを確認します。 これにより、エンドポイントが10秒未満使用できない場合に、Prometheusがアラートを送信しないことが保証されます。 アプリケーションの種類とニーズに応じて、任意の期間を自由に選択できます。
また、重大度とアラートの概要を示す2つのラベルを添付して、アラートを簡単に管理およびフィルタリングできるようにします。
アラートのラベルと注釈に詳細を含める場合は、{{ $labels.metrics_label }}
構文を使用してラベルの値を取得できます。 これを使用して、メトリックのinstance
ラベルからエンドポイントのアドレスを含めます。
次のルールをアラートファイルに追加します。
groups:
- name: alert.rules
rules:
- alert: EndpointDown
expr: probe_success == 0
for: 10s
labels:
severity: "critical"
annotations:
summary: "Endpoint {{ $labels.instance }} down"
ファイルを保存して、テキストエディタを終了します。
Prometheusを再起動する前に、次のpromtool
コマンドを使用して、アラートファイルが構文的に正しいことを確認してください。
- sudo promtool check rules /etc/prometheus/alert.rules.yml
出力には、ファイルで見つかったルールの数と、ルールが構文的に正しいかどうかに関する情報が含まれています。
OutputChecking /etc/prometheus/alert.rules.yml
SUCCESS: 1 rules found
最後に、Prometheusを再起動して、変更を適用します。
- sudo systemctl restart prometheus
status
コマンドを使用して、サービスが実行されていることを確認します。
- sudo systemctl status prometheus
サービスのステータスがactive
でない場合は、チュートリアルを続行する前に、画面上のログに従い、前の手順をたどって問題を解決してください。
アラートルールを設定すると、Alertmanagerをダウンロードしてインストールできます。
ステップ6—Alertmanagerのダウンロード
Blackbox Exporterが構成され、アラートルールが設定されています。 Alertmanagerをダウンロードしてインストールし、Prometheusが受信したアラートを処理しましょう。
最新のバイナリとそのチェックサムは、Prometheusダウンロードページで見つけることができます。 Alertmanagerの現在の安定バージョンをホームディレクトリにダウンロードして解凍します。
- cd ~
- curl -LO https://github.com/prometheus/alertmanager/releases/download/v0.14.0/alertmanager-0.14.0.linux-amd64.tar.gz
アーカイブを解凍する前に、次のsha256sum
コマンドを使用してファイルのチェックサムを確認してください。
- sha256sum alertmanager-0.14.0.linux-amd64.tar.gz
このコマンドの出力をPrometheusダウンロードページのチェックサムと比較して、ファイルが本物であり、破損していないことを確認します。
Outputcaddbbbe3ef8545c6cefb32f9a11207ae18dcc788e8d0fb19659d88c58d14b37 alertmanager-0.14.0.linux-amd64.tar.gz
チェックサムが一致しない場合は、ダウンロードしたファイルを削除し、前の手順を繰り返してファイルを再ダウンロードします。
ダウンロードを確認したら、アーカイブを解凍します。
- tar xvf alertmanager-0.14.0.linux-amd64.tar.gz
これにより、2つのバイナリファイル(alertmanager
とamtool
)、ライセンス、および設定ファイルの例を含むalertmanager-0.14.0.linux-amd64
というディレクトリが作成されます。
2つのバイナリファイルを/usr/local/bin
ディレクトリに移動します。
- sudo mv alertmanager-0.14.0.linux-amd64/alertmanager /usr/local/bin
- sudo mv alertmanager-0.14.0.linux-amd64/amtool /usr/local/bin
バイナリファイルのユーザーとグループの所有権を、手順1で作成したalertmanagerユーザーに設定します。
- sudo chown alertmanager:alertmanager /usr/local/bin/alertmanager
- sudo chown alertmanager:alertmanager /usr/local/bin/amtool
残ったファイルは不要になったので、ホームディレクトリから削除します。
- rm -rf alertmanager-0.14.0.linux-amd64 alertmanager-0.14.0.linux-amd64.tar.gz
必要なファイルが適切な場所にあるので、アラートの通知を電子メールで送信するようにAlertmanagerを構成できます。
ステップ7—電子メールでアラートを送信するようにAlertmanagerを構成する
この手順では、Alertmanagerのデータと構成設定を格納するディレクトリとファイルを作成してから、アラートを電子メールで送信するようにAlertmanagerを構成します。
標準のLinux規則に従って、/etc
にディレクトリを作成し、Alertmanagerの構成ファイルを保存します。
- sudo mkdir /etc/alertmanager
新しく作成されたディレクトリのユーザーとグループの所有権をalertmanagerユーザーに設定します。
- sudo chown alertmanager:alertmanager /etc/alertmanager
構成ファイルはalertmanager.yml
ファイルに保存されるので、このファイルを作成してエディターで開きます。
- sudo nano /etc/alertmanager/alertmanager.yml
他のPrometheus関連のファイルと同様に、これもYAML形式を使用しているため、インデントにはタブではなく2つのスペースを使用してください。
前提条件のチュートリアルに従ってインストールしたPostfixを使用してメールを送信するようにAlertmanagerを設定します。 smtp_smarthost
ディレクティブを使用してSMTPサーバーのアドレスを指定する必要があります。また、smtp_from
ディレクティブを使用して電子メールの送信元のアドレスを指定する必要があります。 PostfixはAlertmanagerと同じサーバーで実行されているため、サーバーのアドレスはlocalhost:25
です。 メールの送信にはalertmanagerユーザーを使用します。
デフォルトでは、PostfixにはTLSが設定されていないため、smtp_require_tls
ディレクティブを使用して非TLSSMTPサーバーを許可するようにAlertmanagerに指示する必要があります。
SMTP構成をglobal
ディレクティブの下に置きます。これは、他のすべての構成コンテキストで有効なパラメーターを指定するために使用されるためです。 これには、この場合のSMTP構成が含まれ、さまざまな統合用のAPIトークンを含めることもできます。
global:
smtp_smarthost: 'localhost:25'
smtp_from: 'alertmanager@your_domain'
smtp_require_tls: false
注:smtp_from
ディレクティブのyour_domin
をドメイン名に置き換えてください。
この時点で、Alertmanagerは電子メールの送信方法を知っていますが、route
ディレクティブを使用して着信アラートを処理する方法を定義する必要があります。 route
ディレクティブはすべての着信アラートに適用され、Alertmanagerがアラートをグループ化する方法、デフォルトの受信者、またはAlertmanagerが最初のアラートを送信するまで待機する時間などのプロパティを定義します。
アラートをグループ化するには、group_by
サブディレクティブを使用します。これは、ラベルのインライン配列(['label-1', 'label-2']
など)を取ります。 グループ化により、同じラベルを含むアラートがグループ化され、同じバッチで送信されます。
すべてのroute
ディレクティブには、receiver
サブディレクティブを使用して定義された単一のレシーバーがあります。 複数のレシーバーを追加する場合は、同じディレクティブで複数のレシーバーを定義するか、routes
サブディレクティブを使用して複数のroute
ディレクティブをネストする必要があります。 このチュートリアルでは、Slackアラートを構成するための最初のアプローチについて説明します。
この場合、手順6でアラートに添付したBlackboxのinstance
ラベルとseverity
ラベルのみでグループ化し、重大度が重大なエンドポイントに対して複数のアラートを取得できるようにします。 1通のメール。
次のgroup_by
ディレクティブを追加します。
...
route:
group_by: ['instance', 'alert']
次に、Alertmanagerが最初のアラートと新しいアラートを送信するまで待機する時間などの間隔を定義します。
group_wait
サブディレクティブを使用して、Alertmanagerが最初のアラートを送信するまで待機する時間を定義します。 この期間中、Alertmanagerは、Prometheusが他のアラートを送信するのを待ちます(存在する場合)。これにより、同じバッチで送信できるようになります。 アラートは1つしかないため、30秒の任意の値を選択します。
次に、group_interval
間隔を使用して、同じグループに新しいアラートがある場合にAlertmanagerがアラートの次のバッチを送信するまで待機する時間を定義します。 必要に応じて任意の値を自由に選択できますが、これは5分ごとに設定されます。
構成する最後の間隔はrepeat_interval
です。これは、アラートがまだ解決されていない場合にAlertmanagerが通知を送信するまで待機する時間を定義します。 ニーズに合った値を選択できますが、3時間の任意の値を使用します。
最後に、receiver
サブディレクティブを使用して、アラートの通知を受信するユーザーを定義します。 team-1
というレシーバーを使用します。これは、後で定義します。
ルートディレクティブを次のように変更します。
route:
group_by: ['instance', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 3h
receiver: team-1
特定のアラートについてのみ一致して通知を送信する場合は、match
およびmatch_re
サブディレクティブを使用して、ラベルの値でアラートを除外できます。 match
サブディレクティブは等式一致を表し、match_re
サブディレクティブは正規表現による一致を表します。
次に、team-1
レシーバーを構成して、アラートの通知を受信できるようにします。 receivers
ディレクティブの下で、名前と適切な構成サブディレクティブを含むレシーバーを定義できます。 使用可能なレシーバーのリストとそれらの構成方法の説明は、Alertmanagerのドキュメントの一部として入手できます。
team-1
電子メール受信者を構成するために、receivers
ディレクティブの下でemail_configs
サブディレクティブを使用します。
receivers:
- name: 'team-1'
email_configs:
- to: 'your-email-address'
この時点で、アラートの通知を電子メールアドレスに送信するようにAlertmanagerを構成しました。 構成ファイルは次のようになります。
global:
smtp_smarthost: 'localhost:25'
smtp_from: 'alertmanager@example.com'
smtp_require_tls: false
route:
group_by: ['instance', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 3h
receiver: team-1
receivers:
- name: 'team-1'
email_configs:
- to: 'your-email-address'
次のステップでは、Slackチャネルにアラートを送信するようにAlertmanagerを構成します。 Slackを構成したくない場合は、ステップ10に直接スキップして、サービスファイルを作成し、Alertmanagerと連携するようにPrometheusを構成します。
ステップ8—Slackを介してアラートを送信するようにAlertmanagerを構成する
この手順に進む前に、Slackアカウントを作成し、Slackワークスペースを使用できることを確認してください。
Slackにアラートを送信するには、最初に着信Webhookを作成します。
ブラウザで、https://workspace-name.slack.com/services/new/incoming-webhook/
にある着信Webhook作成ページにアクセスします。 着信Webhookの詳細と、アラートを送信するチャネルを選択するために必要なドロップダウンを含むページが表示されます。
チャネルを選択したら、着信WebHooks統合の追加ボタンをクリックします。
Webhookが正常に作成されたことを確認する新しいページが表示されます。 このページに表示されているWebhookURL をコピーします。これを使用して、AlertmanagerのSlack通知を構成します。
エディターでAlertmanager構成ファイルを開き、Slack通知を構成します。
- sudo nano /etc/alertmanager/alertmanager.yml
まず、Slack Incoming Webhookの作成時に取得したURLを使用して、構成のglobal
部分にslack_api_url
サブディレクティブを追加します。
global:
smtp_smarthost: 'localhost:25'
smtp_from: 'alertmanager@example.com'
smtp_require_tls: false
slack_api_url: 'your_slack_webhook_url'
複数の受信者にアラートを送信するには、次の2つの方法があります。
- 同じエントリの下に複数のレシーバー構成を含めます。 これは、エラーが発生しにくいソリューションであり、最も簡単な方法です。
- 複数のレシーバーエントリを作成し、複数の
route
ディレクティブをネストします。
このチュートリアルでは2番目のアプローチについては説明しませんが、興味がある場合は、Alertmanagerドキュメントのルート構成の部分を参照してください。
team-1
レシーバーで、 slack_configs という新しいサブディレクティブを追加し、アラートを受信するチャネルの名前を指定します。 この場合、general
チャネルを使用します。
receivers:
- name: 'team-1'
email_configs:
- to: 'your-email-address'
slack_configs:
- channel: 'general<^>'
完成した構成ファイルは次のようになります。
global:
smtp_smarthost: 'localhost:25'
smtp_from: 'alertmanager@example.com'
smtp_require_tls: false
slack_api_url: 'your_slack_webhook_url'
route:
group_by: ['instance', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 3h
receiver: team-1
receivers:
- name: 'team-1'
email_configs:
- to: 'your-email-address'
slack_configs:
- channel: 'general'
ファイルを保存して、エディターを終了します。
これで、Alertmanagerを初めて実行する準備が整いました。
ステップ9—Alertmanagerを実行する
Alertmanagerを起動して実行してみましょう。 まず、Alertmanagerがsystemd
を使用してサービスを管理するためのsystemdユニットファイルを作成します。 次に、Alertmanagerを使用するようにPrometheusを更新します。
新しいsystemd
ユニットファイルを作成し、テキストエディタで開きます。
- sudo nano /etc/systemd/system/alertmanager.service
以下をファイルに追加して、/etc/alertmanager/alertmanager.yml
にある構成ファイルとサーバーのIPアドレスを使用するように構成されたAlertmanagerのURLを使用して、Alertmanagerをalertmanagerユーザーとして実行するようにsystemdを構成します。
[Unit]
Description=Alertmanager
Wants=network-online.target
After=network-online.target
[Service]
User=alertmanager
Group=alertmanager
Type=simple
WorkingDirectory=/etc/alertmanager/
ExecStart=/usr/local/bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml --web.external-url http://your_server_ip:9093
[Install]
WantedBy=multi-user.target
これにより、Alertmanagerがalertmanagerユーザーとして実行されます。 また、AlertmanagerにWebUIにURLhttp://your_server_ip:9093
を使用するように指示します。ここで、9093
はAlertmanagerのデフォルトポートです。 プロトコル(http://
)を含めるようにしてください。そうしないと、機能しません。
ファイルを保存して、テキストエディタを閉じます。
次に、適切なAlertmanagerサービス検出ディレクトリをPrometheus構成ファイルに追加して、AlertmanagerについてPrometheusに通知する必要があります。 デフォルトでは、Alertmanagerはポート9093
で実行されており、Prometheusと同じサーバー上にあるため、アドレスlocalhost:9093
を使用します。
Prometheus構成ファイルを開きます。
- sudo nano /etc/prometheus/prometheus.yml
rule_files
ディレクティブの後に、次のalerting
ディレクティブを追加します。
...
rule_files:
- alert.rules.yml
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
...
完了したら、ファイルを保存してテキストエディタを閉じます。
受信したアラートからURLを追跡できるようにするには、Prometheusの起動時に-web.external-url
フラグを使用して、サーバーのIPアドレスまたはドメイン名をPrometheusに通知する必要があります。
Prometheusのsystemd
ユニットファイルを開きます。
- sudo nano /etc/systemd/system/prometheus.service
既存の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 \
--web.external-url http://your_server_ip
新しいPrometheusユニットファイルは次のようになります。
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
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 \
--web.external-url http://your_server_ip
[Install]
WantedBy=multi-user.target
ファイルを保存して、テキストエディタを閉じます。
systemd
をリロードし、Prometheusを再起動して変更を適用します。
- sudo systemctl daemon-reload
- sudo systemctl restart prometheus
サービスのステータスをチェックして、Prometheusが意図したとおりに機能していることを確認します。
- sudo systemctl status prometheus
サービスのステータスがactive (running)
でない場合は、チュートリアルを続行する前に、画面上のログに従い、前の手順をたどって問題を解決してください。
最後に、Alertmanagerを初めて起動します。
- sudo systemctl start alertmanager
サービスのステータスをチェックして、Alertmanagerが意図したとおりに機能していることを確認します。
- sudo systemctl status alertmanager
サービスのステータスがactive (running)
でない場合は、チュートリアルを続行する前に、画面上のメッセージに従い、前の手順に戻って問題を解決してください。
最後に、サービスを有効にして、システムの起動時にAlertmanagerが起動することを確認します。
- sudo systemctl enable alertmanager
AlertmanagerのWebUIにアクセスするには、ファイアウォールを介したポート9093
へのトラフィックを許可します。
- sudo ufw allow 9093/tcp
Alertmanagerは、電子メールとSlackを介してアラートの通知を送信するように構成されました。 それが機能することを確認しましょう。
ステップ10—Alertmanagerのテスト
Alertmangerが正しく機能し、メールとSlack通知を送信していることを確認しましょう。 前提条件のチュートリアルで作成したNginxサーバーブロックを削除して、エンドポイントを無効にします。
- sudo rm /etc/nginx/sites-enabled/your_domain
Nginxをリロードして、変更を適用します。
- sudo systemctl reload nginx
実際に無効になっていることを確認したい場合は、Webブラウザでサーバーのアドレスを指定できます。 サイトにアクセスできなくなったことを示すメッセージが表示されます。 そうでない場合は、前の手順をたどって、正しいサーバーブロックを削除し、Nginxをリロードしたことを確認してください。
group_wait
の間隔(この場合は 30秒)に応じて、30秒後にメールとSlackの通知を受信する必要があります。
そうでない場合は、次のstatus
コマンドを使用してサービスのステータスを確認し、画面上のログに従って問題の原因を見つけてください。
- sudo systemctl status alertmanager
- sudo systemctl status prometheus
Webブラウザでhttp://your_server_ip/alerts
を指定することにより、PrometheusWebUIからアラートのステータスを確認することもできます。 Prometheusチュートリアルに従って、選択したユーザー名とパスワードを入力するように求められます。 アラート名をクリックすると、ステータス、アラートルール、および関連するラベルが表示されます。
Alertmanagerが機能していることを確認したら、sites-available
ディレクトリからsites-enabled
ディレクトリへのシンボリックリンクを再作成して、エンドポイントを有効にします。
- sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled
Nginxをもう一度リロードして、変更を適用します。
- sudo systemctl reload nginx
次のステップでは、Alertmanagerのコマンドラインインターフェイスの使用方法を見ていきます。
ステップ11—CLIを使用したアラートの管理
Alertmanagerには、アラートを監視、管理、および無音化できるコマンドラインツールamtool
が付属しています。
amtool
ツールでは、コマンドを実行するたびに、--alertmanager.url
フラグを使用してAlertmanagerのURLを指定する必要があります。 URLを指定せずにamtool
を使用するには、まず構成ファイルを作成します。
構成ファイルのデフォルトの場所は、現在のユーザーのみが構成を使用できるようにする$HOME/.config/amtool/config.yml
と、サーバー上のすべてのユーザーが構成を使用できるようにする/etc/amtool/config.yml
です。
ニーズに合ったものを自由に選択できますが、このチュートリアルでは、$HOME/.config/amtool/config.yml
ファイルを使用します。
まず、ディレクトリを作成します。 -p
フラグは、mkdir
に、途中で必要な親ディレクトリを作成するように指示します。
- mkdir -p $HOME/.config/amtool
config.yml
ファイルを作成し、テキストエディタで開きます。
- nano $HOME/.config/amtool/config.yml
次の行を追加して、amtool
にhttp://localhost:9093
URLでAlertmanagerを使用するように指示します。
alertmanager.url: http://localhost:9093
ファイルを保存して、テキストエディタを終了します。
次に、amtool
コマンドラインツールで何ができるかを見ていきます。
amtool alert query
コマンドを使用すると、Alertmanagerに送信されたすべてのアラートを一覧表示できます。
- amtool alert query
出力には、アラートの名前、アラートが最初に発生した時刻、および構成時に提供したアラートの要約が表示されます。
OutputAlertname Starts At Summary
EndpointDown 2018-04-03 08:48:47 UTC Endpoint http://localhost:8080 down
適切なマッチャーを使用して、ラベルでアラートをフィルタリングすることもできます。 マッチャーには、ラベル名、完全一致の場合は=
、部分一致の場合は=~
の適切な操作、およびラベルの値が含まれます。
クリティカル重大度ラベルが添付されているすべてのアラートを一覧表示する場合は、alert query
コマンドでseverity=critical
マッチャーを使用します。
- amtool alert query severity=critical
以前と同様に、出力にはアラートの名前、アラートが最初に発生した時刻、およびアラートの要約が含まれます。
OutputAlertname Starts At Summary
EndpointDown 2018-04-03 08:48:47 UTC Endpoint http://localhost:8080 down
正規表現を使用して、=~
演算子でラベルを照合できます。 たとえば、ポートに依存しないhttp://localhost
エンドポイントのすべてのアラートを一覧表示するには、instance=~http://localhost.*
マッチャーを使用できます。
- amtool alert query instance=~http://localhost.*
アラートとエンドポイントが1つしかないため、出力は前の例と同じになります。
Alertmanagerの設定を確認するには、amtool config
コマンドを使用します。
- amtool config
出力には、/etc/alertmanager/alertmanager.yml
ファイルの内容が含まれます。
次に、amtool
を使用してアラートを消音する方法を見てみましょう。
アラートをサイレンシングすると、特定の時間のマッチャーに基づいてアラートをミュートできます。 その期間中、無音アラートのメールやSlack通知は届きません。
amtool silence add
コマンドは、マッチャーを引数として取り、マッチャーに基づいて新しいsilenceを作成します。
アラートの有効期限を定義するには、1h
や--expire-on
フラグなど、必要な無音期間の--expires
フラグを使用し、[ X182X]RFC3339フォーマット