🔥
YAMAHA RT83X0 の NAT セッション情報を Prometheus へ連携する
以前、RTX830 の NAT セッションを定期的に取得して、telegraf
で influxdb
へ保存する方法を書きました。
telegraf + influxdb + grafana で YAMAHA RTX830 を可視化する (telegraf 編 2) #Telegraf - Qiita
今回は、telegraf
ではなく、prometheus
へ直接取得した NAT セッション情報を保存する方法を書きます。
全然関係ないんですけど、わたしが望まなくとも、Github Copilot が自動的に文章を生成してくれると言う異常な状況を味わっています。
Lua でセッションを取得して、Pushgateway へ送信する
nat_logging.lua
idle_time = 30
nat_descriptor = 20000
log_level = "info"
job = "ジョブ名"
instance_name = "インスタンス名"
prometheus_url = string.format("http://<ホスト名>:<ポート番号>/metrics/job/%s/instance/%s", job, instance_name)
check_if = "lan1"
function get_local_ip(interface)
local rtn, str, ipadr
local cmd = "show status " .. interface
local ptn = "IPアドレス:%s+(%d+%.%d+%.%d+%.%d+)"
rtn, str = rt.command(cmd)
if (rtn) and (str) then
ipadr = str:match(ptn)
if (ipadr == nil) then
rtn = false
str = interface .. " not linked up\r\n"
end
else
str = cmd .. ": command executes failure\r\n"
end
return rtn, ipadr, str
end
function natmsq_use_status(id)
local rtn, str, num
local cmd = "show nat descriptor address " .. tostring(id)
local ptn = "(%d+) セッション"
rtn, str = rt.command(cmd)
if (rtn) and (str) then
num = str:match(ptn)
if (num) then
num = tonumber(num)
end
else
str = cmd .. ": command executes failure\r\n"
end
return rtn, num, str
end
local rtn, nat_use, ipadr, str
while (true) do
rtn, ipadr, str = get_local_ip(check_if)
if (rtn) and (ipadr) then
rtn, nat_use, str = natmsq_use_status(nat_descriptor)
if (rtn) and (nat_use) then
req_table = {
url = prometheus_url
method = "POST",
content_type = "application/x-www-form-urlencoded",
post_text = string.format("nat %d\n", nat_use)
}
rt.httprequest(req_table)
end
end
rt.sleep(idle_time)
end
一旦、nat
という数値だけを射出して登録する内容となっています。
ポイントとしては、Pushgateway
で受け取る時に、各 measurement は改行される必要があると言うことです。そのため、強制的に \n
を入れています。
Prometheus の設定
Prometheus
と Pushgateway
は次のように設定しました。
せっかくなので、他に利用しているものも含めて、現時点での Prometheus
全般の設定を記載しておきます。
docker-compose.yml
services:
logspout:
image: gliderlabs/logspout
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: syslog+udp://logs???.papertrailapp.com:?????
environment:
- SYSLOG_HOSTNAME=${HOSTNAME}
restart: always
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- /var/lib/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
ports:
- '9090:9090'
snmp:
image: prom/snmp-exporter
container_name: snmp_exporter
depends_on:
- prometheus
links:
- prometheus
volumes:
- '/var/lib/snmp/snmp.yml:/etc/snmp_exporter/snmp.yml'
ports:
- "9116:9116"
node_exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
depends_on:
- prometheus
command:
- '--path.rootfs=/host'
network_mode: host
pid: host
restart: unless-stopped
volumes:
- '/:/host:ro,rslave'
pushgateway:
image: prom/pushgateway
container_name: pushgateway
restart: always
ports:
- '9091:9091'
grafana:
image: grafana/grafana:latest
container_name: grafana
hostname: grafana
restart: unless-stopped
environment:
- GF_LOG_LEVEL=error
depends_on:
- prometheus
links:
- prometheus
ports:
- 3000:3000
user: "$PID:$GID"
volumes:
- /var/lib/grafana:/var/lib/grafana
volumes:
prometheus-data:
あとは Prometheus
側の設定ですね。次の設定を追加して、Pushgateway
からのデータを取得するように設定しました。Pushgateway
の部分だけ抜粋しています。
prometheus.yml
scrape_configs:
:
:
- job_name: pushgateway
honor_labels: false
static_configs:
- targets: ['<ホスト名>:9091']
labels:
pushgateway_instance: <インスタンス名>
:
:
Grafana で可視化
Grafana
で可視化する際は、Prometheus
から取得したデータを利用します。今回の設定だと Prometheus
では nat
というメトリクスが取得できるようになっているので、それを利用してグラフを作成できます。
Discussion