用 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/翻译以下内容为中文,请提供一种选项:

广告
将在 10 秒后关闭
bannerAds