目录

1. Prometheus介绍

1.1 什么是监控

(1)监控原理

(2)监控机制

(3) Metric(度量)

(4)通知和警报

1.2 Prometheus 介绍

Prometheus由来

Prometheus的主要特点

Prometheus的核心组件

Prometheus的架构图

1.3 Prometheus 数据及安全模型

Metric 名字

标签(Labels)

时间序列元素

时序索引

时序样本

格式

时序 4 种类型:Counter, Gauge, Histogram, Summary

2. Prometheus 安装

2.1 在 centos7上安装

2.2 通过 Docker 安装

2.3 Prometheus的配置

Prometheus的启动


1. Prometheus介绍

1.1 什么是监控

从技术角度看,监控是度量和管理技术系统的工具和过程。但远不止于此,监控提供从系统和应用程序生成的指
标到业务价值的转换。
这些指标转换为用户体验的度量,为业务提供反馈,同样还向技术提供反馈,指示业务的
工作状态以及持续改进。

监控系统主要有两个客户:

• 技术: 技术团队,开发环境等
• 业务:公司生产环境,帮助业务的持续交付等

(1)监控原理

监控

监控不应该:

• 事后监控
• 监控的不完整
• 不正确的监控
• 静态监控
• 监测不够频繁
• 没有自动化

良好的监测应提供:

• 整个世界的状态,从上到下。
• 协助故障诊断。
• 基础架构、应用程序开发和业务人员的信息源。

它应该是:

• 内置于应用程序开发和部署的设计和生命
• 在可能的情况下,自动提供自助服务。

(2)监控机制

应用程序监控有两种方法:

• 探测
• 自省

执行监控也有两种方法:

• 推
• 拉

监测数据的类型主要有两种:

• Metrics
• Logs

(3) Metric(度量)

度量是对软件或硬件组件属性的度量。为了使度量有用,我们跟踪它的状态,通常随时间记录数据点。这些数
据点称为观测值。观察由值、时间戳以及有时描述观察的一系列属性(如源或标记)组成。观测的集合称为时间
序列。

Metric(度量)

度量的类型

• 仪表(Gauges)
• 计数器(Counters)
• 直方图

度量的类型
度量的类型-直方图

度量总结

通常,单个指标的值对我们来说并不有用。相反, 度量的可视化需要对其应用数学变换。例如,我们可以将
计函数应用到我们的度量或度量组中
。我们可以应用的一些常见功能包括:

  1. • 计数或n -计数在特定时间间隔内的观测次数。
  2. • Sum - To - Sum是在特定的时间间隔内将所有观测值相加。
  3. • 平均值— 提供特定时间间隔内所有值的平均值。
  4. • 中值——中值是我们的值的死中心:正好50%的值低于它, 50%高于它。
  5. • 百分比——测量一组观测中某一特定百分比下降的值。
  6. • 标准差-表示我们度量的分布中与均值的标准差。这测量了数据集中的变化。 0的标准差意味着分布等于数
  7. • 据的平均值。较高的偏差意味着数据分布在一系列值上。
  8. • 变化率——变化率表示时间序列中数据之间的变化程度。

(4)通知和警报

通知和警报的区别
良好的通知和警报系统,应考虑的问题:

• 通知什么问题
• 谁来通知 altermanager
• 如何通知。 sms , email,wechart, dingding
• 通知间隔
• 什么时候停止

1.2 Prometheus 介绍

(1) Prometheus由来

普罗米修斯的灵感来自于谷歌的Borgmon。它最初是由马特·t·普劳德(Matt T. Proud)作为一个研究项目开发的,普劳
德曾是谷歌(google)的一名雇员。在普劳德加入SoundCloud之后,他与另一位工程师朱利叶斯•沃尔兹(Julius Volz)合作,
认真开发普罗米修斯。其他开发人员也参与了这项工作,并继续在SoundCloud内部进行开发,最终于2015年1月公开
发布。

Prometheus的主要特点

  1. 多维 数据模型(时序由 metric 名字和 k/v 的 labels 构成)。
  2. 灵活的查询语句(PromQL)。
  3. 无依赖存储,支持 local 和 remote 不同模型。
  4. 采用 http 协议,使用 pull 模式,拉取数据,简单易懂。
  5. 监控目标,可以采用服务发现或静态配置的方式。
  6. 支持多种统计数据模型,图形化友好。

Prometheus的核心组件

  1. Prometheus Server: 用于收集和存储时间序列数据。
  2. Client Library: 客户端库,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server。当 Prometheus server 来 pull 时,直接返回实时状态的 metrics。
  3. Push Gateway: 主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的 metrics,对于机器层面的 metrices,需要使用 node exporter。
  4. Exporters: 用于暴露已有的第三方服务的 metrics 给 Prometheus。
  5. Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。
  6. 一些其他的工具。

Prometheus的架构图

 
Prometheus的架构图
Prometheus的架构图-高可用

从上图可以看出,Prometheus 的主要模块包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及图形界面

其大概的工作流程是:

  1. Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
  2. Prometheus server 在本地存储收集到的 metrics(如果使用 remote storage 将持久化到云端),并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
  3. Alertmanager 根据配置文件,聚合,去重,降噪,对接收到的警报进行处理,发出告警
  4. 在图形界面中,可视化采集数据(可以使用 API, Prometheus Console 或者 Grafana 查询和聚合数据)。

 

METRIC 集合
 

• 为了获取端点,普罗米修斯定义了一个称为目标的配置,称为 Scrape(刮刮)


服务发现

• 用户提供的静态资源列表。
• 基于文件的发现—例如,使用配置管理工具生成在Prometheus中自动更新的资源列表。
• 自动发现
 

聚合和提醒

服务器还可以查询和聚合时间序列数据,并可以创建规则来记录常用的查询和聚合。这允许您从现有的时间序
列中创建新的时间序列

普罗米修斯也可以定义警报规则,但没有内置警报工具,而是通过外在的 Alertmanager

查询数据

Prometheus服务器也提供了内置的查询语言PromQL;一个表达式浏览器;以及一个图形界面,您可以使用它来查
看服务器上的数据。
 

 

1.3 Prometheus 数据及安全模型

Metric 名字

  • 时间序列的名称通常描述收集的时间序列数据的一般性质。
  • 时序的名字由 ASCII 字符,数字,下划线,以及冒号组成,它必须满足正则表达式 [a-zA-Z_:][a-zA-Z0-9_:]*
  •  其名字应该具有语义化,一般表示一个可以度量的指标,例如: http_requests_total, 可以表示 http 请求的总数。

标签(Labels)

  • 时序的标签可以使 Prometheus 的数据更加丰富,能够区分具体不同的实例,例如 http_requests_total{method="POST"} 可以表示所有 http 中的 POST 请求。
  • 标签名称由 ASCII 字符,数字,以及下划线组成,
  • 其中 __ 开头属于 Prometheus 保留
  • 标签的值可以是任何 Unicode 字符,支持中文。

时间序列元素

时间序列元素

Prometheus 存储的是时序数据, 即按照相同时序(相同的名字和标签),以时间维度存储连续的数据的集合。

时序索引

时序(time series) 是由名字(Metric),以及一组 key/value 标签定义的,具有相同的名字以及标签属于相同时序。

时序样本

按照某个时序以时间维度采集的数据,称之为样本,其值包含:

  • 一个 float64 值
  • 一个毫秒级的 unix 时间戳

格式

Prometheus 时序格式与 OpenTSDB 相似:

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

其中包含时序名字以及时序的标签。

时序 4 种类型:CounterGaugeHistogramSummary

Prometheus 时序数据分为 CounterGaugeHistogramSummary 四种类型。

Counter

Counter 表示收集的数据是按照某个趋势(增加/减少)一直变化的,我们往往用它记录服务请求总量、错误总数等。

例如 Prometheus server 中 http_requests_total, 表示 Prometheus 处理的 http 请求总数,我们可以使用 delta, 很容易得到任意区间数据的增量,这个会在 PromQL 一节中细讲。

Gauge

Gauge 表示搜集的数据是一个瞬时的值,与时间没有关系,可以任意变高变低,往往可以用来记录内存使用率、磁盘使用率等。

例如 Prometheus server 中 go_goroutines, 表示 Prometheus 当前 goroutines 的数量。

Histogram

Histogram 由 <basename>_bucket{le="<upper inclusive bound>"}<basename>_bucket{le="+Inf"}<basename>_sum<basename>_count 组成,主要用于表示一段时间范围内对数据进行采样(通常是请求持续时间或响应大小),并能够对其指定区间以及总数进行统计,通常它采集的数据展示为直方图。

例如 Prometheus server 中 prometheus_local_storage_series_chunks_persisted, 表示 Prometheus 中每个时序需要存储的 chunks 数量,我们可以用它计算待持久化的数据的分位数。

Summary

Summary 和 Histogram 类似,由 <basename>{quantile="<φ>"}<basename>_sum<basename>_count 组成,主要用于表示一段时间内数据采样结果(通常是请求持续时间或响应大小),它直接存储了 quantile 数据,而不是根据统计区间计算出来的。

例如 Prometheus server 中 prometheus_target_interval_length_seconds

Histogram vs Summary

  • 都包含 <basename>_sum<basename>_count
  • Histogram 需要通过 <basename>_bucket 计算 quantile, 而 Summary 直接存储了 quantile 的值。

2. Prometheus 安装

2.1 在 centos7上安装

# wget https://github.com/prometheus/prometheus/releases/download/v2.5.0/prometheus-2.5.0.linux-amd64.tar.gz
# tar xf prometheus-2.5.0.linux-amd64.tar.gz
# cp prometheus-2.5.0.linux-amd64/{prometheus,promtool} /usr/local/bin/
# prometheus --version
# cd prometheus-2.5.0.linux-amd64
# cp prometheus.yml prometheus.yml.orig
# mkdir -p /etc/prometheus
# cp prometheus.yml /etc/prometheus/
# promtool check config /etc/prometheus/prometheus.yml
# prometheus --config.file "/etc/prometheus/prometheus.yml"

2.2 通过 Docker 安装

// 通过 docker 安装
# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# docker run -d -p 9090:9090 prom/prometheus
# docker run -d -p 9090:9090 -v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

wget  -O:下载并以指定的文件名保存;

Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定

热配置:

  • curl -X POST http://localdns:9090/-/reload //热载入配置,2.0之后,默认是关闭的,需要 --web.enable-lifecycle参数 开启
  • kill -HUP pid

2.3 Prometheus的配置

global:
  scrape_interval:     15s 
  evaluation_interval: 15s 

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'node'
    static_configs:
    - targets: ['192.168.20.172:9100', '192.168.20.173:9100', '192.168.20.174:9100']
    params:
      collect[]:
        - cpu
        - meminfo
        - diskstats
        - netdev
        - netstat
        - filefd
        - filesystem
        - xfs
        - systemd
  - job_name: 'docker'
    static_configs:
      - targets: ['192.168.20.172:8080', '192.168.20.173:8080', '192.168.20.174:8080']
  • 最关键的配置就是targets,就是web应用的ip和端口
 

Prometheus的启动

  1. 如果安装成功你可以访问 127.0.0.1:9090 查看页面

运行 docker start prometheus 启动服务

运行 docker stats prometheus 查看 prometheus 状态

运行 docker stop prometheus 停止服务

 
参考来源: 
 

https://songjiayang.gitbooks.io/prometheus/introduction/what.html

https://www.ibm.com/developerworks/cn/cloud/library/cl-lo-prometheus-getting-started-and-practice/index.html

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐