Prometheus+Grafana+Altermanager搭建监控系统
监控系统搭建
基本概念
Prometheus
时间序列化数据库,我的理解就是将数据打上标签,以时间维度存储。后面有机会在深入研究。
Prometheus架构如下:
Grafana
Prometheus中存储的数据,通过Grafana进行图形化呈现。
Alertmanager
Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重,降噪,分组,策略路由,是一款前卫的告警通知系统。
软件安装
一.Prometheus安装
1.1 Prometheus安装
1) 普通安装:
prometheus安装包最新版本下载地址:
wget https://github.com/prometheus/prometheus/releases/download/v2.3.2/prometheus-2.3.2.linux-amd64.tar.gz #解压: tar txvf prometheus-2.3.2.linux-amd64.tar.gz #切换目录: cd prometheus-2.3.2.linux-amd64
mv prometheus-2.3.2.linux-amd64 /usr/local/prometheus
#启动: nohup ./prometheus --config.file=prometheus.yml &
注:通过执行
./prometheus -h
可以查看具体得执行参数,参数后面可以查看默认得参数。如下图所示。
2)docker 方式安装(前提docker已经安装完毕)
创建目录和prometheus配置文件
mkdir /prometheus vim /prometheus/prometheus.yml
注:对于prometheus.yml文件的配置,稍后详细介绍。
拉取prometheus镜像
docker pull prom/prometheus
启动prometheus
docker run -d -p 9090:9090 --name prometheus -v /prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus --config.file=/etc/prometheus/prometheus.yml
注:参数的简要说明
a、-d选项启动独立模式下的prometheus容器,这意味着容器将在后台启动,这种情况下只有stop docker才可以关闭prometheus,而不能执行ctrl+c
b、-p选择指定端口号映射,通过访问本机的9090端口,即可访问prometheus容器的9090端口
c、--name指定容器的名称
d、-v选项建立本机文件和docker内文件的映射
e、--config.file指定运行docker内prometheus的配置文件
1.2 prometheus配置文件的设定
prometheus的配置文件采用的是yaml文件,yaml文件书写的要求如下:
大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格。 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
prometheus.yml的样例
# Prometheus全局配置项 global: scrape_interval: 15s # 设定抓取数据的周期,默认为1min evaluation_interval: 15s # 设定更新rules文件的周期,默认为1min scrape_timeout: 15s # 设定抓取数据的超时时间,默认为10s external_labels: # 额外的属性,会添加到拉取得数据并存到数据库中 monitor: 'codelab_monitor' # Alertmanager配置 alerting: alertmanagers: - static_configs: - targets: ["localhost:9093"] # 设定alertmanager和prometheus交互的接口,即alertmanager监听的ip地址和端口 # rule配置,首次读取默认加载,之后根据evaluation_interval设定的周期加载 rule_files: - "alertmanager_rules.yml" - "prometheus_rules.yml" # scape配置 scrape_configs: - job_name: 'prometheus' # job_name默认写入timeseries的labels中,可以用于查询使用 scrape_interval: 15s # 抓取周期,默认采用global配置 static_configs: # 静态配置 - targets: ['localdns:9090'] # prometheus所要抓取数据的地址,即instance实例项 - job_name: 'example-random' static_configs: - targets: ['localhost:8080']
1.3. 访问,如下图所示:
安装exporter
prometheus可以理解为一个数据库+数据抓取工具,工具从各处抓来统一的数据,放入prometheus这一个时间序列数据库中。那如何保证各处的数据格式是统一的呢?就是通过这个exporter。exporter也是用GO写的程序,它开放一个http接口,对外提供格式化的数据。所以在不同的环境下,需要编写不同的exporter。好在已经有很多写好的exporter,我们可以直接使用(https://github.com/prometheus这里可以找到很多exporter)我们这里直接使用mysqld_exporter(prometheus.io/download/#mysqld_exporter)。当然也要下载对应系统的版本。
下载地址可参考:
window版本:https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.windows-amd64.tar.gz
Linux版本:https://github.com/prometheus/mysqld_exporter/releases/download/v0.11.0/mysqld_exporter-0.11.0.linux-amd64.tar.gz
解压后的内容类似如下图:
这里的mysqld_exporter是启动文件,.my.cnf是配置文件。想要正确的导出mysql的状态数据,必须在配置文件中正确的配置mysql的连接信息。我的配置如下:
配置好了,就可以启动了。成功如下所示:
通过localhost:9104,就可以看到exporter导出的数据:
在Prometheus中配置mysqld_exporter
exporter启动了,需要在Prometheus中正确的配置。修改prometheus目录中的prometheus.yml,增加配置如下:
重启prometheus,点击导航栏中的status->targets可以看到,mysql的exporter已经集成。
二.安装Grafana
2.1.安装Grafana
下载Grafana安装包:
wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.2.3.linux-amd64.tar.gz tar zxvf grafana-5.2.3.linux-amd64.tar.gz cd grafana-5.2.3.linux-amd64.tar.gz bin/grafana-server web
Grafana默认服务端口号为3000,通过浏览器对Grafana进行访问。
http://localdns:3000
默认登录名密码为"admin/admin"。
2.2 配置数据源
首先,你要添加一个数据源,将Grafana和Prometheus关联起来。点击Add data source,如下填写数据保存即可:
操作步骤如下:
1 在左侧工具栏中,点击"Configuration"菜单。 2 点击"Data Sources"。 3 点击"Add data source"。 4 数据源Type选择“Prometheus”。 5 设置Prometheus服务访问地址(例如:http://localhost:9090)。 6 调整其他想要的设置(例如:关闭代理访问)。 7 点击“Add”按钮,保存这个新数据源。
看到如下的提示,说明你的prometheus工作是正常的:
2.3 配置dashboard
接着回到首页,你需要添加一个dashboard,如下图进入dashboard导入页面:
这里你需要从https://github.com/percona/grafana-dashboards项目中的dashboards下载MySQL_Overview.json,然后通过上面页面的Upload .json File按钮上传上去,导入即可
下载地址:https://github.com/percona/grafana-dashboards/blob/master/dashboards/MySQL_Overview.json
导入成功后,你将看到监控页面。
三、Alertmanager(email报警)
Alertmanager简介及机制
Alertmanager处理由类似Prometheus服务器等客户端发来的警报,之后需要删除重复、分组,并将它们通过路由发送到正确的接收器,比如电子邮件、Slack等。Alertmanager还支持沉默和警报抑制的机制。
分组
分组是指当出现问题时,Alertmanager会收到一个单一的通知,而当系统宕机时,很有可能成百上千的警报会同时生成,这种机制在较大的中断中特别有用。
例如,当数十或数百个服务的实例在运行,网络发生故障时,有可能服务实例的一半不可达数据库。在告警规则中配置为每一个服务实例都发送警报的话,那么结果是数百警报被发送至Alertmanager。
但是作为用户只想看到单一的报警页面,同时仍然能够清楚的看到哪些实例受到影响,因此,人们通过配置Alertmanager将警报分组打包,并发送一个相对看起来紧凑的通知。
分组警报、警报时间,以及接收警报的receiver是在配置文件中通过路由树配置的。
抑制
抑制是指当警报发出后,停止重复发送由此警报引发其他错误的警报的机制。
例如,当警报被触发,通知整个集群不可达,可以配置Alertmanager忽略由该警报触发而产生的所有其他警报,这可以防止通知数百或数千与此问题不相关的其他警报。
抑制机制可以通过Alertmanager的配置文件来配置。
沉默
沉默是一种简单的特定时间静音提醒的机制。一种沉默是通过匹配器来配置,就像路由树一样。传入的警报会匹配RE,如果匹配,将不会为此警报发送通知。
沉默机制可以通过Alertmanager的Web页面进行配置。
3.1 Alertmanager安装
详细安装和对接文档可参考:https://www.cnblogs.com/momoyan/p/14111786.html#auto-id-9
3.2 alertmanager.yml的配置
# 全局配置项 global: resolve_timeout: 5m #处理超时时间,默认为5min smtp_smarthost: 'smtp.sina.com:25' # 邮箱smtp服务器代理 smtp_from: '******@sina.com' # 发送邮箱名称 smtp_auth_username: '******@sina.com' # 邮箱名称 smtp_auth_password: '******' # 邮箱密码或授权码 wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' # 企业微信地址 # 定义模板信心 templates: - 'template/*.tmpl' # 定义路由树信息 route: group_by: ['alertname'] # 报警分组依据 group_wait: 10s # 最初即第一次等待多久时间发送一组警报的通知 group_interval: 10s # 在发送新警报前的等待时间 repeat_interval: 1m # 发送重复警报的周期 对于email配置中,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝 receiver: 'email' # 发送警报的接收者的名称,以下receivers name的名称 # 定义警报接收者信息 receivers: - name: 'email' # 警报 email_configs: # 邮箱配置 - to: '******@163.com' # 接收警报的email配置 html: '{{ template "test.html" . }}' # 设定邮箱的内容模板 headers: { Subject: "[WARN] 报警邮件"} # 接收邮件的标题
webhook_configs: # webhook配置 - url: 'http://127.0.0.1:5001' send_resolved: true wechat_configs: # 企业微信报警配置 - send_resolved: true to_party: '1' # 接收组的id agent_id: '1000002' # (企业微信-->自定应用-->AgentId) corp_id: '******' # 企业信息(我的企业-->CorpId[在底部]) api_secret: '******' # 企业微信(企业微信-->自定应用-->Secret) message: '{{ template "test_wechat.html" . }}' # 发送消息模板的设定 # 一个inhibition规则是在与另一组匹配器匹配的警报存在的条件下,使匹配一组匹配器的警报失效的规则。两个警报必须具有一组相同的标签。 inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
注:
1)repeat_interval配置项,对于email来说,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝
2)企业微信注册地址:https://work.weixin.qq.com
上述配置的email、webhook和wechat三种报警方式。目前Alertmanager所有的报警方式有以下几个方面:
email_config hipchat_config pagerduty_config pushover_config slack_config opsgenie_config victorops_config
3.3.tmpl模板的配置
1)test.tmpl
注:上述Labels项,表示prometheus里面的可选label项。annotation项表示报警规则中定义的annotation项的内容。
2)test_wechat.tmpl
{{ define "cdn_live_wechat.html" }} {{ range $i, $alert := .Alerts.Firing }} [报警项]:{{ index $alert.Labels "alertname" }} [实例]:{{ index $alert.Labels "instance" }} [报警阀值]:{{ index $alert.Annotations "value" }} [开始时间]:{{ $alert.StartsAt }} {{ end }} {{ end }}
注:此处range遍历项与email模板中略有不同,只遍历当前没有处理的报警(Firing)。此项如果不设置,则在Alert中已经Resolved的报警项,也会被发送到企业微信。
3.4、在Prometheus模块定义告警规则
alertmanager_rules.yml样例配置文件(与prometheus同目录下)
groups: - name: test-rules rules: - alert: InstanceDown # 告警名称 expr: up == 0 # 告警的判定条件,参考Prometheus高级查询来设定 for: 2m # 满足告警条件持续时间多久后,才会发送告警 labels: #标签项 team: node annotations: # 解析项,详细解释告警信息 summary: "{{$labels.instance}}: has been down" description: "{{$labels.instance}}: job {{$labels.job}} has been down " value: {{$value}}
3.5、告警信息生命周期的3中状态
1)inactive:表示当前报警信息即不是firing状态也不是pending状态
2)pending:表示在设置的阈值时间范围内被激活的
3)firing:表示超过设置的阈值时间被激活的
3.6、结果展示
启动prometheus和alertmanager,满足报警条件后,就可以收到报警邮件了。
1. 浏览器界面化告警展示
在浏览器输入alertmanager的配置地址,即可查看所监控到的报警信息
http://localdns:9093/#/alerts
如图所示:
2 . 邮箱告警展示
1)原始邮箱告警展示
2)模板邮箱告警展示
3、企业微信告警展示
四. Prometheus与其他模块对接
由于Prometheus灵活的接口配置和数据获取方式,可以很灵活的与其他模块进行对接,用于实时监控多个模块。
包括以下常用模块:
1.node_exporter
用户监控节点虚拟机的指标信息。
2.jmx_exporter
3.elasticsearch_exporter
4.redis_exporter
5.mysqld_exporter
6.postgres_exporter
7.mongodb_exporter
下载地址:https://github.com/dcu/mongodb_exporter/releases/download/v1.0.0/mongodb_exporter-linux-amd64
8.statsd_exporter
9.mesos_exporter
10.apache_exporter
11.hadoop_exporter
下载地址:https://github.com/wyukawa/hadoop_exporter
12.logstash_exporter
下载地址:https://github.com/BonnierNews/logstash_exporter/archive/v0.1.2.tar.gz
13.sql_exporter
14.oracle_exporter
下载地址:https://github.com/iamseth/oracledb_exporter/releases/download/0.0.8/oracledb_exporter.linux-amd64
15.zookeeper_exporter
下载地址2:https://github.com/carlpett/zookeeper_exporter/releases/download/v1.0.2/zookeeper_exporter
16.influxdb_exporter
17.zabbix_exporter
下载地址:https://github.com/MyBook/zabbix-exporter/archive/1.0.2.tar.gz
18.opentsdb_exporter
下载地址:https://github.com/cloudflare/opentsdb_exporter/archive/0.0.3.tar.gz
19.grafana_exporter
20.json_exporter
下载地址:https://github.com/sciffer/json_exporter