在spring1.5x使用micrometer和influxdb时,会引入micrometer-spring-legacy和micrometer-registry-influx两个包,如下maven配置,本文主要介绍下这两个包

1 micrometer-registry-influx

1、作用

核心就在于提供了一个InfluxMeterRegistry。InfluxMeterRegistry作用就是定时发送指标数据到influxdb,所以如果需要修改influxdb的请求URL中sql的格式,可以修改这个类。因为它继承自MeterRegistry所以还具有组成Meter和使用Meter记录指标作用。参考之前写的InfluxdbReporter,就是发送指标数据到influxdb。

  • 注册meter,在什么时候被谁注册?在micrometre-spring-legacy的WebMvcMetricsFilter#filter中
  • 使用meter收集数据,在什么时候被谁调用?在micrometre-spring-legacy的WebMvcMetricsFilter#filter中

2、初始化InfluxMeterRegistry

在初始化时,启动一线程,该线程定时的向influxdb发送指标数据。

2 micrometer-spring-legacy

2.1 收集http request指标

提供了一个WebMvcMetricsFilter过滤器,通过这个过滤器来收集指标。流程如下:

2000418

2.1.1 Filter初始化

如何初始化这个Filter,提供了一个配置类,自动会加重MeterRegistry类型的对象,

2.1.2 收集指标流程

通过WebMvcMetricsFilter的record()操作记录指标

(1)WebMvcTagsProvider负责成tags

在DefaultWebMvcTagsProvider中生成uri、exception、status、method的tags。这些tags的值会组成一个标志Metert的唯一键,假设每一个唯一键对应一个Timer,此时uri、exception、status、method有多少种组合,就有多少个Meter。

在influxdb中查看tags

(2)创建Timer

Timer#Registry根据Tags 来生成一个Timer。一组Tag标识一个Timer,如Influxdb中就是一个Seriries就对应一个Timer,如下对应四个Timer。

在MeterRegistry中保存了Meter集合,如下

对于Id的hash值是由name和tags的组合而成,如下

(3)使用Timer记录指标

如上面的“timingContext.timerSample.stop(xxx)”的stop方法

2.2 收集Tomcat指标

2.2.1 初始化

通过@Configuration来加载

2.3 保存指标

支持不同监控系统来保存指标,如Influx/Ganglie/Grahite等系统,在如下包中来通过自动化配置类来初始化对应的MeterRegtry,如对于influxdb,就是通过InfluxMetricsExportAutoConfiguration 配置类初始化InfluxMeterRegtry对象。

50483251

这里以influxdb为例

这里存在一个问题:当引入多个micrometer-registry-xx多个监控系统时,在初始化WebMetricsFilter时,注册哪一个MetrRegry???

如下代码,micrometer-spring-legacy会首先加载CompositMeterRegstry,其他监控系统的MeterRegry都会注册到CompositMeterRegestry.

2.4 收集那些指标

如查看Influxdb中收集的Micrometer指标信息,如下。

目前只介绍了Http Request和Tomcat 的监控信息,对于JVM、DataSoruce、System等信息是如何收集的??通过MeteRegistryPostProcessor来加载micrometer-core中MeterBinder的类,如下:

3 应用-支持Http Request指标的扩展信息

如需要对一个Request增加IP、每一个请求的信息(错误码、耗时等)等指标信息,分为Tag字段和非Tag字段两种类型。

72388524

目前的micrometer-spring-legacy和micrometer-registry-influx是无法支持的,需要自定义开发来实现。

3.1 Tag类型

需要新增一个IP和Env信息,记录这个请求的 Ip和环境,方便后续统计,如统计流量分布情况。这些信息需要作为tag类型。

1、重写DefaultWebMvcTagsProvider类

3.2 非Tag类型

如需要新增一个url_extend字段,类型是String类型的,里面存放每一个请求的耗时、LogId、错误码等信息,例如格式可以为“耗时1_LogID1_错误码1;耗时2_LogId2_错误2″。

对于Influx的Filed类型的值,都是保存在StepTimer中,所以此时需要自定义一个StepTimer来增加这个扩展字段,如下:

在StepTimer中都是记录的StepLong的值,此时在这个自定义的Timer中需要一个String类型字段,所以参考StepLong自定义了StepString。如下:

3.3 重写InfluxMeterRetry

InfluxMeterRetry负责把指标数据输出到Influxdb,所以新增了字段,无论是tag类型或者非tag类型,都需要重写InfluxMeterRetry,来修改拼接调用influxdb的url的参数。

1、需要重写writeTimer方法来来修改拼接调用influxdb的url的参数。

上面的Filed也是需要修改的,目前Influxdb都支持long的值,如果需要支持string,还需要修改下Filed中value的类型为String类型。

2、在新增非Tag类型实现了一个Timer时,还需要重写InfluxMeterRestry中

3.3 重新定义WebMvcMetricsFilter

如何指定使用自定义MvcTagsProvider类或者自定义InfluxMeterRegestry?此时需要实现一个WebMvcMetricsFilter,这是为了替换如下WebMvcTagsProvider类

(全文完)

分类&标签