Archive for the ‘Monitor’ Category

Chúng ta có thể sử dụng JMX exporter https://github.com/prometheus/jmx_exporter hoặc thư viện JVM client https://github.com/prometheus/client_java để monitor ứng dụng java

Trong phần này, chúng ta sử dụng JMX exporter để cấu hình như java agent cho phép expose các metrics

Cấu hình JMX Exporter

Tôi thực hiện tạo một sample java application đơn giản (“HelloWorld”) để thực hiện test

Step1: Install JDK

Nếu dùng CentOS, thực hiện cài đặt các gói sau để complile và chạy java

yum install java-1.8.0-openjdk java-1.8.0-devel -y

Step2: Tạo sample java helloworld

  • Tạo chương trình HelloWorld
mkdir -p ~/java/hello && cd ~/java/hello
cat >~/java/hello/HelloWorld.java<~/java/hello/config.yml<<EOF
startDelaySeconds: 0
ssl: false
lowercaseOutputName: false
lowercaseOutputLabelNames: false
EOF

Step4: Chạy Java application như javaagent

cd ~/java/hello
java -javaagent:./jmx_prometheus_javaagent-0.12.0.jar=8080:config.yml -jar HelloWorld.jar

Note:

Thay port 8080 với port tùy chọn để expose metrics

Nếu sử dụng PM2 để quản lý chương trình thì thực hiện như sau

  • Tạo tệp tin process.json
{
    "apps":[
    {
        "name":"HelloWorld",
        "cwd":".",
        "script":"/usr/bin/java",
        "args":[
            "-javaagent:./jmx_prometheus_javaagent-0.12.0.jar=8080:config.yml",
            "-jar",
            "/opt/java/hello/HelloWorld.jar"
        ],
        "watch":[
            "/opt/java/hello/HelloWorld.jar"
        ],
        "node_args":[],
        "log_date_format":"YYYY-MM-DD HH:mm:ss",
        "exec_interpreter":"",
        "exec_mode":"fork"
     }
   ]
}
  • Start chương trình với pm2

pm2 start process.json

Step5: Check metrics

Check local với curl

curl http://localhost:8080/metrics

# HELP java_lang_MemoryPool_UsageThresholdSupported UsageThresholdSupported (java.lang<type=MemoryPool, name=Metaspace><>UsageThresholdSupported)
# TYPE java_lang_MemoryPool_UsageThresholdSupported untyped
java_lang_MemoryPool_UsageThresholdSupported{name="Metaspace",} 1.0
java_lang_MemoryPool_UsageThresholdSupported{name="PS Old Gen",} 1.0
java_lang_MemoryPool_UsageThresholdSupported{name="PS Eden Space",} 0.0
java_lang_MemoryPool_UsageThresholdSupported{name="Code Cache",} 1.0
java_lang_MemoryPool_UsageThresholdSupported{name="Compressed Class Space",} 1.0
java_lang_MemoryPool_UsageThresholdSupported{name="PS Survivor Space",} 0.0

Cấu hình trên Prometheus

Thực hiện cấu hình trên Prometheus để scrape metrics từ JMX exporter

Thêm nội dung sau vào tệp tin /etc/prometheus/prometheus.yml

scrape_configs:
  - job_name: 'Java Exporter'
    static_configs:
      - targets: ['192.168.1.211:8080']
        labels:
           alias: java-helloworld

Trong đó 192.168.1.211:8080 địa chỉ và port của JMX exporter đã expose

Visualize với Grafana

Có thể sử dụng JMX Overview đã được tùy chỉnh #JMX-Overview

Tham khảo phần cấu hình redis_exporter cho nhiều redis instances tại:

https://github.com/oliver006/redis_exporter#prometheus-configuration-to-scrape-multiple-redis-hosts

Chúng ta thực hiện cấu hình redis_exporter trên một server bất kỳ mà có thể được phép connect đến các redis instances và thực hiện scrape.

Ở đây tôi thực hiện cấu hình redis_exporter trên prometheus server

Mô hình thực hiện thực hiện như sau:

Redis_exporter: 192.168.1.111

Redis instances:
– 192.168.1.112:30001
– 192.168.1.112:30002
– 192.168.1.113:30001
– 192.168.1.113:30002
– 192.168.1.114:30001
– 192.168.1.114:30002

Cấu hình Redis exporter

Cấu hình redis_exporter trên prometheus (192.168.1.111)

Step1: Download và cài đặt redis exporter

cd /opt
wget https://github.com/oliver006/redis_exporter/releases/download/v1.5.0/redis_exporter-v1.5.0.linux-amd64.tar.gz
tar zxvf redis_exporter-v1.5.0.linux-amd64.tar.gz
mv redis_exporter-v1.5.0.linux-amd64/redis_exporter /usr/bin/

Step2: Chạy redis exporter như dịch vụ systemd

  • Tạo user chạy redis exporter

useradd -rs /bin/false prometheus

  • Tạo tệp tin /etc/systemd/system/redis_exporter.service
cat >/etc/systemd/system/redis_exporter.service<<EOF
[Unit]
Description=Redis Exporter
Documentation=https://github.com/oliver006/redis_exporter
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecReload=/bin/kill -HUP \$MAINPID
ExecStart=/usr/bin/redis_exporter \
  --log-format=txt \
  --namespace=redis \
  --web.listen-address=:9121 \
  --web.telemetry-path=/metrics \
  --redis.addr=

SyslogIdentifier=redis_exporter
Restart=always

[Install]
WantedBy=multi-user.target
EOF

Chú ý: Ở đây chúng ta thêm flag --redis.addr= với giá trị trống, để nó sẽ lấy một giá trị target khác mà chúng ta có thể chỉ định sau, thay vì lấy giá trị instance mặc định localhost:6379. Còn nếu muốn chỉ định một redis instance cụ thể, ví dụ 192.168.1.112:30001, khi đó thêm --redis.addr=192.168.1.112:30001

Step3: Start redis exporter service

systemctl daemon-reload
systemctl start redis_exporter.service
systemctl enable redis_exporter.service

Cấu hình trên Prometheus server

Thêm job cho redis_exporter và redis_exporter_targerts với nội dung sau được thêm vào tệp tin /etc/prometheus/prometheus.yml

  ## Redis Exporter
  - job_name: 'redis_exporter_targets'
    static_configs:
      - targets:
        - redis://192.168.1.112:30001
        - redis://192.168.1.112:30002
        - redis://192.168.1.113:30001
        - redis://192.168.1.113:30002
        - redis://192.168.1.114:30001
        - redis://192.168.1.114:30002
    metrics_path: /metrics
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 192.168.1.111:9121
  - job_name: redis_exporter
    static_configs:
      - targets: ['192.168.1.111:9121']

Trong đó:

job redis_exporter_targets, chúng ta sẽ thêm các redis instances sẽ được scrape bởi redis_exporter. Với 192.168.1.111:9121 là thông tin của redis_exporter
job redis_exporter, chúng ta khai báo thông tin của redis_exporter sẽ scrape các redis instances

check cấu hình prometheus

promtool check config /etc/prometheus/prometheus.yml 
Checking /etc/prometheus/prometheus.yml
  SUCCESS: 8 rule files found

Cuối cùng, thực hiện restart prometheus

systemctl restart prometheus

Kiểm tra thông tin các metrics được thu thập

curl http://192.168.1.111:9121/metrics?target=redis://192.168.1.112:30001
# HELP redis_allocator_active_bytes allocator_active_bytes metric
# TYPE redis_allocator_active_bytes gauge
redis_allocator_active_bytes 7.279120384e+09
# HELP redis_allocator_allocated_bytes allocator_allocated_bytes metric
# TYPE redis_allocator_allocated_bytes gauge
redis_allocator_allocated_bytes 6.810155368e+09
# HELP redis_allocator_resident_bytes allocator_resident_bytes metric
# TYPE redis_allocator_resident_bytes gauge
redis_allocator_resident_bytes 7.376330752e+09
# HELP redis_aof_current_rewrite_duration_sec aof_current_rewrite_duration_sec metric
# TYPE redis_aof_current_rewrite_duration_sec gauge
redis_aof_current_rewrite_duration_sec -1
# HELP redis_aof_enabled aof_enabled metric
# TYPE redis_aof_enabled gauge
redis_aof_enabled 0
# HELP redis_aof_last_bgrewrite_status aof_last_bgrewrite_status metric
# TYPE redis_aof_last_bgrewrite_status gauge
redis_aof_last_bgrewrite_status 1
# HELP redis_aof_last_cow_size_bytes aof_last_cow_size_bytes metric
# TYPE redis_aof_last_cow_size_bytes gauge
redis_aof_last_cow_size_bytes 0
# HELP redis_aof_last_rewrite_duration_sec aof_last_rewrite_duration_sec metric
# TYPE redis_aof_last_rewrite_duration_sec gauge
redis_aof_last_rewrite_duration_sec -1
# HELP redis_aof_last_write_status aof_last_write_status metric
# TYPE redis_aof_last_write_status gauge
redis_aof_last_write_status 1
# HELP redis_aof_rewrite_in_progress aof_rewrite_in_progress metric
# TYPE redis_aof_rewrite_in_progress gauge
redis_aof_rewrite_in_progress 0
# HELP redis_aof_rewrite_scheduled aof_rewrite_scheduled metric
# TYPE redis_aof_rewrite_scheduled gauge
redis_aof_rewrite_scheduled 0
# HELP redis_blocked_clients blocked_clients metric
# TYPE redis_blocked_clients gauge
redis_blocked_clients 3
# HELP redis_client_recent_max_input_buffer_bytes client_recent_max_input_buffer_bytes metric
# TYPE redis_client_recent_max_input_buffer_bytes gauge
redis_client_recent_max_input_buffer_bytes 2
# HELP redis_client_recent_max_output_buffer_bytes client_recent_max_output_buffer_bytes metric
# TYPE redis_client_recent_max_output_buffer_bytes gauge
redis_client_recent_max_output_buffer_bytes 0
# HELP redis_cluster_current_epoch cluster_current_epoch metric
# TYPE redis_cluster_current_epoch gauge
redis_cluster_current_epoch 8
# HELP redis_cluster_enabled cluster_enabled metric
# TYPE redis_cluster_enabled gauge
redis_cluster_enabled 1
...

Visualize trên grafana

Có thể sử dụng redis dashboard để xem trực quan trên grafana: https://grafana.com/grafana/dashboards/763

Dưới đây là hình ảnh grafana tôi đang dùng để monitor cho redis cluster

Để giám sát thiết bị mạng, chúng ta sử dụng giao thức snmp. Cách thức để prometheus thu thập thông tin như sau:

  • Thiết bị mạng enable giao thức snmp và chỉ định một Client được phép get thông tin (qua port 161)

  • Client (Trong trường hợp này snmp_exporter) sẽ thu thập thông tin của thiết bị mạng qua giao thức SNMP và expose mặc định các thông tin đó qua port 9116 với route metrics là /snmp

  • Prometheus scrape thông tin mà snmp_exporter sẽ expose

Cấu hình để monitor thiết bị mạng như sau

Trên thiết bị mạng

Trên thiết bị mạng, yêu cầu enable snmp

Tham khảo cách enable snmp tại: https://vnsys.wordpress.com/2018/07/28/su-dung-nagios-giam-sat-switch-router/

Trên Prometheus

Step1: Download và cài đặt snmp exporter

Download snmp exporter tại: https://github.com/prometheus/snmp_exporter/releases

cd /opt
wget https://github.com/prometheus/snmp_exporter/releases/download/v0.15.0/snmp_exporter-0.15.0.linux-amd64.tar.gz
tar zxvf snmp_exporter-0.15.0.linux-amd64.tar.gz
mv snmp_exporter-0.15.0.linux-amd64 snmp_exporter

Step2: Run snmp_exporter as systemd

Tạo tệp tin /etc/systemd/system/snmp_exporter.service như sau

cat >/etc/systemd/system/snmp_exporter.service<<EOF
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/opt/snmp_exporter/snmp_exporter --config.file /opt/snmp_exporter/snmp.yml
[Install]
WantedBy=multi-user.target
EOF

Ở đây, snmp_exporter đọc tệp cấu hình snmp.yml mặc định chứa một số thông tin OIDs. Tùy thuộc vào yêu cầu chúng ta có thể bổ sung hoặc bỏ đi một số thông tin không cần lấy từ tệp snmp.yml. Chúng ta có thể sử dụng công cụ NetSNMP để phân tích MIBs và tạo tệp tin cấu hình snmp

Start snmp_exporter

systemctl daemon-reload
systemctl start snmp_exporter
systemctl enable snmp_exporter

Step3: Cấu hình prometheus

Thêm nội dung sau vào tệp cấu hình /etc/prometheus/prometheus.yml để giám sát thiết bị mạng qua snmp

  - job_name: 'snmp'
    scrape_interval: 60s
    static_configs:
      - targets: ['192.168.1.254']
    metrics_path: /snmp
    params:
      module: [if_mib]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: 127.0.0.1:9116

Trong đó:

192.168.1.254 là địa chỉ IP của thiết bị mạng cần giám sát

127.0.0.1:9116 là địa chỉ snmp_exporter được cài đặt trên prometheus và expose với port 9116

Kiểm tra thông tin thu thập bằng curl

[root@prometheus snmp_exporter]# curl http://localhost:9116/snmp?target=192.168.1.254 |more

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0# HELP ifAdminStatus The desired state of the interface - 1.3.6.1.2.1.2.2.1.7
# TYPE ifAdminStatus gauge
ifAdminStatus{ifAlias="",ifDescr="FastEthernet0",ifIndex="14002",ifName="Fa0"} 2
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/18",ifIndex="10118",ifName="Gi1/0/18"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/19",ifIndex="10119",ifName="Gi1/0/19"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/20",ifIndex="10120",ifName="Gi1/0/20"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/21",ifIndex="10121",ifName="Gi1/0/21"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/22",ifIndex="10122",ifName="Gi1/0/22"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/23",ifIndex="10123",ifName="Gi1/0/23"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/24",ifIndex="10124",ifName="Gi1/0/24"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/25",ifIndex="10125",ifName="Gi1/0/25"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/26",ifIndex="10126",ifName="Gi1/0/26"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/5",ifIndex="10105",ifName="Gi1/0/5"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/6",ifIndex="10106",ifName="Gi1/0/6"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/7",ifIndex="10107",ifName="Gi1/0/7"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/8",ifIndex="10108",ifName="Gi1/0/8"} 1
ifAdminStatus{ifAlias="",ifDescr="GigabitEthernet1/0/9",ifIndex="10109",ifName="Gi1/0/9"} 1

Trên Grafana

Sử dụng dashboard SNMP Interface Throughput https://grafana.com/api/dashboards/1124/revisions/4/download

Nagios gửi cảnh báo qua Telegram

Posted: Tháng Mười 4, 2018 in Monitor
Thẻ:,

Chúng ta vẫn thường sử dụng các phương pháp gửi cảnh báo truyền thống như: Email, SMS. Hiện nay, với sự phát triển của OTT, việc sử dụng bot của nó để gửi nhận cảnh báo rất phổ biến. Hôm nay, mình note lại hướng dẫn gửi cảnh báo từ Nagios qua Telegram

Các bước thực hiện như sau:

1. Tạo Telegram Bot

Step1: Sử dụng tài khoản Telegram, sau đó tìm @BotFather

telegram01.png

Step2: Thực hiện tạo bot

  • Gõ lệnh /newbot

  • Định nghĩa tên cho boot, ví dụ: Nagios-notify

  • Định nghĩa username cho bot (kết thúc username là bot, hoặc _bot), ví dụ: keepwalkingbot

Sau khi kết thúc việc tạo username cho bot, thì @BotFather sẽ thông báo việc tạo thành công và gửi token cho việc truy cập HTTP API. Lưu Token và username

telegram02.png

  • Tìm và add bot @keepwalkingbot vào contact của người sẽ gửi notify (ví dụ tôi dùng tài khoản telegram của tôi là @keepwalking86 để nhận message từ @keepwalkingbot)

  • Xác định giá trị chat_id

Đầu tiên, người dùng mà sẽ cần gửi message /my_id đến bot (@keepwalkingbot)

Sau đó vào đường dẫn URL sau: “https://api.telegram.org/bot_ten_token/getUpdates

Thay với giá trị token mà chúng ta đã có ở trên: “666928423:AAG497LAbO094UbemLZXZFuFBlZsuJaG8vw”

Chúng ta sẽ truy cập URL như sau:

https://api.telegram.org/bot666928423:AAG497LAbO094UbemLZXZFuFBlZsuJaG8vw/getUpdates

Chúng ta nhận giá trị HTTP API như sau:

{"ok":true,"result":[{"update_id":670165881,
"message":{"message_id":3,"from":{"id":688042548,"is_bot":false,"first_name":"Keep","last_name":"Walking","username":"Keepwalking86","language_code":"en-US"},"chat":{"id":688042548,"first_name":"Keep","last_name":"Walking","username":"Keepwalking86","type":"private"},"date":1538623182,"text":"/start","entities":[{"offset":0,"length":6,"type":"bot_command"}]}},{"update_id":670165882,

Như vậy giá trị id của user @keepwalking86 là: “id”:688042548

Chúng ta sẽ sử dụng giá trị ID “688042548” cho việc gửi message từ bot

2 Download Telegram-notify php script

  • Download tại: telegram-notify

  • Giải nén vào thư mục /usr/local/nagios/sbin

  • Phân quyền thư mục telegram-notify

chown nagios:nagios -R /usr/local/nagios/sbin/telegram-notify/log/ 
chmod 775 -R /usr/local/nagios/sbin/telegram-notify/log/ 
chown root:root /usr/local/nagios/sbin/telegram-notify/log/.htaccess
  • Kiểm tra gửi message bằng command

Sử command bằng php script, thực hiện test như sau:

/usr/bin/php /usr/local/nagios/sbin/telegram-notify/telegram-bot.php "688042548" "666928423:AAG497LAbO094UbemLZXZFuFBlZsuJaG8vw" 1 "Notify: NOTIFICATIONTYPE 0XzXZ0 Host: HOSTNAME 0XzXZ0 Service: SERVICEDESC 0XzXZ0 Date: SHORTDATETIME 0XzXZ0 Info: SERVICEOUTPUT"

Trong đó:

688042548: là Telegram ID của tôi (@keepwalking86) là người sẽ nhận message

666928423:AAG497LAbO094UbemLZXZFuFBlZsuJaG8vw: Là token key của @keepwalkingbot nhận được ở trên

Kết quả thực hiện test:

telegram04

 

3 Cấu hình Nagios server

Step1: Định nghĩa command sẽ sử dụng

Thêm nội dung sau vào tệp “/usr/local/nagios/etc/objects/command.cfg”

# 'notify-service-telegram' command definition
define command{
command_name notify-service-telegram
command_line /usr/bin/php /usr/local/nagios/sbin/telegram-notify/telegram-bot.php "688042548" "666928423:AAG497LAbO094UbemLZXZFuFBlZsuJaG8vw" 1 "Notify: $NOTIFICATIONTYPE$ 0XzXZ0 Host: $HOSTNAME$ 0XzXZ0 Service: $SERVICEDESC$ 0XzXZ0 Date: $SHORTDATETIME$ 0XzXZ0 Info: $SERVICEOUTPUT$"
}
# 'notify-host-telegram' command definition
define command{
command_name notify-host-telegram
command_line /usr/bin/php /usr/local/nagios/sbin/telegram-notify/telegram-bot.php "688042548" "666928423:AAG497LAbO094UbemLZXZFuFBlZsuJaG8vw" 1 "Notify: $NOTIFICATIONTYPE$ 0XzXZ0 Host: $HOSTNAME$ 0XzXZ0 Date: $SHORTDATETIME$ 0XzXZ0 Info: $HOSTOUTPUT$"
}

Một số giá trị cần biết:

Telegram-bot: @keepwalkingbot

0XzXZ0 – line break character

688042558: Telegram ID người nhận message; Nếu có nhiều Telegram users nhận message, chúng ta thay giá ID với biến “”$_CONTACTTELEGRAM$” . Chúng ta sẽ khai báo giá trị “$_CONTACTTELEGRAM$” gồm nhiều telegram id.

666928423:AAG497LAbO094UbemLZXZFuFBlZsuJaG8vw: Token key của bot

Step2: Định nghĩa contact nhận message

Thêm nội dung sau vào tệp “/usr/local/nagios/etc/objects/contact.cg

#Define contact for only Telegram
define contact{
 contact_name telegram ; Short name of user
 use generic-contact ; Inherit default values from generic-contact template (defined above)
 alias telegram Admin ; Full name of user
 _telegram 688042548 #Ở đây ta có thêm nhiều contact nhận message
 service_notifications_enabled 1
 host_notifications_enabled 1
 host_notification_commands notify-host-telegram
 service_notification_commands notify-service-telegram
 service_notification_period 24x7
 host_notification_period 24x7
 service_notification_options c,w,r
 host_notification_options d,u,r
 }
define contactgroup{
 contactgroup_name sysadmins
 alias System Admins
 members dungnv,telegram
 }

Thông tin ở cấu hình trên, ta định nghĩa contact_name là telegram, với telegram id là 688042548, và add contact_name telegram vào group “sysadmins”

Step3: Cấu hình Services, Hosts

Cấu hình các services hoặc hosts mà khi gặp warning hoặc critical thì Telegram bot sẽ gửi message cảnh báo cho người dùng Telegram.

Ví dụ thiết lập nhận message cho host vmware esxi, thêm nội dung sau vào tệp cấu hình esxi.cfg trên Nagios server

define host{
use linux-server
host_name ESXi05_192.168.10.205
alias ESXi05_192.168.10.205
address 192.168.10.205
contact_groups sysadmins
}

Step4: Restart nagios và kiểm tra nhận message

Khởi động lại service nagios: service nagios restart

Kiểm tra message từ telegram

telegram05

Chúng ta thấy, tài khoản Telegram đã nhận được cảnh báo từ @keepwalkingbot gửi đến

 

Cũng đã cài đặt và cấu hình nhiều công cụ giám sát như: OpManager, Zabbix, Nagios, PRTG. Nhưng hôm nay mới xuất vài bài về cấu hình basic của Nagios.

Nagios cho phép chúng ta giám sát các dịch vụ của server, các thông tin về phần cứng thiết bị máy chủ, mạng.

Hôm nay, chúng ta sẽ cấu hình Nagios để giám sát thiết bị mạng như Switch, Router

Trước khi cấu hình giám sát các thiết bị mạng, chúng ta có thể tham khảo cách cài đặt Nagios Core 4x trên CentOS 7 tại đây

1. Trên thiết bị mạng

1.1 Enable SNMP

Dưới đây là cách enable và cấu hình cơ bản một số thiết bị mang phổ biến bằng giao diện command line.
– Thiết bị Cisco

(config)#snmp-server community ten_community RO

  • Thiết bị HP
(config)#snmp-server enable
(config)#snmp-server community ten_community operator restricted
  • Thiết bị Juniper
>set snmp community ten_community authorization read-only
>set description "Juniper Network"

Cụ thể trong bài này, mình sẽ đi vào giám sát thiết bị switch Cisco catalyst 2960, có địa chỉ IP là 192.168.10.254.

Thực hiện enable SNMP như sau:

switch2960>en
switch2960#conf t
(config)#snmp-server enable traps
(config)#snmp-server community public ro
(config)#snmp-server host 192.168.10.111 version 2c public
(config)#exit
Switch2960#show snmp
Swtich2960#copy running-config startup-config
(config)#end

Ở đây, tôi thao tác trên switch cisco 2960, với một số thông tin set như sau:

  • Tên community là “public”

  • set quyền ro = Read Only

  • Set chỉ có server nagios (192.168.10.111) có thể truy cập đọc thông tin SNMP

1.2  Check connected port

switch2960#show interfaces status
Port Name Status Vlan Duplex Speed Type
Fa0/1 connected 10 a-full a-100 10/100BaseTX
Fa0/2 connected 10 a-full a-100 10/100BaseTX
Fa0/3 connected 10 a-full a-100 10/100BaseTX
Fa0/4 connected 10 a-full a-100 10/100BaseTX
Fa0/5 notconnect 10 auto auto 10/100BaseTX
Fa0/6 notconnect 10 auto auto 10/100BaseTX
Fa0/7 notconnect 10 auto auto 10/100BaseTX
Fa0/8 notconnect 10 auto auto 10/100BaseTX
Fa0/9 connected 20 a-full a-100 10/100BaseTX
Fa0/10 connected 20 a-full a-100 10/100BaseTX
Fa0/11 connected 20 a-full a-100 10/100BaseTX
Fa0/12 connected 20 a-full a-100 10/100BaseTX
Fa0/13 connected 20 a-full a-100 10/100BaseTX
Fa0/14 connected 20 a-full a-100 10/100BaseTX
Fa0/15 connected 20 a-full a-100 10/100BaseTX
Fa0/16 notconnect 20 auto auto 10/100BaseTX
Fa0/17 notconnect 10 auto auto 10/100BaseTX
Fa0/18 notconnect 10 auto auto 10/100BaseTX
Fa0/19 notconnect 10 auto auto 10/100BaseTX
Fa0/20 notconnect 10 auto auto 10/100BaseTX
Fa0/21 notconnect 40 auto auto 10/100BaseTX
Fa0/22 notconnect 40 auto auto 10/100BaseTX
Fa0/23 notconnect 1 auto auto 10/100BaseTX
Fa0/24 notconnect 1 auto auto 10/100BaseTX
Gi0/1 connected trunk a-full a-1000 10/100/1000BaseTX
Gi0/2 notconnect 1 auto auto Not Present

=> Ở đây show ra các port mà connected là F0/1-4,9-15 và port G0/1

Khi show thông tin cấu hình interface, ta thấy các port F0/1-4,9-15 và port G0/1 đang connect. Vì vậy chúng ta sẽ chỉ cấu hình để monitor các port đó

Show thông tin memory

Switch2960#show memory total     
                Head    Total(b)     Used(b)     Free(b)   Lowest(b)  Largest(b)
Processor    1F5B978    30287368     9970888    20316480    13518392    16768896
      I/O    2C00000     4194304     1660600     2533704     2489068     2532336
Driver te    1300000     1048576          44     1048532     1048532     1048532
Ta thấy tổng memory là 30287368 byte, used: 9970888 byte và Free: 20316480 byte

2. Cấu hình trên Nagios server

Step1: Cài đặt snmp và utils

  • Thực hiện cài đặt trên Nagios Server là CentOS
yum -y install net-snmp net-snmp-utils
yum -y install nagios-plugins-snmp.x86_64
cp /usr/lib64/nagios/plugins/check_snmp /usr/local/nagios/libexec/

– Check snmp with snmpwalk

Cho rằng Switch có địa chỉ IP là 192.168.10.254

snmpwalk -v 2c -c public 192.168.10.254

SNMPv2-MIB::sysDescr.0 = STRING: Cisco IOS Software, C2960 Software (C2960-LANLITEK9-M), Ver
sion 12.2(55)SE7, RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2013 by Cisco Systems, Inc.
Compiled Mon 28-Jan-13 10:22 by prod_rel_team
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.9.1.928
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (149549490) 17 days, 7:24:54.90
SNMPv2-MIB::sysContact.0 = STRING:
SNMPv2-MIB::sysName.0 = STRING: SW1.ditech.vn
SNMPv2-MIB::sysLocation.0 = STRING:
SNMPv2-MIB::sysServices.0 = INTEGER: 2
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORID.1 = OID: SNMPv2-SMI::enterprises.9.7.129
SNMPv2-MIB::sysORID.2 = OID: SNMPv2-SMI::enterprises.9.7.115
SNMPv2-MIB::sysORID.3 = OID: SNMPv2-SMI::enterprises.9.7.265
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-SMI::enterprises.9.7.112
SNMPv2-MIB::sysORID.5 = OID: SNMPv2-SMI::enterprises.9.7.106
SNMPv2-MIB::sysORID.6 = OID: SNMPv2-SMI::enterprises.9.7.47
SNMPv2-MIB::sysORID.7 = OID: SNMPv2-SMI::enterprises.9.7.122
SNMPv2-MIB::sysORID.8 = OID: SNMPv2-SMI::enterprises.9.7.135
SNMPv2-MIB::sysORID.9 = OID: SNMPv2-SMI::enterprises.9.7.43
SNMPv2-MIB::sysORID.10 = OID: SNMPv2-SMI::enterprises.9.7.37
SNMPv2-MIB::sysORID.11 = OID: SNMPv2-SMI::enterprises.9.7.92
SNMPv2-MIB::sysORID.12 = OID: SNMPv2-SMI::enterprises.9.7.53
SNMPv2-MIB::sysORID.13 = OID: SNMPv2-SMI::enterprises.9.7.54
SNMPv2-MIB::sysORID.14 = OID: SNMPv2-SMI::enterprises.9.7.52

Step2: Thực hiện kiểm tra memory, cpu của thiết bị mạng

Chúng ta sẽ thu thập thông tin về Memory, CPU của thiết bị mạng dựa vào giá trị ping, OID (Object Identifiers).

Tùy vào từng thiết bị mạng mà chúng ta sẽ tìm OID phù hợp. Trong trường hợp này, chúng ta đang giám sát Memory, CPU trên thiết bị Cisco.

Khi đó truy cập trang sau:

https://www.cisco.com/c/en/us/support/docs/ip/simple-network-management-protocol-snmp/15215-collect-cpu-util-snmp.html

http://docwiki.cisco.com/wiki/Monitoring_CPU_and_Memory_via_SNMP_-_ASR9K

Thông tin Memory

Login vào switch và show thông tin memory

Switch2960#show memory total
Head Total(b) Used(b) Free(b) Lowest(b) Largest(b)
Processor 1F5B978 30287368 9970888 20316480 13518392 16768896
I/O 2C00000 4194304 1660600 2533704 2489068 2532336
Driver te 1300000 1048576 44 1048532 1048532 1048532

Ta thấy tổng memory là 30287368 byte, used: 9970888 byte và Free: 20316480 byte

Ta đặt mức thiết lập memory cho switch memory như sau:

  • Warning khi sử dụng 20000000 byte

  • Critical khi sử dụng 25000000 byte

Tùy thuộc vào giá trị memory của từng thiết bị mạng mà chúng ta thiết thập mức cảnh báo phù hợp.

Dựa vào bảng danh sách OID của một số thiết bị, chúng ta sử dụng tên OID là ciscoMemoryPoolUsed và OID có giá trị là 1.3.6.1.4.1.9.9.48.1.1.1.5

  • Show index của OID 1.3.6.1.4.1.9.9.48.1.1.1.5
[root@nagios etc]# snmpwalk -Os -c public -v2c 192.168.10.254 1.3.6.1.4.1.9.9.48.1.1.1.5
enterprises.9.9.48.1.1.1.5.1 = Gauge32: 9943016
enterprises.9.9.48.1.1.1.5.2 = Gauge32: 1658100
enterprises.9.9.48.1.1.1.5.16 = Gauge32: 40

Chúng ta có 03 indexes: 1,2,16. Khi đó kết hợp index này với value OID để cho phép chúng ta thiết lập check_command

Khi đó chúng ta thiết lập: check_command check_snmp!-C public -o .1.3.6.1.4.1.9.9.48.1.1.1.5.1 -w 20000000 -c 25000000

Diễn giải một số tham số:

-C chỉ định tên communnity

  • o chỉ định giá trị OID kết hợp index

  • w thiết lập giá trị để đạt mức warning

  • c thiết lập giá trị để đạt mức critical
    Thông tin CPU

Login switch và show thông tin CPU

Switch2960#show processes CPU
CPU utilization for five seconds: 5%/0%; one minute: 5%; five minutes: 5%
PID Runtime(ms) Invoked uSecs 5Sec 1Min 5Min TTY Process
1 0 3 0 0.00% 0.00% 0.00% 0 Chunk Manager
2 0 305035 0 0.00% 0.00% 0.00% 0 Load Meter
3 0 13154 0 0.00% 0.00% 0.00% 0 DHCPD Timer
4 10073290 514918 19562 0.00% 0.44% 0.57% 0 Check heaps
5 17 310 54 0.00% 0.00% 0.00% 0 Pool Manager
6 0 2 0 0.00% 0.00% 0.00% 0 Timers
7 0 1 0 0.00% 0.00% 0.00% 0 HRPC asic-stats
8 0 1 0 0.00% 0.00% 0.00% 0 Crash writer
9 2289822 7731271 296 0.00% 0.12% 0.11% 0 ARP Input
10 0 1 0 0.00% 0.00% 0.00% 0 AAA_SERVER_DEADT
11 0 2 0 0.00% 0.00% 0.00% 0 AAA high-capacit
12 0 1 0 0.00% 0.00% 0.00% 0 Policy Manager
13 25 6 4166 0.00% 0.00% 0.00% 0 Entity MIB API
14 0 1 0 0.00% 0.00% 0.00% 0 IFS Agent Manage
15 8 25454 0 0.00% 0.00% 0.00% 0 IPC Dynamic Cach
16 0 1 0 0.00% 0.00% 0.00% 0 IPC Zone Manager
17 4561 1517383 3 0.00% 0.00% 0.00% 0 IPC Periodic Tim
18 0 1 0 0.00% 0.00% 0.00% 0 IPC Managed Time
19 3769 1517384 2 0.00% 0.00% 0.00% 0 IPC Deferred Por
20 0 1 0 0.00% 0.00% 0.00% 0 IPC Seat Manager
21 0 1 0 0.00% 0.00% 0.00% 0 IPC Session Serv
22 58 3 19333 0.00% 0.00% 0.00% 0 PrstVbl
23 0 2 0 0.00% 0.00% 0.00% 0 XML Proxy Client
24 0 1 0 0.00% 0.00% 0.00% 0 ARP Snoop
25 5344 1517350 3 0.00% 0.00% 0.00% 0 GraphIt
26 0 1 0 0.00% 0.00% 0.00% 0 Critical Bkgnd
27 17832 244113 73 0.00% 0.00% 0.00% 0 Net Background
28 0 1 0 0.00% 0.00% 0.00% 0 IDB Work
29 33 50984 0 0.00% 0.00% 0.00% 0 Logger
30 7339 1517350 4 0.00% 0.00% 0.00% 0 TTY Background
--More--

Dựa vào bảng danh sách OID của một số thiết bị, chúng ta sử dụng tên OID là cpmCPUTotal5min và OID có giá trị là 1.3.6.1.4.1.9.9.109.1.1.1.1.5

  • Show index của OID 1.3.6.1.4.1.9.9.109.1.1.1.1.5
[root@nagios ~]# snmpwalk -Os -c public -v2c 192.168.10.254 1.3.6.1.4.1.9.9.109.1.1.1.1.5
enterprises.9.9.109.1.1.1.1.5.1 = Gauge32: 5

Chúng ta có 01 index: 1. Khi đó kết hợp index này với value OID để cho phép chúng ta thiết lập check_command

Khi đó chúng ta thiết lập: check_command check_snmp!-C public -o .1.3.6.1.4.1.9.9.109.1.1.1.1.5.1 -w 70 -c 80

  • Thiết lập warning khi CPU đạt đến 70%

  • Thiết lập critical khi CPU đạt đến 80%

Thông tin Uptime

  • sysUpTime.0 = OID (1.3.6.1.2.1.1.3.0)

Giá trị OID 1.3.6.1.2.1.1.3.0 show thời gian mà thiết bị đã uptime

Chúng ta có thể kiểm tra bằng tool snmpwalk

[root@nagios nagios]# snmpwalk -Os -c public -v2c 192.168.10.254 sysUpTime.0
sysUpTimeInstance = Timeticks: (150471556) 17 days, 9:58:35.56
[root@nagios nagios]# snmpwalk -Os -c public -v2c 192.168.10.254 1.3.6.1.2.1.1.3.0
sysUpTimeInstance = Timeticks: (150488304) 17 days, 10:01:23.04

Hoặc test bằng check_snmp

[root@nagios nagios]# ./libexec/check_snmp -C public 192.168.10.254 -o sysUpTime.0
SNMP OK - 150694740 | DISMAN-EVENT-MIB::sysUpTimeInstance=150694740

Khi đó chúng ta thiết lập: check_snmp!-C public -o sysUpTime.0 hoặc check_snmp!-C public -o 1.3.6.1.2.1.1.3.0

Trạng thái interface port

Sử dụng giá trị ifOperStatus.n dùng để check trạng thái interface mạng. Trong đó n=ifindex

Với một số thiết bị thì giá trị ifindex tương ứng với số port như 1,2,..

Với dòng Cisco, login thiết bị và thực hiện lệnh sau để biết ifindex

switch2960#show snmp mib ifmib ifindex
FastEthernet0/24: Ifindex = 10024
FastEthernet0/17: Ifindex = 10017
FastEthernet0/9: Ifindex = 10009
FastEthernet0/15: Ifindex = 10015
GigabitEthernet0/1: Ifindex = 10101
FastEthernet0/20: Ifindex = 10020
Vlan40: Ifindex = 40
FastEthernet0/22: Ifindex = 10022
FastEthernet0/13: Ifindex = 10013
FastEthernet0/11: Ifindex = 10011
FastEthernet0/3: Ifindex = 10003
FastEthernet0/1: Ifindex = 10001
FastEthernet0/7: Ifindex = 10007
FastEthernet0/19: Ifindex = 10019
FastEthernet0/5: Ifindex = 10005
Null0: Ifindex = 10501
Vlan10: Ifindex = 10
GigabitEthernet0/2: Ifindex = 10102
FastEthernet0/16: Ifindex = 10016
FastEthernet0/8: Ifindex = 10008
FastEthernet0/14: Ifindex = 10014
FastEthernet0/21: Ifindex = 10021
FastEthernet0/23: Ifindex = 10023
Vlan1: Ifindex = 1
FastEthernet0/12: Ifindex = 10012
FastEthernet0/10: Ifindex = 10010
FastEthernet0/2: Ifindex = 10002
FastEthernet0/6: Ifindex = 10006
FastEthernet0/18: Ifindex = 10018
FastEthernet0/4: Ifindex = 10004

Khi đó ta thấy port GigabitEthernet0/1Ifindex = 10101

Test thử:
“`
[root@nagios nagios]# ./libexec/check_snmp -C public 192.168.10.254 -o ifOperStatus.10101
SNMP OK – up(1) |
“`
Khi đó chúng ta thiết lập: check_snmp!-C public -o ifOperStatus.10101 -r 1 -m RFC1213-MIB

 

Step3: Định nghĩa switch để giám sát

Tạo tệp tin /usr/local/nagios/etc/switches/switch01.cfg với nội dung sau:

## HOST DEFINITIONS

# Define the switch that we'll be monitoring
define host{
    use     generic-network     ; Inherit default values from a template
    host_name   Switch_192.168.10.254       ; The name we're giving to this switch
    alias       Cisco SRW224P Switch    ; A longer name associated with the switch
    address     192.168.10.254      ; IP address of the switch
    #hostgroups network-devices     ; Host groups this switch is associated with
    }

# SERVICE DEFINITIONS
# Create a service to PING
define service{
    use         generic-service     ; Inherit values from a template
    host_name       Switch_192.168.10.254   ; The name of the host the service is associated with
    service_description PING            ; The service description
    check_command       check_ping!200.0,20%!600.0,60%  ; The command used to monitor the service
    check_interval      5           ; Check the service every 5 minutes under normal conditions
    retry_interval      1           ; Re-check the service every minute until its final/hard state is determined
    }

# Monitor uptime
define service{
    use         generic-service     ; Inherit values from a template
    host_name       Switch_192.168.10.254
    service_description Uptime  
    check_command       check_snmp!-C public -o sysUpTime.0
    }

# Monitor status of port number (Port G0/1)
define service{
use                  generic-service
host_name            Switch_192.168.10.254
service_description  Port 1 Link Status
check_command        check_snmp!-C public -o ifOperStatus.10101 -r 1 -m RFC1213-MIB
}

# Monitor CPU của thiết bị, warning khi đạt 70, critical khi đạt 80.
define service{
    use generic-service
    host_name Switch_192.168.10.254
    service_description CPU Utilization
    check_command check_snmp!-C public -o .1.3.6.1.4.1.9.9.109.1.1.1.1.5.1 -w 70 -c 80
    }

# Monitor usage memory của thiết bị
define service{
    use generic-service
    host_name Switch_192.168.10.254
    service_description Free Memory
    check_command check_snmp!-C public -o .1.3.6.1.4.1.9.9.48.1.1.1.5.1 -w 20000000 -c 25000000
    }

Step4: Restart nagios, httpd và kiểm tra

“`
service httpd restart
service nagios restart
“`

Truy cập Nagios qua giao diện web và kiểm tra switch

monitor network device with nagios

3. Sử dụng MRTG giám sát băng thông mạng

MRTG (Multi Router Traffic Grapher) là công cụ dùng để giám sát tình trạng traffic mạng. Nó tạo ra các trang HTML mà có chứa ảnh PNG, từ đó cho phép chúng ta có thể xem trực quan độ thị traffic ở dạng LIVE thông qua giao diện web.
Thông tin về mrtg có tham khảo: https://oss.oetiker.ch/mrtg/doc/index.en.html

Step1: Cài đặt MRTG trên CentOS 7

`yum -y install mrtg`

Step2: Cấu hình MRTG

Tạo file `mrtg.cfg` bằng **cfgmaker**

Nếu chúng ta chỉ monitor 01 Switch thì tạo như ở dưới, trong trường hợp monitor nhiều switch ta sẽ tạo ra các folder khác nhau để chứa log và images graph

`cfgmaker –global ‘WorkDir: /var/www/html/mrtg’ –global ‘Options[_]: bits,growright’ –output /etc/httpd/conf/mrtg.cfg public@192.168.10.254`

Note: tệp “/etc/httpd/conf/mrtg.cfg”

**Step3**: Schedule để update mrtg log

Thiết lập cron chạy mrtg mỗi 05 minute

*/5 * * * * /usr/bin/env LANG=C /usr/bin/mrtg /etc/mrtg/mrtg.cfg –logging /var/log/mrtg.log
*/5 * * * * /usr/bin/env LANG=C /usr/bin/mrtg /etc/httpd/conf/mrtg.cfg –logging /var/log/mrtg.log

Step3: Cấu hình httpd (Apache web server)

Tạo tệp `/etc/httpd/conf.d/mrtg.conf` chứa thông tin để cấu hình virtual path /mrtg. Thông tin tệp cấu hình với nội dung sau:

Alias /mrtg /var/www/html/mrtg
<Location /mrtg>
   Options None
   AllowOverride None
   Order allow,deny
   Allow from 192.168.10.0/24
   DirectoryIndex index.html
</Location>

Step4: Định nghĩa command check_mrtgtraf

Chúng ta định nghĩa command check_mrtgtraf dùng cho xuất đồ thị.

Thêm nội dung sau vào tệp tin /usr/local/nagios/etc/objects/commands.cfg

# 'check_local_mrtgtraf' command definition
define command{
command_name check_local_mrtgtraf
command_line $USER1$/check_mrtgtraf -F $ARG1$ -a $ARG2$ -w $ARG3$ -c $ARG4$ -e $ARG5$
}

Step5:  Định nghĩa interface cho giám sát

Chúng ta thực hiện định nghĩa interface cần giám sát bandwidth thông qua giao diện đồ họa.

Thêm nội dung sau vào tệp tin /usr/local/nagios/etc/switches/switch01.cfg

#Monitor bandwidth on port G0/1
define service{
    use         generic-service ; Inherit values from a template
    host_name       Switch_192.168.10.254
    service_description Port G0/1 Bandwidth Usage
    check_command       check_local_mrtgtraf!/var/www/html/mrtg/192.168.10.254_10101.log!AVG!10000000,10000000!50000000,50000000!10
    }
#Monitor bandwidth on VLAN10
define service{
    use         generic-service ; Inherit values from a template
    host_name       Switch_192.168.10.254
    service_description VLAN10 Bandwidth Usage
    check_command       check_local_mrtgtraf!/var/www/html/mrtg/192.168.10.254_10.log!AVG!1000000,1000000!5000000,5000000!10
    }
#Monitor bandwidth on Port F0/1
define service{
    use         generic-service ; Inherit values from a template
    host_name       Switch_192.168.10.254
    service_description Port F0/1 Bandwidth Usage
    check_command       check_local_mrtgtraf!/var/www/html/mrtg/192.168.10.254_10001.log!AVG!1000000,1000000!5000000,5000000!10
    }
**Chú ý**: Giá trị xuất log, kết hợp IP và ifindex (ví dụ: 192.168.10.254_10101.log, với 10101 là ifindex của port G0/1)

Step6: Kiểm tra dữ liệu đồ họa

Restart nagios
systemctl restart nagios
Sử dụng trình duyệt truy cập http://your-nagios-server-ip-address/mrtg để xem graph
monitoring network bandwidth with nagios

Read more: