通过 Agent 监控自定义打点上报

1. 上报格式

上报格式为json, 时间(timestamp)如果不提交,默认当前时间。

无tags例子

[	
	{
		// 上报数据项名字,英文不要和其他上报项重复
		"name": "kafka_offset_metric",
		// 当前时间
		"timestamp": 1481523611,
		// 要上报的值
		"value": 3
	}
]

有tags例子

[	
	{
		"name": "kafka_offset_metric",
		"timestamp": 1481523611,
		"tags":
			{
				"channel":"router",
				"topic":"news"
			}
		"value": 3
	}
]

2. tags

tags用于聚合计算和展示,可以看做监控曲线的一个分类。 举个例子: 一台服务器的流量是一个 measurement, 具体的端口 和 流量方向可以放到tags中,这样tags之间可以自由组合,方便后期展示和计算。 需要说明一点的是监控系统会为每个上报的采集项默认打上 host 这个tag,用来区别是哪个机器上报的数据,如果你有这个需求,不用自己添加了。

注意:tag中不能有 =

tags在展示中的作用:

tags display

3. NS (name space)

监控左侧的服务树上每个节点对应一个 NS, 例如: common.db.monitor.loda , loda是默认根节点,监控系统的数据库集群的common组。 一台机器是有可能挂载多个节点(NS)之上的, 所以在写入数据的时候需要指明我要写入那个NS. 当然agent也提供了API可以动态查询:

curl http://127.0.0.1:1234/me/ns

返回示例:

["db.test.loda","module1.test.loda","module2.test.loda"]

4. 上报方式

数据上报会有本机的agent代理。

4.1 HTTP方式

将数据以 json body 的形式 POST 到本机的 http://127.0.0.1:1234/post?ns=$ns上即可,返回 200 成功, 500失败, 下面是个 shell 的例子:

curl -X POST -d '[{"name":"day_report_msg","value": 1}]' http://127.0.0.1:1234/post

4.2 unix domain socket 【推荐】

socket位置: /var/run/monitor-agent.sock

agent将上面的http handler承载到了unixsocket上,这样的话你可以用1中同样的方式去提交数据,只是将TCP换作了unixsocket了。http的transport换为unixsocket即可。

每个语言的实现方式,略有差异,下面给出一个golang的例子:

import "github.com/lodastack/sdk-go"

type Metric struct {
	Name      string            `json:"name"`
	Timestamp int64             `json:"timestamp"`
	Tags      map[string]string `json:"tags"`
	Value     interface{}       `json:"value"`
	Offset    int64             `json:"offset,omitempty"`
}

func Send(ns string, from string, loss int) error {
	m := Metric{
		Name:      "ping.loss",
		Timestamp: time.Now().Unix(),
		Tags: map[string]string{
			"from": from,
		},
		Value: loss,
	}
	data, err := json.Marshal([]Metric{m})
	if err != nil {
		return err
	}
	return sdk.Post(ns, data)
}

5. 说明

虽然数据上报不会阻塞,没有任何逻辑,是异步上报,但是同样希望调用方处理好自己的业务逻辑,不要因为上报堵塞了业务主流程。