用 Prometheus 进行超速监视的设置
因为golang实现是以二进制文件分发的,所以很容易安装和运行起来,这是重点。
总之它能很快运行起来,(与Zabbix或Munin相比)可以很容易地进行尝试。
我是在CentOS6上操作的,所以请根据需要进行相应的调整。
简单的动作
监视主机方
源代码在这里(https://github.com/prometheus/prometheus),但编译很麻烦,所以我们将下载发布版进行执行。
# versionは2018/06/06時点最新 2.2.1
$ wget https://github.com/prometheus/prometheus/releases/download/v2.2.1/prometheus-2.2.1.linux-amd64.tar.gz
$ tar xzf prometheus-2.2.1.linux-amd64.tar.gz
$ cd prometheus-2.2.1.linux-amd64
$ ./prometheus
如果端口9090已经打开,则可以在http://yourserver.com:9090上运行。详细设置稍后介绍。
客户端
通过设置exporter,可以成为主机从中拉取的入口。
根据所需监控的服务,有各种各样的exporter。官方总结在这里。
除了Apache、MySQL之外,还有许多适用于云服务如AWS的exporter,因此可以根据监控目标进行选择。
我們將引入node_exporter來獲取最基本的CPU和內存數值。因為名字中含有”node”,我原以為是為了監視node伺服器,但實際上是指分支節點。
# バージョンと環境に合わせた構成のURLを確認(https://github.com/prometheus/node_exporter/releases)
$ wget https://github.com/prometheus/node_exporter/releases/download/v0.16.0/node_exporter-0.16.0.linux-amd64.tar.gz
$ tar xzf node_exporter-0.16.0.linux-amd64.tar.gz
$ cd node_exporter-0.16.0.linux-amd64
$ ./node_exporter
# 以下のように実行されました
INFO[0000] Starting node_exporter (version=0.16.0, branch=HEAD, revision=d42bd70f4363dced6b77d8fc311ea57b63387e4f) source="node_exporter.go:82"
INFO[0000] Build context (go=go1.9.6, user=root@a67a9bc13a69, date=20180515-15:52:42) source="node_exporter.go:83"
INFO[0000] Enabled collectors: source="node_exporter.go:90"
INFO[0000] - arp source="node_exporter.go:97"
INFO[0000] - bcache source="node_exporter.go:97"
INFO[0000] - bonding source="node_exporter.go:97"
INFO[0000] - conntrack source="node_exporter.go:97"
INFO[0000] - cpu source="node_exporter.go:97"
INFO[0000] - diskstats source="node_exporter.go:97"
INFO[0000] - edac source="node_exporter.go:97"
INFO[0000] - entropy source="node_exporter.go:97"
INFO[0000] - filefd source="node_exporter.go:97"
INFO[0000] - filesystem source="node_exporter.go:97"
INFO[0000] - hwmon source="node_exporter.go:97"
INFO[0000] - infiniband source="node_exporter.go:97"
INFO[0000] - ipvs source="node_exporter.go:97"
INFO[0000] - loadavg source="node_exporter.go:97"
INFO[0000] - mdadm source="node_exporter.go:97"
INFO[0000] - meminfo source="node_exporter.go:97"
INFO[0000] - netdev source="node_exporter.go:97"
INFO[0000] - netstat source="node_exporter.go:97"
INFO[0000] - nfs source="node_exporter.go:97"
INFO[0000] - nfsd source="node_exporter.go:97"
INFO[0000] - sockstat source="node_exporter.go:97"
INFO[0000] - stat source="node_exporter.go:97"
INFO[0000] - textfile source="node_exporter.go:97"
INFO[0000] - time source="node_exporter.go:97"
INFO[0000] - timex source="node_exporter.go:97"
INFO[0000] - uname source="node_exporter.go:97"
INFO[0000] - vmstat source="node_exporter.go:97"
INFO[0000] - wifi source="node_exporter.go:97"
INFO[0000] - xfs source="node_exporter.go:97"
INFO[0000] - zfs source="node_exporter.go:97"
INFO[0000] Listening on :9100
如果在http://yourclient.com:9100/metrics上显示了指标,则客户端将释放9100端口。
然后将客户端作为主机监控对象。
在主机上运行的./prometheus通过Ctrl+C停止,并修改配置文件。
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
# 追記 ここから
- job_name: 'clientname'
static_configs:
- targets: ['yourclient.com:9100']
# ここまで
当您再次运行/prometheus时,将会在http://yourserver.com:9090上进行反映。
到目前为止,我们已经成功获取了客户端的数据,并在主机上进行了处理。
當異常發生時的警報設定
这个地方是由主机端进行操作。
超过阈值后会发送电子邮件,作为监控的必要部分。
Prometheus本身不包含此机制,所以需要另外配置一种类似Alertmanager的扩展功能。
它与./prometheus独立并在不同的端口上运行。
$ wget https://github.com/prometheus/alertmanager/releases/download/v0.14.0/alertmanager-0.14.0.linux-amd64.tar.gz
$ tar xzf alertmanager-0.14.0.linux-amd64.tar.gz
$ cd alertmanager-0.14.0.linux-amd64
由于v0.15.0-rc.1运行出现错误,所以我决定使用0.14.0版本。
级别=错误 ts=2018-06-06T10:29:16.315983112Z 调用者=main.go:160 信息=”无法初始化八卦网格” 错误=”创建成员列表: 无法获取最终的广告地址: 没有找到私有IP地址,并且未提供明确的IP地址”
如果不设置AlertManager,这里将设置各种警报配置,Prometheus方面将设置警报发生的阈值等定义条件,AlertManager方面将设置发送邮件给某某等设置。
- prometheusのグローバル設定
# もともとコメントしてあった部分を調整します
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- # - alertmanager:9093
+ # AlertManagerに丸投げ Prometheusと同一サーバーで動かす場合はlocalhost:9093
+ - localhost:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- # - "first_rules.yml"
- # - "second_rules.yml"
+ # ルールは別ファイルで定義します
+ "alert_rules.yml"
- prometheusのルール設定
# 例:5分間インスタンスダウン
groups:
- name: node_exporter
rules:
- alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} has been down for more than 5 minutes."
表达条件的构建方法有详细的正式文件。
- alertmanagerの送信設定
global:
slack_api_url: 'https://hooks.slack.com/services/****'
route:
receiver: 'test-route'
group_by: [alertname]
group_wait: 10s
group_interval: 5m
repeat_interval: 1h
receivers:
- name: 'test-route'
slack_configs:
- channel: '#channel_name'
启动AlertManager!
./alertmanager --config.file=alert.yml
如果在这个设置中封锁监视目标服务器上的端口,那么5分钟后就会发送Slack通知。
这简单而且很好。
如果要徹底引入的話
如果设置好了自动启动相关的配置,似乎可以将其带到实际运行级别。在/usr/local/bin等位置放置符号链接并设置路径。
$ sudo ln -s "/path/to/prometheus" "/usr/local/bin/prometheus"
$ sudo ln -s "/path/to/alertmanager" "/usr/local/bin/alertmanager"
启动脚本是参考了这里的内容。根据各自的环境进行配置。
让它自动启动。如果选项无效,请查看–help得到帮助。
$ chmod 755 /etc/rc.d/init.d/prometheus
$ chmod 755 /etc/rc.d/init.d/alertmanager
$ chkconfig --add prometheus
$ chkconfig --add alertmanager
$ chkconfig prometheus on
$ chkconfig alertmanager on
在某些情况下,尽管客户端也可以在init.d中运行,但由于需要使用root权限和过于繁琐的操作,可能有一些服务器不太适合这么做。
在这种情况下,可能可以尝试使用cron在服务器上执行一个简单的生存监视shell脚本。
我写了一个简单的样例。
#!/bin/bash
# exporterが動いているか監視します。cronで適当に実行します。
PWD=$(cd $(dirname $0);pwd)
EXPORTERS_DIR="$PWD/exporters/"
PROCESSES=("node_exporter")
for process in ${PROCESSES[@]};
do
isAlive=`ps -ef | grep "$process" | grep -v grep | grep -v prometheus.sh | wc -l`
if [ $isAlive = 1 ]; then
echo $process" is running."
else
echo $process" is dead, restarting..."
# restart
exporter="${EXPORTERS_DIR}${process}"
if [ -e $exporter ]; then
chmod 755 $exporter
echo "$exporter &"
else
echo "$exporter not found"
fi
fi
done
如果你按照以下方式在crontab -e中设置,它将每分钟运行并检查是否停止,如果停止了,则会方便地重新启动(请注意,由于未经过测试,请小心使用):
* * * * * path/to/prometheus.sh
考察 – Investigate or examine
果然只需要一个选择:
果然把二进制文件放在那里就够了,这个不够那个不够,还能不受指责地运行,真是一种很爽的感觉。
正如希腊神话中普罗米修斯从天界偷来并赠与人类的火一样,我认为golang是这个世纪的产物(真的吗)。
即使开始使用Prometheus进行监控,也不需要像被钉在山上,被秃鹰啄食肝脏那样需要运营应对。
尽管有人说文档很少,但我认为它并不复杂,只要有官方文档就足够了。
据说也有很多人希望通过与Grafana联动来展示漂亮的图表,但对我个人而言,只要警报能发送到Slack或邮件中就已经足够了,不想增加额外的负担,所以忽略这些需求。
但是,如果你只是想尝试一下,用Docker是个方便的选择。
docker run -d -p 3000:3000 grafana/grafana
Grafana的详细信息请参考这里:http://docs.grafana.org/installation/
请看
JoergM/alertmanager https://gist.github.com/JoergM/翻译以下内容为中文,请提供一种选项: