微服务监控Prometheus架构与实践原创
金蝶云社区-艾贺521
艾贺521
3人赞赏了该文章 4,996次浏览 未经作者许可,禁止转载编辑于2019年06月16日 21:57:33
summary-icon摘要由AI智能服务提供

本文介绍了分布式系统监控的三种主要内容:Logging(日志)、Tracing(调用链)、Metrics(离散数据点)。强调了Prometheus在Metrics和健康检查方面的优势,详细阐述了Prometheus的架构、优点、基本概念、Metrics种类、采集形式、PromQL查询语言及Alertmanager告警系统。通过实践指南展示了如何在本地环境部署Prometheus,结合Grafana进行数据可视化,并配置Alertmanager进行告警。旨在帮助读者全面了解Prometheus及其在监控系统中的应用。


如果你是分布式系统的开发人员或者运维人员,肯定要了解系统监控的手段,有哪些监控的内容。如下有三种监控内容:

  • Logging:日志,离散事件,一般是文本的,最常用的也是比较好用的一种方式

  • Tracing : 调用链,一般是请求,一般是跟踪一个请求从网关一直到后端某服务,最终返回给客户端,可以参考:微服务调用链基本原理与使用

  • Metrics:离散的数据点,最终存储到数据库里面,一般是一个数字,并且可以进行计算。


除此之外,还有对系统进行健康检查,healthchecks。Prometheus主要是进行Metrics和健康检查进行监控。



监控的应用场景


MetricsLoggingTracing
研发成本
运维成本高(业务量增大,扩容,调优)
出问题后响应能力高(很快效应)低(主要用于排查问题)
查问题


参考:Go for Industrial Programming



  • 当出现问题的时候,我们主要去看日志,看Tracing,找到问题所在

  • 当健康检查出现问题的时候,通过Metrics进行告警是比较灵敏的,Metrics可以对监控进行如下分层

    • 系统层面的metrics,cpu,内存,io等信息,一般是运维处理

    • 应用层面,出错率,请求延迟等,一般是开发处理

    • 业务层Metrics则是转化率,下单率,一般产品与运营人员关注



Metrics监控架构

一般主要有推和拉两种方式:

  • 推,则是在监控主机上安装agent,定期的上报系统信息

  • 拉,比较简单,但是对监控服务器有很大的压力



对于Prometheus一般采用如下监控架构:

  • 将TiDB转换为我们的其它业务服务器




Prometheus简介

Prometheus是一个开源的完整监控解决方案,其对传统监控系统的测试和告警模型进行了彻底的颠覆,形成了基于中央化的规则计算、统一分析和告警的新模型。它本质上是一个数据库,时间序列的数据库,Soundcloud研发。采用pull模式,支持黑盒与白盒。是推进践行DevOPS的一个很好的方式。

相比于传统监控系统Prometheus具有以下优点:

  • 支持各种语言的客户端,支持各种exports。

  • 性能强劲,支持百万的序列。

  • 社区生态丰富,在github上已经2万多start,2019.06.16

  • 易于管理,可扩展,强大的查询语言PromQL,易于集成,可视化,开放性等等


Prometheus在其官网上给出了架构图,主要包含Prometheus的生态组件:


Prometheus基本概念

Metrics种类:

  • Counter计数器,始终增加的,比如Http请求数,下单数

  • Gauge(测量仪):当前值的一次快照,比如磁盘使用率

  • Histogram(直方图):区间的分布情况,比如某个年龄段有多少人

  • Summary(汇总):根据样本统计出百分位


Metrics形式:

<metric name>{<label name>=<label value>, ...}

比如名称为http_requests_total的metric,标签有两个code="200",path="/status",最终存储的值为8。


Metrics采集形式:

  • 直接采集,Prometheus与要采集的指标直接打交道,比如Spring Boot已经提供了Metrics,可以直接用

  • 简接采集,没有提供metrics,需要exporter来与产品和Prometheus打交道,exporter相当于适配器。prometheus提供了很多exporter


PromeQL:

PromQL是Prometheus内置的数据查询语言,其提供对时间序列数据丰富的查询,聚合以及逻辑运算能力的支持。并且被广泛应用在Prometheus的日常应用当中,包括对数据查询、可视化、告警处理当中。


Alertmanager:

Alertmanager除了提供基本的告警通知能力以外,还主要提供了如:分组、抑制以及静默等告警特性:


Prometheus安装及使用

1 去官网下载prometheus的安装包,或者使用docker都行,安装方式灵活。下载地址:https://prometheus.io/download/  , 我用的是Mac系统,根据自己的系统进行选择


2 做一个简单的配置,作为对prometheus实际使用的了解,去掉大部分的注释之后

global:
  scrape_interval:     15s
  evaluation_interval: 15s

rule_files:
  # - "first.rules"
  # - "second.rules"

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ['localhost:9090']
  • scrape_interval控制抓取metric的间隔时间,可以在targets中覆盖掉global的配置

  • evaluation_interval,评估rule的时间,prometheus会使用rules来创建新的时间序列和报警

  • scrape_configs,配置prometheus要监控的资源


3 启动prometheus,然后查看是否正常运行。

./prometheus --config.file=prometheus.yml

然后访问:

http://localhost:9090/graph

http://localhost:9090/metrics


4 在http://localhost:9090/graph中,grath的标签栏查看图表,在表达式哪里输入表达式查看效果:



Prometheus实践指南

在github上,有架构师杨波提供的几节prometheus的实验项目地址:https://github.com/spring2go/prom_lab

1 首先打开http_simulate项目,查看里面的代码,核心代码位于ActivitySimulator。

  • 通过/spike/{mode}请求设置是否开启流量高峰模拟

  • 通过/error_rate/{error_rate}模拟内部的http状态码有多少错误率

  • 内部有一个线程池不断的模拟请求,至于内部的Counter,Histogram类,我们上文已经提到过


2 启动项目,进行模拟

访问:http://localhost:8080/prometheus 查看当前prometheus的状态,


在prometheus.yml配置文件中增加如下job:

  - job_name: 'http-simulator'
    metrics_path: /prometheus
    static_configs:
    - targets: ['localhost:8080']


3 启动prometheus,进行查询,之前我们有进行过简单的查询,这次比如要查询:

// 查询名称为http_requests_total的metric,并且label为job='simulate',status="200"
http_requests_total{job='simulate',status="200"}

从graph也可以看得出来效果,metric的label在我们的代码中配置:prometheus的promQL内部提供了函数方便使用:如rate,increase等,参考:https://prometheus.io/docs/prometheus/latest/querying/functions/#rate



4 prometheus与Grafana进行结合,架构如图,记得要安装Grafana。

下载地址:https://grafana.com/grafana/download

grafana默认地址:http://localhost:3000,默认账号密码:admin,admin

Grafana本身不存储数据,只负责展示,需要添加数据源。Grafana支持很多种类型的数据源,这次我们要选择是的prometheus的数据源,如果没有对prometheus做特殊修改,采用默认配置即可,注意ip地址要填写正确


5 配置Grafana图表,添加Dashboard,然后添加图表。Grafana做的实在是人性化,不需要去教怎么去添加东西,只需要自己摸索下常见的选项,多点击几下就知道怎么用了。最后记得点击保存。

Grafana文档:https://grafana.com/docs/


6 配置报警,AlertManager可以用多种方式安装。

AlertManager介绍地址:https://github.com/prometheus/alertmanager

配置alertmanager.yml:

global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_from: 'aihehe123@foxmail.com'
  # 自己去QQ的客户端去生成授权码,password为QQ的授权码
  smtp_auth_username: 'aihehe123@foxmail.com'
  smtp_auth_password: 'xxx'
  # 记得设置为false,不然会报错
  smtp_require_tls: false

route:
  # group_by: ['alertname']
  # group_wait: 10s
  group_interval: 1m
  repeat_interval: 1m
  receiver: 'mail-receiver'

receivers:
  - name: 'mail-receiver'
    email_configs:
    - to: 'aihehe123@foxmail.com'


然后再新建报警的规则配置文件:simulator_alert_rules.yml

# 第一个规则代表simulate服务器停止了
groups:
- name: simulator-alert-rule
  rules:
  - alert: HttpSimulatorDown
    expr: sum(up{job="simulate"}) == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Simulator Stoped"
      description: "stopped"

# 第二个规则代表服务器500的错误码比例大于2%了
  - alert: ErrorRateHigh
    expr: sum(rate(http_requests_total{job="simulate", status="500"}[5m])) / sum(rate(http_requests_total{job="simulate"}[5m])) > 0.02
    for: 1m
    labels:
      severity: major
    annotations:
      summary: "High Error Rate detected"
      description: "Error Rate is above 2% (current value is: {{ $value }}"


最后配置prometheus.yml,增加告警服务器地址:

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - 127.0.0.1:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "simulator_alert_rules.yml"



7 启动AlertManager。重启prometheus服务器。

http://localhost:9090/config 看看配置是否生效

看看是否有告警信息:http://localhost:9090/alerts


8 停止simulate服务器,查看报警是否生效。最终看到有效效果,成功收到报警信息


9 停掉Promethus,停掉Grafana,停掉Alertmanager,至此实验完成。


最后

在本篇文章里:

  • 介绍了一些监控的种类与特点

  • 引入Prometheus,介绍Prometheus的架构与概念

  • 实战部署Prometheus + Grafana + AlertManager,验证Prometheus的强大功能


最后希望能帮助到大家


参考


注:

本文独家发布自金蝶云社区



图标赞 3
3人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!