Prometheus 简介

Prometheus 是什么?

Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社区也十分活跃,他们便将它独立成开源项目,并且有公司来运作。google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。

Prometheus 的优点

  • 非常少的外部依赖,安装使用超简单
  • 已经有非常多的系统集成 例如:docker HAProxy Nginx JMX等等
  • 服务自动化发现
  • 直接集成到代码
  • 设计思想是按照分布式、微服务架构来实现的

Prometheus 的特性

  • 自定义多维度的数据模型
  • 非常高效的存储 平均一个采样数据占 ~3.5 bytes左右,320万的时间序列,每30秒采样,保持60天,消耗磁盘大概228G。
  • 强大的查询语句
  • 轻松实现数据可视化

等等

Prometheus的主要特点
 
    
  1. Prometheus 属于一站式监控告警平台,依赖少,功能齐全。
  2. Prometheus 支持对云的或容器的监控,其他系统主要对主机监控。
  3. Prometheus 数据查询语句表现力更强大,内置更强大的统计函数。
  4. Prometheus 在数据存储扩展性以及持久性上没有 InfluxDBOpenTSDBSensu 好。

Prometheus的核心组件
 
     
  1. Prometheus Server 主要用于抓取数据和存储时序数据,另外还提供查询和 Alert Rule 配置管理。
  2. client libraries,用于对接 Prometheus Server, 可以查询和上报数据。
  3. push gateway ,用于批量,短期的监控数据的汇总节点,主要用于业务数据汇报等。
  4. 各种汇报数据的 exporters ,例如汇报机器数据的 node_exporter, 汇报 MongoDB 信息的 MongoDB exporter 等等。
  5. 用于告警通知管理的 alertmanager 

Prometheus的架构图



从这个架构图,也可以看出 Prometheus 的主要模块包含, Server, Exporters, Pushgateway, PromQL, Alertmanager, WebUI 等。

它大致使用逻辑是这样:

  1. Prometheus server 定期从静态配置的 targets 或者服务发现的 targets 拉取数据
  2. 当新拉取的数据大于配置内存缓存区的时候,Prometheus 会将数据持久化到磁盘(如果使用 remote storage 将持久化到云端)。
  3. Prometheus 可以配置 rules,然后定时查询数据,当条件触发的时候,会将 alert 推送到配置的 Alertmanager。
  4. Alertmanager 收到警告的时候,可以根据配置,聚合,去重,降噪,最后发送警告。
  5. 可以使用 API, Prometheus Console 或者 Grafana 查询和聚合数据。
     
Prometheus的安装

 
    
  1. tar -zxvf prometheus-2.0.0.linux-amd64.tar.gz
  2. cd prometheus-2.0.0.linux-amd64.tar.gz
  3. ./prometheus

Prometheus的配置
 
     
  1. global:
  2. scrape_interval: 15s # By default, scrape targets every 15 seconds.
  3. evaluation_interval: 15s # By default, scrape targets every 15 seconds.
  4. # scrape_timeout is set to the global default (10s).
  5. # Attach these labels to any time series or alerts when communicating with
  6. # external systems (federation, remote storage, Alertmanager).
  7. external_labels:
  8. monitor: 'codelab-monitor'
  9. # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
  10. rule_files:
  11. # - "first.rules"
  12. # - "second.rules"
  13. # A scrape configuration containing exactly one endpoint to scrape:
  14. # Here it'Prometheus itself.
  15. scrape_configs:
  16. # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  17. - job_name: 'prometheus'
  18. # Override the global default and scrape targets from this job every 5 seconds.
  19. scrape_interval: 5s
  20. # metrics_path defaults to '/metrics'
  21. # scheme defaults to 'http'.
  22. static_configs:
  23. - targets: ['localhost:9090']
  24. - job_name: 'mydemo'
  25. # Override the global default and scrape targets from this job every 5 seconds.
  26. scrape_interval: 5s
  27. metrics_path: '/prometheus'
  28. # scheme defaults to 'http'.
  29. static_configs:
  30. - targets: ['192.168.60.207:8088']
  • 最关键的配置就是targets,就是web应用的ip和端口

Prometheus的启动
 
     
  1. http://localhost:9090/targets

相对于Graphite这种产品,还是有不少优点的。最让我觉得不错的是非常优秀的写性能和读取性能,它数据结构实现和OpenTSDB是有相似之处,有兴趣可以看看这个文档。解密OpenTSDB的表存储优

Prometheus 的系统架构

它的服务过程是这样的 Prometheus daemon 负责定时去目标上抓取 metrics(指标) 数据,每个抓取目标需要暴露一个http服务的接口给它定时抓取。Prometheus支持通过配置文件、文本文件、zookeeper、Consul、DNS SRV lookup等方式指定抓取目标。Alertmanager 是独立于Prometheus的一个组件,可以支持Prometheus的查询语句,提供十分灵活的报警方式。Prometheus支持很多方式的图表可视化,例如十分精美的Grafana,自带的Promdash,以及自身提供的模版引擎等等,还提供HTTP API的查询方式,自定义所需要的输出。PushGateway这个组件是支持Client主动推送 metrics 到PushGateway,而Prometheus只是定时去Gateway上抓取数据。

如果有使用过statsd的用户,则会觉得这十分相似,只是statsd是直接发送给服务器端,而Prometheus主要还是靠进程主动去抓取。

Prometheus 的数据模型

Prometheus 从根本上所有的存储都是按时间序列去实现的,相同的 metrics(指标名称) 和 label(一个或多个标签) 组成一条时间序列,不同的label表示不同的时间序列。为了支持一些查询,有时还会临时产生一些时间序列存储。

metrics name & label 指标名称和标签

每条时间序列是由唯一的 指标名称 和 一组 标签 (key=value)的形式组成。指标名称 一般是给监测对像起一名字,例如 http_requests_total 这样,它有一些命名规则,可以包字母数字_之类的的。通常是以应用名称开头_监测对像_数值类型_单位这样。例如:

  1. push_total
  2. userlogin_mysql_duration_seconds
  3. app_memory_usage_bytes

标签 就是对一条时间序列不同维度的识别了,例如 一个http请求用的是POST还是GET,它的endpoint是什么,这时候就要用标签去标记了。最终形成的标识便是这样了

http_requests_total{method="POST",endpoint="/api/tracks"}

记住,针对http_requests_total这个metrics name 无论是增加标签还是删除标签都会形成一条新的时间序列。查询语句就可以跟据上面标签的组合来查询聚合结果了。如果以传统数据库的理解来看这条语句,则可以考虑 http_requests_total是表名,标签是字段,而timestamp是主键,还有一个float64字段是值了。(Prometheus里面所有值都是按float64存储)

Prometheus 的四种数据类型

Counter

  • Counter 用于累计值,例如 记录 请求次数、任务完成数、错误发生次数。
  • 一直增加,不会减少。
  • 重启进程后,会被重置。

例如:http_response_total{method="GET",endpoint="/api/tracks"} 10010秒后抓取 http_response_total{method="GET",endpoint="/api/tracks"} 100

Gauge

  • Gauge 常规数值,例如 温度变化、内存使用变化。
  • 可变大,可变小。
  • 重启进程后,会被重置

例如: memory_usage_bytes{host="master-01"} 100 < 抓取值memory_usage_bytes{host="master-01"} 30memory_usage_bytes{host="master-01"} 50memory_usage_bytes{host="master-01"} 80 < 抓取值

Histogram

  • Histogram 可以理解为柱状图的意思,常用于跟踪事件发生的规模,例如:请求耗时、响应大小。它特别之处是可以对记录的内容进行分组,提供 count 和 sum 全部值的功能。

    例如:{小于10=5次,小于20=1次,小于30=2次},count=7次,sum=7次的求和值

Summary

  • Summary和Histogram十分相似,常用于跟踪事件发生的规模,例如:请求耗时、响应大小。同样提供 count 和 sum 全部值的功能。
  • 例如:count=7次,sum=7次的值求值
  • 它提供一个quantiles的功能,可以按%比划分跟踪的结果。例如:quantile取值0.95,表示取采样值里面的95%数据。

简介

prometheus 是一个开源的系统监控和告警的工具包,其采用pull方式采集时间序列,通过http协议传输。

架构

每个应用都通过javaagent向外提供一个http服务暴露出自己的JMX信息。当应用启动的时候就会向consul注册服务,注册成功后,prometheus就能把这个应用加入监控对象列表,进行数据收集并跟踪服务的状态。

这里写图片描述

部署

prometheus

官网下载prometheus-1.2.1.linux-amd64.tar.gz, 解压到/services/apps/目录下,修改配置文件 prometheus.yml,在 scrape_config节点下增加以下内容:

- job_name: 'consul-node'
    consul_sd_configs:
      - server: 'localhost:8500'
        services: ['scorer','file-proxy','....']
  • 1
  • 2
  • 3
  • 4

services如果不配置默认会显示出所有的服务,包含了consul agent服务。

运行,默认端口9090

./prometheus -config.file=prometheus.yml &
  • 1

prometheus jmx exporter

jmx exporter是prometheus和JMX的桥梁。 
在我们的工程里面,它是以Java Agent的方式运行,它的功能是收集本地的JVM信息,并通过HTTP服务暴露出来。引用的方式为:

1. 在pom.xml中增加依赖

<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>jmx_prometheus_javaagent</artifactId>
    <version>0.7</version>
</dependency>   
  • 1
  • 2
  • 3
  • 4
  • 5

该工程已经把consul的服务注册功能整合进去。没有注销服务功能

2. 增加启动参数

-javaagent:${WORK_DIR}/lib/jmx_prometheus_javaagent-0.7.jar=scorer:1234:${WORK_DIR}/bin/scorer.yaml
  • 1

javaagent参数解释如下:

-javagent:path/agent.jar=serviceName:servicePort:path/conf.yaml
  • 1

service 指的是http service,如指定servicePort为1234,在应用启动之后,可以在http://host:1234/metrics获取到metrics信息。在conf.yaml里配置JMX的收集策略,完整的yaml配置

consul agent

prometheus可以静态的配置监控对象,也可以采用动态的服务发现机制。为了部署更方便,我们采用的是现在更为流行的服务发现解决方案consul。其只包含了一个二进制的命令文件,把它拷贝到PATH( echo $PATH 可以查看 )就可以运行。 
运行命令为:

consul agent -server -data-dir data &
  • 1

解释如下

  • consul agent 启动一个consul agent进程。 该进程负责维护集群成员信息、注册服务、运行检查、查询响应等等。而且,consul集群的每一个节点上都必须有agent进程运行。

  • -server **agent有两种模式:server与client。**server模式包含了一致性的工作:保证一致性和可用性(在部分失败的情况下),响应RPC,同步数据到其他节点代理。client 模式用于与server进行通信,转发RPC到服务的代理agent,它仅保存自身的少量一些状态,是非常轻量化的东西。本身是相对无状态的。

  • -data-dir 指定一个文件夹用于存储该agent的状态,在以server模式运行时,尤其重要。

一些其他的可选参数

  • -node 指定该节点的名称,默认为主机名
  • -http-port 指定端口接收http请求,用于默认端口8500被占用的情况。
  • -config-dir 指定一个或多个文件夹用于agent启动时加载配置文件,加载顺序由文件名的字母顺序决定。

consul 运行起来后,server会通过8500端口与prometheus通信。

使用

consul 启动

consul agent -server –data-dir=/services/data/consul/ –join 10.18.1.12&

注销服务

curl http://localhost:8500/v1/agent/service/deregister/172.17.42.1

查询该agent上面注册的服务

curl http://localhost:8500/v1/agent/services?pretty

查询集群上面所有的服务

curl http://localhost:8500/v1/catalog/services?pretty

查询

参见prometheus官网提供的查询表达式,简而言之,标签过滤用{},时间范围选择用[],如下例。

http_request_total{job="prometheus"}[5m]
  • 1

可视化

prometheus官方的dashboard不怎么给力,目前将grafana集成了进去。grafana可以自定义数据源,并且保存多个dashboard,针对不同的系统可以使用不同的dashboard来进行监控。

猜你喜欢

转载自blog.csdn.net/zyc88888/article/details/80263190