自定义push数据到open-falcon

不仅仅是falcon-agent采集的数据可以push到监控系统,一些场景下,我们自定义的一些数据指标,也可以push到open-falcon中,比如:

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

一个shell脚本编写的,自定义push数据到open-falcon的例子

  1. # 注意,http request body是个json,这个json是个列表
  2. ts=`date +%s`;
  3. 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

一个python的、自定义push数据到open-falcon的例子

  1. #!-*- coding:utf8 -*-
  2. import requests
  3. import time
  4. import json
  5. ts = int(time.time())
  6. payload = [
  7. {
  8. "endpoint": "test-endpoint",
  9. "metric": "test-metric",
  10. "timestamp": ts,
  11. "step": 60,
  12. "value": 1,
  13. "counterType": "GAUGE",
  14. "tags": "idc=lg,loc=beijing",
  15. },
  16. {
  17. "endpoint": "test-endpoint",
  18. "metric": "test-metric2",
  19. "timestamp": ts,
  20. "step": 60,
  21. "value": 2,
  22. "counterType": "GAUGE",
  23. "tags": "idc=lg,loc=beijing",
  24. },
  25. ]
  26. r = requests.post("http://127.0.0.1:1988/v1/push", data=json.dumps(payload))
  27. print r.text

一个go的、自定义push数据到open-falcon的例子

  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "net/http"
  8. )
  9. func main() {
  10. apiurl := "http://127.0.0.1:1988/v1/push"
  11. type item struct {
  12. Endpoint string `json:"endpoint"`
  13. Metric string `json:"metric"`
  14. Timestamp int64 `json:"timestamp"`
  15. Step int `json:"step"`
  16. Value int64 `json:"value"`
  17. CounterType string `json:"counterType"`
  18. Tags string `json:"tags"`
  19. }
  20. type message struct {
  21. Item []item `json:"item"`
  22. }
  23. //json序列化
  24. var post message
  25. post.Item = append(post.Item, item{Endpoint: "test-endpoint", Metric: "test-metric", Timestamp: 1500804940,
  26. Step: 60, Value: 10, CounterType: "GAUGE", Tags: "idc=xixian"})
  27. jsonStr, _ := json.Marshal(post.Item)
  28. req, err := http.NewRequest("POST", apiurl, bytes.NewBuffer([]byte(jsonStr)))
  29. req.Header.Set("Content-Type", "application/json")
  30. client := &http.Client{}
  31. resp, err := client.Do(req)
  32. if err != nil {
  33. panic(err)
  34. }
  35. defer resp.Body.Close()
  36. }

API详解

  • 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之间用逗号分割

说明:这7个字段都是必须指定