背景:因为很多项目都需要从es中获取数据,测试不会自己造es数据,所以每次都要问。然而问过之后一段时间就忘了,而且一条一条的造也很累。所以写了一个shell脚本
目的:只需要修改shell脚本里的一些参数,然后执行脚本就能得到造好的数据,再使用批量创建es数据的命令制造数据。简化制造数据的成本。
脚本:
```
#!/bin/bash
#!固定变量无需修改
date="`date "+%Y%m%d"`";
dateTime="`date "+%Y-%m-%dT%H:%M:%S.000+08:00"`";
#!日志公共变量
ip="10.33.81.40";
hostname="DVJTY-SERV001";
appsystem="JTY4";
logType="alarm_metric";
#!输出日志条数
count=2;
#!isAlarm=1制造告警日志 isAlarm=0普通日志
isAlarm=0;
#!告警更改所需变量
status="PROBLEM";
alarmWay="1,2,1"
mergeTag=0
connectId=
#!普通系统日志更改所需变量
latency=0;
appprogramname="金太阳数据库";
servicename="金太阳数据库";
servicecode="DB";
clustername="default";
source="runlog0.log";
logTypeName="kcbp_biz_logstash";
offset=700000
function alarmLog(){
echo -e "{\"index\":{\"_id\":\"$uuid\"}}"
echo -e "{\c"
echo -e "\"severity\":\"3\",\c"
echo -e "\"indexTime\":\"$dateTime\",\c"
echo -e "\"sourceTopic\":\"alarm_$date\",\c"
echo -e "\"sources\":{\c"
echo -e "\"appsystem\":\"$appsystem\",\c"
echo -e "\"hostname\":\"$hostname\",\c"
echo -e "\"sourSystem\":\"1\",\c"
echo -e "\"ruleId\":\"6789\",\c"
echo -e "\"ip\":\"$ip\"\c"
echo -e "},\c"
echo -e "\"alarmTypeName\":\"$logType\",\c"
echo -e "\"countFileds\":\"${hostname}${ip}趋势预测用例1单实例当前CPU${cpu_used_pct}\",\c"
echo -e "\"indexStr\":\"alarm_$date$alarmType\",\c"
echo -e "\"title\":\"DVJTY-SERV00110.33.81.40趋势预测用例1单实例\",\c"
echo -e "\"content\":\"${hostname}${ip}趋势预测用例1单实例当前CPU${cpu_used_pct}\",\c"
echo -e "\"extFields\":{\c"
if [ -n "$mergeTag" ]; then
echo -e "\"mergeTag\":\"$mergeTag\",\c";
fi
if [ "$mergeTag" == "1" ] ; then
echo -e "\"uuid\":\"$uuid\",\c";
elif [ "$mergeTag" == "0" ] ; then
echo -e "\"uuid\":\"$uuid\",\c";
echo -e "\"connectId\":\"$connectId\",\c";
fi
echo -e "\"expressionId\":\"6789\",\c"
echo -e "\"sourSystem\":\"1\",\c"
echo -e "\"alarmtime\":\"$dateTime\",\c"
echo -e "\"actionID\":\"0\",\c"
echo -e "\"alarmSuppress\":\"alarmSuppress\",\c"
echo -e "\"calenderId\":\"1\",\c"
echo -e "\"alarmWay\":\"$alarmWay\",\c"
echo -e "\"successFlag\":\"1\",\c"
echo -e "\"revUsers\":\"[]\"\c"
echo -e "},\c"
echo -e "\"expressionId\":\"6789\",\c"
echo -e "\"metricSetName\":\"cpu\",\c"
echo -e "\"status\":\"$status\",\c"
echo -e "\"timestamp\":\"$dateTime\"\c"
echo -e "}"
}
function normalLog(){
echo -e "{\"index\":{\"_id\":\"$uuid\"}}"
echo -e "{\c"
echo -e "\"measures\":{\c"
echo -e "\"latency\":$latency\c"
echo -e "},\c"
echo -e "\"normalFields\":{\c"
echo -e "\"logcheckip\":\"$ip\",\c"
echo -e "\"deserializerTime\":\"$dateTime\",\c"
echo -e "\"indexTime\":\"$dateTime\",\c"
echo -e "\"logchecktime\":\"$dateTime\",\c"
echo -e "\"message\":\"$dateTime 这是一条脚本跑出的测试日志 $ip $hostname\"\c"
echo -e "},\c"
echo -e "\"offset\":$offset,\c"
echo -e "\"logTypeName\":\"$logTypeName\",\c"
echo -e "\"source\":\"$source\",\c"
echo -e "\"timestamp\":\"$dateTime\",\c"
echo -e "\"dimensions\":{\c"
echo -e "\"ip\":\"$ip\",\c"
echo -e "\"hostname\":\"$hostname\",\c"
echo -e "\"appprogramname\":\"$appprogramname\",\c"
echo -e "\"code\":\"0\",\c"
echo -e "\"servicecode\":\"$servicecode\",\c"
echo -e "\"clustername\":\"$clustername\",\c"
echo -e "\"appsystem\":\"$appsystem\",\c"
echo -e "\"servicename\":\"$servicename\",\c"
echo -e "\"funcid\":\"420410\",\c"
echo -e "\"nodeid\":\"107\"\c"
echo -e "}\c"
echo -e "}"
let "offset++";
}
while(( $count>0 ))
do
uuid=$(cat "/proc/sys/kernel/random/uuid")
if [ $isAlarm == 1 ] ; then
alarmLog
else
normalLog
fi
let "count--"
done
```
遇到的问题:
1. 不会shell,现学了shell。
2. shell将数据输入到一个文件使用 ./eslog.sh >testLog.txt (>是覆盖文件内容,>>接着原本的内容输入)
3.命令批量导入es数据需要合适非常严格,不能有空格,而且单条数据要换行,本条数据内容不能换行
如:
{"index":{"_id":"AWVq9MFRV9j8LejhM58L"}}
{"indexTime":"2018-08-24T16:02:29.829+08:00","measures":{"duration":12575},"normalFields":{"traceId":"2840045838270464","N_pkg":"","code":"0","session":"729eb5111f47adc9c1736096aa42b5a02aa62fd2c8993f52baf46bf4"}}
所以必须去除换行,也不能有空格,所以使用输出为 echo -e "aaa/c" 的命令
4.在widows下编辑好的.sh脚本上传到Linux时会不能执行,所以需要先
vi eslog.sh 后执行 set ff=unix 脚本才能正常执行
5.如果早的es数据有中文但是文件格式不是utf-8也会报错