仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

ZabbixでPrometheusメトリックを取り込む

[追記]

記事ではZabbix 4.4を使った流れで解説していますが、Zabbix 5.0 LTSでも同じように設定して動作したので、これから試すならZabbix 5.0で動かした方がいいと思います。サポート期間的にも


前回はKubernetesクラスターをPrometheusとcAdvisorで監視するためのセットアップを行いました。

tech.virtualtech.jp

今回はこれらの環境からデータをZabbixで取得して、Zabbixで性能監視するための流れを見てみたいと思います。

Zabbix 4.0 LTS以降にはHTTPエージェントという機能があり、この機能を利用することでAPI などから取得したデータを保存できます。 この機能を使ってPrometheusメトリック情報を収集して、Zabbixでグラフを生成し、ノードの状態監視に利用できます。

調べたところ、この機能は4.0時点では正規表現でデータの抽出をする必要があってちょっと面倒だったのですが、4.2以降のバージョンで標準機能としてPrometheusメトリックの取得する機能が追加されたということなので、バージョン4系の最新版である4.4を使うことにします。

本題に入る前に

PrometheusはSoundCloud が中心になって開発しているプル型のリソース監視ソフトウェアです。Prometheusメトリックと呼んでいるのはこのPrometheusでリソース監視するための形式でエクスポートされた、互換性のある形式で書かれたデータのことです。例えば次のような形式のデータです。httpやhttpsソースから入手し、監視ソフトウェア側で収集、解析してデータとして利用します。

Prometheusの基礎情報としては次が参考になります。

qiita.com

メトリックの例

# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 1.9454e-05
go_gc_duration_seconds{quantile="0.25"} 5.2445e-05
go_gc_duration_seconds{quantile="0.5"} 0.000122942
go_gc_duration_seconds{quantile="0.75"} 0.000264466
go_gc_duration_seconds{quantile="1"} 0.014661171
go_gc_duration_seconds_sum 0.277686022
go_gc_duration_seconds_count 595
# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 13
# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use.
# TYPE go_memstats_alloc_bytes gauge
go_memstats_alloc_bytes 1.170688e+06
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed.
# TYPE go_memstats_alloc_bytes_total counter
go_memstats_alloc_bytes_total 1.31029376e+09
...

メトリックをPrometheusでグラフ表示

上記のメトリックの一項目をグラフ化すると次のようになります。

f:id:virtualtech:20200518105046p:plain
メトリックをPrometheusでグラフ表示

メトリックからのグラフ化はこのように簡単にPrometheusでできます。Prometheusはグラフを使った性能の解析には役立ちますが、永続的な監視には向いていません。そこでPrometheusと別の監視ソフトウェアを組み合わせて使うのが一般的です。OSSの世界ではメトリック収集はPrometheus、監視ソフトウェアとしてGrafanaを組み合わせて使うことが多いそうです。

今回はGrafanaを使わず、Zabbixを使った場合をまとめてみます。

Zabbixのインストール

何はともあれ、Zabbixが必要なので用意します。今回はHTTPエージェント機能を使いたいため(および他の理由があり)、今回は4.4を利用しました。同様の手順で5.0 LTSでも動作するのを確認しています。

Zabbixのインストール方法はパッケージを使う方法、コンテナーで動かす方法など、色々あります。Zabbixの公式サイトの「ダウンロード」リンクをクリックすると「Download and install Zabbix」というページが表示されます。今回はパッケージを使うため、「Install from Packages」を選択します。

その後、バージョン、OS、OSバージョン、(利用する)データベースを選択します。すると、その下部にインストール手順が示されますので、この指示に従います。

f:id:virtualtech:20200518144223p:plain
Zabbixのインストール構成を選択

インストール前に、事前にデータベースサーバーのインストールと設定、サービスの起動を行なっておく必要があります。例えばMySQLやMariaDBなら、インストールした後に mysql_secure_installation コマンドを実行しておくことやデータベースサービスの起動、ファイアウォールが実行されているのであればポートの開放などの作業が必要です。

準備ができたら示されたインストール手順に従い、Zabbixのセットアップを行います。ちなみにUbuntuでApacheサーバーを使って実行したときは、/etc/php/7.4/apache2/php.ini にタイムゾーンを追加する必要がありました。そのほかは手順に従ってセットアップするだけでZabbixを動かすことができました。

date.timezone = "Asia/Tokyo"

インストール後はZabbixフロントエンドにアクセスして、Zabbixの設定を続行します。詳細な手順は省略します。カラフルなダッシュボードにアクセスできたらZabbixのインストールは完了です。

f:id:virtualtech:20200518145713p:plain
Zabbix 4.4のダッシュボード

監視対象に「Exporter」の導入

今回の方法で監視を行うには、監視対象でメトリックが出力されている必要があります。ZabbixはPrometheus形式のメトリックと互換性があるので、Prometheusの様々なExporterを使うことができそうです。

今回はコンテナーの情報を収集するためにcAdvisorを使ってみます。同じ方法でNode Expoterを使えば、ノードの情報をZabbixに取り込むことができるのでお試しください。

まずExporterを導入します。Ubuntuの場合は各種ExporterやcAdvisorがsnapパッケージやdebカッケージとして用意されていますので、導入は簡単です。

$ sudo apt install prometheus-node-exporter cadvisor

curlコマンドを使って、メトリックが取れることを確認してください。

$ curl http://localhost:9100/metrics    # prometheus-node-exporter
$ curl http://localhost:4194/metrics    # cadvisor

監視対象に「Zabbix Agent」の導入

Prometheusで物理ノードを監視するにはNode Exporterを使うのが一般的ですが、Zabbixでこのデータを使うと、監視できる項目はそこまで多くないのでZabbix Agentを使った方がいいかもしれません。インストール方法は「ダウンロードページ」に示された手順を参考にします。

4.4をインストールする場合は次のとおりです。

$ wget https://repo.zabbix.com/zabbix/4.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.4-1+focal_all.deb
$ sudo dpkg -i zabbix-release_4.4-1+focal_all.deb
$ sudo apt update  && sudo apt install zabbix-agent 

最低限、Zabbix Serverとホスト名を指定します。その他必要な設定があれば行います。ファイアウォールを設定している場合は、ポート10050ポート(デフォルト値)を開放します。

$ sudo vi /etc/zabbix/zabbix_agentd.conf
...
Server=zabbix44.tooyama.local   #Zabbix Serverを指定する
...
#Hostname=Zabbix server   #コメント化するとHostnameItemから取得

設定が終わったら、Zabbix Agentを再起動します。

$ sudo systemctl restart zabbix-agent.service

監視対象をZabbixに追加

監視対象のサーバーをZabbixに追加する方法は様々ありますが、今回は普通にノードを追加します。 手順は公式サイトや他のサイトで取り上げられているので、ここでは省略します。

www.zabbix.com

監視対象にHTTPエージェント項目を追加

ZabbixでHTTPエージェント機能を使ってメトリックからデータを取得して監視に用いるには「メトリックデータを取り込む」、「取り込んだデータから必要な項目を取り出す」、「取り出したデータを元にグラフ化する」と言った流れが必要です。

アイテムの作成について詳細は公式サイトドキュメントの「Items」を確認してください。

(1) HTTPエージェント項目を追加するにはホストから監視対象を選び、「Items」を選択します。

f:id:virtualtech:20200518131404p:plain

(2) 右上の「Create Items」ボタンをクリックします。 (3) Request Typeを「GET」にしたアイテムを作成します。URLはメトリックのURLを設定します。今回はcAdvisorをソースとするのでポート4194を指定していますが、Node Exporterの場合は9100ポートがよく使われます。どのポートが使われているかは「ssやnetstatコマンド」、「lsof -i」などで確認してください。「History storage period」はZabbixが収集したデータの保存期間です。当然長ければ長いほどストレージを消費しますので、ポリシーにあった期間を設定してください。

f:id:virtualtech:20200518131552p:plain

HTTPエージェントで収集した情報から監視項目を取り出し

前の設定で「メトリックデータを取り込む」を行いましたので、次に「取り込んだデータから必要な項目を取り出」し、「取り出したデータを元にグラフ化」してみます。 同様に「取り込んだデータから必要な項目を取り出す」ためのアイテムを作成します。

アイテムの作成について詳細は公式サイトドキュメントの「Items」を確認してください。

(1) HTTPエージェント項目を追加するにはホストから監視対象を選び、「Items」を選択します。

f:id:virtualtech:20200518131404p:plain

(2) 右上の「Create Items」ボタンをクリックします。 (3) Type「Dependent item」のアイテムを作成します。

f:id:virtualtech:20200518133249p:plain

「Name」はアイテム名、「Key」はこのアイテムをよびだす際に使うキーを256文字以内で設定します。 「Master item」は、前の項で設定したアイテムを設定します。このアイテムは指定したアイテムに依存している(つまりその依存する項目からデータを取得する)ということを設定します。

「Type of Information」は、グラフ作成したい場合は「Numeric(float)」、変化を文字列として履歴として残したい場合は「Text」を設定します。 「History storage period」はZabbixが収集したデータの保存期間です。当然長ければ長いほどストレージを消費しますので、ポリシーにあった期間を設定してください。

(4) アイテムに必要な項目を入力したら「Preprocessing」をクリックします。 (5)Nameを「Prometheus pattern」を選択します。ParametersにはPromQL (Prometheus Query Language) 形式でクエリを記述します。

f:id:virtualtech:20200518134403p:plain

クエリはIDで絞り込む必要があります。絞り込めていないと次のようにエラーになります。

f:id:virtualtech:20200518140333p:plain

以上です。これでクエリとして記述したデータを用いてZabbixでノードの性能監視が行えます。

f:id:virtualtech:20200518134946p:plain

f:id:virtualtech:20200518134959p:plain

ちなみにテキストデータとして取り込んだ場合は、定期的なデータをヒストリーとして保存できます。

f:id:virtualtech:20200518141641p:plain