Prometheus监控系统:实时数据采集与可视化
Prometheus
基于Prometheus+Grafana+Alert Manager搭建监控系统
分为5大部分:
- prometheus server用于从目标监控中定时采集指标数据并计算处理数据,同时提供报警规则以及对接可视化的监控系统,例如Grafana
- Service discovery用于采集目标的发现。prometheus server通过该服务发现要采集的目标服务
- Prometheus targets是被prometheus server采集的目标。实际上就是在业务系统中加入的指标监控。该部分首先将指标数据记录到本地内存中,并提供标准的http接口供prometheus server定时拉取。
- 数据可视部分是将prometheus server中收集到的监控数据以图标的形式展示出来。例如Grafana
- 告警系统是当系统状态有异常时可及时通知相关人员用于及时处理
Prometheus targets搭建
package mainimport ( "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")// 定义监控的指标var ( MetricHttpRequestTotal = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: "promdemo", Subsystem: "demo", Name: "http_request_total", Help: "http request total", }, []string{"from"}, ))func init() { // 注册指标采集器 prometheus.MustRegister(MetricHttpRequestTotal)}func main() { go func() { muxProm := http.NewServeMux() // 提供数据采集接口 muxProm.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":9638", muxProm) }() http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { values := req.URL.Query() from := values.Get("platform") // 指标数据采集 MetricHttpRequestTotal.WithLabelValues(platform).Inc() w.Write([]byte("hi, platform " + platform)) }) http.ListenAndServe(":8180", nil)}
Prometheus Server搭建
下载地址:https://github.com/prometheus/prometheus/releases/download/v2.37.0/prometheus-2.37.0.darwin-arm64.tar.gz
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: - "first_rules.yml" # - "second_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' scrape_interval: 15s # 抓取周期,默认采用global配置 static_configs: - targets: ['localhost:9527']
启动:./prometheus --config.file="prometheus.yml"
first_rules.yml
groups: - name: example rules: - alert: high-request expr: sum(increase(promdemo_demo_http_request_total[1m])) > 1 - name: test-rules rules: # 监控应用是否宕机 - alert: InstanceDown # 告警名称 expr: up{job="example-random"} == 0 # 基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件 for: 1m # 评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending labels: # 自定义标签,允许用户指定要附加到告警上的一组附加标签 team: node annotations: summary: "{{$labels.instance}}: has been down" # 描述告警的概要信息 description: "{{$labels.instance}}: job {{$labels.job}} has been down, value: {{$value}}" # 描述告警的详细信息 # 监控接口发生异常 - alert: interface_request_exception expr: increase(http_server_requests_seconds_count{exception!="None",exception!="ServiceException",job="example-random"}[1m])> 0 for: 1s labels: severity: page annotations: description: '实例:{{ $labels.instance }}的{{$labels.uri}}的接口发生了{{ $labels.exception}}异常 ' summary: 监控一定时间内接口请求异常的数量 # 监控接口请求时长 uri!~".Excel." 是将一些接口给排除掉。这个是将包含Excel的接口排除掉。 - alert: interface_request_duration expr: increase(http_server_requests_seconds_sum{exception="None",job="acs-ms",uri!~".*Excel.*"}[1m]) / increase(http_server_requests_seconds_count{exception="None",job="example-random",uri!~".*Excel.*"}[1m]) > 5 for: 5s labels: severity: page annotations: description: '实例:{{ $labels.instance }} 的{{$labels.uri}}接口请求时长超过了设置的阈值:5s,当前值{{$value }}s ' summary: 监控一定时间内的接口请求时长 # 监测系统CPU使用的百分比 - alert: CPUTooHeight expr: process_cpu_usage{job="example-random"} > 0.3 for: 15s labels: severity: page annotations: description: '实例:{{ $labels.instance }} 的cpu超过了设置的阈值:30%,当前值{{ $value }} ' summary: 监测系统CPU使用的百分比 # 监控tomcat活动线程占总线程的比例 - alert: tomcat_thread_height expr: tomcat_threads_busy_threads{job="acs-ms"} / tomcat_threads_config_max_threads{job="example-random"} > 0.5 for: 15s labels: severity: page annotations: description: '实例:{{ $labels.instance }} 的tomcat活动线程占总线程的比例超过了设置的阈值:50%,当前值{{ $value}} ' summary: 监控tomcat活动线程占总线程的比例
测试命令:/usr/local/prometheus-2.37.0.darwin-amd64/promtool check config /usr/local/prometheus-2.37.0.darwin-amd64/prometheus.yml
启动地址:http://localhost:9090/
Grafana
安装:brew install grafana
启动grafana服务:brew services start grafana
关闭grafana服务:brew services stop grafana
下载地址:https://grafana.com/grafana/download/9.0.6?platform=linux
启动地址:http://localhost:3000
Alert Manager
alertmanager.yml文件
# 全局配置项global: resolve_timeout: 5m #处理超时时间,默认为5min smtp_smarthost: 'smtp.163.com:465' # 邮箱smtp服务器代理 smtp_from: 'm19139651941@163.com' # 发送邮箱名称 smtp_auth_username: 'm19139651941@163.com' # 邮箱名称 smtp_auth_password: 'KDAMXZOMZFBFOMSK' # 将此替换为您的授权码 #smtp_require_tls: false 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: 'm19139651941@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']
test.html
{{ define "test.html" }}<table border="1"> <tr> <td>报警项</td> <td>实例</td> <td>报警阀值</td> <td>开始时间</td> </tr> {{ range $i, $alert := .Alerts }} <tr> <td>{{ index $alert.Labels "alertname" }}</td> <td>{{ index $alert.Labels "instance" }}</td> <td>{{ index $alert.Annotations "value" }}</td> <td>{{ $alert.StartsAt }}</td> </tr> {{ end }}</table>{{ end }}
test_wechat.html
{{ 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 }}
http://localhost:9093
告警展示
邮箱告警
模版邮箱告警
企业微信告警
The End
本站内容搜集自互联网,版权归原作者所有。如有侵权,请来信告知,我们将删除相关内容。