1、简介
Prometheus受启发于Google的Brogmon监控系统(相似的Kubernetes是从Google的Brog系统演变而来),从2012年开始由前Google工程师在Soundcloud以开源软件的形式进行研发,并且于2015年早期对外发布早期版本。2016年5月继Kubernetes之后成为第二个正式加入CNCF基金会的项目,同年6月正式发布1.0版本。2017年底发布了基于全新存储层的2.0版本,能更好地与容器平台、云平台配合。
Prometheus是一个开放性的监控解决方案,用户可以非常方便的安装和使用Prometheus并且能够非常方便的对其进行扩展。为了能够更加直观的了解Prometheus Server,接下来我们将在本地部署并运行一个Prometheus Server实例,通过Node Exporter采集当前主机的系统资源使用情况。 并通过Grafana创建一个简单的可视化仪表盘。
2、安装Prometheus
2.1 下载软件包并解压
对于非Docker用户,可以从https://prometheus.io/download/找到最新版本的Prometheus Sevrer软件包
1 2
| curl -LO https://github.com/prometheus/prometheus/releases/download/v2.38.0/prometheus-2.38.0.linux-amd64.tar.gz tar -xvf prometheus-2.38.0.linux-amd64.tar.gz
|
2.2 配置软件
解压后当前目录会包含默认的Prometheus配置文件promethes.yml
Promtheus作为一个时间序列数据库,其采集的数据会以文件的形似存储在本地中,默认的存储路径为data/,因此我们需要先手动创建该目录:
添加prometheus到systemd
1 2 3 4 5 6 7 8 9 10 11 12 13
| vim /lib/systemd/system/prometheus.service
After=network.target ntpdate.service sntp.service ntpd.service chronyd.service
[Service] KillMode=control-group Restart=on-failure RestartSec=60 ExecStart=/opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml --web.console.templates=/opt/prometheus/consoles --web.console.libraries=/opt/prometheus/console_libraries --storage.tsdb.path=/opt/prometheus/data --log.level=info ExecReload=/bin/kill -HUP $MAINPID
[Install] WantedBy=multi-user.target
|
2.3 启动Prometheus并设置为开机自启
1 2
| systemctl start prometheus systemctl enable prometheus
|
启动完成后,可以通过http://localhost:9090访问Prometheus的UI界面
3、使用Node Exporter采集主机运行数据
在Prometheus的架构设计中,Prometheus Server并不直接服务监控特定的目标,其主要任务负责数据的收集,存储并且对外提供数据查询支持。因此为了能够能够监控到某些东西,如主机的CPU使用率,我们需要使用到Exporter。Prometheus周期性的从Exporter暴露的HTTP服务地址(通常是/metrics)拉取监控样本数据。
从上面的描述中可以看出Exporter可以是一个相对开放的概念,其可以是一个独立运行的程序独立于监控目标以外,也可以是直接内置在监控目标中。只要能够向Prometheus提供标准格式的监控样本数据即可。
3.1 安装Node Exporter
Node Exporter同样采用Golang编写,并且不存在任何的第三方依赖,只需要下载,解压即可运行。可以从https://prometheus.io/download/获取最新的node exporter版本的二进制包。
1 2 3 4
| curl -OL https://github.com/prometheus/node_exporter/releases/download/v0.17.0/node_exporter-0.17.0.linux-amd64.tar.gz tar -xzf node_exporter-0.17.0.linux-amd64.tar.gz cd node_exporter-0.17.0.linux-amd64/ mv node_exporter /usr/local/bin/
|
配置脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| cat >> /etc/rc.d/init.d/node_exporter <<EOF #!/bin/bash # # /etc/rc.d/init.d/node_exporter # # Prometheus node exporter # # description: Prometheus node exporter # processname: node_exporter
# Source function library. . /etc/rc.d/init.d/functions
PROGNAME=node_exporter PROG=/opt/prometheus/$PROGNAME USER=root LOGFILE=/var/log/prometheus.log LOCKFILE=/var/run/$PROGNAME.pid
start() { echo -n "Starting $PROGNAME: " cd /opt/prometheus/ daemon --user $USER --pidfile="$LOCKFILE" "$PROG &>$LOGFILE &" echo $(pidofproc $PROGNAME) >$LOCKFILE echo }
stop() { echo -n "Shutting down $PROGNAME: " killproc $PROGNAME rm -f $LOCKFILE echo }
case "$1" in start) start ;; stop) stop ;; status) status $PROGNAME ;; restart) stop start ;; reload) echo "Sending SIGHUP to $PROGNAME" kill -SIGHUP $(pidofproc $PROGNAME)#!/bin/bash ;; *) echo "Usage: service node_exporter {start|stop|status|reload|restart}" exit 1 ;; esac EOF
|
添加到systemd
1 2 3 4 5 6 7 8 9 10 11 12
| vim /lib/systemd/system/node_exporter.service
After=network.target ntpdate.service sntp.service ntpd.service chronyd.service
[Service] KillMode=control-group Restart=on-failureRestartSec=60 ExecStart=/usr/local/bin/node_exporter ExecReload=/bin/kill -HUP $MAINPID
[Install] WantedBy=multi-user.target
|
运行node exporter
1
| service node_exporter start
|
启动成功后,查看端口
1
| netstat -anplt|grep 9100
|
访问http://localhost:9100/可以看到以下页面
3.2 添加node_exporter到Prometheus
为了能够让Prometheus Server能够从当前node exporter获取到监控数据,这里需要修改Prometheus配置文件。编辑prometheus.yml并在scrape_configs节点下添加以下内容:
1 2 3 4 5 6 7 8 9 10
| vim /opt/prometheus/prometheus.yml
scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'node' static_configs: - targets: ['localhost:9100']
|
重新启动Prometheus Server
1
| systemctl restart prometheus
|
访问http://localhost:9090,进入到Prometheus Server。如果输入“up”并且点击执行按钮以后,可以看到如下结果
如果Prometheus能够正常从node exporter获取数据,则会看到以下结果
1 2
| up{instance="localhost:9090",job="prometheus"} 1 up{instance="localhost:9100",job="node"} 1
|
其中“1”表示正常,反之“0”则为异常。
4、监控数据可视化
Prometheus UI提供了快速验证PromQL以及临时可视化支持的能力,而在大多数场景下引入监控系统通常还需要构建可以长期使用的监控数据可视化面板(Dashboard)。这时用户可以考虑使用第三方的可视化工具如Grafana,Grafana是一个开源的可视化平台,并且提供了对Prometheus的完整支持。
4.1 安装Grafana
添加Grafana源
1 2 3 4 5 6 7 8 9 10
| [root@server ~] [grafana] name=grafana baseurl=https://packages.grafana.com/enterprise/rpm repo_gpgcheck=1 enabled=1 gpgcheck=1 gpgkey=https://packages.grafana.com/gpg.key sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt
|
更新缓存
安装Grafana
1
| yum install grafana-enterprise
|
编辑配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| vim /etc/sysconfig/grafana-server
GRAFANA_USER=grafana
GRAFANA_GROUP=grafana
GRAFANA_HOME=/usr/share/grafana
LOG_DIR=/var/log/grafana
DATA_DIR=/var/lib/grafana
MAX_OPEN_FILES=10000
CONF_DIR=/etc/grafana
CONF_FILE=/etc/grafana/grafana.ini
RESTART_ON_UPGRADE=true
PLUGINS_DIR=/var/lib/grafana/plugins
PROVISIONING_CFG_DIR=/etc/grafana/provisioning
PID_FILE_DIR=/var/run/grafana
|
启动Grafana并设置为开机自启动
1 2
| systemctl start grafana-server systemctl enable grafana-server
|
添加数据源
访问http://localhost:3000,进入到Grafana Server
grafana的官方提供了很多社区或者官方设置的漂亮的dashboard,地址如下:
点击打开链接
5、告警处理
5.1 部署Alertmanager
Alertmanager和Prometheus Server一样均采用Golang实现,并且没有第三方依赖。
使用二进制包部署AlertManager
5.1.1 获取并安装软件包
Alertmanager最新版本的下载地址可以从Prometheus官方网站https://prometheus.io/download/获取。
1 2
| curl -LO https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz tar xvf alertmanager-0.24.0.linux-amd64.tar.gz
|
5.1.2 创建alertmanager配置文件
Alertmanager解压后会包含一个默认的alertmanager.yml配置文件,内容如下所示···
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| global: resolve_timeout: 5m
route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'web.hook' receivers: - name: 'web.hook' webhook_configs: - url: 'http://127.0.0.1:5001/' inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
|
5.1.3 添加Altermanager到systemd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| vim /lib/systemd/system/altermanager.service
[Unit] Description=alertmanager Documentation=https://prometheus.io/ After=network.target
[Service] User=prometheus Group=prometheus ExecStart=/opt/alertmanager/alertmanager --config.file=/opt/alertmanager/alertmanager.yml --storage.path=/opt/alertmanager/data Restart=on-failure
[Install] WantedBy=multi-user.target
|
5.1.4 启动altermanager并配置开机自启动
1 2
| systemctl start altermanager systemctl enable altermanager
|
Alertmanager启动后可以通过9093端口访问,http://192.168.33.10:9093
5.2 添加altermanager到Prometheus
在Prometheus的架构中被划分成两个独立的部分。Prometheus负责产生告警,而Alertmanager负责告警产生后的后续处理。因此Alertmanager部署完成后,需要在Prometheus中设置Alertmanager相关的信息。
编辑Prometheus配置文件prometheus.yml,并添加以下内容
1 2 3 4
| alerting: alertmanagers: - static_configs: - targets: ['localhost:9093']
|
重启Prometheus服务。
5.3 添加altermanager到Grafana
导入dashboard