把docker狀態變成kafka實時數據流---一行代碼寫了2天的shell代碼

shell 命令行實時打印docker 狀態,並添加當前的時間戳,變成json字符串,每行一個,持續不停的輸出。
結果將給filebeat 採集並實時送到kafka 集羣做實時數據流分析的源頭,發給Flink 做各種實時數據流分析.
這個看起來很簡單,其實要實現起來難度不小,嘗試了多次都失敗了,
只是目標不斷的趨近,到此刻終於徹底解決了這個問題。

  1. 禁止stdio緩存
  2. 實時輸出
  3. docker stats 前面添加一個時間戳,而不是由filebeat 添加,因爲這個意義不一樣,命令行代表的實時的事件,filebeat 添加時間戳代表的是filebeat 讀取日誌的時間。
  4. 各種linux 命令的管道應用要很熟悉
docker stats  --format ',"ID": "{{ .ID }}","name": "{{.Name}}","cpu":"{{ .CPUPerc }}","memory":{"raw":"{{ .MemUsage }}","percent":"{{ .MemPerc }}"},"netIO":"{{.NetIO}}","blockIO":"{{.BlockIO}}","PIDs":"{{.PIDs}}" }' | stdbuf -oL -eL  sed -e  's/\"/\\\"/g' | sed 's/\x1b//g'  | sed 's/\[2J\[H//g' |  xargs -L 1 echo `date +'{"time":"%Y-%m-%d %H:%M:%S"'` $1


如果要實時採集遠程的docker 狀態,可以使用非入侵方式 
e$ ssh [email protected] "docker stats  --format ',"ID": "{{ .ID }}","name": "{{.Name}}","cpu":"{{ .CPUPerc }}","memory":{"raw":"{{ .MemUsage }}","percent":"{{ .MemPerc }}"},"netIO":"{{.NetIO}}","blockIO":"{{.BlockIO}}","PIDs":"{{.PIDs}}" }' | stdbuf -oL -eL  sed -e  's/\"/\\\"/g' | sed 's/\x1b//g'  | sed 's/\[2J\[H//g' |  xargs -L 1 echo `date +'{"time":"%Y-%m-%d %H:%M:%S"'` $1"


結果如下

在這裏插入圖片描述


在這裏插入圖片描述

如果要把結果保存到本地的文件
ssh [email protected] "docker stats  --format ',"ID": "{{ .ID }}","name": "{{.Name}}","cpu":"{{ .CPUPerc }}","memory":{"raw":"{{ .MemUsage }}","percent":"{{ .MemPerc }}"},"netIO":"{{.NetIO}}","blockIO":"{{.BlockIO}}","PIDs":"{{.PIDs}}"  | stdbuf -oL -eL  sed -e  's/\"/\\\"/g' | sed 's/\x1b//g'  | sed 's/\[2J\[H//g' |  xargs -L 1 echo `date +'{"time":"%Y-%m-%d %H:%M:%S"'` $1" >/tmp/1.log

可以使用tail -f 實時查看

在這裏插入圖片描述

上面代碼有個問題,就是返回的雙引號被xargs刪除了,這個不是預期的理想結果,
修改如下: 使用#替換",然後再替換回來.

ssh [email protected] " docker stats --format ‘,#ID#: #{{ .ID }}#,#name#: #{{.Name}}#,#cpu#:#{{ .C#{{.BlockIO}}#,#PIDs#:#{{.PIDs}}# }’ | stdbuf -oL -eL sed -e ‘s/#/\#/g’ | xargs -L 1 echo date +'{#time#:#%Y-%m-%d %H:%M:%S#' $1 | sed -e ‘s/#/"/g’"

在這裏插入圖片描述

到這裏,結果相對就比較完美了.

ssh [email protected] " docker stats --format ‘,#ID#: #{{ .ID }}#,#name#: #{{.Name}}#,#cpu#:#{{ .CPUPerc }}#,#memory#:{#raw#:#{{ .MemUsage }}#,#percent#:#{{ .MemPerc }}#},#netIO#:#{{.NetIO}}#,#blockIO#:#{{.BlockIO}}#,#PIDs#:#{{.PIDs}}# }’ | stdbuf -oL -eL sed -e ‘s/#/\#/g’ | xargs -L 1 echo date +'{#time#:#%Y-%m-%d %H:%M:%S#' $1 | sed -e ‘s/#/"/g’" > /tmp/docker_container/docker_container1.log

ssh [email protected] " docker stats --format ‘,#ID#: #{{ .ID }}#,#name#: #{{.Name}}#,#cpu#:#{{ .CPUPerc }}#,#memory#:{#raw#:#{{ .MemUsage }}#,#percent#:#{{ .MemPerc }}#},#netIO#:#{{.NetIO}}#,#blockIO#:#{{.BlockIO}}#,#PIDs#:#{{.PIDs}}# }’ | stdbuf -oL -eL sed -e ‘s/#/\#/g’ | xargs -L 1 echo date +'{#time#:#%Y-%m-%d %H:%M:%S#' $1 | sed -e ‘s/#/"/g’" > /tmp/docker_container/docker_container2.log

ssh [email protected] " docker stats --format ‘,#ID#: #{{ .ID }}#,#name#: #{{.Name}}#,#cpu#:#{{ .CPUPerc }}#,#memory#:{#raw#:#{{ .MemUsage }}#,#percent#:#{{ .MemPerc }}#},#netIO#:#{{.NetIO}}#,#blockIO#:#{{.BlockIO}}#,#PIDs#:#{{.PIDs}}# }’ | stdbuf -oL -eL sed -e ‘s/#/\#/g’ | xargs -L 1 echo date +'{#time#:#%Y-%m-%d %H:%M:%S#' $1 | sed -e ‘s/#/"/g’" > /tmp/docker_container/docker_container3.log

這樣我們就可以用一臺機器ssh 登錄到n臺機器去採集docker 實時信息,然後通過filebeat 發送給 kafka,
然後讓Flink 之類的流處理引擎做實時的處理和監控預警,實現更復雜的邏輯.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章