/** * This executes the search query to retrieve result from splunk. It then converts each event's * value into tuple and emit that into output port. */ @Override public void emitTuples() { String query = queryToRetrieveData(); logger.debug(String.format("select statement: %s", query)); try { exportSearch = store.getService().export(queryToRetrieveData(), exportArgs); multiResultsReader = new MultiResultsReaderXml(exportSearch); for (SearchResults searchResults : multiResultsReader) { for (Event event : searchResults) { for (String key : event.keySet()) { if (key.contains("raw")) { T tuple = getTuple(event.get(key)); outputPort.emit(tuple); } } } } multiResultsReader.close(); } catch (Exception e) { store.disconnect(); throw new RuntimeException(String.format("Error while running query: %s", query), e); } }
@Override public void runJob() { addLog("开始更新基线", LOG_TYPE_SUCCESS); Calendar cl = Calendar.getInstance(); long times = cl.getTimeInMillis(); TaskInfoDto taskInfo = (TaskInfoDto) this.params.get(TASKINFO_KEY); String[] strs = taskInfo.getConfigDesc().split(";"); // splunk服务器连接信息 String[] serCfg = strs[0].split(","); if (serCfg.length != 4) { addLog("连接服务器参数不对:" + strs[0], LOG_TYPE_ERROR); return; } // 基本查询条件 String baseStr = strs[2]; String baseStr2 = strs.length < 14 ? "" : strs[13]; // 统计值字段名 String cntCol = strs[3]; // 时间字段名 String timeCol = strs[4]; try { // 连接参数 ServiceArgs loginArgs = new ServiceArgs(); loginArgs.setUsername(serCfg[2]); loginArgs.setPassword(serCfg[3]); loginArgs.setHost(serCfg[0]); loginArgs.setPort(NumberUtils.toInt(serCfg[1])); // 连接 Service service = Service.connect(loginArgs); // 延迟 int delayMi = NumberUtils.toInt(strs[5], 0); String searchStr = createNSearchStr(baseStr, cntCol, timeCol, delayMi, baseStr2); this.addLog("查询:" + searchStr, LOG_TYPE_SUCCESS); // 查询 Job nJob = service.search(searchStr); // 最近1分钟 ResultsReader results; Event et; Iterator<Event> ie; InputStream is; ////////////////////////////////////////////////////////// 最近1分钟 while (!nJob.isDone()) { Thread.sleep(1000); } is = nJob.getResults(new Args("output_mode", "json")); results = createResultsReader(ResultsReaderJson.class, is); List<String> nNumVal1 = new ArrayList<String>(); List<String> nNumVal2 = new ArrayList<String>(); List<String> nNumVal3 = new ArrayList<String>(); List<Date> nDate = new ArrayList<Date>(); if (nJob.getResultCount() > 0) { ie = results.iterator(); while (ie.hasNext()) { if (strs.length > 12 && "1".equals(strs[12])) { et = ie.next(); nNumVal1.add(et.get("my_cnt1")); nNumVal2.add(et.get("my_cnt2")); nDate.add(convertDate(et.get("my_time"))); } else if (strs.length > 12 && "2".equals(strs[12])) { while (ie.hasNext()) { et = ie.next(); nNumVal1.add(et.get("my_cnt1")); nNumVal2.add(et.get("my_cnt2")); nNumVal3.add(et.get("my_cnt3")); nDate.add(convertDate(et.get("my_time"))); } } else { et = ie.next(); nNumVal1.add(et.get("my_cnt1")); nDate.add(convertDate(et.get("my_time"))); } } } is.close(); nJob.cancel(); ////////////////////////////////////////////////////////// 最近1分钟 end String curTime; BizMiDto dto; BizMiDao bdao = new BizMiDao(); double rr; if (!nNumVal1.isEmpty()) { for (int i = 0; i < nNumVal1.size(); i++) { cl.set(Calendar.SECOND, 0); if (nDate.get(i) != null) { cl.setTime(nDate.get(i)); curTime = DateUtil.datetimeFormat.format(nDate.get(i)); } else { cl.add(Calendar.MINUTE, -delayMi); curTime = DateUtil.datetimeFormat.format(cl.getTime()); } try { dto = bdao.findByTimeAndMi(strs[7], strs[8], curTime, strs[6]); if (dto == null) { this.addLog( "更新出错,找不到更新点:" + strs[7] + "::" + strs[8] + "::" + curTime + "::" + strs[6], LOG_TYPE_ERROR); this.addLog("更新出错,找不到更新点", LOG_TYPE_ERROR); } dto.setVal(ckVal(nNumVal1.get(i))); bdao.updateByTimeAndMi(dto); } catch (Exception e) { addLog("更新入口VAL:" + formatExpection(e), LOG_TYPE_ERROR); } if (!nNumVal2.isEmpty()) { try { dto = bdao.findByTimeAndMi(strs[7], strs[9], curTime, strs[6]); if (dto == null) { this.addLog( "更新出错,找不到更新点:" + strs[7] + "::" + strs[9] + "::" + curTime + "::" + strs[6], LOG_TYPE_ERROR); } dto.setVal(ckVal(nNumVal2.get(i))); bdao.updateByTimeAndMi(dto); } catch (Exception e) { addLog("更新出口VAL:" + formatExpection(e), LOG_TYPE_ERROR); } try { dto = bdao.findByTimeAndMi(strs[7], strs[10], curTime, strs[6]); if (dto == null) { this.addLog( "更新出错,找不到更新点:" + strs[7] + "::" + strs[10] + "::" + curTime + "::" + strs[6], LOG_TYPE_ERROR); } rr = NumberUtils.toDouble(nNumVal2.get(i), 0) / NumberUtils.toDouble(nNumVal1.get(i), 0); if (rr == Double.NaN) { dto.setVal(String.valueOf(0)); } else { dto.setVal(String.valueOf(rr)); } bdao.updateByTimeAndMi(dto); } catch (Exception e) { addLog("更新响应率:" + formatExpection(e), LOG_TYPE_ERROR); } } if (!nNumVal3.isEmpty()) { dto = bdao.findByTimeAndMi(strs[7], strs[11], curTime, strs[6]); dto.setVal(ckVal(nNumVal3.get(i))); bdao.updateByTimeAndMi(dto); try { bdao.saveByTable(dto, strs[6]); } catch (Exception e) { addLog("更新响应时间:" + formatExpection(e), LOG_TYPE_ERROR); } } } } addLog("任务耗时:" + (Calendar.getInstance().getTimeInMillis() - times) + "毫秒", LOG_TYPE_SUCCESS); } catch (Exception e) { e.printStackTrace(); addLog(formatExpection(e), LOG_TYPE_ERROR); } }