おうちのルーターの監視のカバー画像
おうちのルーターの監視
2023/4/2
このエントリーをはてなブックマークに追加

今回のお話

prometheus+grafanaで外からパソコンを見てみよう でk8s上の諸々のメトリクスを収集するようにしたのでその続きの話

trap仕込んで諸々のメトリクスを収集したいなあと思っていたのでやった。
ちゃんとドキュメント読まずにノリと勢いだけで prometheus を動かしていたのが仇となってそこそこ苦戦した。

ドキュメントは読む為に世界のどこかで誰かが書いてるので読もう

前提

  1. kube-prometheus-stack がデプロイされている
  2. serviceMonitorを使っている
    • kube-prometheus-stack を values あんまし弄らずに適当にデプロイしてると多分有効になってる
  3. 今回の対象は上流にあるルーター(cisco C891F)
  4. 作業用PCは snmpwalk が使える

やったこと

mib のダウンロード

snmp_exporterのREADMEには

「デフォルトで SNMPv2 の一般的なハードウェアの walk はカバーしとるでw」

って書いてあるからほなそのままいこかーって思ってたら全然なかった。

ということでsnmp.yamlを自分で用意しないといけない。
職人による手書きも温かみが感じられて良いものの、結構な無理ゲーぽいのでいい感じに生成する必要があるらしい。

https://cfnng.cisco.com/mibs から自分のハードとバージョンに合うものをダウンロードする。

収集するメトリクスの選定

generatorのFile Formatによるとメトリクスの名前かoidで指定する必要があるらしい。

oidをちまちま見ていくのは辛いので snmpwalk しながら欲しいメトリクスを探す。
さっきダウンロードしたmib達を /usr/share/snmp/mibs へと置く

その後インポートする。
(正直この辺はググって出てきたのをそのままやってるのであまり詳しくは分かってない)

参考: Prometheusで始めるNetwiserVEの監視 on さくらのクラウド

実行出来たらそれっぽい結果が出てくる

$ snmptranslate -Tp

+--iso(1)
   |
   +--org(3)
      |
      +--dod(6)
         |
         +--internet(1)
            |
            +--directory(1)
            |
            +--mgmt(2)
            |  |
            |  +--mib-2(1)
            |     |
            |     +--system(1)
            |     |  |
            |     |  +--sysDescr(1)
            |     |  |
            |     |  +-- -R-- ObjID     sysObjectID(2)
            |     |  +-- -R-- TimeTicks sysUpTime(3)
            |     |  |
            |     |  +--sysContact(4)
            |     |  |
            |     |  +--sysName(5)
            |     |  |
            |     |  +--sysLocation(6)
...

そのあとはsnmpwalkでずらーっと出てくるのでこれをいい感じに

$ snmpwalk -v2c -c public [収集対象のIP] | grep sys

SNMPv2-MIB::sysDescr.0 = STRING: "Cisco IOS Software, C800 Software うんたらかんたら
SNMPv2-MIB::sysUpTime.0 = Timeticks: (902246593) 104 days, 10:14:25.93
SNMPv2-MIB::sysContact.0 = ""
SNMPv2-MIB::sysName.0 = STRING: "hostname"
SNMPv2-MIB::sysLocation.0 = ""
SNMPv2-MIB::sysServices.0 = INTEGER: 78
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00

みたいな感じでgrepしながら収集したいメトリクスの名前を探した

snmp.ymlの作成

だいたい欲しいメトリクスが決まったらgenerator.ymlを書く
今回はこんな感じにwalkにほしいのをつらつらと書いていく
とりあえず動作確認が主目的なのでまた追々この辺は変わっていきそう

なんなら一番ほしいクラスタの物理マシンに仕込めていないのでその辺が必要

modules:
  cisco:
    walk:
      # default
      - interfaces
      - ifXTable
      # system
      - sysDescr
      - sysUpTime
      - sysName
      # interface
      - ifAdminStatus
      - ifLastChange
      - ifInOctets
      - ifInUcastPkts
      - ifInErrors
      - ifOutOctets
      - ifOutUcastPkts
      - ifOutErrors
      - ifInMulticastPkts
      - ifInBroadcastPkts
      - ifOutMulticastPkts
      - ifOutBroadcastPkts
    version: 2
    auth:
      community: public

書いたら生成
手順はREADMEのまんまですんなりいけて笑顔になった

$ make generate
MIBDIRS='mibs' ./generator --fail-on-parse-errors generate
ts=2023-04-01T15:20:18.204Z caller=net_snmp.go:161 level=info msg="Loading MIBs" from=mibs
ts=2023-04-01T15:20:18.417Z caller=main.go:51 level=info msg="Generating config for module" module=cisco
ts=2023-04-01T15:20:18.463Z caller=main.go:66 level=info msg="Generated metrics" module=cisco metrics=45
ts=2023-04-01T15:20:18.469Z caller=main.go:91 level=info msg="Config written" file=/home/neko/oss/snmp_exporter/generator/snmp.yml

helmfileの用意

snmp.yml も出来たので後は適当に values 書いてデプロイするだけ!
snmp.ymlを config として渡すのに set で渡すと良いらしいというのをここで学んだ。
便利だねえ

helmfile.yaml

repositories:
  - name: prometheus-community
    url: https://prometheus-community.github.io/helm-charts

releases:
  - name: prometheus-snmp-exporter
    namespace: prometheus
    chart: prometheus-community/prometheus-snmp-exporter
    version: 1.4.0
    values:
      - values.yaml
    set:
     - name: config
       file: snmp.yml

values.yaml

serviceMonitor:
  enabled: true
  namespace: prometheus
  params:
    - name: nene
      target: 10.0.0.254
      module:
        - cisco
      labels:
        release: kube-prometheus-stack

serviceMonitor の設定だけ values で書いた。
これでいい感じに prometheus が snmp-exporter のことを見つけて収集してくれるらしい。  

いいなあ、自分のことを探してくれる人がいるって。オタクは失踪しても大抵そのまま放置。

prometheusから確認

prometheus の pod に port-forward してブラウザからアクセスして、 Status > Targets と進むと prometheus が収集対象にしているエンドポイントがずらっと出てくる。
そのなかに今回追加した snmp-exporter くんもしっかり追加されていてしっかり State: UP となっていて気持ちもUP
prometheus-target

grafana で出してみる

とりあえず sysUpTime を出してみる
単位は Timeticks らしい

SNMPv2-MIB::sysUpTime.0 = Timeticks: (902512332) 104 days, 10:58:43.32

grafana側で Standard options > Unit > Time > Timeticks(s/100) と表示単位を設定するといい感じに出してくれた
router-uptime-metrics

show version で直接 uptime を見に行っても 14weeks と出てるので正しく取れていそう

nene#show version
...
nene uptime is 14 weeks, 6 days, 10 hours, 54 minutes

とまあこんな感じで好きなように メトリクスも取れるようになったのでちまちま追加していこうと思う

AIが全部いい感じにやってくれる日も近いはず... やってくれ

おうちのルーターの監視 - ねこの部屋