sofa
sofa
主要用于执行 shell
以及命令行应用
并收集其输出结果(Console Stdout)并存储到Redis
,便于后续处理(Logstash),
弥补filebeat
只能收集log
文件,无法收集控制台输出的问题,也可以通过Redis
任务队列来接受命令执行并处理结果
主要有以下几个命令:
-
sofa
: 通过linux管道接受shell
以及命令行应用
的输出结果,通过unix socket
发送给sofa server
来处理并存储到Redis
e.g:
docker ps | sofa -p docker -c ps -t 001
-
sofa exec
: 直接执行一条命令并获取输出结果,通过unix socket
发送给sofa server
来处理并存储到Redis
e.g:
sofa exec "docker ps" -p docker -c ps -t 001
-
sofa server
: 启动一个后台服务,该服务有如下两个作用:- 监听
unix socket
,接受sofa
发送过来到数据 - 监听
redis
任务队列,执行并处理结果
- 监听
build
make clean && make build
or
go build -o ./bin/sofa ./main.go
run
docker run -d -p 6379:6379 --name=redis redis
sofa server -c ./sofa.yaml
usage
1. start server
sofa server -c ./sofa.yaml
2. collect data
- 使用管道符收集收据
bjobs -W | sofa --platform=LSF --command=bjobs --tid=001
- 使用exec直接执行命令获取数据
sofa exec 'bjobs -W' -u test01 -t 001 -p lsf -c bjobs
3. 通过redis执行命令
可以向 redis
calls
队列中发送消息,给sofa server
来处理
消息结构:
{
"TID": "001",
"Platform": "docker",
"Command": "info",
"FullCommand": "docker info"
}
发送消息:
lpush calls "{\"TID\":\"001\",\"Platform\":\"docker\",\"Command\":\"info\",\"FullCommand\":\"docker info\"}"
4.处理结果示例:
{
"TID": "001",
"Platform": "docker",
"Command": "ps",
"FullCommand": "docker ps",
"ExitStatus": 0,
"Stdout": [
"CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES",
"44cf62dfc507 redis \"docker-entrypoint.s…\" 43 seconds ago Up 41 seconds 0.0.0.0:6379->6379/tcp redis",
"5765e68f63e1 mysql \"docker-entrypoint.s…\" 3 months ago Up 2 days 0.0.0.0:3306->3306/tcp, 33060/tcp mysql"
],
"Stderr": null,
"Username": "shumin",
"SubmitTime": "2019-10-11T01:16:15.050761+08:00",
"StartTime": "2019-10-11T01:16:15.0509+08:00",
"EndTime": "2019-10-11T01:16:15.134961+08:00"
}