在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
本文公众号文章链接:https://mp.weixin.qq.com/s/d-HTKCldEn4CSdQU0uqd6w 本文csdn博客文章链接:https://blog.csdn.net/screscent/article/details/79759481 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接口提供了如下库。
那下面进行源码分析: 一、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日 第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注 |
请发表评论