집안의 감시를 Zabbix에서 Proometheus로 바꾼 이야기
배경.
AWS re:invent
Amazon Managed Service for Grafana 및
Amazon Managed Service for Prometheus 발표 후
미리 이중화로 구성된 감시 기판을 간단하게 이용할 수 있다(왜냐하면
앞으로 어떤 접촉의 기회가 있을 수 있기 때문에 개인의 학습을 총결하였다.
감시 기반으로 현재까지 Zabbix 주로 개봉 환경에서 처리
인프라 시설 자체의 하락 여부 등 다른 설비부터 감시의 순환에 빠지는 경우가 많다
나는 일단 말을 꺼내면 끝도 없이 싫어진다고 생각한다.
AWS에 CloudWatch logs가 있는 반면
AWS가 와서 이 서비스를 발표했어요.
나는 사용자의 기대와 요구가 있기 때문에 발표한 것이라고 생각한다. (이것은 AWS이다)
실제로 만나보시면 보실 수 있을 것 같아요.
이번에는 집에 기계가 있기 때문에 그런 것들을 감시하고 싶어요.
OS를 모국어로 세밀하게 구축해도 원리를 이해할 수 있다는 것도 하나의 선택이다
관리 서비스 이용 = 설정에만 초점을 맞추고 싶어 Docker로 즐겁게 놀았다.
또한 시험 통지처에서도 슬랙과 다른 방법을 채택했다.
Zabbix의 비밀번호를 모르기 때문에 MySQL의 비밀번호 리셋 작업은 매우 번거롭기 때문에 좋은 기회라고 말하기 어렵다
Google Chat도 한순간에 목적지 알림 며칠 전의 장애 을 고려했지만, 의존이 좋지 않다고 생각합니다.
생성물
Grafana - dashboard
Prometheus - target
토대
Grafana(시각화)
Proometheus(감시 기초) + AlertManager(통지) + SNMP Exporter(SNMP 수집) + Blackbox-Exporter(외부 감시)
감시 대상
Firewall
Router
Switch
Wireless AP
Linux
sudo groupadd -g 10001 prometheus
sudo useradd -u 10001 -g 10001 -s /sbin/nologin -M prometheus
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
sudo tar zxvf ./node_exporter-1.0.1.linux-amd64.tar.gz -C /opt/
cd /opt/
sudo mv node_exporter-1.0.1.linux-amd64 node_exporter
sudo chown -R prometheus:prometheus node_exporter/
cd /etc/systemd/system/
sudo vi prometheus-node-exporter.service
****************************************
[Unit]
Description=node_exporter for Prometheus
[Service]
Restart=always
User=prometheus
ExecStart=/opt/node_exporter/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
****************************************
sudo systemctl daemon-reload
sudo systemctl status prometheus-node-exporter.service
sudo systemctl start prometheus-node-exporter.service
sudo systemctl status prometheus-node-exporter.service
sudo systemctl enable prometheus-node-exporter.service
Windows
msiexec /i windows_exporter-0.15.0-amd64.msi ENABLED_COLLECTORS="ad,cpu,dhcp,dns,iis,net,os,logical_disk,memory" LISTEN_PORT=5000 TEXTFILE_DIR="C:\custom_metrics\"
Grafana
Docker
sudo docker run -d --name=grafana -p 3000:3000 grafana/grafana:7.3.6-ubuntu
Prometheus
Docker
폴더 구성
myhome-prometheus
└── src
├── alertmanager
│ └── config.yml
├── blackbox_exporter
│ └── config.yml
├── docker
│ └── docker-compose.yml
├── prometheus
│ ├── prometheus.yml
│ └── rules.yml
└── snmp_exporter
└── snmp.yml
Create Cotainers
cd myhome-prometheus/src/docker
pwd
ls -l ./docker-compose.yml
ls -l ../prometheus/prometheus.yml
ls -l ../prometheus/rules.yml
ls -l ../snmp_exporter/snmp.yml
ls -l ../alertmanager/config.yml
ls -l ../blackbox_exporter/config.yml
sudo docker-compose up -d
sudo docker-compose ps
******************************
Name Command State Ports
-----------------------------------------------------------------------------------
alertmanager /bin/alertmanager --config ... Up 0.0.0.0:9093->9093/tcp
blackbox-exporter /bin/blackbox_exporter --c ... Up 0.0.0.0:9115->9115/tcp
node-exporter /bin/node_exporter Up 0.0.0.0:9100->9100/tcp
prometheus /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp
snmp-exporter /bin/snmp_exporter --confi ... Up 0.0.0.0:9116->9116/tcp
*******************************
docker-compose.yml
version: '3'
services:
prometheus:
image: prom/prometheus:v2.23.0
container_name: prometheus
volumes:
- ../prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- ../prometheus/rules.yml:/etc/prometheus/rules.yml
ports:
- 9090:9090
restart: always
exporter:
image: prom/node-exporter:v1.0.1
container_name: node-exporter
ports:
- 9100:9100
restart: always
snmp-exporter:
image: prom/snmp-exporter:v0.19.0
container_name: snmp-exporter
volumes:
- ../snmp_exporter/snmp.yml:/etc/snmp_exporter/snmp.yml
ports:
- 9116:9116
restart: always
alertmanager:
image: prom/alertmanager:v0.21.0
container_name: alertmanager
volumes:
- ../alertmanager/config.yml:/etc/alertmanager/config.yml
command: "--config.file=/etc/alertmanager/config.yml"
ports:
- 9093:9093
restart: always
blackbox-exporter:
image: prom/blackbox-exporter:v0.18.0
container_name: blackbox-exporter
ports:
- 9115:9115
volumes:
- ../blackbox_exporter/config.yml:/etc/blackbox_exporter/config.yml
prometheus
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# Alertmanager configuration
alerting:
alertmanagers:
- scheme: http
static_configs:
- targets:
- alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- rules.yml
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets:
- prometheus:9090
- node-exporter:9100
- job_name: 'Linux'
static_configs:
- labels:
type: linux
targets:
- 192.168.10.203:9100
- job_name: 'Windows'
static_configs:
- labels:
type: windows
targets:
- 192.168.10.220:5000
- job_name: 'snmp-exporter'
static_configs:
- labels:
type: cisco
targets:
- 192.168.10.1
- 192.168.10.250
- 192.168.10.253
metrics_path: /snmp
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- source_labels: [type]
target_label: __param_module
- target_label: __address__
replacement: snmp-exporter:9116
- job_name: 'blackbox_icmp'
metrics_path: /probe
params:
module: [icmp]
static_configs:
- targets:
- 192.168.10.1
- 192.168.10.150
- 192.168.10.200
- 192.168.10.202
- 192.168.10.203
- 192.168.10.220
- 192.168.10.250
- 192.168.10.251
- 192.168.10.253
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter:9115
groups:
- name: checkInstance
rules:
- alert: NodeInstanceDown
expr: up{job='Linux'} == 0
for: 30s
labels:
severity: critical
- alert: pingInstance
expr: up{job='blackbox_icmp'} == 0
for: 2m
labels:
severity: critical
alertmanager
global:
slack_api_url: 'https://hooks.slack.com/services/**********************t'
route:
receiver: 'slack'
receivers:
- name: 'slack'
slack_configs:
- channel: '#myhome'
snmp-exporter
우선 사과 기계의 MIB. 을 최소한의 확인으로 설정하다.
또한 SNMP_Exporter의 창고도 수동 유지 보수가 아닙니다.
표방은 첨부된generator에 의해 생성됩니다
This file is not intended to be written by hand, rather use the generator to generate it for you.
cisco:
walk:
- 1.3.6.1.2.1.2.2.1.16
- 1.3.6.1.2.1.2.2.1.20
- 1.3.6.1.2.1.31.1.1.1.1
- 1.3.6.1.4.1.9.9.109.1.1.1.1.6
metrics:
- name: ifOutOctets
oid: 1.3.6.1.2.1.2.2.1.16
type: counter
indexes:
- labelname: ifName
type: gauge
lookups:
- labels:
- ifName
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
indexes:
- labelname: ifName
type: gauge
lookups:
- labels:
- ifName
labelname: ifName
oid: 1.3.6.1.2.1.31.1.1.1.1
type: DisplayString
- name: cpmCPUTotal5secRev
oid: 1.3.6.1.4.1.9.9.109.1.1.1.1.6
type: gauge
indexes:
- labelname: cpmCPUTotalIndex
type: gauge
version: 2
auth:
community: public
blackbox-exporter
수집 설정은 이것으로 끝냅니다🍵
여기서부터는 promQL - Prometheus Query Language시간입니다.🆒
데이터 참조 가져오기
프로파일링은 이번이 처음입니다.
RDB와 같은 데이터 추출에 뛰어나 머릿속에 SQL을 보충하는 동시에
검색을 고려하여, 나는 추출한 그림이 하나 있다.
1단계(Promaetheus)
먼저 SNMP에서 얻은 데이터를 살펴보겠습니다.👀
ifOutOctets ( = SELECT * FROM ifOutOctets ; )
2단계(Promaetheus)
사용하지 않은 인터페이스(값 0)가 방해가 되네요.😣
ifOutOctets > 0 ( = SELECT * FROM ifOutOctets WHERE value > 0 ; )
3단계(Promaetheus)
인터페이스와 장치에 집중하고 싶네요.😋
sum by ( ifName, instance ) ( ifOutOctets > 0 ) ( = SELECT ifName, instance FROM ifOutOctets WHERE value > 0 GROUP BY ifName, instance ; )
4단계(Promaetheus)
기계에 조건을 붙일 수 있을까요?😆
sum by ( ifName, instance ) ( ifOutOctets{instance="192.168.10.1"} > 0 ) ( = SELECT ifName, instance FROM ifOutOctets WHERE value > 0 AND instance = '192.168.10.1' GROUP BY ifName, instance ; )
5단계(Grafana 상)
일단 자신의 마음속에 좋은 느낌을 형성하면, 그라파나에서 패널을 만든다.📈
이런 형식으로 프로파일링QL을 조립했습니다.
다른 것은 우선 핑이 응답했을 때의 조회 등도 다음과 같이 기재되어 있다.
count ( probe_success{ job="blackbox_icmp" } )
모니터링 알림
자기 집이라 사활을 감시하는 게 좋을 것 같아서 낮춘 뒤에도 문제 없이 알림을 확인했다.
총결산
이번 주말 오후를 이용해 단숨에 착수했다.
Promaetheus와 주변 이미지 간의 통신, configuration 주위에 오류가 발생했기 때문에
가동 전에도 처리됐지만, 집 내 감시 기반을 안전하게 바꿀 수 있었다.
이번에는 자기 집 시사회라서 인터넷도 확정됐어요.
기계도 알기 때문에 설정이 쉽다
CNCF 졸업 프로그램 2018년 이후
접촉할 기회는 없었지만 이번에 먼저 체험할 수 있는 기회가 생겨서 정말 다행입니다.
왜냐하면 공식 문서에서 기본적으로 커튼을 설정하는 방법도 있기 때문이다
나는 먼저 집에서 경험을 쌓은 후에 클라우드 현지의 감시 방법을 배우고 싶다.
나는 마침내 구름의 트레이닝 셔츠로 한 걸음 내디뎠다고 생각한다.
AWS EC2
_meta_ec2_tag
__meta_ec2_vpc_id: the ID of the VPC in which the instance is running, if available
GCP GCE
_meta_gce_label
__meta_gce_project: the GCP project in which the instance is running
__meta_gce_subnetwork: the subnetwork URL of the instance
__meta_gce_tags: comma separated list of instance tags
기타
AWS re:invent의Cable Detective를 제거했지만 72시간 동안 연락이 없었다.
이번re:Invent 한정 트렌치코트는 받을 수 있다고 들었는데 이미 받을 수 없죠...😣
Reference
이 문제에 관하여(집안의 감시를 Zabbix에서 Proometheus로 바꾼 이야기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/mid480/articles/docker-prometheus-grafana텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)