1. 程式人生 > >Centos6.10下Open-falcon學習記錄(三)——log監控外掛falcon-log-agent

Centos6.10下Open-falcon學習記錄(三)——log監控外掛falcon-log-agent

這篇主要是記錄學習一個滴滴公司開發的日誌監控元件用於監控系統的日誌採集agent,可無縫對接open-falcon

1 安裝

go get安裝,肥腸簡單

go get github.com/didi/falcon-log-agent
cd $GOPATH/src/github.com/didi/falcon-log-agent
make build

cp cfg/dev.cfg cfg/cfg.json
cp cfg/strategy.dev.json cfg/strategy.json

make pack
mkdir ~/open-falcon/falcon-log-agent
tar -xzvf falcon-log-agent.tar.gz -C ~/open-falcon/falcon-log-agent

2 測試

這個外掛一共有兩個配置檔案,第一個是cfg.json,是外掛的自身配置,第二個是strategy.json,配置你要監控的日誌資訊

cfg.json我基本都默認了,有一個log_level可以改成DEBUG,輸出一些DEBUG資訊方便除錯

strategy.json預設

官方提供了一個api用來檢測策略是否可以匹配日誌的,命令如下

./control start  #啟動
curl -s -XPOST localhost:8003/check -d  'log=01/Jan/2018:12:12:12 service error 500, num=10 province=33' | python -m json.tool  #測試這行日誌是否能匹配當前策略

 按照預設策略,這行日誌應該是可以匹配到的,然而,我看到了如下的返回

我仔細觀察了官方提供的預設策略

 

= =行吧,這裡要求匹配的是空白符,給的例子是province=33,修改測試命令

curl -s -XPOST localhost:8003/check -d 'log=01/Jan/2018:12:12:12 service error 500, num=10 province= ' | python -m json.tool

成功了

3 監控

準備用於測試的檔案是open-falcon的agent日誌檔案,如下

就採集那個每一行的Total好了

vim cfg/strategy.json

#建立一個新的日誌監控如下
[
    {
        "id":1,
        "name":"agent send num",
        "file_path":"/home/tuan/open-falcon/agent/logs/agent.log",
        "time_format":"yyyy/mm/dd HH:MM:SS",
        "pattern":"Total=(\\d+)",
        "exclude":"",
        "step":60,
        "tags":{
            "type":"log",
            "file":"/home/tuan/open-falcon/agent/logs/app.log"
        },
        "func":"cnt",
        "degree":6,
        "comment":""
    }
]

這個元件提供了http服務檢視自身資訊,預設埠是8003,定義在cfg/cfg.json裡,可以按照需要修改,需要修改防火牆設定暴露埠

#開啟一下防火牆的8003埠
sudo vi /etc/sysconfig/iptables
#在開放22埠的下一行新增如下規則
#-A INPUT -p tcp -m state --state NEW -m tcp --dport 8003 -j ACCEPT
sudo service iptables restart

開啟http://IP:8003/health,就可以看見他的執行狀態,介面大氣簡潔

api大概就是下面這幾個:

  1. /health : 自身存活狀態
  2. /strategy :當前生效的策略列表
  3. /cached : 最近1min內上報的點

執行,發現完蛋,啥都沒有

嘗試一下命令,返回為空

curl -s -XPOST localhost:8003/check -d 'log=2018/10/11 14:01:11 var.go:109: <= <Total=6, Invalid:0, Latency=0ms, Message:ok>' | python -m json.tool

實在無奈,在原始碼裡插了幾個fmt,調的是http/check.go裡的函式matchedStrategy(),程式碼裡的fmt都是我寫的

func matchedStrategy(content string, strategy *scheme.Strategy) (bool, map[string]string) {
        fmt.Print("content is ");fmt.Println(content)
        var detail = make(map[string]string, 0)
        valid, patMap := getRegsFromOneStrategy(strategy)
        if !valid {
                return false, map[string]string{}
        }

        for key, pat := range patMap {
                fmt.Print("key is ");fmt.Println(key)
                fmt.Print("pat is ");fmt.Println(pat)
                reg, err := regexp.Compile(pat)
                fmt.Print("reg is ");fmt.Println(reg)
                if err != nil {
                        return false, map[string]string{}
                }
                l := reg.FindStringSubmatch(content)
                fmt.Println(l)
                if len(l) == 0 {
                        if key != "exclude_" {
                                return false, map[string]string{}
                        }
                        detail[key] = ""
                        continue
                }
                detail[key] = l[0]
        }

        return true, detail
}

這個外掛把標準輸出定向到log/app.log這個檔案了,開啟一看,發現問題,他居然把我配置的tags裡面的東西也當成了pattern,要求匹配

也就是說,strategy.json這個配置裡的tags必須也是從日誌檔案中可以匹配到的一個正則表示式,不是直接配置的

再來看一下官方配置,tags裡的provice也是從日誌中匹配到的

不能寫死

於是我去掉了tag,重新修改一下策略

vim cfg/strategy.json

#建立一個新的日誌監控如下
[
    {
        "id":1,
        "name":"agent send num",
        "file_path":"/home/tuan/open-falcon/agent/logs/agent.log",
        "time_format":"yyyy/mm/dd HH:MM:SS",
        "pattern":"Total=(\\d+)",
        "exclude":"",
        "step":60,
        "tags":{
        },
        "func":"cnt",
        "degree":6,
        "comment":""
    }
]

可以匹配到了

去open-falcon那裡看一眼,Counter出來了!!

影象也有了,但是我配置的採集只是單純計數,即每次有多少行日誌符合我設定的pattern

 

做一點進階的有意義的事情

agent的日誌如下,每傳送一堆監控資料就會列印兩條日誌,Total後面的數字是相等的,這個數字我估計就是每次傳送的監控資料個數(不是也沒有關係,假設他是就可以了)

現在我需要知道每60秒agent傳送的監控資料個數,可以用日誌監控外掛提供的sum這個函式,還需要排除掉重複的一條日誌(我打算把Invalid那一行排除掉,只保留Endpoint開頭的)

好了,繼續修改策略

vim cfg/strategy.json

#建立一個新的日誌監控如下
[
    {
        "id":1,
        "name":"agent send num",
        "file_path":"/home/tuan/open-falcon/agent/logs/agent.log",
        "time_format":"yyyy/mm/dd HH:MM:SS",
        "pattern":"Total=(\\d+)",
        "exclude":"Invalid",
        "step":60,
        "tags":{
        },
        "func":"sum",
        "degree":6,
        "comment":""
    }
]

資料出來了,不過日誌滾的太多,不知道採集的資料對不對,為了學術,我進行了更嚴謹的測試

4 嚴謹的測試

用一個指令碼生成一個模擬的日誌,往模擬日誌檔案裡插入給定的資訊,看一下監控採集到的資料是否正確

生成模擬日誌指令碼如下,簡單粗暴

#!/bin/bash
echo '2018/10/11 14:03:00 var.go:109: <= <Total=8, Invalid:0, Latency=0ms, Message:ok>'  >> agent.log
echo '2018/10/11 14:03:11 gpu.go:31: Initialize error:  could not load NVML library'  >> agent.log
echo '2018/10/11 14:03:11 var.go:102: => <Total=120> <Endpoint:open-falcon-server, Metric:agent.alive, Type:GAUGE, Tags:, Step:60, Time:1539237791, Value:1>'  >> agent.log
echo '2018/10/11 14:03:11 var.go:102: => <Total=7> <Endpoint:open-falcon-server, Metric:df.bytes.free.percent, Type:GAUGE, Tags:mount=/,fstype=ext4, Step:60, Time:1539237791, Value:32.156528701007986>'  >> agent.log
echo '2018/10/11 14:03:11 var.go:109: <= <Total=120, Invalid:0, Latency=2ms, Message:ok>'  >> agent.log
echo '2018/10/11 14:03:11 var.go:109: <= <Total=7, Invalid:0, Latency=0ms, Message:ok>'  >> agent.log
echo '2018/10/11 14:03:11 var.go:102: => <Total=6> <Endpoint:open-falcon-server, Metric:ss.estab, Type:GAUGE, Tags:, Step:60, Time:1539237791, Value:48>'  >> agent.log
echo '2018/10/11 14:03:11 var.go:109: <= <Total=6, Invalid:0, Latency=0ms, Message:ok>'  >> agent.log
echo '2018/10/11 14:04:00 var.go:102: => <Total=8> <Endpoint:open-falcon-server, Metric:value, Type:GAUGE, Tags:name=pfc.push.size, Step:60, Time:1539237840, Value:8>'  >> agent.log

sleep 70

echo '2018/10/11 14:01:11 var.go:102: => <Total=7> <Endpoint:open-falcon-server, Metric:df.bytes.free.percent, Type:GAUGE, Tags:mount=/,fstype=ext4, Step:60, Time:1539237671, Value:32.15721132115766>'  >> agent.log
echo '2018/10/11 14:01:11 var.go:109: <= <Total=120, Invalid:0, Latency=0ms, Message:ok>'  >> agent.log
echo '2018/10/11 14:01:11 var.go:109: <= <Total=7, Invalid:0, Latency=0ms, Message:ok>'  >> agent.log
echo '2018/10/11 14:01:11 var.go:102: => <Total=6> <Endpoint:open-falcon-server, Metric:ss.estab, Type:GAUGE, Tags:, Step:60, Time:1539237671, Value:48>'  >> agent.log

第一次採集到的資料總和應該是120+7+6+8=141,第二次採集到的資料總和應該是 7+6=13

把strategy.json裡的路徑改成我們的模擬日誌,然後執行指令碼生成模擬日誌

睿智的人肯定不需要去等待open-falcon的影象,直接看外掛的log/INFO日誌

cat log/INFO.log | grep endpoint

看到如下的push資訊,數值正確

 現在來嘗試一下所有的函式,目前log外掛一共支援5個函式

  1. cnt:計數,匹配規則的日誌條數
  2. avg:平均數,匹配規則的資料平均值
  3. sum:和,匹配規則的資料和
  4. max:最大值,匹配規則的最大資料
  5. min:最小值,匹配規則的最小資料

最終使用的strategy.json檔案如下

[
    {
        "id":1,
        "name":"agent total sum",
        "file_path":"/home/tuan/agent.log",
        "time_format":"yyyy/mm/dd HH:MM:SS",
        "pattern":"Total=(\\d+)",
        "exclude":"Invalid",
        "step":60,
        "tags":{
        },
        "func":"sum",
        "degree":6,
        "comment":""
    },
    {
        "id":2,
        "name":"agent total min",
        "file_path":"/home/tuan/agent.log",
        "time_format":"yyyy/mm/dd HH:MM:SS",
        "pattern":"Total=(\\d+)",
        "exclude":"Invalid",
        "step":60,
        "tags":{
        },
        "func":"min",
        "degree":6,
        "comment":""
    },
    {
        "id":3,
        "name":"agent total max",
        "file_path":"/home/tuan/agent.log",
        "time_format":"yyyy/mm/dd HH:MM:SS",
        "pattern":"Total=(\\d+)",
        "exclude":"Invalid",
        "step":60,
        "tags":{
        },
        "func":"max",
        "degree":6,
        "comment":""
    },
    {
        "id":4,
        "name":"agent total cnt",
        "file_path":"/home/tuan/agent.log",
        "time_format":"yyyy/mm/dd HH:MM:SS",
        "pattern":"Total=(\\d+)",
        "exclude":"Invalid",
        "step":60,
        "tags":{
        },
        "func":"cnt",
        "degree":6,
        "comment":""
    },
    {
        "id":5,
        "name":"agent total avg",
        "file_path":"/home/tuan/agent.log",
        "time_format":"yyyy/mm/dd HH:MM:SS",
        "pattern":"Total=(\\d+)",
        "exclude":"Invalid",
        "step":60,
        "tags":{
        },
        "func":"avg",
        "degree":6,
        "comment":""
    }
]

看一下各項指標,都正確