記錄了學習過程,官方文檔地址http://book.open-falcon.org/zh_0_2/usage/getting-started.html
另外還看了Open-falcon作者的寫的設計理念的文,見open-falcon編寫的整個腦洞歷程
1 自定義數據採集
自定義的數據要求是json格式,至少包括以下七項:
- metric: 最核心的字段,代表這個採集項具體度量的是什麼, 比如是cpu_idle呢,還是memory_free, 還是qps
- endpoint: 標明Metric的主體(屬主),比如metric是cpu_idle,那麼Endpoint就表示這是哪臺機器的cpu_idle
- timestamp: 表示彙報該數據時的unix時間戳,注意是整數,代表的是秒
- value: 代表該metric在當前時間點的值,float64
- step: 表示該數據採集項的彙報週期,這對於後續的配置監控策略很重要,必須明確指定。
- counterType: 只能是COUNTER或者GAUGE二選一,前者表示該數據採集項爲計時器類型(指標在存儲和展現的時候,會被計算爲speed,即(當前值 - 上次值)/ 時間間隔),後者表示其爲原值 (即用戶上傳什麼樣的值,就原封不動的存儲)
- tags: 一組逗號分割的鍵值對, 對metric進一步描述和細化, 可以是空字符串. 比如idc=lg,比如service=xbox等,多個tag之間用逗號分隔
然後數據通過POST方法發送到本機agent1988端口的v1/push即可
1.1 Shell命令行傳輸
這裏通過curl命令,命令格式如下
curl -X [請求類型] -d [要傳輸的內容] [要發送到的URL]
寫了一個腳本自定義了這樣的一個監控項time-is-odd,抓取當前的時間戳,如果是奇數就返回1,否則返回0,返回的json大概長這樣
{
"endpoint": "open-falcon-server-user-define",
"metric": "minute-is-even",
"timestamp": 1537841191,
"step": 60,
"value": 1,
"counterType": "GAUGE",
"tags": "usage=stupid"
}
腳本如下,初學shell,寫的很醜陋
#!/bin/bash
ts=`date +%s`
minute=`date +%M`
is_odd=$(($minute%2))
url="http://127.0.0.1:1988/v1/push"
data="[{ \
\"endpoint\": \"open-falcon-server-user-define\", \
\"metric\": \"minute-is-odd\", \
\"timestamp\": "$ts", \
\"step\": 60, \
\"value\": "$is_odd", \
\"counterType\": \"GAUGE\", \
\"tags\": \"usage=stupid\" \
}]"
curl -X POST -d "$data" $url
用crontab把這個腳本設置爲每分鐘執行一次
crontab -e #進入編輯器模式
#寫入每分鐘執行一次腳本的命令
#*/1 * * * * [剛纔寫的腳本目錄,最好是絕對目錄]
#例如 */1 * * * * /home/tuan/send_test.sh
去Open-falcon的Dashboard看一眼,可以看見新出現的虛擬主機open-falcon-server-user-define和Counter
數據圖像如下
1.2 Python傳輸
現在我們push一個新的Counter,當前分鐘數爲偶數時爲1,否則爲0,通過Python腳本
#!/usr/bin/python
import requests
import time
import json
ts = int(time.time())
minute = int(time.strftime("%M", time.localtime()))
minute_is_even = (minute + 1) % 2
payload = [
{
"endpoint": "open-falcon-server-user-define",
"metric": "minute-is-even",
"timestamp": ts,
"step": 60,
"value": minute_is_even,
"counterType": "GAUGE",
"tags": "usage=stupid",
},
]
r = requests.post("http://127.0.0.1:1988/v1/push", data=json.dumps(payload))
同樣用crontab -e,添加爲每分鐘自動運行,看一下Open-falcon的Dashboard,把兩個定義的項畫在一張圖上,嗯效果很不錯
2 歷史數據查詢
通過API可以查詢歷史數據,官方文檔如下
http://api.open-falcon.com/#/graph_histroy
官方api寫的不清不楚,摸索了很久,主要是請求頭要設置好用於驗證身份的信息
首先我們需要獲取一個sig,這個sig大概就是判斷session是否有效的一個標誌,網上一般都說是去數據庫uic的session表裏面查找每個用戶對應的sig。只要在Web端登陸後,沒有做登出動作這個sig就不會過期,可以一直使用
但是我覺得這個方法不夠優雅,所以研究了一下怎麼調用login的api接口,login之後,會返回sig給你使用,這樣就避免了誰都要來看一眼數據庫才能用api
所有的api默認都是在8080端口,如果你不確定你可以看一眼api的日誌,剛啓動的時候會顯示端口信息
2.1 通過api登陸
這一步就是爲了獲取sig,圖省事你直接去uic這個庫裏的session表看一眼對應用戶名的sig即可
/api/v1/user/login是登陸的地址,登陸很簡單,發送一個json過去即可,爲了優雅我們把這個json寫在一個文件裏
#login.json
{
"name": "root",
"password": "root密碼"
}
然後用curl命令,通過POST的方法發送到對應的地址,一定要在請求頭加入信息表示發送的是json,不然一直提示{"error":"name or password is blank"}的錯誤,詳見我這篇博文Open-falcon通過api登陸,返回{"error":"name or password is blank"}的錯誤
sig值記下來
curl -H 'Content-Type:application/json' [email protected] http://127.0.0.1:8080/api/v1/user/login #發送post請求
#返回值
{"sig":"************************","name":"root","admin":true}
2.2 查詢歷史信息
現在要在請求頭中加入Apitoken這一項,這一項的值是{"name":"root","sig":"************************"},命令如下。返回結果很長所以我保存到res.json這個文件裏了
curl -H 'Content-Type:application/json' -H 'Apitoken:{"name":"root", "sig":"*******************************"}' [email protected] http://127.0.0.1:8080/api/v1/graph/history > res.json
history.json長這樣,時間戳可以在網上找在線工具轉換
{
"step": 60,
"start_time": 1537840800,
"hostnames": [
"open-falcon-server"
],
"end_time": 1537854845,
"counters": [
"cpu.idle",
"cpu.iowait"
],
"consol_fun": "AVERAGE"
}
json可以通過jq這個工具整理一下格式,沒有的可以yum安裝一下,然後通過jq打開res.json,注意jq後面有個空格加點,這個點表示所有的key都解析
cat res.json | jq . > res1.json
less res1.json #打開解析後的文件
文件最終長這樣,每個時間戳的數據,以及Counter的基本信息
3 進程監控
端口監控之前的學習記錄已經有了Centos6.10下Open-falcon學習記錄(零)——主機監控、Nodata組件、集羣監控
這裏我寫了一個java程序,進程沉睡五分鐘後結束運行
//Main.java
public class Main {
public static void main(String[] args) {
try {
Thread.sleep(5 * 60000);
} catch (Exception e) {
System.out.println(e);
}
}
}
javac Main.java #編譯
java Main & #運行
有兩種方法可以監控這個進程,一個通過進程name,一個通過啓動進程的命令
3.1 進程name
用&啓動的命令,會返回給你一個PID,記住這個PID,看/proc/{PID}/status這個文件,我的文件如下,name就是java
去Open-falcon配置一個報警,監視這個進程
綁定模板
3.2 cmdline
類似地,這回文件在/proc/{PID}/cmdline,會把你啓動進程的命令行保存下來,不過是去掉了空格等
配置報警,直接配在3.1一樣的模板裏,省得綁定了
3.3 報警測試
等一會,就能看見兩個Counter
抽出來看一眼圖,可以看到進程存在了約5分鐘然後消失(忽略第一個起伏,那是測試)
告警列表