目录
时序 4 种类型:Counter, Gauge, Histogram, Summary
1. Prometheus介绍
1.1 什么是监控
从技术角度看,监控是度量和管理技术系统的工具和过程。但远不止于此,监控提供从系统和应用程序生成的指
标到业务价值的转换。这些指标转换为用户体验的度量,为业务提供反馈,同样还向技术提供反馈,指示业务的工作状态以及持续改进。
监控系统主要有两个客户:
• 技术: 技术团队,开发环境等
• 业务:公司生产环境,帮助业务的持续交付等
(1)监控原理
监控
监控不应该:
• 事后监控
• 监控的不完整
• 不正确的监控
• 静态监控
• 监测不够频繁
• 没有自动化
良好的监测应提供:
• 整个世界的状态,从上到下。
• 协助故障诊断。
• 基础架构、应用程序开发和业务人员的信息源。
它应该是:
• 内置于应用程序开发和部署的设计和生命
• 在可能的情况下,自动提供自助服务。
(2)监控机制
应用程序监控有两种方法:
• 探测
• 自省
执行监控也有两种方法:
• 推
• 拉
监测数据的类型主要有两种:
• Metrics
• Logs
(3) Metric(度量)
度量是对软件或硬件组件属性的度量。为了使度量有用,我们跟踪它的状态,通常随时间记录数据点。这些数
据点称为观测值。观察由值、时间戳以及有时描述观察的一系列属性(如源或标记)组成。观测的集合称为时间
序列。
Metric(度量)
度量的类型
• 仪表(Gauges)
• 计数器(Counters)
• 直方图
度量的类型
度量的类型-直方图
度量总结
通常,单个指标的值对我们来说并不有用。相反, 度量的可视化需要对其应用数学变换。例如,我们可以将统
计函数应用到我们的度量或度量组中。我们可以应用的一些常见功能包括:
- • 计数或n -计数在特定时间间隔内的观测次数。
- • Sum - To - Sum是在特定的时间间隔内将所有观测值相加。
- • 平均值— 提供特定时间间隔内所有值的平均值。
- • 中值——中值是我们的值的死中心:正好50%的值低于它, 50%高于它。
- • 百分比——测量一组观测中某一特定百分比下降的值。
- • 标准差-表示我们度量的分布中与均值的标准差。这测量了数据集中的变化。 0的标准差意味着分布等于数
- • 据的平均值。较高的偏差意味着数据分布在一系列值上。
- • 变化率——变化率表示时间序列中数据之间的变化程度。
(4)通知和警报
通知和警报的区别
良好的通知和警报系统,应考虑的问题:
• 通知什么问题
• 谁来通知 altermanager
• 如何通知。 sms , email,wechart, dingding
• 通知间隔
• 什么时候停止
1.2 Prometheus 介绍
(1) Prometheus由来
普罗米修斯的灵感来自于谷歌的Borgmon。它最初是由马特·t·普劳德(Matt T. Proud)作为一个研究项目开发的,普劳
德曾是谷歌(google)的一名雇员。在普劳德加入SoundCloud之后,他与另一位工程师朱利叶斯•沃尔兹(Julius Volz)合作,
认真开发普罗米修斯。其他开发人员也参与了这项工作,并继续在SoundCloud内部进行开发,最终于2015年1月公开
发布。
Prometheus的主要特点
Prometheus的核心组件
- Prometheus Server: 用于收集和存储时间序列数据。
- Client Library: 客户端库,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server。当 Prometheus server 来 pull 时,直接返回实时状态的 metrics。
- Push Gateway: 主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics。这种方式主要用于服务层面的 metrics,对于机器层面的 metrices,需要使用 node exporter。
- Exporters: 用于暴露已有的第三方服务的 metrics 给 Prometheus。
- Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。常见的接收方式有:电子邮件,pagerduty,OpsGenie, webhook 等。
- 一些其他的工具。
Prometheus的架构图
Prometheus的架构图
Prometheus的架构图-高可用
从上图可以看出,Prometheus 的主要模块包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及图形界面。
其大概的工作流程是:
- Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics。
- Prometheus server 在本地存储收集到的 metrics(如果使用 remote storage 将持久化到云端),并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。
- Alertmanager 根据配置文件,聚合,去重,降噪,对接收到的警报进行处理,发出告警。
- 在图形界面中,可视化采集数据(可以使用 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 种类型:Counter, Gauge, Histogram, Summary
Prometheus 时序数据分为 Counter, Gauge, Histogram, Summary 四种类型。
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的启动
- 如果安装成功你可以访问
127.0.0.1:9090
查看页面
运行
docker start prometheus
启动服务运行
docker stats prometheus
查看 prometheus 状态运行
docker stop prometheus
停止服务
参考来源:
https://songjiayang.gitbooks.io/prometheus/introduction/what.html