在数据生成过程中,我们通常会以脚本执行成功与否来判断数据是否生成;但是这种判断逻辑会有一个问题:只能判断是否有数据,而不能对数据质量进行监控。举个简单例子:我们有一个脚本生成每日流量数据,20190410这一天生成了100w数据,20190411这一天只有50w数据,这明显不正常,出现这种情况必须马上核查问题所在,不然依赖这份数据的所有报表都会出问题;所以数据质量监控就很有必要,怎么做?就以这个例子为例尝试解决下。先画个图,假定是数据项监控页面结构
我们定义一些关注的指标,例如变量dayBeforeyestoday
,yesterday
,每个变量后面都跟一个计算值的sql;有了这些变量后,接下来就是编写表达式
Math.abs(${yesterday}-${dayBeforeyesterday})/${dayBeforeyesterday}>0.1
这个表达式采用的是javascript
语法,这个表达式的含义:如果昨天的数据量和前天的数据量误差超过10%,就进行报警;问题来了,怎样在后台解析执行判断表达式?其实在java里可以使用javax.script.ScriptEngine
来实现这个功能,这就是为什么表达式要用javascript语法,看代码
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("javascript");
String expression = "Math.abs(${yesterday}-${dayBeforeyesterday})/${dayBeforeyesterday}>0.1";
Map<String,String> values = new HashMap<String,String>();
values.put("dayBeforeyesterday","1000340");
values.put("yesterday","1110340");
Set<String> strings = values.keySet();
for(String k:strings){
expression = expression.replaceAll("\\$\\{"+k+"}",values.get(k));
}
System.out.println("表达式:"+expression);
try {
String result = String.valueOf(scriptEngine.eval(expression));
System.out.println(result);
} catch (ScriptException e) {
e.printStackTrace();
}
输出
表达式:Math.abs(1110340-1000340)/1000340>0.1
true