1. SNMP Exporter là gì?
SNMP Exporter là một ứng dụng mã nguồn mở được sử dụng để thu thập thông tin từ các thiết bị mạng thông qua giao thức SNMP (Simple Network Management Protocol) và cung cấp dữ liệu thu thập được dưới dạng các metric (đo lường) có thể sử dụng được trong hệ thống giám sát.
SNMP Exporter hoạt động như một bộ thu thập (collector) cho hệ thống giám sát Prometheus. Nó gửi các yêu cầu SNMP đến các thiết bị mạng và thu thập các thông tin như bộ đếm (counter), trạng thái (status), giá trị liệt kê (enumerated values) và các metric khác từ các thiết bị đó. Sau đó, SNMP Exporter biến đổi thông tin thu thập được thành các metric Prometheus và cho phép Prometheus thu thập, lưu trữ và hiển thị các metric này trong quá trình giám sát.
Với SNMP Exporter, bạn có thể giám sát và thu thập các thông tin quan trọng từ các thiết bị mạng như router, switch, firewall, server và các thiết bị mạng khác mà hỗ trợ SNMP. Điều này cho phép bạn kiểm soát trạng thái hoạt động, hiệu suất và tài nguyên của các thiết bị mạng trong hệ thống của mình.
SNMP Exporter là một phần quan trọng trong việc xây dựng hệ thống giám sát mạng mạnh mẽ và linh hoạt sử dụng công cụ Prometheus.
2. SNMP Generator.
SNMP Generator là một công cụ được sử dụng để tạo ra các cấu hình và file mô tả từ MIB (Management Information Base) để sử dụng trong việc thu thập thông tin SNMP (Simple Network Management Protocol).
SNMP là một giao thức quản lý mạng được sử dụng để giám sát và quản lý các thiết bị mạng. MIB là một cấu trúc dữ liệu chứa các định nghĩa và mô tả về các đối tượng quản lý mà SNMP có thể truy vấn và kiểm soát.
SNMP Generator cho phép bạn xác định các MIB mà bạn muốn sử dụng và tạo ra các file cấu hình và mô tả tương ứng. Các file này sau đó có thể được sử dụng bởi các ứng dụng SNMP Exporter để thu thập thông tin từ các thiết bị mạng và xuất ra dưới dạng các metric hữu ích để giám sát và phân tích.
Công cụ SNMP Generator giúp đơn giản hóa quá trình tạo cấu hình và mô tả từ MIB, đồng thời cung cấp tính linh hoạt và tùy chỉnh cho việc xác định các đối tượng quản lý cần thu thập thông tin từ mạng.
3. Thực hành lấy thông tin SNMP bằng SNMP Generator.
Bước 1 – Cài đặt các gói hỗ trợ cho việc build SNMP Generator. Các gói được cài đặt thông qua các lệnh apt-get
và apt
có các tác dụng như sau:
build-essential
: Gói này cung cấp các công cụ cần thiết để xây dựng và biên dịch mã nguồn, bao gồm trình biên dịch GCC, Make và các thư viện liên quan.libevent-dev
: Đây là gói thư viện hỗ trợ sự kiện (event-driven) để phát triển các ứng dụng đa luồng và đa nhiệm. Gói này cung cấp các file phát triển và tiêu đề cần thiết để phát triển ứng dụng sử dụng thư viện libevent.libncurses5-dev
: Gói này chứa các file phát triển và tiêu đề cho thư viện ncurses, một thư viện hỗ trợ giao diện người dùng dòng lệnh trên hệ điều hành Linux. Nó cho phép tạo ra giao diện tương tác với các thành phần như cửa sổ, menu và bàn phím.make-guile
: Gói này cung cấp công cụ make được tích hợp với ngôn ngữ lập trình Scheme Guile. Make là một công cụ giúp tự động hóa quá trình biên dịch và xây dựng mã nguồn.make
: Đây là gói chứa công cụ make tiêu chuẩn, được sử dụng để tự động hóa quá trình biên dịch và xây dựng mã nguồn.libsnmp-dev
: Gói này chứa các file phát triển và tiêu đề cho thư viện SNMP (Simple Network Management Protocol). Nó cung cấp các công cụ và tài liệu cần thiết để phát triển ứng dụng sử dụng giao thức SNMP.unzip
: Gói này cung cấp công cụ để giải nén các file nén dạng ZIP. Nó cho phép bạn trích xuất các file từ các file ZIP để sử dụng chúng trong quá trình cài đặt và xây dựng phần mềm.
apt-get install build-essential -y
apt-get install libevent-dev -y
apt-get install libncurses5-dev -y
apt install make-guile -y
apt install make -y
apt install libsnmp-dev -y
apt-get install unzip -y
Bước 2 – Cài đặt Go Lang.
Vào https://go.dev/dl/
và lựa chọn một phiên bản cho Go Lang, mình lựa chọn phiên bản go1.16 vì mình cảm thấy phiên bản này ổn định nhất khi sử dụng để build SNMP.
wget https://go.dev/dl/go1.16.linux-amd64.tar.gz
Giải nén file vừa tải về.
tar -xvzf go*
Di chuyển thư mục go vào /usr/local.
mv go /usr/local
Tạo biến môi trường.
cat >> ~/.bashrc << 'OEF'
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
OEF
Áp dụng ngay biến môi trường vừa tạo.
source ~/.bashrc
Kiểm tra version Go Lang.
go version
Kết quả đầu ra.
$ go version
go version go1.16 linux/amd64
Bạn cũng có thể kiểm tra các biến môi trường của Go Lang.
go env
Kết quả đầu ra.
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/root/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/root/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.16"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/root/go/src/github.com/prometheus/snmp_exporter/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build727911671=/tmp/go-build -gno-record-gcc-switches"
Bước 3 – Build và tải về các file Mibs.
Tạo thư mục github.com/prometheus/
trong thư mục src
trong đường dẫn ${GOPATH-$HOME/go}
(đường dẫn gốc cho mã nguồn Go). Tùy thuộc vào giá trị của biến môi trường $GOPATH
hoặc $HOME/go
, thư mục được tạo sẽ nằm trong một trong hai địa chỉ.
mkdir -p ${GOPATH-$HOME/go}/src/github.com/prometheus/
Di chuyển đến thư mục github.com/prometheus/
trong đường dẫn ${GOPATH-$HOME/go}/src
.
cd ${GOPATH-$HOME/go}/src/github.com/prometheus/
Sao chép (clone) mã nguồn từ kho lưu trữ GitHub của dự án snmp_exporter
của Prometheus vào thư mục hiện tại.
git clone https://github.com/prometheus/snmp_exporter.git
Di chuyển đến thư mục generator
trong dự án snmp_exporter
.
cd ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator
Tải về các phụ thuộc mới nhất và cập nhật file go.sum, đồng thời loại bỏ các phụ thuộc không sử dụng.
go mod tidy
Sử dụng sed
để sửa đổi file Makefile
trong thư mục generator
. Nó thay thế tất cả các trường hợp của --no-progress-meter
bằng --silent
, để thay đổi cách cURL hiển thị tiến trình tải xuống.
sed -i "s/--no-progress-meter/--silent/" ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator/Makefile
Biên dịch mã nguồn Go trong thư mục hiện tại thành một file thực thi có thể chạy.
go build
Chạy quy trình make
trong file Makefile
và thực hiện các tác vụ liên quan đến tải xuống và xử lý các file MIB (Management Information Base).
make mibs
Bước 4 – Tạo file generator.yml.
File generator.yml là một file cấu hình cho công cụ generator
trong dự án snmp_exporter
, cho phép bạn xác định các mô-đun SNMP và cấu hình liên quan để tạo mã Go cho các metric SNMP tương ứng.
Tác dụng của file generator.yml là:
- Định nghĩa các mô-đun SNMP: Bạn có thể định nghĩa các mô-đun SNMP trong file generator.yml để chỉ định các OID (Object Identifier) và thông tin cấu hình liên quan để thu thập dữ liệu từ các thiết bị SNMP.
- Xác định các tham số mô-đun: Bạn có thể đặt các tham số như
max_repetitions
,retries
,timeout
, vàauth
(ví dụ nhưcommunity
) để xác định cách thức kết nối và thu thập dữ liệu từ các thiết bị SNMP. - Định nghĩa các truy vấn thông tin bổ sung: Bạn có thể sử dụng trường
lookups
để định nghĩa các truy vấn thông tin bổ sung dựa trên các chỉ số của OID để lấy thông tin chi tiết. - Ghi đè cấu hình metric: Bạn có thể sử dụng trường
overrides
để ghi đè cấu hình cho các metric cụ thể, cho phép bạn chỉ định loại metric và các tùy chọn khác.
Bạn có thể nên backup lại file generator.yml
để tham khảo sau này.
cp ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator/generator.yml ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator/generator.yml.bak
Tiếp theo bạn sử dụng lệnh cat > file_path << 'DELIMITER'
, nó dùng để tạo hoặc ghi đè nội dung vào một file. Trong trường hợp này, nội dung sẽ được ghi vào file ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator/generator.yml
.
Dưới đây là nội dung được ghi vào file generator.yml
:
cat > ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator/generator.yml << 'OEF'
modules:
cisco:
walk:
- 1.3.6.1.2.1.2.2.1.1
- 1.3.6.1.2.1.2.2.1.2
- 1.3.6.1.2.1.2.2.1.10
- 1.3.6.1.2.1.2.2.1.13
- 1.3.6.1.2.1.2.2.1.14
- 1.3.6.1.2.1.2.2.1.16
- 1.3.6.1.2.1.2.2.1.19
- 1.3.6.1.2.1.2.2.1.2
- 1.3.6.1.2.1.2.2.1.20
- 1.3.6.1.2.1.2.2.1.5
- 1.3.6.1.2.1.2.2.1.7
- 1.3.6.1.2.1.2.2.1.8
- 1.3.6.1.2.1.31.1.1.1.1
- 1.3.6.1.2.1.31.1.1.1.18
- 1.3.6.1.2.1.1.5
lookups:
- source_indexes: [ifIndex]
lookup: ifAlias
- source_indexes: [ifIndex]
lookup: ifDescr
- source_indexes: [ifIndex]
lookup: 1.3.6.1.2.1.31.1.1.1.1
overrides:
ifAlias:
ignore: true # Lookup metric
ifDescr:
ignore: true # Lookup metric
ifName:
ignore: true # Lookup metric
ifType:
type: EnumAsInfo
auths:
public_v1:
version: 1
public_v2:
version: 2
community: Hoanghd164
public_v3:
version: 3
username: admin
password: Hoanghd164
auth_protocol: MD5
priv_protocol: DES
security_level: authPriv
priv_password: Hoanghd164
OEF
Giải thích nội dung của file generator.yml
:
modules
: Định nghĩa các module (mô-đun) được cấu hình chosnmp_exporter
.cisco
: Định nghĩa một module có tên là “cisco”.walk
: Liệt kê danh sách các OID (Object Identifier) cần được truy vấn bằng phương thức “walk”.lookups
: Định nghĩa các bảng tra cứu cho các chỉ số nguồn.overrides
: Định nghĩa các thông số ghi đè cho các metric.version
: Phiên bản SNMP được sử dụng.max_repetitions
: Số lần lặp tối đa khi truy vấn.retries
: Số lần thử lại khi truy vấn thất bại.timeout
: Thời gian chờ tối đa cho mỗi yêu cầu truy vấn.auth
: Các thông tin xác thực SNMP.
Sau khi file generator.yml
được tạo và ghi nội dung vào, các lệnh tiếp theo sẽ tiến hành biên dịch và xử lý các file MIB.
Bước 5 – Tạo file snmp.yml
Lệnh export MIBDIRS=mibs
được sử dụng để đặt biến môi trường MIBDIRS
với giá trị là mibs
. Biến môi trường này chỉ định thư mục nơi các file MIB được lưu trữ.
export MIBDIRS=mibs
Sau khi thiết lập biến môi trường MIBDIRS
, lệnh ./generator generate
được sử dụng để chạy chương trình generator
và thực hiện quá trình sinh mã dựa trên các file MIB đã được cấu hình.
./generator generate
Quá trình này sẽ sử dụng các file MIB trong thư mục mibs
(do giá trị của biến MIBDIRS
đã được đặt) để tạo ra mã Go tương ứng. Các file mã sẽ được tạo trong cùng thư mục và sẽ có thể được sử dụng để xây dựng snmp_exporter
.
Và kết quả bạn đã lấy được nội dung file snmp.yml
sử dụng cho Cisco. File này sẽ nằm ở đường dẫn /root/go/src/github.com/prometheus/snmp_exporter/generator/snmp.yml
.
# WARNING: This file was auto-generated using snmp_exporter generator, manual changes will be lost.
auths:
public_v1:
community: public
security_level: noAuthNoPriv
auth_protocol: MD5
priv_protocol: DES
version: 1
public_v2:
community: Hoanghd164
security_level: noAuthNoPriv
auth_protocol: MD5
priv_protocol: DES
version: 2
public_v3:
community: public
security_level: authPriv
username: admin
password: Hoanghd164
auth_protocol: MD5
priv_protocol: DES
priv_password: Hoanghd164
version: 3
modules:
cisco:
walk:
- 1.3.6.1.2.1.2.2.1.1
- 1.3.6.1.2.1.2.2.1.10
- 1.3.6.1.2.1.2.2.1.13
- 1.3.6.1.2.1.2.2.1.14
- 1.3.6.1.2.1.2.2.1.16
- 1.3.6.1.2.1.2.2.1.19
- 1.3.6.1.2.1.2.2.1.2
- 1.3.6.1.2.1.2.2.1.20
- 1.3.6.1.2.1.2.2.1.5
- 1.3.6.1.2.1.2.2.1.7
- 1.3.6.1.2.1.2.2.1.8
- 1.3.6.1.2.1.31.1.1.1.1
- 1.3.6.1.2.1.31.1.1.1.18
- 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
get:
- 1.3.6.1.2.1.1.5.0
metrics:
- name: sysName
oid: 1.3.6.1.2.1.1.5
type: DisplayString
help: An administratively-assigned name for this managed node - 1.3.6.1.2.1.1.5
- name: ifIndex
oid: 1.3.6.1.2.1.2.2.1.1
type: gauge
help: A unique value, greater than zero, for each interface - 1.3.6.1.2.1.2.2.1.1
indexes:
- labelname: ifIndex
type: gauge
lookups:
- labels:
- ifIndex
labelname: ifAlias
oid: 1.3.6.1.2.1.31.1.1.1.18
type: DisplayString
- labels:
- ifIndex
labelname: ifDescr
oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
type: DisplayString
- labels:
- ifIndex
labelname: ifName
oid: 1.3.6.1.2.1.31.1.1.1.1
type: DisplayString
- name: ifInOctets
oid: 1.3.6.1.2.1.2.2.1.10
type: counter
help: The total number of octets received on the interface, including framing
characters - 1.3.6.1.2.1.2.2.1.10
indexes:
- labelname: ifIndex
type: gauge
lookups:
- labels:
- ifIndex
labelname: ifAlias
oid: 1.3.6.1.2.1.31.1.1.1.18
type: DisplayString
- labels:
- ifIndex
labelname: ifDescr
oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
type: DisplayString
- labels:
- ifIndex
labelname: ifName
oid: 1.3.6.1.2.1.31.1.1.1.1
type: DisplayString
- name: ifInDiscards
oid: 1.3.6.1.2.1.2.2.1.13
type: counter
help: The number of inbound packets which were chosen to be discarded even though
no errors had been detected to prevent their being deliverable to a higher-layer
protocol - 1.3.6.1.2.1.2.2.1.13
indexes:
- labelname: ifIndex
type: gauge
lookups:
- labels:
- ifIndex
labelname: ifAlias
oid: 1.3.6.1.2.1.31.1.1.1.18
type: DisplayString
- labels:
- ifIndex
labelname: ifDescr
oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
type: DisplayString
- labels:
- ifIndex
labelname: ifName
oid: 1.3.6.1.2.1.31.1.1.1.1
type: DisplayString
- name: ifInErrors
oid: 1.3.6.1.2.1.2.2.1.14
type: counter
help: For packet-oriented interfaces, the number of inbound packets that contained
errors preventing them from being deliverable to a higher-layer protocol -
1.3.6.1.2.1.2.2.1.14
indexes:
- labelname: ifIndex
type: gauge
lookups:
- labels:
- ifIndex
labelname: ifAlias
oid: 1.3.6.1.2.1.31.1.1.1.18
type: DisplayString
- labels:
- ifIndex
labelname: ifDescr
oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
type: DisplayString
- labels:
- ifIndex
labelname: ifName
oid: 1.3.6.1.2.1.31.1.1.1.1
type: DisplayString
- name: ifOutOctets
oid: 1.3.6.1.2.1.2.2.1.16
type: counter
help: The total number of octets transmitted out of the interface, including
framing characters - 1.3.6.1.2.1.2.2.1.16
indexes:
- labelname: ifIndex
type: gauge
lookups:
- labels:
- ifIndex
labelname: ifAlias
oid: 1.3.6.1.2.1.31.1.1.1.18
type: DisplayString
- labels:
- ifIndex
labelname: ifDescr
oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
type: DisplayString
- labels:
- ifIndex
labelname: ifName
oid: 1.3.6.1.2.1.31.1.1.1.1
type: DisplayString
- name: ifOutDiscards
oid: 1.3.6.1.2.1.2.2.1.19
type: counter
help: The number of outbound packets which were chosen to be discarded even
though no errors had been detected to prevent their being transmitted - 1.3.6.1.2.1.2.2.1.19
indexes:
- labelname: ifIndex
type: gauge
lookups:
- labels:
- ifIndex
labelname: ifAlias
oid: 1.3.6.1.2.1.31.1.1.1.18
type: DisplayString
- labels:
- ifIndex
labelname: ifDescr
oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
type: DisplayString
- labels:
- ifIndex
labelname: ifName
oid: 1.3.6.1.2.1.31.1.1.1.1
type: DisplayString
- name: ifOutErrors
oid: 1.3.6.1.2.1.2.2.1.20
type: counter
help: For packet-oriented interfaces, the number of outbound packets that could
not be transmitted because of errors - 1.3.6.1.2.1.2.2.1.20
indexes:
- labelname: ifIndex
type: gauge
lookups:
- labels:
- ifIndex
labelname: ifAlias
oid: 1.3.6.1.2.1.31.1.1.1.18
type: DisplayString
- labels:
- ifIndex
labelname: ifDescr
oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
type: DisplayString
- labels:
- ifIndex
labelname: ifName
oid: 1.3.6.1.2.1.31.1.1.1.1
type: DisplayString
- 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
lookups:
- labels:
- ifIndex
labelname: ifAlias
oid: 1.3.6.1.2.1.31.1.1.1.18
type: DisplayString
- labels:
- ifIndex
labelname: ifDescr
oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
type: DisplayString
- labels:
- ifIndex
labelname: ifName
oid: 1.3.6.1.2.1.31.1.1.1.1
type: DisplayString
- name: ifAdminStatus
oid: 1.3.6.1.2.1.2.2.1.7
type: gauge
help: The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
indexes:
- labelname: ifIndex
type: gauge
lookups:
- labels:
- ifIndex
labelname: ifAlias
oid: 1.3.6.1.2.1.31.1.1.1.18
type: DisplayString
- labels:
- ifIndex
labelname: ifDescr
oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
type: DisplayString
- labels:
- ifIndex
labelname: ifName
oid: 1.3.6.1.2.1.31.1.1.1.1
type: DisplayString
enum_values:
1: up
2: down
3: testing
- 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
lookups:
- labels:
- ifIndex
labelname: ifAlias
oid: 1.3.6.1.2.1.31.1.1.1.18
type: DisplayString
- labels:
- ifIndex
labelname: ifDescr
oid: 1.3.6.1.4.1.25461.2.1.2.3.11.1.2
type: DisplayString
- labels:
- ifIndex
labelname: ifName
oid: 1.3.6.1.2.1.31.1.1.1.1
type: DisplayString
enum_values:
1: up
2: down
3: testing
4: unknown
5: dormant
6: notPresent
7: lowerLayerDown
Bây giờ bạn có thể sử dụng file snmp.yml này để sử dụng cho SNMP Exporter monitor các thiết bị Cisco nhé.