/** {@inheritDoc} */ @SuppressWarnings("deprecation") @Override protected void doJudgeElement(final JavelinLogElement element) { // 識別子が"Event"でない場合は、処理しない。 String type = element.getBaseInfo().get(JavelinLogColumnNum.ID); boolean isEvent = MSG_EVENT.equals(type); if (isEvent == false) { return; } String eventName = element.getBaseInfo().get(JavelinLogColumnNum.EVENT_NAME); // イベント名が "IntervalError" の場合、検出を行う。 if (EventConstants.NAME_INTERVALERROR.equals(eventName) == false) { return; } Map<String, String> eventInfoMap = JavelinLogUtil.parseDetailInfo(element, JavelinParser.TAG_TYPE_EVENTINFO); String actual = eventInfoMap.get(EventConstants.PARAM_INTERVALERROR_ACTUAL_INTERVAL); // 実際にかかった時間が閾値以下の場合は、処理を終了する。 long actualTime = Long.MAX_VALUE; try { actualTime = Long.parseLong(actual); } catch (NumberFormatException ex) { LOGGER.warn(ex); } if (actualTime > this.threshold) { return; } classMethodMatching(element, eventInfoMap, actualTime); }
/** * 各メソッドの呼び出し回数をカウントする。 閾値を超えたものがある場合には記録する。 * * @param javelinLogElement ログデータ。 * @param callCountMap 呼び出し回数を記録するマップ。 * @param overThresholdMethodMap 呼び出された回数が閾値を超えたメソッドを記録するマップ。 */ private void doJudgeSingleElement( final JavelinLogElement javelinLogElement, final Map<String, Integer> callCountMap, final Map<String, JavelinLogElement> overThresholdMethodMap) { List<String> baseInfo = javelinLogElement.getBaseInfo(); // Callログのみを対象とする。 String id = baseInfo.get(JavelinLogColumnNum.ID); if (JavelinConstants.MSG_CALL.equals(id) == false) { return; } // Mapのキーを作成する。 String className = baseInfo.get(JavelinLogColumnNum.CALL_CALLEE_CLASS); String methodName = baseInfo.get(JavelinLogColumnNum.CALL_CALLEE_METHOD); String threadId = baseInfo.get(JavelinLogColumnNum.CALL_THREADID); // SQL実行は除外する if (isSqlExec(className) == true) { return; } String key = className + "#" + methodName + "#" + threadId; // カウントに1を加える。 // まだ一度も実行されていない場合には新たにオブジェクトを作り、値を1にする。 Integer count = callCountMap.get(key); if (count == null) { count = Integer.valueOf(1); } else { count = Integer.valueOf(count.intValue() + 1); } callCountMap.put(key, count); // もしカウントが閾値に達するのであれば、overThresholdMethodMap_に記録する。 if (count.intValue() == this.threshold) { overThresholdMethodMap.put(key, javelinLogElement); } }