标签:tag 时间序列数据 http服务 end 时间序列 退出 应该 内嵌 body
transfer模块的作用是接收所有被监控服务器上发送过来的数据进行一些判断和处理之后转发至后面的graph和judge模块。
transfer主要从四个来源接收数据:
transfer设计时支持三种数据后端,分别是:judge、graph、OpenTSDB.传输给judge是为了对收集上来的数据进行实时告警判断,graph是使用RRD技术存储监控数据的组件,OpenTSDB是开源的时间序列数据存储服务。
transfer的后端judge和graph为了提供高可用及负载均衡,都可能部署了多节点,transfer使用一致性hash对数据映射到不同节点。而OpenTSDB没有使用一致性hash,只提供了一个接口写数据。
transfer通过接收的数据的endpoint+metric+排序后的tags组成的pk作为key,进行hash(进行crc32循环冗余校验),最后获取该数据应该发送到的node。下面是pk生成的源码:
func PK(endpoint, metric string, tags map[string]string) string {
if tags == nil || len(tags) == 0 {
return fmt.Sprintf("%s/%s", endpoint, metric)
}
return fmt.Sprintf("%s/%s/%s", endpoint, metric, SortedTags(tags))
}
transfer源码分析需要结合数据流动的方向来进行梳理。
初始化时首先初始化连接池,然后初始化发送队列,最后初始化一致性hash环。
初始化完成之后开始执行发送数据任务startSendTasks
将会定期将队列中的数据发送到不同的后端,至于最后的startSenderCron
是开启定时任务,记录不同队列发送数据的情况。
safe list
。graph
是两层循环,拼接成node+addr
创建一个safe list
。tsdb如果开启,创建了一个safe list
。initNodeRings
创建一致性hash环时,只获取了judge
和graph
的node名称,通过名称生成hash值,再生成hash环。startSendTasks
发送数据时,对于judge
,循环每个judge node
队列中的数据,将其发送到对应的node
中,对于graph node
队列,将循环该node
列表中的所有地址,每个地址将接收到一份数据,这样,同一份数据被拷贝了len(node.addr)
份发送。// 初始化数据发送服务, 在main函数中调用
func Start() {
// 初始化默认参数
MinStep = g.Config().MinStep
if MinStep < 1 {
MinStep = 30 //默认30s
}
//
initConnPools()
initSendQueues()
initNodeRings()
// SendTasks依赖基础组件的初始化,要最后启动
startSendTasks()
startSenderCron()
log.Println("send.Start, ok")
}
transfer接收数据有三种方式,除了Http提供数据接收之外,另两种,一种是使用golang的rpc模块,另一种是使用socket直接传输数据,两种方式将在下面介绍:
rpc方法 | 接收数据 | 作用 |
---|---|---|
Ping | 空 | 检测transfer是否存活,code=0说明正常,code=1说明请求异常 |
Update | MetricValue 列表 |
将上报的数据进行简单处理,检测是否满足格式条件,最后将数据发送到队列中 |
\n
进行分割。socket指令 | 接收数据 | 作用 |
---|---|---|
quit | 空 | 退出该次处理 |
update | 上报数据,用\n 分隔 |
上报数据进行处理后发送到对应的发送队列中 |
在open-falcon中基本都是使用rpc和http进行传输数据,这里添加了socket支持,可能是为了用户使用其他语言写的客户端,发送一些自定义的监控数据的上报,基本不使用。
http服务含有一个上报数据的接口,是"/api/push"
,该接口可以接受其他服务push
上来的数据,其他主要是一些关于transfer统计信息,状态信息等的获取。
golang
能用的rpc
和Http
以外,另外提供的socket
感觉不友好,希望能够改进以支持其他语言编写的服务能够比较方便的上报数据。标签:tag 时间序列数据 http服务 end 时间序列 退出 应该 内嵌 body
原文地址:http://www.cnblogs.com/bingabcd/p/7749528.html