把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 root@10.2.1.83 "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 root@10.2.1.83 "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 root@10.2.1.81 " 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 root@10.2.1.81 " 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 root@10.2.1.82 " 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 root@10.2.1.83 " 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 之类的流处理引擎做实时的处理和监控预警,实现更复杂的逻辑.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心自由天使

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值