Centos6.10下Open-falcon學習記錄(一)——自定義資料採集、歷史查詢、程序監控
記錄了學習過程,官方文件地址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分鐘然後消失(忽略第一個起伏,那是測試)
告警列表