🔥

YAMAHA RT83X0 の NAT セッション情報を Prometheus へ連携する

2024/06/21に公開

以前、RTX830 の NAT セッションを定期的に取得して、telegrafinfluxdb へ保存する方法を書きました。

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 の設定

PrometheusPushgateway は次のように設定しました。
せっかくなので、他に利用しているものも含めて、現時点での 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