龙空技术网

Prometheus 入门(上)

K8SMeetup中国 292

前言:

此刻小伙伴们对“ubuntu1404摄像头liv”大致比较关心,小伙伴们都想要分析一些“ubuntu1404摄像头liv”的相关知识。那么小编在网上汇集了一些关于“ubuntu1404摄像头liv””的相关资讯,希望各位老铁们能喜欢,看官们一起来学习一下吧!

随着容器技术的迅速发展,Kubernetes 已然成为大家追捧的容器集群管理系统。Prometheus 作为生态圈 Cloud Native Computing Foundation(简称:CNCF)中的重要一员,其活跃度仅次于 Kubernetes,现已广泛用于 Kubernetes 集群的监控系统中。本文将简要介绍 Prometheus 的组成和相关概念,并实例演示 Prometheus 的安装,配置及使用,以便开发人员和云平台运维人员可以快速的掌握 Prometheus。

Prometheus 简介

Prometheus 是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 Google 前员工在 2012 年创建,作为社区开源项目进行开发,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成为受欢迎度仅次于 Kubernetes 的项目。

作为新一代的监控框架,Prometheus 具有以下特点:

强大的多维度数据模型:时间序列数据通过 metric 名和键值对来区分。所有的 metrics 都可以设置任意的多维标签。数据模型更随意,不需要刻意设置为以点分隔的字符串。可以对数据模型进行聚合,切割和切片操作。支持双精度浮点类型,标签可以设为全 unicode。灵活而强大的查询语句(PromQL):在同一个查询语句,可以对多个 metrics 进行乘法、加法、连接、取分数位等操作。易于管理: Prometheus server 是一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。高效:平均每个采样点仅占 3.5 bytes,且一个 Prometheus server 可以处理数百万的 metrics。使用 pull 模式采集时间序列数据,这样不仅有利于本机测试而且可以避免有问题的服务器推送坏的 metrics。可以采用 push gateway 的方式把时间序列数据推送至 Prometheus server 端。可以通过服务发现或者静态配置去获取监控的 targets。有多种可视化图形界面。易于伸缩。

需要指出的是,由于数据采集可能会有丢失,所以 Prometheus 不适用对采集数据要 100% 准确的情形。但如果用于记录时间序列数据,Prometheus 具有很大的查询优势,此外,Prometheus 适用于微服务的体系架构。

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 等。

一些其他的工具。

图 1 为 Prometheus 官方文档中的架构图:

图 1. Prometheus 架构图

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

其大概的工作流程是:

Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metricsPrometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。在图形界面中,可视化采集数据。Prometheus 相关概念

下面将对 Prometheus 中的数据模型,metric 类型以及 instance 和 job 等概念进行介绍,以便读者在 Prometheus 的配置和使用中可以有一个更好的理解。

数据模型

Prometheus 中存储的数据为时间序列,是由 metric 的名字和一系列的标签(键值对)唯一标识的,不同的标签则代表不同的时间序列。

metric 名字:该名字应该具有语义,一般用于表示 metric 的功能,例如:http_requests_total, 表示 http 请求的总数。其中,metric 名字由 ASCII 字符,数字,下划线,以及冒号组成,且必须满足正则表达式 [a-zA-Z_:][a-zA-Z0-9_:]*。标签:使同一个时间序列有了不同维度的识别。例如 http_requests_total{method="Get"} 表示所有 http 请求中的 Get 请求。当 method="post" 时,则为新的一个 metric。标签中的键由 ASCII 字符,数字,以及下划线组成,且必须满足正则表达式 [a-zA-Z_:][a-zA-Z0-9_:]*。样本:实际的时间序列,每个序列包括一个 float64 的值和一个毫秒级的时间戳。格式:{=, …},例如:http_requests_total{method="POST",endpoint="/api/tracks"}。

四种 Metric 类型

Prometheus 客户端库主要提供四种主要的 metric 类型:

Counter

一种累加的 metric,典型的应用如:请求的个数,结束的任务数, 出现的错误数等等。

例如,查询 http_requests_total{method="get", job="Prometheus", handler="query"} 返回 8,10 秒后,再次查询,则返回 14。

Gauge

一种常规的 metric,典型的应用如:温度,运行的 goroutines 的个数。可以任意加减。

例如:go_goroutines{instance="172.17.0.2", job="Prometheus"} 返回值 147,10 秒后返回 124。

Histogram

可以理解为柱状图,典型的应用如:请求持续时间,响应大小。

可以对观察结果采样,分组及统计。

例如,查询 http_request_duration_microseconds_sum{job="Prometheus", handler="query"} 时,返回结果如下:

图 2. Histogram metric 返回结果图

Summary

类似于 Histogram,典型的应用如:请求持续时间,响应大小。提供观测值的 count 和 sum 功能。提供百分位的功能,即可以按百分比划分跟踪结果。

instance 和 jobs

instance:一个单独 scrape 的目标, 一般对应于一个进程。jobs:一组同种类型的 instances(主要用于保证可扩展性和可靠性),例如:

清单 1. job 和 instance 的关系

当 scrape 目标时,Prometheus 会自动给这个 scrape 的时间序列附加一些标签以便更好的分别,例如: instance,job。

下面以实际的 metric 为例,对上述概念进行说明。

图 3. Metrics 示例

如上图所示,这三个 metric 的名字都一样,他们仅凭 handler 不同而被标识为不同的 metrics。这类 metrics 只会向上累加,是属于 Counter 类型的 metric,且 metrics 中都含有 instance 和 job 这两个标签。

Node exporter 安装

为了更好的演示 Prometheus 从配置,到监控,到报警的功能,本实例将引入本机 ubuntu server 的监控。由于 Prometheus 主要用于监控 web 服务,如果需要监控 ubuntu server,则需要在本机上安装 node exporter。 Node exporter 主要用于暴露 metrics 给 Prometheus,其中 metrics 包括:cpu 的负载,内存的使用情况,网络等。

安装 node export 首先需要从 github 中下载最新的 node exporter 包,放在指定的目录并解压安装包,在本实例中,放在 /home/lilly/prom/exporters/ 中。

清单 2. 安装 Node exporte

cd /home/lilly/prom/exporters/

wget

tar -xvzf node_exporter-0.14.0.linux-amd64.tar.gz

为了更好的启动和停止 node exporter,可以把 node exporter 转换为一个服务。

清单 3. 配置 node exporter 为服务

vim /etc/init/node_exporter.conf #Prometheus Node Exporter Upstart script start on startup script /home/lilly/prom/exporters/node_exporter/node_exporter end script

此时,node exporter 已经是一个服务,可以直接用 service 命令进行启停和查看。

清单 4. 查看 node exporter 状态

root@ubuntu1404-dev:~/alertmanager# service node_exporter startnode_exporter start/running, process 11017root@ubuntu1404-dev:~/alertmanager# service node_exporter statusnode_exporter start/running, process 11017此时,node exporter 已经监听在 9100 端口。root@ubuntu1404-dev:~/prom# netstat -anp | grep 9100tcp6 0 0 :::9100 :::* LISTEN 155/node_exporter

当 node exporter 启动时,可以通过 curl 或者在浏览器中查看 ubuntu server 里面的 metrics,部分 metrics 信息如下:

清单 5. 验证 node exporter

root@ubuntu1404-dev:~/prom# curl ……# HELP node_cpu Seconds the cpus spent in each mode.# TYPE node_cpu counternode_cpu{cpu="cpu0",mode="guest"} 0node_cpu{cpu="cpu0",mode="idle"} 30.02node_cpu{cpu="cpu0",mode="iowait"} 0.5node_cpu{cpu="cpu0",mode="irq"} 0node_cpu{cpu="cpu0",mode="nice"} 0node_cpu{cpu="cpu0",mode="softirq"} 0.34node_cpu{cpu="cpu0",mode="steal"} 0node_cpu{cpu="cpu0",mode="system"} 5.38node_cpu{cpu="cpu0",mode="user"} 11.34# HELP node_disk_bytes_read The total number of bytes read successfully.# TYPE node_disk_bytes_read counternode_disk_bytes_read{device="sda"} 5.50009856e+08node_disk_bytes_read{device="sr0"} 67584# HELP node_disk_bytes_written The total number of bytes written successfully.# TYPE node_disk_bytes_written counternode_disk_bytes_written{device="sda"} 2.0160512e+07node_disk_bytes_written{device="sr0"} 0# HELP node_disk_io_now The number of I/Os currently in progress.# TYPE node_disk_io_now gaugenode_disk_io_now{device="sda"} 0node_disk_io_now{device="sr0"} 0# HELP node_disk_io_time_ms Total Milliseconds spent doing I/Os.# TYPE node_disk_io_time_ms counternode_disk_io_time_ms{device="sda"} 3484node_disk_io_time_ms{device="sr0"} 12……# HELP node_memory_MemAvailable Memory information field MemAvailable.# TYPE node_memory_MemAvailable gaugenode_memory_MemAvailable 1.373270016e+09# HELP node_memory_MemFree Memory information field MemFree.# TYPE node_memory_MemFree gaugenode_memory_MemFree 9.2403712e+08# HELP node_memory_MemTotal Memory information field MemTotal.# TYPE node_memory_MemTotal gaugenode_memory_MemTotal 2.098388992e+09……# HELP node_network_receive_drop Network device statistic receive_drop.# TYPE node_network_receive_drop gaugenode_network_receive_drop{device="docker0"} 0node_network_receive_drop{device="eth0"} 0node_network_receive_drop{device="eth1"} 0node_network_receive_drop{device="lo"} 0

标签: #ubuntu1404摄像头liv