开发者学堂课程【3天吃透 Prometheus:Prometheus 基础】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1244/detail/18453
Prometheus 基础
四、资源发现
Node 资源发现
在资源发现时,node role 会依次检索节点规范上的 NodeIneternalIP、NodeExternalIP、NodeLegacyHostIP 和 NodeHostName 字段,并将发现的第一个地址作为目标地址,因为只有一个 address。这是从前往后的、依次的,也就是说一旦发现了一个地址就不会再进行下去了。只要找到了了一个,就将其作为对应的 address。
Prometheus Server 的数据抓取工作于 Pull 模型,因而,它必须事先知道 target 的位置,然后才能从相应的 exporter 或 instrumentation 中抓取数据。对于小型的系统环境而言,静态配置即可完成。但显然,对于大型的系统环境而言,必须要进行服务发现。进行服务服务发现后,实现指标抓取有生命周期。
指标抓取的生命周期
真正配置好让 Prometheus 基于服务发现去发现各个 target 时,大概有这样几个步骤。第一,先进行服务发现,而后执行配置,接着可以对发现的每一个 target 重新打标,因为每一个 target 都有一个标签,而每一个 target 至少有三个非常重要的标签,第一,address,用来记录当前 target 的地址和端口,第二,metric path,在这个地址和端口下的哪个路径下基于 http 协议来抓取指标,第三,scheme,定义是使用 http 还是 https 协议。
但基于不同的服务发现机制,它所提供给的元标签都是以 meta 开头的可能不尽相同。Kuberntes、consul 和基于文件的服务发现是不相同的。接着,正常情况下,一旦发现 target 之后,可以在 target 对应的指标在存到 Prometheus 内部之前先去更改标签,叫做重新打标。改完之后,就可以把 target 自身配置到 Prometheus 之上作为抓取指标的对象,而后,就可以周期性的抓取指标数据。每一个 target 上可能会有多个指标,每一个指标可能会生成多个时间序列。因此,就会有很多很多时间序列,而每一个时间序列都应该有指标名,加上标签集进行标识,而这里的标签也可以使用 metric relable 被重新打标。正常情况下,指标抓取的生命周期大概分为这五个阶段,第一,Prometheus 一启动,开始基于服务发现机制去发现每一个 target,所以,它会返回一个 target 列表,其中包含一组称为元数据的标签,这些标签都以 -meta- 为前缀,同时还会返回 scheme、address、metric-path。随后,这些标签都会附加的 target 之上,为了便于用户使用可以对这些默认的标签集删改一部分等等相关操作,这个功能就叫做重新标记。
而这个重新标记,在 up 的指标之下,每一个 target 都会有一个对应的时间序列,可以想象成这就是对应的每一个 target 的标签集。我们可以对这个标签集进行修改。修改前要在 target 上进行查看,而蓝色为底色的是修改后的标签集,这个标签可以使用 up 指标进行显示。每一个 target 都有一个叫做 up 时间序列,而 up 上的标签集就是 target 的标签集,而这个标签集可能是被重新打标过的。在 Prometheus 的配置文件当中,有一个重要的配置参数 relabel configs,它允许进行打标。接着,打标完成后,就可以执行对应的 target 的指标抓取,up 可以算得上是 target 自己的指标了,至于其他的,都是 target 之上的内部输出的其他指标。比如对于第一个 node 而言,访问它的网址172.29.1.11:9100/metrics,这里指标特别多,up 只是其中一个,认为 up 属于 target,剩余的都属于当前 target 的所有指标。
所以,up 是在发现 target 之后就直接被使用的。余下,就是抓取过程。抓取了一个就保存为时间序列,而每一个时间序列也会有它的标签集。要使用 metric relable configs 进行重新打标。
可以通过操作标签集或重新打标从而删除不必要的指标,从那个指标中删除敏感或不需要的标签,添加、编辑或修改指标的标签集或标签格式。这些都可以在对应的改 target 的标签集或 target 之上抓取到的所有指标的标签集都是允许的。其实,对应的重新打标的过程是相当复杂的。使用 Prometheus 而言,重新打标是一个至关重要的功能。
Pod 资源发现
Node role 会输出以下几个元标签,pod role 负责发现 Kubernetes 集群上所有的 pod,有些 pod 不想监控或者有些 pod 有敏感性给它移除,也可以通过重新打标来实现。但正常情况下,会输出这么多元标签,每一个 pod 所属的名称空间,pod 自己的名称、ID、标签注解信息等等,都会通过标签输出给 Prometheus 使用,或者传递给 Prometheus 使用。
Service 资源发现
Service 资源也有大量的元标签,以便于将 service 上的元数据传递给 Prometheus 使用。
Endpoint 资源发现
对 endpoint 而言,它也有自己的 endpoint role,也有自己的元标签,并且其元标签还有两种不同的定义方式。
Ingress 资源发现
Ingress 也可以作为 target,ingress 是正常将集群外部流量引入到集群内部的非常重要的组件,称之为北向流量。
基于 Kubernetes 发现机制的部分配置参数
配置 Prometheus 之上告诉 Kubernetes 的API server 在哪,它可以访问 API server,从 API server 当中去加载各个 node、ingress 的信息。在作为 target 使用之前,可以基于传递过来的元标签去附加一些标签到 target 之上,而后在 pot、ingress 或者 services 之上所抓取的每一个指标序列也可以去修改它们对应的标签集中的标签,从而达到删除某个指标改变某个指标的时间序列,或者更改标签集等功能。
五、对 target 重新打标
正常情况下,每一个 target 上的 metric 会输出很多指标,每一个指标都会被 Prometheus 默认抓取,但有一些是没有用的,我们可以选择不存储这个指标或者时间序列,这可以通过重新打标来实现。如果想修改标签集,因为其标签集输出了一些敏感信息,不想给它记录到 Prometheus,也可以通过重新打标来实现。重新打标是在 job 上进行定义的。也可以通过重新打标来给对应的 target 所处的环境位置、top 结构等等分类,便于展示时基于某些标签过滤出这些指标,分租、分地理环境、分 top 结构进行展示,等等。这些功能对我们而言非常重要。所以,重新打标对使用 Prometheus 而言,是一个非常重要的功能。
六、如何为 Prometheus 添加图形界面
图形界面叫做 grafana,要想安装 grafana,直接通过镜像站点下载即可。可以使用 yum install 去安装 grafana。注意,grafana 有很多依赖关系。使用 systemctl 去 start grafana 即可,在 start 之前,可以使用 rpm-ql 看一下 grafana 安装配置所生成的文件,配置文件应该在 etc 的 grafana 目录下,其中,grafana.ini 是其主配置文件,指明了监听地址、端口之类的。现在监听的端口和地址是默认监听的3000端口上,来访问3000端口对应的服务,输入 网址172.29.1.11:3000,就可以进入 grafana 的界面,默认用户名和密码都是 admire。
Grafana 默认支持各种各样的数据源,通过 Prometheus 的 promQL 去获取时间序列并展示为图形。事实上,安装完 grafana 之后,最重要的是对接到 Prometheus 之上。
添加 data source 指定为 Prometheus,选择 Prometheus 地址和端口172.29.1.11:9090。server 模式取名为 Prometheus,使用测一下,显示为绿色,则表示测试完成,没有任何问题。接着,内置的面板可以安装或者导入进来。比如,Prometheus 2.0 stats,grafana 的 metrics 就可以生成几个面板。回到 grafana,找到 Dashboard,其中某些 Dashboard 就是导入进来来的。
Dashboard 能够查询 Prometheus 使用 promQL 来生成一些图像。以 Prometheus 2.0 stats 为例,显示了 Prometheus 对应的 server 的指标数据。
选择
Edit,sum(irate(prometheus-tsdb-head-samples-appended-total{job=”prometheus”
{5m})) 其实就是一个 promQL 的语句。基于这样一个标签和指标数据去过滤时间序列,取5分钟之内的样本,所以这是一个范围向量或者区间向量。对于这个向量中的数据,对区间向量中的样本值做速率运算,选择 irate 做速率运算。而速率运算后的结果,再求一个和,这其实就是 promQL 的基本语句。如果自己想去建一个面板,方法是一样的,选择一个图形的形式,写下查询语句,就能正常的获取数据了。基于 Prometheus 的默认数据源,获取数据,正常情况下,Prometheus 访问,就有对应的数据,能够进行显示,apply 来一下,生成图形。
而后可以对它做一些处理,因为它是 total 的数据,我们要把它转换成速率格式才更合适。
因此,我们可以取到的区间,比如一个小时内的数据,对其作速率计算,再 apply 一下。也可以过滤一些特定的时间序列,比如说去找那些响应码不是200的,因此,指定 code 标签≠200来获取,就可以看到 Prometheus 正常响应码不是200的有哪些。
能够检测到 Prometheus 之上大概过去一个小时内非正常相应的数据形成图像。
更重要的是,语句也可以保留下来,保留下来之后,每一次展示都是查询的结果。事实上,grafana 默认提供了很多 dshboard,可以下载或者导入。
针对 Prometheus 数据源去搜索相关的面板,copy ID就可以成功导入到 Dashboard,导入进来后,可以指定放在哪个分类下。只要有对应的数据,就可以使用展示,要想学好 promQL 如何写,点击 idit,可以看到每一个语句。