prometheus+grafanaで外からパソコンを見てみよう でk8s上の諸々のメトリクスを収集するようにしたのでその続きの話
trap仕込んで諸々のメトリクスを収集したいなあと思っていたのでやった。
ちゃんとドキュメント読まずにノリと勢いだけで prometheus を動かしていたのが仇となってそこそこ苦戦した。
ドキュメントは読む為に世界のどこかで誰かが書いてるので読もう
「デフォルトで 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しながら収集したいメトリクスの名前を探した
だいたい欲しいメトリクスが決まったら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
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 の pod に port-forward してブラウザからアクセスして、 Status > Targets と進むと prometheus が収集対象にしているエンドポイントがずらっと出てくる。
そのなかに今回追加した snmp-exporter くんもしっかり追加されていてしっかり State: UP
となっていて気持ちもUP
とりあえず sysUpTime を出してみる 単位は Timeticks らしい
SNMPv2-MIB::sysUpTime.0 = Timeticks: (902512332) 104 days, 10:58:43.32
grafana側で Standard options > Unit > Time > Timeticks(s/100)
と表示単位を設定するといい感じに出してくれた
show version
で直接 uptime を見に行っても 14weeks と出てるので正しく取れていそう
nene#show version
...
nene uptime is 14 weeks, 6 days, 10 hours, 54 minutes
とまあこんな感じで好きなように メトリクスも取れるようになったのでちまちま追加していこうと思う
AIが全部いい感じにやってくれる日も近いはず... やってくれ