写在前面
collector采集的数据可以push到监控系统,一些场景下,我们需要自定义的一些数据指标比如:
- 线上某服务的qps
- 某业务的在线人数
- 某个接⼝的响应时间
- 某个⻚面的状态码(500、200)
- 某个接⼝的请求出错次数
- 某个业务的每分钟的收⼊统计
- …
那么问题来了,监控平台支持自定义推送数据吗,答案是肯定了,回顾一下上篇文章内容
绿色部分最左侧有一个***plugin*** ,这个表示监控平台是支持插件机制了,我们可以自己写一些采集插件或者使用开源的采集器,shell、python、java什么语言都可以!甚至是一些二进制都ok,这里只介绍两种比较常用的语言作为例子
1.准备工作
1.安装
这边不多讲监控平台的安装部署,有问题去看安装视频,通过源码编译安装
2. 推送数据格式说明
2.1 shell
# 注意,http request body是个json,这个json是个列表
ts=`date +%s`;
curl -H "Content-Type: application/json" -X POST --data '[{"endpoint": "viotest", "tags": "service=sshd, port=22", "timestamp": 1589525503, "metric": "tempa.cpu0", "extra": "pid=359696", "value": 33, "counterType": "GAUGE", "step": 20}]' http://ip:5810/api/transfer/push
2.2 python
#!-*- coding:utf8 -*-
import requests
import time
import json
ts = int(time.time())
payload = [
{
"endpoint": "test-endpoint",
"metric": "temp1",
"timestamp": ts,
"step": 60,
"value": 50,
"counterType": "GAUGE",
"tags": "idc=lg,loc=wuxi",
},
{
"endpoint": "test-endpoint",
"metric": "temp2",
"timestamp": ts,
"step": 60,
"value": 66,
"counterType": "GAUGE",
"tags": "idc=lg,loc=wuxi",
},
]
r = requests.post("http://ip:5810/api/transfer/push", data=json.dumps(payload))
2.3 字段详解
- metric: 最核心的字段,代表这个采集项具体度量的是什么, 比如是cpu_idle呢,还是memory_free, 还是qps
- endpoint: 标明Metric的主体(属主),比如metric是cpu_idle,那么Endpoint就表示这是哪台机器的cpu_idle
- timestamp: 表示汇报该数据时的unix时间戳,注意是整数,代表的是秒
- value: 代表该metric在当前时间点的值,float64
- step: 表示该数据采集项的汇报周期,这对于后续的配置监控策略很重要,必须明确指定。
- counterType: 只能是COUNTER或者GAUGE二选一,前者表示该数据采集项为计时器类型,后者表示其为原值 (注意大小写)
- GAUGE:即用户上传什么样的值,就原封不动的存储
- COUNTER:指标在存储和展现的时候,会被计算为speed,即(当前值 - 上次值)/ 时间间隔
- tags: 一组逗号分割的键值对, 对metric进一步描述和细化, 可以是空字符串. 比如idc=lg,比如service=xbox等,多个tag之间用逗号分割
3.实战
出于某种原因,公司机器不能连接外网,因此pip 、yum等软件源就无法使用,只能通过本地源的方式去install,所以这里就演示通过shell发送
- 选一个测试机器往装有transfer的机器上发送指标数据,当返回
{"dat":"ok","err":""}
表示成功,
如果返回502,首先检查nginx日志,然后定位问题,一般都是由于发送数据格式不对导致的。push的数据应该是个数组,另外要加个header Content-Type: application/json
回到n9e平台,在全部对象里面会发现多了一个节点信息viotest
稍作解释:endpoint会自动解析出来,自动进入全部对象那个表
然后进入监控大盘会发现,我们推送的数据已经显示出来了