实践指路明灯,源码剖析flink-metrics
1.
通过上期的分享,我们对 Metrics 类库有了较深入的认识,并对指标监控的几个度量类型了如指掌。
本期,我们将走进当下最火的流式处理框架 flink 的源码,一同深入并学习一下别人家的代码。
2.
会当凌绝顶,一览众山小。先从全局了解个梗概,然后再采用剥洋葱的方式逐层去解密。
我本地的源码是 flink-1.8.1 版本,打开源码,进入 flink-metrics 模块,发现很多以 flink-metrics-开头的系列模块。
映入眼帘的 flink-metrics 系列模块虽然很多,不用发愁。其实主要分为指标监控基础核心模块(flink-metrics-core),以及指标数据监控组件集成模块(flink-metrics-xxx)两大类。
2.1.
flink-metrics-core 模块剖析。
开篇提到 Metrics 的几种度量类型,来看看 flink 是咋定义的?
打开指标监控基础核心模块 flink-metrics-core 看个梗概。
不出我们所料,flink 定义了 Metrics 监控中常见的几种度量规范(Meter、Gauge、Counter、Histogram),画个简易的类图再看的明白些。
不过为了便于管理和区分 Metric,于是就有了 MetricGroup 的定义,那么编码时可以直接与 MetricGroup 交互就可以啦。
到这,了解了全局,不妨采用剥洋葱的方式,再去看看每个接口定义的都是啥规范?逐一进行解密。
Meter 定义 getRate() 方法,用于统计系统中某一个事件的速率,定义 getCount() 方法,用于系统中事件的计数统计。
Gauge 是最简单的度量指标,只有一个简单的返回值,定义 getValue() 方法,用来获取一些对象或者事物的瞬时值。
Counter 累计型的度量指标,定义 inc() 累加方法,以及 dec() 累减等方法。
Histogram 是一种非常常见的统计图表,统计数据的分布情况,其中定义的 getStatistics() 方法,提供了最小值,最大值,中间值等对应的计算支撑。
其中 HistogramStatistics 定义如下。
指标对外披露,flink 是咋定义的?
是否还记得上期的分享中,如何把指标数据披露出去的?没错,那就是有一系列的 Reporter 来完成的事情,接下来看看 flink 有没有类似的规范定义呢?
也是没出我们所料,flink 定义了专门用于指标报告的规范,画个简易的类图,从全局上稍微看的明白些。
如上图示意,flink 定义了 MetricReporter 用于规定指标披露规范,其中 AbstractReporter 提供了 MetricReporter 接口的简单的实现。Scheduled 接口用于定义数据披露方案,提供定期性的披露当前数据的支持。
那么,不妨采取剥洋葱的方式,逐个再去看看都是啥,能意会就行啦。
MetricReporter 是 flink 定义的指标披露的接口规范,方法名字其实已经很明确啦,再解说一二。其中 open() 方法主要用于初始化相关操作;close() 主要是关闭 Reporter,用于释放资源;notifyOfAddedMetric()/notifyOfRemovedMetric() 定义新指标注册以及指标删除时通知。
如上图示意,AbstractReporter 抽象类实现了接口 MetricReporter,并拥有 gauges、counters、histograms、meters 四个度量类型的 Map 容器,并对接口 MetricReporter 中定义的 notifyOfAddedMetric()/notifyOfRemovedMetric() 提供了简单实现。
Scheduled 接口很简单,定义了 report() 方法,用于定期披露当前指标数据。
上面对 flink-metrics-core 指标监控核心定义模块,有了初步的认识,那么看看这些规范到底是怎么用的?
2.2.
flink-metrics-prometheus 模块剖析。
从全局上了解个梗概,画个简易的类图,稍微看的更清晰。
很显然,针对 Prometheus 做了支撑,没有使用 flink-metrics-core 包中的 AbstractReporter 类,而是对 MetricReporter 进行了单独实现,不妨我们去看个梗概。
见名知意,AbstractPrometheusReporter 是对 Prometheus 轮子单独定义的,实现了 MetricReporter 接口定义的方法,肯定少不了去迎合 Prometheus 的代码,摘取部分核心代码剖析一下。
如上图所示,notifyOfAddedMetric() 方法主要按照 Prometheus 的规范进行封装成 io.prometheus.client.Collector,以及调用 Prometheus 提供的方法对 Metric 进行转换封装(说白了,就是按照 Prometheus 的规范进行转换,不懂也没关系,因为每个轮子的实现均不同)。
再去看 AbstractPrometheusReporter 实现类 PrometheusPushGatewayReporter 的源码之前,不妨先扒拉出以往分享 Prometheus 实战中的一张图,解说一二。
如图示意,要完成数据源层的 AppService 的指标监控,需要对应用纳入一个 Client lib 来支撑指标产生、输出,然后通过 push 的形式,主动推送数据到 PushGateway,然后 Prometheus Server 会定期性的从 PushGateway 上拉取指标数据。
知道了流程,我们再去看 flink-metrics-prometheus 的源码,可能会更清晰。
如源码所示,PrometheusPushGatewayReporter 类持有 PushGateway 的引用,进而可以使用 Prometheus 提供的 API 进行 push 数据,以及创建连接和释放资源。
代码很简单,open() 方法主要读取配置文件,进行实例化 PushGateway;report() 方法会调用 PushGateway 提供的 push 方法进行推送数据;close() 方法主要用于释放资源,从 PushGateway 上把 jobName 对应的 metrics 删除。
如果你一直追随一猿小讲的脚步的话,那么会想起之前 flink 监控实践的一段配置,结合上段代码,再去看这段配置,就知道这个配置咋回事啦。
搞定了监控数据如何披露出去的,唯独有一点,还是没有搞明白?那就是 PrometheusPushGatewayReporter 什么时候实例化的呢?也就是流程怎么串起来的呢?
2.3.
flink-runtime 模块中部分代码剖析。
首先找到flink-runtime 目录下的 metrics 包中的 org.apache.flink.runtime.metrics.MetricRegistryImpl 一探究竟。
截图为 MetricRegistryImpl 构造方法的部分代码,其中标注 1 代码,主要是依据配置内容,构建配置的 Reporter 对象;标注 2 的代码,调用其 open() 方法,完成初始化动作;标注 3 的代码,主要是判断 Reporter 对象有没有实现 Scheduled 接口,如果实现了,则会通过 executor 进行定期调用 reporter.report() 方法进行报送数据。
了解到指标数据如何对外披露,但是 Metric 在哪儿添加的呢?
我们知道 MetricGroup 设计的目的,是为了方便对 Metric 管理,而 AbstractMetricGroup 则对添加 Metric 等相关方法进行了定义实现。
如图示标注 2 代码,AbstractMetricGroup 类中会调用 registry.register(metric, name, this) 完成指标的注册添加,进而会调用 MetricRegistryImpl 的 register 方法。
如图中标注 2 代码,会调用对应的 Reporter 的 notifyOfAddedMetric() 方法完成添加指标通知。
此时,代码懵懵懂,再去看以往实战的效果图(Granfna 展示 flink-metrics)的背后,脑海里应该会清晰不少。
3.
flink-metrics 源码剖析就到这儿,flink 与 prometheus 监控集成剖析也刨到这儿,其实 flink-metrics 与其它轮子集成也是这么一回事儿,掌握脉略就行了。
另外,flink 作为当下最流行的开源流式处理框架,那么 flink 定义的指标度量接口规范,势必会对我们应用监控有建设性的参考意义。
好了,本次分享就到这儿,希望你们能够喜欢。
实践指路明灯,源码剖析flink-metrics的更多相关文章
- Flink源码剖析:Jar包任务提交流程
Flink基于用户程序生成JobGraph,提交到集群进行分布式部署运行.本篇从源码角度讲解一下Flink Jar包是如何被提交到集群的.(本文源码基于Flink 1.11.3) 1 Flink ru ...
- 别人家的 InfluxDB 实战 + 源码剖析
1. 前几次的分享,我们多次提到了下图中 Metrics 指标监控的 Prometheus.Grafana,而且 get 到了 influxdata 旗下的 InfluxDB 的入门技能. 本次,我们 ...
- Flink 源码解析 —— Flink JobManager 有什么作用?
JobManager 的作用 https://t.zsxq.com/2VRrbuf 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac ...
- Flink 源码解析 —— Flink TaskManager 有什么作用?
TaskManager 有什么作用 https://t.zsxq.com/RZbu7yN 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- ...
- Apache Spark源码剖析
Apache Spark源码剖析(全面系统介绍Spark源码,提供分析源码的实用技巧和合理的阅读顺序,充分了解Spark的设计思想和运行机理) 许鹏 著 ISBN 978-7-121-25420- ...
- 《Apache Spark源码剖析》
Spark Contributor,Databricks工程师连城,华为大数据平台开发部部长陈亮,网易杭州研究院副院长汪源,TalkingData首席数据科学家张夏天联袂力荐1.本书全面.系统地介绍了 ...
- (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)
本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...
- Spark源码剖析 - SparkContext的初始化(二)_创建执行环境SparkEnv
2. 创建执行环境SparkEnv SparkEnv是Spark的执行环境对象,其中包括众多与Executor执行相关的对象.由于在local模式下Driver会创建Executor,local-cl ...
- Netty 源码剖析之 unSafe.write 方法
前言 在 Netty 源码剖析之 unSafe.read 方法 一文中,我们研究了 read 方法的实现,这是读取内容到容器,再看看 Netty 是如何将内容从容器输出 Channel 的吧. 1. ...
随机推荐
- Java堆内存是线程共享的!面试官:你确定吗?
Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点,所以,即使是一个Java的初学者,也一定或多或少的对JVM有一些了解.可以说,关于JVM的相关知识,基本是每个Java开发者 ...
- iview 踩坑之旅
公司重构管理系统,框架定了vue,UI在element和iview之间选,element样式被吐槽丑,于是选了iview,但是,,这个坑多啊... 废话少说,罗列了iview中容易出错或者懵逼的一些地 ...
- CVPR 2020 全部论文 分类汇总和打包下载
CVPR 2020 共收录 1470篇文章,根据当前的公布情况,人工智能学社整理了以下约100篇,分享给读者. 代码开源情况:详见每篇注释,当前共15篇开源.(持续更新中,可关注了解). 算法主要领域 ...
- RPA如何跑赢传统自动化和人工?
过去的4年时间里,RPA(机器人流程自动化)一词,在Gartner的搜索引擎中一直排名前五.去年Gartner发表的调查数据中显示,RPA行业在2018年保持了60%以上的增长速度,从而成为全球增长最 ...
- c#序列化和反系列化json与类型对象转换
先添加程序集: System.Web.Extensions(在 System.Web.Extensions.dll 中) 引用:using System.Web.Script.Serializati ...
- ipadmini iOS8.4.1系统精简
主要是删除一些系统自带的应用.语言,以及关闭不需要的进程. 精简之后运行流畅性还是能看得出有所提升的.(流畅的玩点游戏还是可行的) 文件的操作可以用Filza.iFile,也可以用爱思助手,但是爱思助 ...
- Jmeter——如何使得token在各线程组间引用的游刃有余
在以前的博文中,有介绍过,jmeter基本的关联,关联就是将参数在各接口中动态传参,使得接口脚本变得灵活使用,非一次性脚本.今天再来介绍一种jmeter全局变量的设置与使用,可以让脚本运用更丰富,场景 ...
- Openstack计算Nova组件
欢迎来到虚拟机的世界,如果我们将Openstack环境里运行在各个无力节点上的各种服务看座生命体,而不是死的指令集合,那么就是一个虚拟机的世界. Openstack的计算组件,也就是Nova项目实现了 ...
- Jmeter中使用MD5方法
在现在这家公司做测试的项目有用到鉴权,token的生成方式有使用到md5,具体的请求url和入参就不方便透露,讲一讲使用方法吧! 自带的Jmeter插件中是没有这个md5的所以,我们可以 (1)打开选 ...
- Oracle 中文日期转换
中文日期转换 select to_char(to_date('07-5月-17'),'yyyy-MM-dd HH24:mi:ss') from dual