1. 程式人生 > >Centos6.10下Open-falcon學習記錄(一)——自定義資料採集、歷史查詢、程序監控

Centos6.10下Open-falcon學習記錄(一)——自定義資料採集、歷史查詢、程序監控

記錄了學習過程,官方文件地址http://book.open-falcon.org/zh_0_2/usage/getting-started.html

另外還看了Open-falcon作者的寫的設計理念的文,見open-falcon編寫的整個腦洞歷程

1 自定義資料採集

自定義的資料要求是json格式,至少包括以下七項:

  1. metric: 最核心的欄位,代表這個採集項具體度量的是什麼, 比如是cpu_idle呢,還是memory_free, 還是qps
  2. endpoint: 標明Metric的主體(屬主),比如metric是cpu_idle,那麼Endpoint就表示這是哪臺機器的cpu_idle
  3. timestamp: 表示彙報該資料時的unix時間戳,注意是整數,代表的是秒
  4. value: 代表該metric在當前時間點的值,float64
  5. step: 表示該資料採集項的彙報週期,這對於後續的配置監控策略很重要,必須明確指定。
  6. counterType: 只能是COUNTER或者GAUGE二選一,前者表示該資料採集項為計時器型別(指標在儲存和展現的時候,會被計算為speed,即(當前值 - 上次值)/ 時間間隔),後者表示其為原值 (即使用者上傳什麼樣的值,就原封不動的儲存)
  7. 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分鐘然後消失(忽略第一個起伏,那是測試)

 告警列表