自定义 Open-Falcon 监控

目录

写在最前:

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 中,比如:

  • 线上某服务的 qps
  • 某业务的在线人数
  • 某个接⼝的响应时间
  • 某个⻚面的状态码(500、200)
  • 某个接⼝的请求出错次数
  • 某个业务的每分钟的收⼊统计
  • ...... 

注意, http request body 是个 json,这个 json 是个列表。

1、API 详解

###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个字段都是必须指定

2、Python 版本

###  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

3、Shell 版本

###  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

4、PHP 版本

###  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;
}

5、Plugin 机制

Plugin 可以看做是对 agent 功能的扩充。对于业务系统的监控指标采集,最好不要做成 plugin,而是把采集脚本放到业务程序发布包中,随着业务代码上线而上线,随着业务代码升级而升级,这样会比较容易管理。

要使用Plugin,步骤如下:

5.1 编写采集脚本

用什么语言写没关系,只要目标机器上有运行环境就行,脚本本身要有可执行权限。采集到数据之后直接打印到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 哦。

5.2 上传脚本到 git

插件脚本也是 code,所以最好也用 git、svn 管理,这里我们使用 git 管理,公司内部如果没有搭建 gitlab,可以使用 gitcafe、coding.net 之类的,将写好的脚本 push 到 git 仓库,比如上例中的 600_ntp.py,姑且放到 git 仓库的 sys/ntp 目录下。注意,这个脚本在 push 到 git 仓库之前要加上可执行权限。

5.3 检查 agent 配置

大家之前部署 agent 的时候应该注意到 agent 配置文件中有配置 plugin 吧,现在到了用的时候了,把 git 仓库地址配置上,enabled 设置为 true。注意,配置的 git 仓库地址需要是任何机器上都可以拉取的,即 git:// 或者 https:// 打头的。如果 agent 之前已经部署到公司所有机器上了,那现在手工改配置可能略麻烦,之前讲过的嘛,用 ops-updater 管理起来~

5.4 拉去 plugin 脚本

agent 开了一个 http 端口 1988,我们可以挨个 curl 一下 http://ip:1988/plugin/update 这个地址,这会让 agent 主动 git pull 这个插件仓库。为啥没做成定期拉取这个仓库呢?主要是怕给 git 服务器压力太大……大家悠着点用,别给人 pull 挂了……

5.5 让 plugin run 起来

上一步我们拉取了 plugin 脚本到所有机器上,不过 plugin 并没有执行。哪些机器执行哪些 plugin 脚本,是在 portal 上面配置的。其实我很想做成,只要插件拉取下来了就立马执行,不过实际实践中,有些插件还是不能在所有机器上跑,所以就在 portal 上通过配置控制了。在 portal 上找到要执行插件的 HostGroup,点击对应的 plugins 超链接,对于上例 sys/ntp 目录下的  600_ntp.py,直接把 sys/ntp 绑定上去即可。sys/ntp 下的所有插件就都执行了。

5.6 补充

portal 上配置完成之后并不会立马生效,有个同步的过程,最终是 agent 通过调用hbs的接口获取的,需要一两分钟。上例我们绑定了 sys/ntp,这实际是个目录,这个目录下的所有插件都会被执行,那什么样的文件会被看做插件呢?文件名是数字下划线打头的,这个数字代表的是 step,即多长时间跑一次,单位是秒,比如 60_a.py,就是在通过命名告诉 agent,这个插件每 60 秒跑一次。sys/ntp 目录下的子目录、其他命名方式的文件都会被忽略。

5.7 插件如何传递参数

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 个参数,多个参数之间用,分割,每个参数可以用双引号或者单引号括起来。如果参数中本身就包含逗号,可以使用 \, 来转义。

  • 参数,只在绑定单个插件脚本时有效。如果绑定的是一个插件目录,传递的参数会忽略掉。
  • 如果某个目录下的某个插件脚本,被单独绑定到某个hostgroup,同时该目录也被绑定到了这个hostgroup,这个插件脚本不会重复被执行,绑定目录时这个插件脚本会被忽略(也就是说,单个脚本的绑定会覆盖目录绑定方式下的同一个脚本)。

你可能感兴趣的:(Open-Falcon)