博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go-metrics源码分析
阅读量:4030 次
发布时间:2019-05-24

本文共 2526 字,大约阅读时间需要 8 分钟。

本文公众号文章链接:

本文csdn博客文章链接:

 

 

go-metrics是一个go语言的metrics库。其README中说的为:This library provides a metrics package which can be used to instrument code, expose application metrics, and profile runtime performance in a flexible manner.

 

如果不了解说明是metrics的,可以自行去网上搜索看下。

源码目录为

 

 

README中的说明:

通过MetricsSink接口提供了如下库。

  • StatsiteSink : Sinks to a statsite instance (TCP)

  • StatsdSink: Sinks to a StatsD / statsite instance (UDP)

  • PrometheusSink: Sinks to a Prometheus metrics endpoint (exposed via HTTP for scrapes)

  • InmemSink : Provides in-memory aggregation, can be used to export stats

  • FanoutSink : Sinks to multiple sinks. Enables writing to multiple statsite instances for example.

  • BlackholeSink : Sinks to nowhere

那下面进行源码分析:

一、MetricsSink

github.com/armon/go-metrics/sink.go

 

 

 

上面有四种类型的数据Gauge、Emitkey、IncrCounter、AddSample。

 

提供了一个黑洞操作的MetricSink。其实就是空的处理

 

FanoutSink是封装了一个[]MetricSink,接口函数,都是遍历各个MetricSink操作。

 

以上为网络上的提供了三个MetricSink的封装。

 

二、StatsiteSink

github.com/armon/go-metrics/statsite.go

StatsiteSink的结构体很简单,就两个成员

 

 

 

初始化了之后,开启了一个协程。后面再重点分析。

先看Sink的接口

 

 

 

以上两个函数对key的操作,不过多解释

以上的接口都很简单,将key和val等处理后,全部都调用pushMetric函数

 

 

这个是将数据发送到了StatsiteSink结构体中的chan中。

 

下面进入到初始化时候的协程中,也就是真正处理的地方

 

 

 

根据初始化的addr,创建了tcp的连接,并将sock封装到了buffio中

 

真正的逻辑操作在for循环中。从chan中接收数据,并将其写入到buffio中。

通过定时器进行flush,这里的flush就是将数据写到tcp中。

 

 

 

 

后续的操作就是退出时候的操作了。

三、StatsdSink

github.com/armon/go-metrics/statsd.go

 

这里的StatsdSink与StatsiteSink一样,其不一样的地方就是构建的是udp连接。

 

四、InmemSink

这个会复杂一些。

先看github.com/armon/go-metrics/inmem_endpoint.go

先看几个数据结构

GaugeValue:其实就是key value的封装,当然还包含了labels

PointValue:其实就是一个foloat32的数组

SampledValue:是一个涉及到数据操作的,比如加减,平均数等

 

 

 

 

github.com/armon/go-metrics/inmem_endpoint.go

以下是AggregateSample

 

 

 

以下是提供的数据操作,包括Stddev,Mean、Ingest等

下面看看InmemSink结构体。最重要的就是intervals

 

其中包含了Gauges,points counters samples4个数据结构

初始化

 

从上面的代码可以看出,会有一个最大数量的Intervals。interval时间间隔,retain时间长度。通过这个来计算出最大的保存数据的数组大小

 

代码过多,这里就通过一个接口进行跟踪解释

上面中最主要 的是getInterval。其余逻辑都很简单

根据当前时间,寻找当前时间内的Interval

 

如果时间间隔是新的,则创建一个新的IntervalMetrics

再介绍一个函数Data

 

 

 

分为两个部分,一个拷贝历史的,一个拷贝当前interval。逻辑就如上面两个框

 

五、InmemSignal

github.com/armon/go-metrics/inmem_signal.go

当有信号的时候,将InmemSink信息打印出来

 

 

 

其中writer就是要打印的入口

监听信号,开启协程

 

接收到信号后,dumpStas

 

 

 

六、应用

先看看例子

从以下例子中看出,除了MetricSink还需要一些config等

 

下面这个则是inmem的信号打印的例子

 

github.com/armon/go-metrics/start.go

其中最主要的就是sink

 

初始化,有sink的初始化。当然还几个flag。

其中还有一个runtime的信息,需要设置flag EnableRuntimeMetrics。这个后面再分析。

当然 还有默认的配置

 

还有一个全局的Metrics

 

 

github.com/armon/go-metrics/metrics.go

那么也看一个接口函数

 

 

 

看以上的逻辑流程,最后就是落入到了sink中的接口。

再看下RuntimeMetrics

 

定时进行runtime信息的收集

 

 

其实就是收集了一些信息,有协程数量,内存信息,gc信息等

 

 

龚浩华

月牙寂道长

QQ 29185807

2018年03月30日

第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注

 

 

 

 

 

你可能感兴趣的文章
Flex 中的元数据标签
查看>>
flex4 中创建自定义弹出窗口
查看>>
01Java基础语法-11. 数据类型之间的转换
查看>>
01Java基础语法-13. if分支语句的灵活使用
查看>>
01Java基础语法-15.for循环结构
查看>>
01Java基础语法-16. while循环结构
查看>>
01Java基础语法-17. do..while循环结构
查看>>
01Java基础语法-18. 各种循环语句的区别和应用场景
查看>>
01Java基础语法-19. 循环跳转控制语句
查看>>
Django框架全面讲解 -- Form
查看>>
socket,accept函数解析
查看>>
今日互联网关注(写在清明节后):每天都有值得关注的大变化
查看>>
”舍得“大法:把自己的优点当缺点倒出去
查看>>
[今日关注]鼓吹“互联网泡沫,到底为了什么”
查看>>
[互联网学习]如何提高网站的GooglePR值
查看>>
[关注大学生]求职不可不知——怎样的大学生不受欢迎
查看>>
[关注大学生]读“贫困大学生的自白”
查看>>
[互联网关注]李开复教大学生回答如何学好编程
查看>>
[关注大学生]李开复给中国计算机系大学生的7点建议
查看>>
[关注大学生]大学毕业生择业:是当"鸡头"还是"凤尾"?
查看>>