1. はじめに
近年、システム運用において「可観測性 (Observability) 」の重要性が高まっており、メトリクス・トレース・ログといった概念が広く知られるようになってきました。
私自身も、Grafana のイベントに参加したことをきっかけに、サーバやネットワーク機器のパフォーマンスを可視化することに興味を持ちました。
特に「メトリクス・トレース・ログ」というキーワードを知ったことで、
単なる監視ではなく「システムの状態を多角的に把握する」という考えに触れ、実際に自分で環境を構築しながら理解を深めたいと考えました。
そこで本記事では、手を動かして学ぶことを目的として、
FortiGateを対象に、Prometheus および Grafana を用いた監視環境を構築し、CPU 使用率・メモリ使用率・セッション数の可視化を行います。
本記事は以下の方を対象としています。
- FortiGate の監視を OSS で実現したい方
- Prometheus および Grafanaの基本的な構成を理解したい方
- 実際に手を動かしながら監視の基礎を学びたい方
できるだけ再現しやすい形で手順をまとめているため、同様の環境構築の参考になれば幸いです。
2. システム構成要素の概要
本記事で構築する監視環境は、複数のコンポーネントで構成されています。
それぞれの役割を簡単に説明します。
■ FortiGate
FortiGate は、Fortinet 社が提供するファイアウォールおよび統合セキュリティアプライアンスです。
ネットワークのトラフィック制御やセキュリティ対策を担う機器であり、CPU 使用率やメモリ使用率、
セッション数などの内部状態を SNMP を通じて外部から取得することができます。
■ snmp_exporter
snmp_exporter は、SNMP 対応機器から取得した情報を Prometheus が扱える形式(メトリクス)に変換するための Exporter です。
Prometheus は SNMP プロトコルを直接扱うことができないため、snmp_exporter が仲介役となり、SNMP の応答を HTTP 経由で取得可能な形式に変換します。
本構成では、snmp_exporter が FortiGate に対して SNMP 通信を行い、その結果を Prometheus に提供します。
■ Prometheus
Prometheus は、時系列データベースを備えた監視システムです。
HTTP を用いた Pull 型のモデルを採用しており、定期的に Exporter にアクセスしてメトリクスを収集・保存します。
また、収集したデータに対してクエリを実行することで、システムの状態を分析することが可能です。
本構成では、snmp_exporter から FortiGate のメトリクスを取得し、時系列データとして保存します。
■ Grafana
Grafana は、Prometheus などのデータソースから取得したメトリクスを可視化するためのダッシュボードツールです。
Web UI 上でグラフやパネルを作成し、システムの状態を直感的に把握できるようにします。
本構成では、Prometheus をデータソースとして設定し、FortiGate の CPU 使用率やメモリ使用率などをグラフとして表示します。
3. 前提条件
本記事は以下の環境で検証しています。
3.1. 実行権限
- 本記事のコマンドは、特に記載がない限り root 権限で実行しています
3.2. 環境情報
- VirtualBox: 7.2.6
- OS: Rocky Linux 9.7
- FortiGate: v7.4.6
- snmp_exporter: v0.30.1
- Prometheus: v3.11.0
- Grafana: v12.4.2
3.3. 構成
全体的な論理構成図は以下の通りです。
- Prometheus および Grafana は同一サーバ上に構築しています
- snmp_exporter は Prometheus サーバ上で動作させます
- FortiGate は評価版ライセンスで動作させています
- プロキシサーバは FortiGate の定期的なライセンス検証のため構築されています
3.4. ネットワーク要件
- Prometheus サーバから snmp_exporter への通信 (TCP/9116) が可能であること
- snmp_exporter から FortiGate への SNMP 通信 (UDP/161) が可能であること
- クライアント端末から Grafana への HTTP/HTTPS 通信 (TCP/3000 または 443) が可能であること
- クライアント端末から Prometheus への HTTP 通信 (TCP/9090) が可能であること(任意)
- FortiGate からプロキシサーバへの通信が可能であること(ライセンス検証用)
本構成では、Prometheus が直接 FortiGate に SNMP 通信を行うのではなく、snmp_exporter を経由してメトリクスを取得します。
3.5. サーバスペック (参考)
- Prometheus と Grafanaサーバ: 4 vCPU / 8 GBメモリ
4. 構築
4.1. FortiGateの設定
4.1.1. FortiGate GUIでの設定
FortiGateに管理者アカウントでログインし、「システム」 > 「SNMP」に移動します。
「SNMP」画面のシステム情報から「SNMPエージェント」をオンにする。
次に、SNMP v1/v2cから「新規作成」をクリックする。
「新規SNMPコミュニティ」画面より以下の値を設定する。
- コミュニティ名: monitor
- IPアドレス: 172.16.2.10/24
- ホストタイプ: クエリを受け入れてトラップを送信する
「クエリ」と「トラップ」はデフォルトの設定のままにします。
「SNMPイベント」では、以下の3つの項目のトグルボタンをオンにし、それ以外の項目のトグルボタンはすべてオフにします。
- CPU負荷の高騰
- 利用可能なメモリが不足
- 利用可能なログスペースが不足
上記の設定をした後、画面下の「OK」をクリックして、設定を反映させます。
4.1.2. FortiGate CLIでの設定
FortiGate CLIで設定する場合は以下コマンドを実行します。
config system snmp sysinfo
set status enable
end
config system snmp community
edit 1
set name "monitor"
config hosts
edit 1
set ip 172.16.2.10 255.255.255.255
next
end
set events cpu-high mem-low log-full
next
end
4.2. snmp_exporter の設定
snmp_exporter は SNMP プロトコルを直接扱えない Prometheus のために、SNMP の応答を Prometheus 形式のメトリクスへ変換する役割を持ちます。
4.2.1. 事前準備
最初に事前準備として、Rocky Linux 9 の更新を実施します。
dnf -y update
dnf -y install wget tar
wget と tar は、パッケージを取得して展開するために使います。
4.2.2. ダウンロード
以下のコマンドを実行し、snmp_exporter をデプロイします。
cd /tmp
wget https://github.com/prometheus/snmp_exporter/releases/download/v0.30.1/snmp_exporter-0.30.1.linux-amd64.tar.gz
tar xvf snmp_exporter-0.30.1.linux-amd64.tar.gz
cd snmp_exporter-0.30.1.linux-amd64
4.2.3. snmp_exporter 用のユーザ作成
SNMP Exporter を root で常駐させないために、専用のユーザを作成します。
useradd --no-create-home --shell /sbin/nologin snmp_exporter
4.2.4. ファイルの配置
設定ファイルを配置します。
cp snmp_exporter /usr/local/bin/
mkdir /etc/snmp_exporter
cp snmp.yml /etc/snmp_exporter/
ユーザに権限を付与します。
chown -R snmp_exporter:snmp_exporter /etc/snmp_exporter
chown snmp_exporter:snmp_exporter /usr/local/bin/snmp_exporter
4.2.5. snmp.yml の設定
snmp_exporter は snmp.yml で取得する OID を定義する必要があります。
初期設定の snmp.yml は汎用的に作られており、FortiGate 用の module を作成する必要があります。
FortiGate に管理者アカウントでログインし、「システム」 > 「SNMP」に移動して、「FortiGate MIB」ファイルをダウンロードします。
検証環境では、FortiGate の CPU 使用率、メモリ使用率、セッション数の情報を試しに取得します。
そのためには、ダウンロードした MIB ファイルから OID を調べる必要があります。
FortiGate 監視用 snmp.yml の記述内容を以下の通りです。
# WARNING: This file was auto-generated using snmp_exporter generator, manual changes will be lost.
auths:
public_v1:
community: monitor
security_level: noAuthNoPriv
auth_protocol: MD5
priv_protocol: DES
version: 1
public_v2:
community: monitor
security_level: noAuthNoPriv
auth_protocol: MD5
priv_protocol: DES
version: 2
modules:
fortigate_snmp:
get:
- 1.3.6.1.4.1.12356.101.4.1.3.0 # fgSysCpuUsage
- 1.3.6.1.4.1.12356.101.4.1.4.0 # fgSysMemUsage
- 1.3.6.1.4.1.12356.101.4.1.8.0 # fgSysSesCount
metrics:
- name: fgSysCpuUsage
oid: 1.3.6.1.4.1.12356.101.4.1.3
type: gauge
help: Current CPU usage (percentage)
- name: fgSysMemUsage
oid: 1.3.6.1.4.1.12356.101.4.1.4
type: gauge
help: Current memory utilization (percentage)
- name: fgSysSesCount
oid: 1.3.6.1.4.1.12356.101.4.1.8
type: gauge
help: Number of active sessions on the device
今回の3つはすべて 末尾が .0 のスカラー OID です。
SNMP Exporter では、テーブル全体をたどる用途では walk: が一般的に使用されますが、単一のスカラー値だけを取りたい場合は get: を使う定義例があります。
そのため、今回のように
- CPU使用率
- メモリ使用率
- セッション総数
だけを取りたい場合は、walk: より get: の方が取得したいデータに適しています。
4.2.6. 補足事項
1. oid: には通常 .0 を付けない
get: に並べるときは実際の取得先なので .0 付きで書きます。
一方で metrics: の oid: はベース OID で書かれる例が一般的なので、上の例では .0 を外しています。
これは公式サンプルの書き方に倣った形で記述しています。
2. 型は gauge
CPU使用率・メモリ使用率・セッション数はいずれも瞬時値として扱うのが自然なので gauge で問題ありません。
3. public_v2 を使う
FortiGate 側が SNMP v2c / community monitor で設定されているなら、Prometheus からは auth=public_v2 を使うのがよいです。snmp_exporter は auth と module を URL パラメータで分けて指定する構成です。
4.2.7. systemd サービスの作成
Rocky Linux 9は systemd ベースで動作するため、プログラムの常駐は systemd サービスで行うのが一般的です。
まずは、サービスファイルを作成します。
vi /etc/systemd/system/snmp_exporter.service
ファイルの中身は以下の通りです。
[Unit]
Description=SNMP Exporter
After=network.target
[Service]
User=snmp_exporter
Group=snmp_exporter
ExecStart=/usr/local/bin/snmp_exporter \
--config.file=/etc/snmp_exporter/snmp.yml
Restart=on-failure
[Install]
WantedBy=multi-user.target
サービスを起動する。
systemctl daemon-reload
systemctl enable --now snmp_exporter
次に、サービスのステータス確認します。
systemctl status snmp_exporter
4.2.8. 動作確認手順
まずFortiGate 側に直接 SNMP で取れること確認します。
snmpget -v2c -c monitor 172.16.2.254 1.3.6.1.4.1.12356.101.4.1.3.0
snmpget -v2c -c monitor 172.16.2.254 1.3.6.1.4.1.12356.101.4.1.4.0
snmpget -v2c -c monitor 172.16.2.254 1.3.6.1.4.1.12356.101.4.1.8.0
その後、snmp_exporter 経由で確認します。
curl "http://172.16.2.10:9116/snmp?target=172.16.2.254&module=fortigate_snmp&auth=public_v2"
4.3. Prometheusの設定
4.3.1. Prometheus 用のユーザ作成
Prometheus を root で常駐させないために、専用のユーザを作成します。
useradd --no-create-home --shell /sbin/nologin prometheus
次に、設定ファイルの置き場とデータの保存先を作ります。
mkdir -p /etc/prometheus
mkdir -p /var/lib/prometheus
所有者をPrometheusユーザに設定します。
chown prometheus:prometheus /etc/prometheus
chown prometheus:prometheus /var/lib/prometheus
4.3.2. Prometheusのデプロイ
以下のコマンドを実行し、Prometheus をデプロイします。
cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v3.11.0/prometheus-3.11.0.linux-amd64.tar.gz
tar xvf prometheus-3.11.0.linux-amd64.tar.gz
cd prometheus-3.11.0.linux-amd64
バイナリファイルを配置します。
cp prometheus /usr/local/bin/
cp promtool /usr/local/bin/
設定ファイルを配置します。
cp prometheus.yml /etc/prometheus/
次に、必要な権限を設定します。
chown prometheus:prometheus /usr/local/bin/prometheus
chown prometheus:prometheus /usr/local/bin/promtool
chown -R prometheus:prometheus /etc/prometheus
chown -R prometheus:prometheus /var/lib/prometheus
4.3.3. 設定ファイルの確認
prometheus.yml の中身を確認します。
vi /etc/prometheus/prometheus.yml
最低限、以下のような scrape_config が入っていれば大丈夫です。
global:
scrape_interval: 15s
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
これは Prometheus 自身のメトリクスを localhost:9090 から取得する設定です。
起動前に promtool コマンドで文法をチェックします。
promtool check config /etc/prometheus/prometheus.yml
4.3.4. systemd サービスの作成
Prometheus と同様に、サービスファイルを作成します。
vi /etc/systemd/system/prometheus.service
ファイルの内容は以下の通りです。
[Unit]
Description=Prometheus Monitoring System
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
Restart=on-failure
[Install]
WantedBy=multi-user.target
この設定の意味は以下の通りです。
-
--config.file: 設定ファイルの場所 -
--storage.tsdb.path: メトリクスの保存先
4.3.5. Prometheusの起動および自動起動
サービスを起動します。
systemctl daemon-reload
systemctl enable --now prometheus
次にサービスの状態を確認します。
systemctl status prometheus
ここで active (running) になっていれば、サービスの起動は成功です。
4.3.6. firewallの設定
検証環境では、firewalldサービスを無効化していますが、設定する場合は以下の通りです。
firewall-cmd --permanent --add-port=9090/tcp
firewall-cmd --reload
firewall-cmd --list-ports
4.3.7. Web UIへのアクセス
ブラウザで以下のサイトにアクセスします。
http://localhost:9090
4.3.8. Prometheus 側の設定
FortiGate が 172.16.2.254 、Prometheus と SNMP Exporter サーバが 172.16.2.10 なので、設定は以下の通りです。
scrape_configs:
- job_name: 'fortigate-snmp'
metrics_path: /snmp
params:
module: [fortigate_snmp]
auth: [public_v2]
static_configs:
- targets:
- 172.16.2.254
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 172.16.2.10:9116
この設定の意味は次の通りです。
targets には実際の監視対象である FortiGate の IP を書き、relabel_configs でその値を __param_target に移し替えます。
最後に __address__ を 172.16.2.10:9116 に置き換えることで、Prometheus は FortiGate ではなく snmp_exporter にアクセスしつつ、内部的には target=172.16.2.254 を渡します。
この設定で Prometheus は次の URL を叩くことと同じ意味です。
http://172.16.2.10:9116/snmp?target=172.16.2.254&module=fortigate_snmp&auth=public_v2
すなわち通信経路は
Prometheus -> snmp_exporter -> FortiGate
になります。
Prometheus が FortiGate に直接 SNMP しに行くわけではありません。
snmp_exporter は SNMP データを Prometheus が読めるメトリクス形式に変換するための Exporter です。
また、Prometheus は Push 型ではなく Pull 型の監視モデルを採用しており、 Exporter に対して HTTP リクエストを送ることでメトリクスを取得します。
4.3.9. 設定の反映
設定追加後は、設定ファイルの構文を確認します。
promtool check config /etc/prometheus/prometheus.yml
その後、Prometheus を再読み込みします。一般的には systemd 管理なら再起動、再読み込み API を有効にしているなら reload でも反映できます。
Prometheus は設定ファイルで scrape job を管理します。
systemctl restart prometheus
4.4. Grafana の設定
Rocky Linux 9 上で Grafana をインストールし、Prometheus に保存されている FortiGate の SNMP メトリクスを可視化するまでの手順です。
Grafana は RHEL/Fedora 系向けに RPM リポジトリから導入でき、grafana-server を systemd で起動できます。
初回ログインは admin / admin です。Prometheus データソースは Grafana の UI から追加し、ダッシュボード上でパネルを作成して可視化します。
4.4.1. Grafana のインストール
RPMリポジトリを追加して dnf install grafana する手順について示します。
まず、Grafana のリポジトリファイルを作成します。
sudo tee /etc/yum.repos.d/grafana.repo > /dev/null <<'EOF'
[grafana]
name=grafana
baseurl=https://rpm.grafana.com
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://rpm.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
EOF
その後、Grafana をインストールします。
dnf install -y grafana
4.4.2. Grafana サービスの起動
systemctl daemon-reload
systemctl start grafana-server
systemctl enable grafana-server.service
systemctl status grafana-server
active (running) になっていれば起動成功です。
4.4.3. firewallの設定
Grafana の既定ポートは 3000 です。ブラウザからアクセスするなら、必要に応じて firewalld で開放します。
sudo firewall-cmd --add-port=3000/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
4.4.4. ブラウザで Grafana にログイン
Grafana は既定で http://localhost:3000 を使い、初回ログインは admin / admin です。初回ログイン後にパスワード変更を求められます。
Prometheus サーバと同じマシンに Grafana を入れたなら、ブラウザで次にアクセスします。
http://172.16.2.10:3000
ログイン情報
- ユーザ名:
admin - パスワード:
admin
初回ログイン後、新しいパスワードに変更します。
4.4.5. Prometheus を Grafana のデータソースとして追加
PrometheusデータソースはGUIから 「Connection」 > 「Add new connection」 > 「Prometheus」の順に追加します。
設定時には Prometheus サーバのURLを指定します。
今回の構成では、Prometheusサーバは 172.16.2.10:9090 なので、以下のように設定します。
- 左メニューから 「Connections」を選択します
- 「Add new connection」を選択します
- 検索欄に「Prometheus」を検索して選択します
- 「Add new data source」をクリックします
- Prometheus server URLに次を入力します
http://172.16.2.10:9090
- 名前を「fortigate-prometheus」に変更します
- 「Save & test」をクリックします
4.4.6. FortiGate 用ダッシュボードの新規作成
Grafana では、ダッシュボードを作成し、その中にパネルを追加して可視化します。
手順は以下の通りです。
- 左メニューから「Dashboards」を選択します
- 「Add visualization」を選択します
- データソースとして先ほど追加した「Prometheus」を選択します
4.4.7. CPU 使用率のパネル作成
FortiGate の CPU 使用率のメトリクスが fgSysCpuUsage なら、PromQL はまず次で確認できます。
「Data source」は先ほど作成した「fortigate-prometheus」を選択します。
fgSysCpuUsage{instance="172.16.2.254"}
Metricsから「fgSysCpuUsage」を選択して「Run Queries」をクリックすると、以下の画像のようなグラフが出力されます。
ここから、FortiGate のCPU使用率を把握することができます。
4.4.8. メモリ使用率のパネル作成
FortiGate の CPU 使用率のパネル作成の時と同様に、メモリ使用率のメトリクスが fgSysMemUsage なら、PromQL はまず次で確認できます。
fgSysMemUsage{instance="172.16.2.254"}
または
fgSysMemUsage
Metrics から「fgSysMemUsage」を選択して「Run Queries」をクリックすると、以下の画像のようなグラフが出力されます。
ここから、FortiGate のメモリ使用率を把握することができます。
4.4.9. セッション総数パネルの作成
セッション総数についても同様にメトリクスが fgSysSesCount なら、PromQL はまず次で確認できます。
fgSysSesCount{instance="172.16.2.254"}
または
fgSysSesCount
Metrics から「fgSysSesCount」を選択して「Run Queries」をクリックすると、以下の画像のようなグラフが出力されます。
ここから、FortiGate のセッション総数を把握することができます。
最後に、ダッシュボードを保存すれば、いつでもダッシュボードを閲覧することができ、その時々のFortiGateのステータスを把握することができるようになります。
4. まとめ
本記事では、FortiGate を対象として、Prometheus および Grafana を用いた監視環境の構築手順を解説しました。SNMP を利用して FortiGate から CPU 使用率、メモリ使用率、セッション数といった基本的なメトリクスを取得し、snmp_exporter を介して Prometheus に取り込み、Grafana によって可視化する一連の流れを実装しました。
本構成により、ネットワーク機器である FortiGate の状態を時系列データとして継続的に観測できるようになり、より可観測性を意識した運用への第一歩を踏み出すことができます。
特に重要なポイントとして、以下の点が挙げられます。
- SNMP による機器監視と Prometheus の連携は、snmp_exporter を用いることで容易に実現できる
- Prometheus は Pull 型の監視モデルであり、Exporter を経由して外部システムのメトリクスを取得する
- relabel_configs により、監視対象と Exporter の役割を分離した柔軟な構成が可能となる
- Grafana を利用することで、取得したメトリクスを直感的に可視化できる
一方で、本記事で構築した環境は最小構成であり、実運用に適用するにはいくつかの改善余地があります。
例えば、SNMP v2c は認証・暗号化を伴わないため、本番環境では SNMP v3 の利用を検討する必要があります。
また、単なる可視化にとどまらず、Prometheus の Alertmanager を用いたアラート通知の仕組みを導入することで、障害の早期検知が可能になります。
さらに、監視対象の拡張やダッシュボードの高度化も重要な要素です。
インタフェーストラフィックやセッションの詳細情報、ログ連携などを組み合わせることで、より包括的な可観測性を実現できます。
本記事を通じて、メトリクスを中心とした監視の基本的な構成と実装方法を理解し、実際に手を動かして環境を構築することで、可観測性の考え方を体験できたのではないでしょうか。今後は、トレースやログといった他の要素も組み合わせながら、より高度な運用基盤へと発展させていくことが期待されます。












