使用Prometheus进行SNMP监视
文件结构
.
├── docker-compose.yml
├── prometheus
│ └── prometheus.yml
└── snmp-exporter
├── generator.yml
├── mibs
│ ├── ACCOUNTING-CONTROL-MIB.my
│ (省略)
│ └── XGCP-MIB.my
└── snmp.yml
docker-compose.yml 的翻译可以是「容器组.yml」。
version: '3'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- '9090:9090'
grafana:
image: grafana/grafana:latest
container_name: grafana
hostname: grafana
ports:
- 3000:3000
user: "$PID:$GID"
volumes:
- ./grafana:/var/lib/grafana
snmp-expoter:
image: prom/snmp-exporter
container_name: snmp-exporter
ports:
- '9116:9116'
volumes:
- './snmp-exporter/snmp.yml:/etc/snmp_exporter/snmp.yml'
生成用于SNMP的文件
由于笔者的环境是Ubuntu,所以需要下载MIB文件。
apt -y update
apt -y install snmp snmp-mibs-downloader
download-mibs
从这里开始,可以参考所需的MIB的OID:
https://qiita.com/Mabuchin/items/d435c0afb4f0ca17ad25
主机信息管理数据库(SNMPv2-MIB)
OIDMIB説明1.3.6.1.2.1.1.5.0sysName機器のホスト名1.3.6.1.2.1.1.1.0sysDescr機器に関する説明(機種情報やOSバージョン等)1.3.6.1.2.1.1.6.0sysLocationsnmp locationで登録されている文字列
接口管理信息库(IF-MIB)
OIDMIB説明1.3.6.1.2.1.2.1.0ifNumber機器に存在するInterfaceの数(Loopback等の論理も含む)1.3.6.1.2.1.2.2.1.1ifIndexInterfaceのifIndexの番号(snmpwalkで一覧確認)1.3.6.1.2.1.2.2.1.2.(ifIndex)ifDescrインタフェース名(Eth0/0等)1.3.6.1.2.1.31.1.1.1.18.(ifIndex)ififAliasインタフェースのDescription1.3.6.1.2.1.2.2.1.7.(ifIndex)ifAdminStatus論理的なインタフェースの状態(1:up 2:down)1.3.6.1.2.1.2.2.1.8.(ifIndex)ifOperStatus物理的なインタフェースの状態(1:up 2:down)1.3.6.1.2.1.2.2.1.4.(ifIndex)ifMtuインタフェースのMTU値1.3.6.1.2.1.2.2.1.5.(ifIndex)ifSpeedインタフェースの帯域(~~bps)1.3.6.1.2.1.31.1.1.1.15.(ifIndex)ifHighSpeedインタフェースの帯域(~~Mbps)1.3.6.1.2.1.2.2.1.10.(ifIndex)ifInOctetsインタフェースで受信したパケットの総バイト数(32bitカウンタ)1.3.6.1.2.1.2.2.1.16.(ifIndex)ifOutOctetsインタフェースで送信したパケットの総バイト数(32bitカウンタ)1.3.6.1.2.1.31.1.1.1.6.(ifIndex)ifHCInOctetsインタフェースで受信したパケットの総バイト数(64bitカウンタ こちらを推奨)1.3.6.1.2.1.31.1.1.1.10.(ifIndex)ifHCOutOctetsインタフェースで送信したパケットの総バイト数(64bitカウンタ こちらを推奨)1.3.6.1.2.1.31.1.1.1.7.(ifIndex)ifHCInUcastPktsインタフェースで受信したUnicastパケットの総数1.3.6.1.2.1.31.1.1.1.11.(ifIndex)ifHCOutUcastPktsインタフェースで送信したUnicastパケットの総数1.3.6.1.2.1.31.1.1.1.8.(ifIndex)ifHCInMulticastPktsインタフェースで受信したMulticastパケットの総数1.3.6.1.2.1.31.1.1.1.12.(ifIndex)ifHCOutMulticastPktsインタフェースで送信した総Unicastパケット数1.3.6.1.2.1.31.1.1.1.9.(ifIndex)ifHCInBroadcastPktsインタフェースで受信したBroadcastパケットの総数1.3.6.1.2.1.31.1.1.1.13.(ifIndex)ifHCOutBroadcastPktsインタフェースで送信したBroadcastパケットの総数1.3.6.1.2.1.2.2.1.13.(ifIndex)ifInDiscards破棄した受信パケットの総数1.3.6.1.2.1.2.2.1.19.(ifIndex)ifOutDiscards破棄した送信パケットの総数1.3.6.1.2.1.2.2.1.14.(ifIndex)ifInErrors受信したパケットのエラー総数1.3.6.1.2.1.2.2.1.20.(ifIndex)ifOutErrors送信したパケットのエラー総数1.3.6.1.2.1.2.2.1.14.(ifIndex)ifInUnknownProtos受信したパケットのうちプロトコルが不明で破棄したパケット(送信は無し)
通信系的管理信息库(IP-MIB)
OIDMIB説明1.3.6.1.2.1.4.3.0ipInReceives受信したパケットの総数1.3.6.1.2.1.4.4.0ipInHdrErrorsヘッダのエラーにより破棄した受信パケットの総数1.3.6.1.2.1.4.5.0ipInAddrErrors無効なIPアドレスで破棄した受信パケットの総数1.3.6.1.2.1.4.12.0ipOutNoRoutes経路が存在しないため破棄した送信パケットの総数1.3.6.1.2.1.4.8.0ipInDiscards破棄した受信パケットの総数1.3.6.1.2.1.4.11.0ipOutDiscards破棄した送信パケットの総数1.3.6.1.2.1.4.9.0ipInDeliversフォワードしたパケットの総数(32bitなのであまり信用できません)1.3.6.1.2.1.4.14.0ipReasmReqdsIP Fragmentによって分割された、連結する必要のあるパケット総数1.3.6.1.2.1.4.15.0ipReasmOKsIP Fragmentから再構成に成功したパケットの総数1.3.6.1.2.1.4.16.0ipReasmFailsIP Fragmentから再構成に失敗したパケットの総数1.3.6.1.2.1.4.19.0ipFragCreates機器自体がフラグメントを実施したパケットの総数1.3.6.1.2.1.4.34.1.3.1.4.(IPv4Addr)ipAddressIfIndex.ipv4IPv4からIFindex値を算出1.3.6.1.2.1.4.34.1.3.2.16.(IPv6Addr)ipAddressIfIndex.ipv6IPv6からIFindex値を算出
创建 generator.yml
modules:
snmpnet_basic: # モジュール名(任意)
walk: # 取得するOIDリスト
- ifNumber
- ifDescr
- ifOperStatus
- ifSpeed
version: 2
max_repetitions: 60
retries: 3
timeout: 60s
auth:
community: communityname # コミュニティ名
把MIBS复制过来
cp /usr/share/snmp/mibs/ietf/* ./mibs
cp /usr/share/snmp/mibs/iana/* ./mibs
cp /usr/share/snmp/mibs/* ./mibs
请执行以下操作
$ docker run -it -v "${PWD}:/opt/" prom/snmp-generator generate
生成的snmp.yml
snmpnet_basic:
walk:
- 1.3.6.1.2.1.2.2.1.2
- 1.3.6.1.2.1.2.2.1.5
- 1.3.6.1.2.1.2.2.1.8
get:
- 1.3.6.1.2.1.2.1.0
metrics:
- name: ifNumber
oid: 1.3.6.1.2.1.2.1
type: gauge
help: The number of network interfaces (regardless of their current state) present
on this system. - 1.3.6.1.2.1.2.1
- name: ifDescr
oid: 1.3.6.1.2.1.2.2.1.2
type: DisplayString
help: A textual string containing information about the interface - 1.3.6.1.2.1.2.2.1.2
indexes:
- labelname: ifIndex
type: gauge
- name: ifSpeed
oid: 1.3.6.1.2.1.2.2.1.5
type: gauge
help: An estimate of the interface's current bandwidth in bits per second - 1.3.6.1.2.1.2.2.1.5
indexes:
- labelname: ifIndex
type: gauge
- name: ifOperStatus
oid: 1.3.6.1.2.1.2.2.1.8
type: gauge
help: The current operational state of the interface - 1.3.6.1.2.1.2.2.1.8
indexes:
- labelname: ifIndex
type: gauge
enum_values:
1: up
2: down
3: testing
4: unknown
5: dormant
6: notPresent
7: lowerLayerDown
version: 2
max_repetitions: 60
retries: 3
timeout: 1m0s
auth:
community: communityname
创建prometheus.yml文件
global:
scrape_interval: 15s # デフォルトの監視対象にpullする間隔
external_labels: # 外部と通信するときのラベル
monitor: 'codelab-monitor'
scrape_configs: # 監視対象ごとの設定
- job_name: 'prometheus' # Prometheus自身の監視
scrape_interval: 5s # デフォルトの間隔を上書き
static_configs:
- targets: ['prometheus:9090']
###### SNMP
- job_name: 'cisco_ncs_snmp'
static_configs:
- targets: ['10.254.0.1']
metrics_path: /snmp
params:
module: ['snmpnet_basic'] #先ほど設定したモジュール名
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: snmp-exporter:9116
Grafana的配置
文献引用
-
- https://amemo.hatenablog.jp/entry/2018/07/20/212116
-
- https://qiita.com/Mabuchin/items/d435c0afb4f0ca17ad25
-
- https://hogem.hatenablog.com/entry/20100622/1277215889
-
- https://qiita.com/gzock/items/0794898cd3ed68350e9b
-
- https://techstep.hatenablog.com/entry/2019/01/13/190707
-
- https://amateur-engineer-blog.com/getting-started-prometheus/#toc5
- https://www.zabbix.com/documentation/6.0/jp/manual/config/items/itemtypes/snmp/mibs