/* * Copyright 2014 NAVER Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.navercorp.pinpoint.web.alarm.collector; import java.util.Collection; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import com.navercorp.pinpoint.web.alarm.DataCollectorFactory.DataCollectorCategory; import com.navercorp.pinpoint.web.applicationmap.histogram.TimeHistogram; import com.navercorp.pinpoint.web.dao.MapResponseDao; import com.navercorp.pinpoint.web.vo.Application; import com.navercorp.pinpoint.web.vo.Range; import com.navercorp.pinpoint.web.vo.ResponseTime; /** * @author minwoo.jung */ public class ResponseTimeDataCollector extends DataCollector { private final Application application; private final MapResponseDao responseDao; private final long timeSlotEndTime; private final long slotInterval; private final AtomicBoolean init =new AtomicBoolean(false); // need to consider a race condition when checkers start simultaneously. private long slowCount = 0; private long errorCount = 0; private long totalCount = 0; private long slowRate = 0; private long errorRate = 0; public ResponseTimeDataCollector(DataCollectorCategory category, Application application, MapResponseDao responseDAO, long timeSlotEndTime, long slotInterval) { super(category); this.application = application; this.responseDao = responseDAO; this.timeSlotEndTime = timeSlotEndTime; this.slotInterval = slotInterval; } @Override public void collect() { if (init.get()) { return; } Range range = Range.createUncheckedRange(timeSlotEndTime - slotInterval, timeSlotEndTime); List<ResponseTime> responseTimes = responseDao.selectResponseTime(application, range); for (ResponseTime responseTime : responseTimes) { sum(responseTime.getAgentResponseHistogramList()); } setSlowRate(); setErrorRate(); init.set(true); } private void setSlowRate() { slowRate = calculatePercent(slowCount); } private void setErrorRate() { errorRate = calculatePercent(errorCount); } private long calculatePercent(long value) { if (totalCount == 0 || value == 0) { return 0; } else { return (value * 100L) / totalCount; } } private void sum(Collection<TimeHistogram> timeHistograms) { for (TimeHistogram timeHistogram : timeHistograms) { slowCount += timeHistogram.getSlowCount(); slowCount += timeHistogram.getVerySlowCount(); errorCount += timeHistogram.getTotalErrorCount(); totalCount += timeHistogram.getTotalCount(); } } public long getSlowCount() { return slowCount; } public long getErrorCount() { return errorCount; } public long getTotalCount() { return totalCount; } public long getSlowRate() { return slowRate; } public long getErrorRate() { return errorRate; } }