[追記]
記事ではZabbix 4.4を使った流れで解説していますが、Zabbix 5.0 LTSでも同じように設定して動作したので、これから試すならZabbix 5.0で動かした方がいいと思います。サポート期間的にも
前回はKubernetesクラスターをPrometheusとcAdvisorで監視するためのセットアップを行いました。
今回はこれらの環境からデータを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の基礎情報としては次が参考になります。
メトリックの例
# 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でグラフ表示
上記のメトリックの一項目をグラフ化すると次のようになります。
メトリックからのグラフ化はこのように簡単に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バージョン、(利用する)データベースを選択します。すると、その下部にインストール手順が示されますので、この指示に従います。
インストール前に、事前にデータベースサーバーのインストールと設定、サービスの起動を行なっておく必要があります。例えばMySQLやMariaDBなら、インストールした後に mysql_secure_installation
コマンドを実行しておくことやデータベースサービスの起動、ファイアウォールが実行されているのであればポートの開放などの作業が必要です。
準備ができたら示されたインストール手順に従い、Zabbixのセットアップを行います。ちなみにUbuntuでApacheサーバーを使って実行したときは、/etc/php/7.4/apache2/php.ini
にタイムゾーンを追加する必要がありました。そのほかは手順に従ってセットアップするだけでZabbixを動かすことができました(今後、この記事を見た時にはもっと新しいバージョンのPHPがインストール可能になっているかもしれません)。
date.timezone = "Asia/Tokyo"
インストール後はZabbixフロントエンドにアクセスして、Zabbixの設定を続行します。詳細な手順は省略します。カラフルなダッシュボードにアクセスできたらZabbixのインストールは完了です。
監視対象に「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に追加する方法は様々ありますが、今回は普通にノードを追加します。 手順は公式サイトや他のサイトで取り上げられているので、ここでは省略します。
監視対象にHTTPエージェント項目を追加
ZabbixでHTTPエージェント機能を使ってメトリックからデータを取得して監視に用いるには「メトリックデータを取り込む」、「取り込んだデータから必要な項目を取り出す」、「取り出したデータを元にグラフ化する」と言った流れが必要です。
アイテムの作成について詳細は公式サイトドキュメントの「Items」を確認してください。
(1) HTTPエージェント項目を追加するにはホストから監視対象を選び、「Items」を選択します。
(2) 右上の「Create Items」ボタンをクリックします。 (3) Request Typeを「GET」にしたアイテムを作成します。URLはメトリックのURLを設定します。今回はcAdvisorをソースとするのでポート4194を指定していますが、Node Exporterの場合は9100ポートがよく使われます。どのポートが使われているかは「ssやnetstatコマンド」、「lsof -i」などで確認してください。「History storage period」はZabbixが収集したデータの保存期間です。当然長ければ長いほどストレージを消費しますので、ポリシーにあった期間を設定してください。
HTTPエージェントで収集した情報から監視項目を取り出し
前の設定で「メトリックデータを取り込む」を行いましたので、次に「取り込んだデータから必要な項目を取り出」し、「取り出したデータを元にグラフ化」してみます。 同様に「取り込んだデータから必要な項目を取り出す」ためのアイテムを作成します。
アイテムの作成について詳細は公式サイトドキュメントの「Items」を確認してください。
(1) HTTPエージェント項目を追加するにはホストから監視対象を選び、「Items」を選択します。
(2) 右上の「Create Items」ボタンをクリックします。 (3) Type「Dependent item」のアイテムを作成します。
「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) 形式でクエリを記述します。
クエリはIDで絞り込む必要があります。絞り込めていないと次のようにエラーになります。
以上です。これでクエリとして記述したデータを用いてZabbixでノードの性能監視が行えます。
ちなみにテキストデータとして取り込んだ場合は、定期的なデータをヒストリーとして保存できます。