Skip to content

Commit

Permalink
#2345 Allow agent start timestamp to be used when sampling agent stats
Browse files Browse the repository at this point in the history
GC count and GC time now use agent start timestamp to more accurately calculate their values.
  • Loading branch information
Xylus authored and minwoo-jung committed Dec 26, 2016
1 parent 950ca5b commit b19d393
Show file tree
Hide file tree
Showing 32 changed files with 1,192 additions and 457 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@

package com.navercorp.pinpoint.web.dao.hbase.stat.v1;

import com.navercorp.pinpoint.common.server.bo.stat.ActiveTraceBo;
import com.navercorp.pinpoint.web.dao.stat.SampledActiveTraceDao;
import com.navercorp.pinpoint.web.mapper.stat.AgentStatMapperV1;
import com.navercorp.pinpoint.web.mapper.stat.SampledActiveTraceResultExtractor;
import com.navercorp.pinpoint.web.mapper.stat.ActiveTraceSampler;
import com.navercorp.pinpoint.web.mapper.stat.SampledAgentStatResultExtractor;
import com.navercorp.pinpoint.web.util.TimeWindow;
import com.navercorp.pinpoint.web.vo.Range;
import com.navercorp.pinpoint.web.vo.stat.SampledActiveTrace;
Expand All @@ -37,7 +39,7 @@ public class HbaseSampledActiveTraceDao implements SampledActiveTraceDao {
private AgentStatMapperV1.ActiveTraceMapper mapper;

@Autowired
private Aggregator.ActiveTraceAggregator aggregator;
private ActiveTraceSampler activeTraceSampler;

@Autowired
private HbaseAgentStatDaoOperations operations;
Expand All @@ -47,7 +49,7 @@ public List<SampledActiveTrace> getSampledAgentStatList(String agentId, TimeWind
long scanFrom = timeWindow.getWindowRange().getFrom();
long scanTo = timeWindow.getWindowRange().getTo() + timeWindow.getWindowSlotSize();
Range range = new Range(scanFrom, scanTo);
SampledActiveTraceResultExtractor resultExtractor = new SampledActiveTraceResultExtractor(timeWindow, mapper);
SampledAgentStatResultExtractor<ActiveTraceBo, SampledActiveTrace> resultExtractor = new SampledAgentStatResultExtractor<>(timeWindow, mapper, activeTraceSampler);
return operations.getSampledAgentStatList(resultExtractor, agentId, range);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@

package com.navercorp.pinpoint.web.dao.hbase.stat.v1;

import com.navercorp.pinpoint.common.server.bo.stat.CpuLoadBo;
import com.navercorp.pinpoint.web.dao.stat.SampledCpuLoadDao;
import com.navercorp.pinpoint.web.mapper.stat.AgentStatMapperV1;
import com.navercorp.pinpoint.web.mapper.stat.SampledCpuLoadResultExtractor;
import com.navercorp.pinpoint.web.mapper.stat.CpuLoadSampler;
import com.navercorp.pinpoint.web.mapper.stat.SampledAgentStatResultExtractor;
import com.navercorp.pinpoint.web.util.TimeWindow;
import com.navercorp.pinpoint.web.vo.Range;
import com.navercorp.pinpoint.web.vo.stat.SampledCpuLoad;
Expand All @@ -37,7 +39,7 @@ public class HbaseSampledCpuLoadDao implements SampledCpuLoadDao {
private AgentStatMapperV1.CpuLoadMapper mapper;

@Autowired
private Aggregator.CpuLoadAggregator aggregator;
private CpuLoadSampler cpuLoadSampler;

@Autowired
private HbaseAgentStatDaoOperations operations;
Expand All @@ -47,7 +49,7 @@ public List<SampledCpuLoad> getSampledAgentStatList(String agentId, TimeWindow t
long scanFrom = timeWindow.getWindowRange().getFrom();
long scanTo = timeWindow.getWindowRange().getTo() + timeWindow.getWindowSlotSize();
Range range = new Range(scanFrom, scanTo);
SampledCpuLoadResultExtractor resultExtractor = new SampledCpuLoadResultExtractor(timeWindow, mapper);
SampledAgentStatResultExtractor<CpuLoadBo, SampledCpuLoad> resultExtractor = new SampledAgentStatResultExtractor<>(timeWindow, mapper, cpuLoadSampler);
return operations.getSampledAgentStatList(resultExtractor, agentId, range);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@

package com.navercorp.pinpoint.web.dao.hbase.stat.v1;

import com.navercorp.pinpoint.common.server.bo.stat.JvmGcBo;
import com.navercorp.pinpoint.web.dao.stat.SampledJvmGcDao;
import com.navercorp.pinpoint.web.mapper.stat.AgentStatMapperV1;
import com.navercorp.pinpoint.web.mapper.stat.SampledJvmGcResultExtractor;
import com.navercorp.pinpoint.web.mapper.stat.JvmGcSampler;
import com.navercorp.pinpoint.web.mapper.stat.SampledAgentStatResultExtractor;
import com.navercorp.pinpoint.web.util.TimeWindow;
import com.navercorp.pinpoint.web.vo.Range;
import com.navercorp.pinpoint.web.vo.stat.SampledJvmGc;
Expand All @@ -37,7 +39,7 @@ public class HbaseSampledJvmGcDao implements SampledJvmGcDao {
private AgentStatMapperV1.JvmGcMapper mapper;

@Autowired
private Aggregator.JvmGcAggregator aggregator;
private JvmGcSampler sampler;

@Autowired
private HbaseAgentStatDaoOperations operations;
Expand All @@ -47,7 +49,7 @@ public List<SampledJvmGc> getSampledAgentStatList(String agentId, TimeWindow tim
long scanFrom = timeWindow.getWindowRange().getFrom();
long scanTo = timeWindow.getWindowRange().getTo() + timeWindow.getWindowSlotSize();
Range range = new Range(scanFrom, scanTo);
SampledJvmGcResultExtractor resultExtractor = new SampledJvmGcResultExtractor(timeWindow, mapper);
SampledAgentStatResultExtractor<JvmGcBo, SampledJvmGc> resultExtractor = new SampledAgentStatResultExtractor<>(timeWindow, mapper, sampler);
return operations.getSampledAgentStatList(resultExtractor, agentId, range);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@

package com.navercorp.pinpoint.web.dao.hbase.stat.v1;

import com.navercorp.pinpoint.common.server.bo.stat.TransactionBo;
import com.navercorp.pinpoint.web.dao.stat.SampledTransactionDao;
import com.navercorp.pinpoint.web.mapper.stat.AgentStatMapperV1;
import com.navercorp.pinpoint.web.mapper.stat.SampledTransactionResultExtractor;
import com.navercorp.pinpoint.web.mapper.stat.SampledAgentStatResultExtractor;
import com.navercorp.pinpoint.web.mapper.stat.TransactionSampler;
import com.navercorp.pinpoint.web.util.TimeWindow;
import com.navercorp.pinpoint.web.vo.Range;
import com.navercorp.pinpoint.web.vo.stat.SampledTransaction;
Expand All @@ -37,7 +39,7 @@ public class HbaseSampledTransactionDao implements SampledTransactionDao {
private AgentStatMapperV1.TransactionMapper mapper;

@Autowired
private Aggregator.TransactionAggregator aggregator;
private TransactionSampler transactionSampler;

@Autowired
private HbaseAgentStatDaoOperations operations;
Expand All @@ -47,7 +49,7 @@ public List<SampledTransaction> getSampledAgentStatList(String agentId, TimeWind
long scanFrom = timeWindow.getWindowRange().getFrom();
long scanTo = timeWindow.getWindowRange().getTo() + timeWindow.getWindowSlotSize();
Range range = new Range(scanFrom, scanTo);
SampledTransactionResultExtractor resultExtractor = new SampledTransactionResultExtractor(timeWindow, mapper);
SampledAgentStatResultExtractor<TransactionBo, SampledTransaction> resultExtractor = new SampledAgentStatResultExtractor<>(timeWindow, mapper, transactionSampler);
return operations.getSampledAgentStatList(resultExtractor, agentId, range);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
import com.navercorp.pinpoint.common.server.bo.stat.AgentStatType;
import com.navercorp.pinpoint.web.dao.stat.SampledActiveTraceDao;
import com.navercorp.pinpoint.web.mapper.stat.AgentStatMapperV2;
import com.navercorp.pinpoint.web.mapper.stat.SampledActiveTraceResultExtractor;
import com.navercorp.pinpoint.web.mapper.stat.ActiveTraceSampler;
import com.navercorp.pinpoint.web.mapper.stat.SampledAgentStatResultExtractor;
import com.navercorp.pinpoint.web.util.TimeWindow;
import com.navercorp.pinpoint.web.vo.Range;
import com.navercorp.pinpoint.web.vo.stat.SampledActiveTrace;
Expand All @@ -39,6 +40,9 @@ public class HbaseSampledActiveTraceDaoV2 implements SampledActiveTraceDao {
@Autowired
private ActiveTraceDecoder activeTraceDecoder;

@Autowired
private ActiveTraceSampler activeTraceSampler;

@Autowired
private HbaseAgentStatDaoOperationsV2 operations;

Expand All @@ -48,7 +52,7 @@ public List<SampledActiveTrace> getSampledAgentStatList(String agentId, TimeWind
long scanTo = timeWindow.getWindowRange().getTo() + timeWindow.getWindowSlotSize();
Range range = new Range(scanFrom, scanTo);
AgentStatMapperV2<ActiveTraceBo> mapper = operations.createRowMapper(activeTraceDecoder, range);
SampledActiveTraceResultExtractor resultExtractor = new SampledActiveTraceResultExtractor(timeWindow, mapper);
SampledAgentStatResultExtractor<ActiveTraceBo, SampledActiveTrace> resultExtractor = new SampledAgentStatResultExtractor<>(timeWindow, mapper, activeTraceSampler);
return operations.getSampledAgentStatList(AgentStatType.ACTIVE_TRACE, resultExtractor, agentId, range);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
import com.navercorp.pinpoint.common.server.bo.stat.CpuLoadBo;
import com.navercorp.pinpoint.web.dao.stat.SampledCpuLoadDao;
import com.navercorp.pinpoint.web.mapper.stat.AgentStatMapperV2;
import com.navercorp.pinpoint.web.mapper.stat.SampledCpuLoadResultExtractor;
import com.navercorp.pinpoint.web.mapper.stat.CpuLoadSampler;
import com.navercorp.pinpoint.web.mapper.stat.SampledAgentStatResultExtractor;
import com.navercorp.pinpoint.web.util.TimeWindow;
import com.navercorp.pinpoint.web.vo.Range;
import com.navercorp.pinpoint.web.vo.stat.SampledCpuLoad;
Expand All @@ -39,6 +40,9 @@ public class HbaseSampledCpuLoadDaoV2 implements SampledCpuLoadDao {
@Autowired
private CpuLoadDecoder cpuLoadDecoder;

@Autowired
private CpuLoadSampler cpuLoadSampler;

@Autowired
private HbaseAgentStatDaoOperationsV2 operations;

Expand All @@ -48,7 +52,7 @@ public List<SampledCpuLoad> getSampledAgentStatList(String agentId, TimeWindow t
long scanTo = timeWindow.getWindowRange().getTo() + timeWindow.getWindowSlotSize();
Range range = new Range(scanFrom, scanTo);
AgentStatMapperV2<CpuLoadBo> mapper = operations.createRowMapper(cpuLoadDecoder, range);
SampledCpuLoadResultExtractor resultExtractor = new SampledCpuLoadResultExtractor(timeWindow, mapper);
SampledAgentStatResultExtractor<CpuLoadBo, SampledCpuLoad> resultExtractor = new SampledAgentStatResultExtractor<>(timeWindow, mapper, cpuLoadSampler);
return operations.getSampledAgentStatList(AgentStatType.CPU_LOAD, resultExtractor, agentId, range);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
import com.navercorp.pinpoint.common.server.bo.stat.JvmGcBo;
import com.navercorp.pinpoint.web.dao.stat.SampledJvmGcDao;
import com.navercorp.pinpoint.web.mapper.stat.AgentStatMapperV2;
import com.navercorp.pinpoint.web.mapper.stat.SampledJvmGcResultExtractor;
import com.navercorp.pinpoint.web.mapper.stat.JvmGcSampler;
import com.navercorp.pinpoint.web.mapper.stat.SampledAgentStatResultExtractor;
import com.navercorp.pinpoint.web.util.TimeWindow;
import com.navercorp.pinpoint.web.vo.Range;
import com.navercorp.pinpoint.web.vo.stat.SampledJvmGc;
Expand All @@ -39,6 +40,9 @@ public class HbaseSampledJvmGcDaoV2 implements SampledJvmGcDao {
@Autowired
private JvmGcDecoder jvmGcDecoder;

@Autowired
private JvmGcSampler jvmGcSampler;

@Autowired
private HbaseAgentStatDaoOperationsV2 operations;

Expand All @@ -48,7 +52,7 @@ public List<SampledJvmGc> getSampledAgentStatList(String agentId, TimeWindow tim
long scanTo = timeWindow.getWindowRange().getTo() + timeWindow.getWindowSlotSize();
Range range = new Range(scanFrom, scanTo);
AgentStatMapperV2<JvmGcBo> mapper = operations.createRowMapper(jvmGcDecoder, range);
SampledJvmGcResultExtractor resultExtractor = new SampledJvmGcResultExtractor(timeWindow, mapper);
SampledAgentStatResultExtractor<JvmGcBo, SampledJvmGc> resultExtractor = new SampledAgentStatResultExtractor<>(timeWindow, mapper, jvmGcSampler);
return operations.getSampledAgentStatList(AgentStatType.JVM_GC, resultExtractor, agentId, range);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
import com.navercorp.pinpoint.common.server.bo.stat.JvmGcDetailedBo;
import com.navercorp.pinpoint.web.dao.stat.SampledJvmGcDetailedDao;
import com.navercorp.pinpoint.web.mapper.stat.AgentStatMapperV2;
import com.navercorp.pinpoint.web.mapper.stat.SampledJvmGcDetailedResultExtractor;
import com.navercorp.pinpoint.web.mapper.stat.JvmGcDetailedSampler;
import com.navercorp.pinpoint.web.mapper.stat.SampledAgentStatResultExtractor;
import com.navercorp.pinpoint.web.util.TimeWindow;
import com.navercorp.pinpoint.web.vo.Range;
import com.navercorp.pinpoint.web.vo.stat.SampledJvmGcDetailed;
Expand All @@ -39,6 +40,9 @@ public class HbaseSampledJvmGcDetailedDaoV2 implements SampledJvmGcDetailedDao {
@Autowired
private JvmGcDetailedDecoder jvmGcDetailedDecoder;

@Autowired
private JvmGcDetailedSampler jvmGcDetailedSampler;

@Autowired
private HbaseAgentStatDaoOperationsV2 operations;

Expand All @@ -48,7 +52,7 @@ public List<SampledJvmGcDetailed> getSampledAgentStatList(String agentId, TimeWi
long scanTo = timeWindow.getWindowRange().getTo() + timeWindow.getWindowSlotSize();
Range range = new Range(scanFrom, scanTo);
AgentStatMapperV2<JvmGcDetailedBo> mapper = operations.createRowMapper(jvmGcDetailedDecoder, range);
SampledJvmGcDetailedResultExtractor resultExtractor = new SampledJvmGcDetailedResultExtractor(timeWindow, mapper);
SampledAgentStatResultExtractor<JvmGcDetailedBo, SampledJvmGcDetailed> resultExtractor = new SampledAgentStatResultExtractor<>(timeWindow, mapper, jvmGcDetailedSampler);
return operations.getSampledAgentStatList(AgentStatType.JVM_GC_DETAILED, resultExtractor, agentId, range);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
import com.navercorp.pinpoint.common.server.bo.stat.TransactionBo;
import com.navercorp.pinpoint.web.dao.stat.SampledTransactionDao;
import com.navercorp.pinpoint.web.mapper.stat.AgentStatMapperV2;
import com.navercorp.pinpoint.web.mapper.stat.SampledTransactionResultExtractor;
import com.navercorp.pinpoint.web.mapper.stat.SampledAgentStatResultExtractor;
import com.navercorp.pinpoint.web.mapper.stat.TransactionSampler;
import com.navercorp.pinpoint.web.util.TimeWindow;
import com.navercorp.pinpoint.web.vo.Range;
import com.navercorp.pinpoint.web.vo.stat.SampledTransaction;
Expand All @@ -39,6 +40,9 @@ public class HbaseSampledTransactionDaoV2 implements SampledTransactionDao {
@Autowired
private TransactionDecoder transactionDecoder;

@Autowired
private TransactionSampler transactionSampler;

@Autowired
private HbaseAgentStatDaoOperationsV2 operations;

Expand All @@ -48,7 +52,7 @@ public List<SampledTransaction> getSampledAgentStatList(String agentId, TimeWind
long scanTo = timeWindow.getWindowRange().getTo() + timeWindow.getWindowSlotSize();
Range range = new Range(scanFrom, scanTo);
AgentStatMapperV2<TransactionBo> mapper = operations.createRowMapper(transactionDecoder, range);
SampledTransactionResultExtractor resultExtractor = new SampledTransactionResultExtractor(timeWindow, mapper);
SampledAgentStatResultExtractor<TransactionBo, SampledTransaction> resultExtractor = new SampledAgentStatResultExtractor<>(timeWindow, mapper, transactionSampler);
return operations.getSampledAgentStatList(AgentStatType.TRANSACTION, resultExtractor, agentId, range);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/*
* Copyright 2016 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.mapper.stat;

import com.navercorp.pinpoint.common.server.bo.stat.ActiveTraceBo;
import com.navercorp.pinpoint.common.trace.BaseHistogramSchema;
import com.navercorp.pinpoint.common.trace.HistogramSchema;
import com.navercorp.pinpoint.common.trace.SlotType;
import com.navercorp.pinpoint.web.vo.chart.Point;
import com.navercorp.pinpoint.web.vo.chart.UncollectedPoint;
import com.navercorp.pinpoint.web.vo.stat.chart.DownSampler;
import com.navercorp.pinpoint.web.vo.stat.chart.DownSamplers;
import com.navercorp.pinpoint.web.vo.stat.SampledActiveTrace;
import com.navercorp.pinpoint.web.vo.chart.TitledPoint;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
* @author HyunGil Jeong
*/
@Component
public class ActiveTraceSampler implements AgentStatSampler<ActiveTraceBo, SampledActiveTrace> {

public static final DownSampler<Integer> INTEGER_DOWN_SAMPLER = DownSamplers.getIntegerDownSampler(ActiveTraceBo.UNCOLLECTED_ACTIVE_TRACE_COUNT);

@Override
public SampledActiveTrace sampleDataPoints(long timestamp, List<ActiveTraceBo> dataPoints, ActiveTraceBo previousDataPoint) {
SampledActiveTrace sampledActiveTrace = new SampledActiveTrace();
HistogramSchema schema = BaseHistogramSchema.getDefaultHistogramSchemaByTypeCode(dataPoints.get(0).getHistogramSchemaType());
if (schema == null) {
sampledActiveTrace.setFastCounts(new UncollectedPoint<>(timestamp, ActiveTraceBo.UNCOLLECTED_ACTIVE_TRACE_COUNT));
sampledActiveTrace.setNormalCounts(new UncollectedPoint<>(timestamp, ActiveTraceBo.UNCOLLECTED_ACTIVE_TRACE_COUNT));
sampledActiveTrace.setSlowCounts(new UncollectedPoint<>(timestamp, ActiveTraceBo.UNCOLLECTED_ACTIVE_TRACE_COUNT));
sampledActiveTrace.setVerySlowCounts(new UncollectedPoint<>(timestamp, ActiveTraceBo.UNCOLLECTED_ACTIVE_TRACE_COUNT));
} else {
List<Integer> fastCounts = new ArrayList<>(dataPoints.size());
List<Integer> normalCounts = new ArrayList<>(dataPoints.size());
List<Integer> slowCounts = new ArrayList<>(dataPoints.size());
List<Integer> verySlowCounts = new ArrayList<>(dataPoints.size());
for (ActiveTraceBo activeTraceBo : dataPoints) {
Map<SlotType, Integer> activeTraceCounts = activeTraceBo.getActiveTraceCounts();
if (activeTraceCounts.get(SlotType.FAST) != ActiveTraceBo.UNCOLLECTED_ACTIVE_TRACE_COUNT) {
fastCounts.add(activeTraceCounts.get(SlotType.FAST));
}
if (activeTraceCounts.get(SlotType.NORMAL) != ActiveTraceBo.UNCOLLECTED_ACTIVE_TRACE_COUNT) {
normalCounts.add(activeTraceCounts.get(SlotType.NORMAL));
}
if (activeTraceCounts.get(SlotType.SLOW) != ActiveTraceBo.UNCOLLECTED_ACTIVE_TRACE_COUNT) {
slowCounts.add(activeTraceCounts.get(SlotType.SLOW));
}
if (activeTraceCounts.get(SlotType.VERY_SLOW) != ActiveTraceBo.UNCOLLECTED_ACTIVE_TRACE_COUNT) {
verySlowCounts.add(activeTraceCounts.get(SlotType.VERY_SLOW));
}
}
sampledActiveTrace.setFastCounts(createSampledTitledPoint(schema.getFastSlot().getSlotName(), timestamp, fastCounts));
sampledActiveTrace.setNormalCounts(createSampledTitledPoint(schema.getNormalSlot().getSlotName(), timestamp, normalCounts));
sampledActiveTrace.setSlowCounts(createSampledTitledPoint(schema.getSlowSlot().getSlotName(), timestamp, slowCounts));
sampledActiveTrace.setVerySlowCounts(createSampledTitledPoint(schema.getVerySlowSlot().getSlotName(), timestamp, verySlowCounts));
}
return sampledActiveTrace;
}

private Point<Long, Integer> createSampledTitledPoint(String title, long timestamp, List<Integer> values) {
if (values.isEmpty()) {
return new UncollectedPoint<>(timestamp, ActiveTraceBo.UNCOLLECTED_ACTIVE_TRACE_COUNT);
} else {
return new TitledPoint<>(
title,
timestamp,
INTEGER_DOWN_SAMPLER.sampleMin(values),
INTEGER_DOWN_SAMPLER.sampleMax(values),
INTEGER_DOWN_SAMPLER.sampleAvg(values, 1),
INTEGER_DOWN_SAMPLER.sampleSum(values));
}
}
}
Loading

0 comments on commit b19d393

Please sign in to comment.