目录
写在最前:
1、API 详解
2、Python 版本
3、Shell 版本
4、PHP 版本
5、Plugin 机制
5.1 编写采集脚本
5.2 上传脚本到 git
5.3 检查 agent 配置
5.4 拉去 plugin 脚本
5.5 让 plugin run 起来
5.6 补充
5.7 插件如何传递参数
自定义 push 数据到 open-falcon:
不仅仅是 falcon-agent 采集的数据可以 push 到监控系统,一些场景下,我们自定义的一些数据指标,也可以 push 到 open-falcon 中,比如:
注意, http request body 是个 json,这个 json 是个列表。
###API详解
metric: 最核心的字段,代表这个采集项具体度量的是什么, 比如是 cpu_idle 呢,还是 memory_free, 还是 qps
endpoint: 标明 Metric 的主体(属主),比如 metric 是 cpu_idle,那么 Endpoint 就表示这是哪台机器的 cpu_idle
timestamp: 表示汇报该数据时的 unix 时间戳,注意是整数,代表的是秒
value: 代表该 metric 在当前时间点的值,float64
step: 表示该数据采集项的汇报周期,这对于后续的配置监控策略很重要,必须明确指定。60 代表每分钟上报一次
counterType: 只能是 COUNTER 或者 GAUGE 二选一,前者表示该数据采集项为计时器类型,后者表示其为原值(注意大小写)GAUGE:即用户上传什么样的值,就原封不动的存储
COUNTER:指标在存储和展现的时候,会被计算为 speed,即(当前值 - 上次值)/ 时间间隔
tags: 一组逗号分割的键值对, 对 metric 进一步描述和细化, 可以是空字符串. 比如 idc=lg,比如service=xbox 等,多个 tag 之间用逗号分割
说明:这7个字段都是必须指定
### python版本 ###
#!-*- coding:utf8 -*-
import requests
import time
import json
ts = int(time.time())
payload = [
{
"endpoint": "test-endpoint",
"metric": "test-metric",
"timestamp": ts,
"step": 60,
"value": 1,
"counterType": "GAUGE",
"tags": "idc=lg,loc=beijing",
},
{
"endpoint": "test-endpoint",
"metric": "test-metric2",
"timestamp": ts,
"step": 60,
"value": 2,
"counterType": "GAUGE",
"tags": "idc=lg,loc=beijing",
},
]
r = requests.post("http://127.0.0.1:1988/v1/push", data=json.dumps(payload))
print r.text
### shell版本 ###
ts=`date +%s`;
curl -X POST -d "[{\"metric\": \"test-metric\", \"endpoint\": \"test-endpoint\", \"timestamp\": $ts,\"step\": 60,\"value\": 1,\"counterType\": \"GAUGE\",\"tags\": \"idc=lg,project=xx\"}]" http://127.0.0.1:1988/v1/push
### php版本 ###
$timestamp = time();
$params = array(
array(
"endpoint" => "yz-higo-xxx.lehe.com",
"metric" => "order_xxx",
"timestamp" => $timestamp,
"step" => 60,
"value" => xxx,
"counterType" => "GAUGE",
"tags" => "xxx",
)
);
$url = 'http://127.0.0.1:1988/v1/push';
curl($params, $url);
function curl($params, $url) {
if (empty($params)) {
return FALSE;
}
$curl = curl_init();
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($params));
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_HEADER, FALSE);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 3);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
$resp = curl_exec($curl);
curl_close($curl);
return $resp;
}
Plugin 可以看做是对 agent 功能的扩充。对于业务系统的监控指标采集,最好不要做成 plugin,而是把采集脚本放到业务程序发布包中,随着业务代码上线而上线,随着业务代码升级而升级,这样会比较容易管理。
要使用Plugin,步骤如下:
用什么语言写没关系,只要目标机器上有运行环境就行,脚本本身要有可执行权限。采集到数据之后直接打印到stdout即可,agent会截获并push给server。数据格式是json,官网给的例子如下:
[root@host01:/path/to/plugins/plugin/sys/ntp]#./600_ntp.py
[{"endpoint": "host01", "tags": "", "timestamp": 1431349763, "metric": "sys.ntp.offset", "value": 0.73699999999999999, "counterType": "GAUGE", "step": 600}]
注意,这个 json 数据是个 list 哦。
插件脚本也是 code,所以最好也用 git、svn 管理,这里我们使用 git 管理,公司内部如果没有搭建 gitlab,可以使用 gitcafe、coding.net 之类的,将写好的脚本 push 到 git 仓库,比如上例中的 600_ntp.py,姑且放到 git 仓库的 sys/ntp 目录下。注意,这个脚本在 push 到 git 仓库之前要加上可执行权限。
大家之前部署 agent 的时候应该注意到 agent 配置文件中有配置 plugin 吧,现在到了用的时候了,把 git 仓库地址配置上,enabled 设置为 true。注意,配置的 git 仓库地址需要是任何机器上都可以拉取的,即 git://
或者 https://
打头的。如果 agent 之前已经部署到公司所有机器上了,那现在手工改配置可能略麻烦,之前讲过的嘛,用 ops-updater 管理起来~
agent 开了一个 http 端口 1988,我们可以挨个 curl 一下 http://ip:1988/plugin/update 这个地址,这会让 agent 主动 git pull 这个插件仓库。为啥没做成定期拉取这个仓库呢?主要是怕给 git 服务器压力太大……大家悠着点用,别给人 pull 挂了……
上一步我们拉取了 plugin 脚本到所有机器上,不过 plugin 并没有执行。哪些机器执行哪些 plugin 脚本,是在 portal 上面配置的。其实我很想做成,只要插件拉取下来了就立马执行,不过实际实践中,有些插件还是不能在所有机器上跑,所以就在 portal 上通过配置控制了。在 portal 上找到要执行插件的 HostGroup,点击对应的 plugins 超链接,对于上例 sys/ntp 目录下的 600_ntp.py,直接把 sys/ntp 绑定上去即可。sys/ntp 下的所有插件就都执行了。
portal 上配置完成之后并不会立马生效,有个同步的过程,最终是 agent 通过调用hbs的接口获取的,需要一两分钟。上例我们绑定了 sys/ntp,这实际是个目录,这个目录下的所有插件都会被执行,那什么样的文件会被看做插件呢?文件名是数字下划线打头的,这个数字代表的是 step,即多长时间跑一次,单位是秒,比如 60_a.py,就是在通过命名告诉 agent,这个插件每 60 秒跑一次。sys/ntp 目录下的子目录、其他命名方式的文件都会被忽略。
Open-Falcon 在 PR #672 中,对插件传递传递自定义参数进行了支持。在 dashboard 中,配置 HostGroup 绑定插件时,可以支持针对单个脚本配置参数。
比如:sys/ntp/30_xx.sh(a, "33 4", 'test.sh f\,d')
,表示对 hostgroup 绑定一个插件脚本 sys/ntp/30_xx.sh
, 并传递 4 个参数,多个参数之间用,
分割,每个参数可以用双引号或者单引号括起来。如果参数中本身就包含逗号,可以使用 \,
来转义。