通过 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在展示中的作用:
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. 说明
虽然数据上报不会阻塞,没有任何逻辑,是异步上报,但是同样希望调用方处理好自己的业务逻辑,不要因为上报堵塞了业务主流程。