[강운덕] [WEB-98] AgentHistogram 생성시 중복된 패턴의 자료 핸들링 로직으로 공통화 시킴.

git-svn-id: http://svn.bds.nhncorp.com/pe/hippo-web/trunk@3690 84d0f5b1-2673-498c-a247-62c4ff18d310
This commit is contained in:
Woonduk Kang
2014-04-16 09:17:35 +00:00
parent 7992d56714
commit 54d02b88fd
12 changed files with 106 additions and 91 deletions
@@ -310,7 +310,7 @@ public class ApplicationMapBuilder {
for (Link link : toLinkList) {
LinkCallDataMap sourceLinkCallDataMap = link.getSourceLinkCallDataMap();
AgentHistogramList targetList = sourceLinkCallDataMap.getTargetList();
for (AgentHistogram histogram : targetList.getCallHistogramList()) {
for (AgentHistogram histogram : targetList.getAgentHistogramList()) {
Histogram find = agentHistogramMap.get(histogram.getId());
if (find == null) {
find = new Histogram(histogram.getServiceType());
@@ -322,14 +322,14 @@ public class ApplicationMapBuilder {
}
}
Collection<LinkCallData> mergeTarget = new ArrayList<LinkCallData>();
LinkCallDataMap mergeSource = new LinkCallDataMap();
for (Link link : toLinkList) {
LinkCallDataMap sourceLinkCallDataMap = link.getSourceLinkCallDataMap();
Collection<LinkCallData> linkDataMap = sourceLinkCallDataMap.getLinkDataMap();
mergeTarget.addAll(linkDataMap);
mergeSource.addLinkDataMap(sourceLinkCallDataMap);
}
AgentTimeHistogramBuilder agentTimeBuilder = new AgentTimeHistogramBuilder(nodeApplication, range);
AgentTimeHistogram agentTimeHistogram = agentTimeBuilder.buildTarget(mergeTarget);
AgentTimeHistogram agentTimeHistogram = agentTimeBuilder.buildTarget(mergeSource);
nodeHistogram.setAgentTimeHistogram(agentTimeHistogram);
return nodeHistogram;
@@ -197,7 +197,7 @@ public class Link {
// form인것 같지만 link의 시간은 rpc를 기준으로 삼아야 하기 때문에. to를 기준으로 삼아야 한다.
AgentTimeHistogramBuilder builder = new AgentTimeHistogramBuilder(toNode.getApplication(), range);
AgentTimeHistogram applicationTimeSeriesHistogram = builder.buildSource(sourceLinkCallDataMap.getLinkDataMap());
AgentTimeHistogram applicationTimeSeriesHistogram = builder.buildSource(sourceLinkCallDataMap);
AgentResponseTimeViewModelList agentResponseTimeViewModelList = new AgentResponseTimeViewModelList(applicationTimeSeriesHistogram.createViewModel());
return agentResponseTimeViewModelList;
}
@@ -205,7 +205,7 @@ public class Link {
public AgentTimeHistogram getTargetAgentTimeHistogram() {
AgentTimeHistogramBuilder builder = new AgentTimeHistogramBuilder(toNode.getApplication(), range);
AgentTimeHistogram agentTimeHistogram = builder.buildSource(targetLinkCallDataMap.getLinkDataMap());
AgentTimeHistogram agentTimeHistogram = builder.buildSource(targetLinkCallDataMap);
return agentTimeHistogram;
}
@@ -28,7 +28,7 @@ public class ServerBuilder {
if (agentHistogramList == null) {
return;
}
this.agentHistogramList.addCallHistogram(agentHistogramList);
this.agentHistogramList.addAgentHistogram(agentHistogramList);
}
public void addAgentInfo(Set<AgentInfoBo> agentInfoBo) {
@@ -64,7 +64,7 @@ public class ServerBuilder {
*/
public ServerInstanceList buildLogicalServer(final AgentHistogramList hostHistogram) {
ServerInstanceList serverInstanceList = new ServerInstanceList();
for (AgentHistogram agentHistogram : hostHistogram.getCallHistogramList()) {
for (AgentHistogram agentHistogram : hostHistogram.getAgentHistogramList()) {
final String instanceName = agentHistogram.getId();
final String hostName = getHostName(agentHistogram.getId());
final ServiceType serviceType = agentHistogram.getServiceType();
@@ -25,7 +25,7 @@ public class AgentTimeHistogram {
private final Range range;
private final TimeWindow window;
private final Map<String, List<TimeHistogram>> histogramMap;
private final Map<Application, List<TimeHistogram>> histogramMap;
public AgentTimeHistogram(Application application, Range range) {
if (application == null) {
@@ -40,7 +40,7 @@ public class AgentTimeHistogram {
this.histogramMap = Collections.emptyMap();
}
public AgentTimeHistogram(Application application, Range range, Map<String, List<TimeHistogram>> histogramMap) {
public AgentTimeHistogram(Application application, Range range, Map<Application, List<TimeHistogram>> histogramMap) {
if (application == null) {
throw new NullPointerException("application must not be null");
}
@@ -59,7 +59,7 @@ public class AgentTimeHistogram {
public List<AgentResponseTimeViewModel> createViewModel() {
final List<AgentResponseTimeViewModel> result = new ArrayList<AgentResponseTimeViewModel>();
for (Map.Entry<String, List<TimeHistogram>> entry : histogramMap.entrySet()) {
for (Map.Entry<Application, List<TimeHistogram>> entry : histogramMap.entrySet()) {
AgentResponseTimeViewModel model = createAgentResponseTimeViewModel(entry.getKey(), entry.getValue());
result.add(model);
}
@@ -72,7 +72,7 @@ public class AgentTimeHistogram {
return result;
}
private AgentResponseTimeViewModel createAgentResponseTimeViewModel(String agentName, List<TimeHistogram> timeHistogramList) {
private AgentResponseTimeViewModel createAgentResponseTimeViewModel(Application agentName, List<TimeHistogram> timeHistogramList) {
List<ResponseTimeViewModel> responseTimeViewModel = createResponseTimeViewModel(timeHistogramList);
AgentResponseTimeViewModel agentResponseTimeViewModel = new AgentResponseTimeViewModel(agentName, responseTimeViewModel);
return agentResponseTimeViewModel;
@@ -1,7 +1,9 @@
package com.nhn.pinpoint.web.applicationmap.histogram;
import com.nhn.pinpoint.common.SlotType;
import com.nhn.pinpoint.web.applicationmap.rawdata.LinkCallData;
import com.nhn.pinpoint.web.applicationmap.rawdata.AgentHistogram;
import com.nhn.pinpoint.web.applicationmap.rawdata.AgentHistogramList;
import com.nhn.pinpoint.web.applicationmap.rawdata.LinkCallDataMap;
import com.nhn.pinpoint.web.util.TimeWindow;
import com.nhn.pinpoint.web.util.TimeWindowOneMinuteSampler;
import com.nhn.pinpoint.web.vo.Application;
@@ -37,30 +39,25 @@ public class AgentTimeHistogramBuilder {
public AgentTimeHistogram build(List<ResponseTime> responseHistogramList) {
Map<String, List<TimeHistogram>> agentLevelMap = new HashMap<String, List<TimeHistogram>>();
AgentHistogramList agentHistogramList = new AgentHistogramList();
for (ResponseTime responseTime : responseHistogramList) {
Set<Map.Entry<String,Histogram>> agentHistogram = responseTime.getAgentHistogram();
Set<Map.Entry<String, Histogram>> agentHistogram = responseTime.getAgentHistogram();
for (Map.Entry<String, Histogram> agentEntry : agentHistogram) {
List<TimeHistogram> histogramList = agentLevelMap.get(agentEntry.getKey());
if (histogramList == null) {
histogramList = new ArrayList<TimeHistogram>();
agentLevelMap.put(agentEntry.getKey(), histogramList);
}
Histogram histogram = agentEntry.getValue();
Histogram histogram = agentEntry.getValue();
TimeHistogram timeHistogram = new TimeHistogram(application.getServiceType(), responseTime.getTimeStamp());
timeHistogram.add(histogram);
histogramList.add(timeHistogram);
agentHistogramList.addAgentHistogram(agentEntry.getKey(), application.getServiceType(), timeHistogram);
}
}
Map<String, List<TimeHistogram>> histogramMap = interpolation(agentLevelMap);
Map<Application, List<TimeHistogram>> histogramMap = interpolation(agentHistogramList, window);
if (logger.isTraceEnabled()) {
for (Map.Entry<String, List<TimeHistogram>> agentListEntry : agentLevelMap.entrySet()) {
String agentName = agentListEntry.getKey();
for (AgentHistogram agentListEntry : agentHistogramList.getAgentHistogramList()) {
Application agentName = agentListEntry.getAgentId();
logger.trace("agentName:{}", agentName);
List<TimeHistogram> value = agentListEntry.getValue();
Collection<TimeHistogram> value = agentListEntry.getTimeHistogram();
for (TimeHistogram histogram : value) {
logger.trace("histogram:{}", histogram);
}
@@ -70,60 +67,52 @@ public class AgentTimeHistogramBuilder {
return agentTimeHistogram;
}
public AgentTimeHistogram buildSource(Collection<LinkCallData> linkCallDataMap) {
return build(linkCallDataMap, true);
}
public AgentTimeHistogram buildTarget(Collection<LinkCallData> linkCallDataMap) {
return build(linkCallDataMap, false);
}
private AgentTimeHistogram build(Collection<LinkCallData> linkCallDataMap, boolean sourceGroup) {
Map<String, List<TimeHistogram>> agentLevelMap = new HashMap<String, List<TimeHistogram>>();
for (LinkCallData linkCallData : linkCallDataMap) {
String nodeGroup = null;
if (sourceGroup) {
nodeGroup = linkCallData.getSource();
} else {
nodeGroup = linkCallData.getTarget();
}
List<TimeHistogram> sourceHistogramList = agentLevelMap.get(nodeGroup);
if (sourceHistogramList == null) {
sourceHistogramList = new ArrayList<TimeHistogram>();
agentLevelMap.put(nodeGroup, sourceHistogramList);
}
// 주의 copy본이 아니라 원본 수정시 데이터가 틀릴수 있음.
// interpolation에서 객체를 재 생성하므로 현재는 상관없음.
sourceHistogramList.addAll(linkCallData.getTimeHistogram());
public AgentTimeHistogram buildSource(LinkCallDataMap linkCallDataMap) {
if (linkCallDataMap == null) {
throw new NullPointerException("linkCallDataMap must not be null");
}
Map<String, List<TimeHistogram>> histogramMap = interpolation(agentLevelMap);
return build(linkCallDataMap.getSourceList());
}
public AgentTimeHistogram buildTarget(LinkCallDataMap linkCallDataMap) {
if (linkCallDataMap == null) {
throw new NullPointerException("linkCallDataMap must not be null");
}
return build(linkCallDataMap.getTargetList());
}
private AgentTimeHistogram build(AgentHistogramList agentHistogramList) {
Map<Application, List<TimeHistogram>> histogramMap = interpolation(agentHistogramList, window);
AgentTimeHistogram agentTimeHistogram = new AgentTimeHistogram(application, range, histogramMap);
return agentTimeHistogram;
}
private Map<String, List<TimeHistogram>> interpolation(Map<String, List<TimeHistogram>> agentLevelMap) {
private Map<Application, List<TimeHistogram>> interpolation(AgentHistogramList agentLevelMap, TimeWindow window) {
if (agentLevelMap.size() == 0) {
return agentLevelMap;
return Collections.emptyMap();
}
Map<String, Map<Long, TimeHistogram>> windowTimeMap = new HashMap<String, Map<Long, TimeHistogram>>();
Map<Application, Map<Long, TimeHistogram>> windowTimeMap = new HashMap<Application, Map<Long, TimeHistogram>>();
// window 공간생성.
// list로 할수도 있으나, filter일 경우 range를 초과하는 경우가 발생할 가능성이 있어 map으로 생성한다.
// 좀더 나은 방인이 있으면 변경하는게 좋을듯.
for (String key : agentLevelMap.keySet()) {
Map<Long, TimeHistogram> value = new HashMap<Long, TimeHistogram>();
for (AgentHistogram agentHistogram : agentLevelMap.getAgentHistogramList()) {
Map<Long, TimeHistogram> timeMap = new HashMap<Long, TimeHistogram>();
for (Long time : window) {
value.put(time, new TimeHistogram(application.getServiceType(), time));
timeMap.put(time, new TimeHistogram(application.getServiceType(), time));
}
windowTimeMap.put(key, value);
windowTimeMap.put(agentHistogram.getAgentId(), timeMap);
}
for (Map.Entry<String, List<TimeHistogram>> entry : agentLevelMap.entrySet()) {
List<TimeHistogram> histogramList = entry.getValue();
for (AgentHistogram agentHistogram : agentLevelMap.getAgentHistogramList()) {
Collection<TimeHistogram> histogramList = agentHistogram.getTimeHistogram();
for (TimeHistogram timeHistogram : histogramList) {
long time = window.refineTimestamp(timeHistogram.getTimeStamp());
// int windowIndex = window.getWindowIndex(time);
Map<Long, TimeHistogram> findSlot = windowTimeMap.get(entry.getKey());
Map<Long, TimeHistogram> findSlot = windowTimeMap.get(agentHistogram.getAgentId());
TimeHistogram windowHistogram = findSlot.get(time);
if (windowHistogram == null) {
windowHistogram = new TimeHistogram(application.getServiceType(), time);
@@ -133,9 +122,9 @@ public class AgentTimeHistogramBuilder {
}
}
Map<String, List<TimeHistogram>> result = new HashMap<String, List<TimeHistogram>>();
for (Map.Entry<String, Map<Long, TimeHistogram>> windowMapEntry : windowTimeMap.entrySet()) {
final String key = windowMapEntry.getKey();
Map<Application, List<TimeHistogram>> result = new HashMap<Application, List<TimeHistogram>>();
for (Map.Entry<Application, Map<Long, TimeHistogram>> windowMapEntry : windowTimeMap.entrySet()) {
final Application key = windowMapEntry.getKey();
List<TimeHistogram> histogramList = result.get(key);
if(histogramList == null) {
histogramList = new ArrayList<TimeHistogram>();
@@ -151,7 +140,7 @@ public class AgentTimeHistogramBuilder {
return result;
}
private void sortList(Map<String, List<TimeHistogram>> agentLevelMap) {
private void sortList(Map<Application, List<TimeHistogram>> agentLevelMap) {
Collection<List<TimeHistogram>> values = agentLevelMap.values();
for (List<TimeHistogram> value : values) {
Collections.sort(value, TimeHistogram.TIME_STAMP_ASC_COMPARATOR);
@@ -50,6 +50,11 @@ public class AgentHistogram {
return agentId.getName();
}
@JsonIgnore
public Application getAgentId() {
return agentId;
}
@JsonIgnore
public ServiceType getServiceType() {
return agentId.getServiceType();
@@ -16,7 +16,7 @@ public class AgentHistogramList {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
// agent별 Time 시리즈 데이터를 가지고 있음.
private final Map<Application, AgentHistogram> callHistogramMap = new HashMap<Application, AgentHistogram>();
private final Map<Application, AgentHistogram> agentHistogramMap = new HashMap<Application, AgentHistogram>();
public AgentHistogramList() {
}
@@ -29,33 +29,49 @@ public class AgentHistogramList {
if (histogramList == null) {
throw new NullPointerException("histogramList must not be null");
}
AgentHistogram agentHistogram = getCallHistogram(agentId);
AgentHistogram agentHistogram = getAgentHistogram(agentId);
agentHistogram.addTimeHistogram(histogramList);
}
public void addCallHistogram(String agentName, ServiceType serviceType, Collection<TimeHistogram> histogramList) {
public void addCallHistogram(Application agentId, TimeHistogram timeHistogram) {
if (agentId == null) {
throw new NullPointerException("agentId must not be null");
}
if (timeHistogram == null) {
throw new NullPointerException("timeHistogram must not be null");
}
AgentHistogram agentHistogram = getAgentHistogram(agentId);
agentHistogram.addTimeHistogram(timeHistogram);
}
public void addAgentHistogram(String agentName, ServiceType serviceType, Collection<TimeHistogram> histogramList) {
Application agentId = new Application(agentName, serviceType);
addCallHistogram(agentId, histogramList);
}
public void addAgentHistogram(String agentName, ServiceType serviceType, TimeHistogram timeHistogram) {
Application agentId = new Application(agentName, serviceType);
addCallHistogram(agentId, timeHistogram);
}
private AgentHistogram getCallHistogram(Application agentId) {
private AgentHistogram getAgentHistogram(Application agentId) {
if (agentId == null) {
throw new NullPointerException("agentId must not be null");
}
AgentHistogram agentHistogram = callHistogramMap.get(agentId);
AgentHistogram agentHistogram = agentHistogramMap.get(agentId);
if (agentHistogram == null) {
agentHistogram = new AgentHistogram(agentId);
callHistogramMap.put(agentId, agentHistogram);
agentHistogramMap.put(agentId, agentHistogram);
}
return agentHistogram;
}
public Histogram mergeHistogram(ServiceType serviceType) {
final Histogram histogram = new Histogram(serviceType);
for (AgentHistogram agentHistogram : getCallHistogramList()) {
for (AgentHistogram agentHistogram : getAgentHistogramList()) {
histogram.add(agentHistogram.getHistogram());
}
return histogram;
@@ -63,7 +79,7 @@ public class AgentHistogramList {
public void addCallHistogram(AgentHistogram agentHistogram) {
public void addAgentHistogram(AgentHistogram agentHistogram) {
if (agentHistogram == null) {
throw new NullPointerException("agentHistogram must not be null");
}
@@ -71,27 +87,31 @@ public class AgentHistogramList {
ServiceType serviceType = agentHistogram.getServiceType();
Application agentId = new Application(hostName, serviceType);
AgentHistogram findAgentHistogram = getCallHistogram(agentId);
AgentHistogram findAgentHistogram = getAgentHistogram(agentId);
findAgentHistogram.addTimeHistogram(agentHistogram.getTimeHistogram());
}
public void addCallHistogram(AgentHistogramList addAgentHistogramList) {
public void addAgentHistogram(AgentHistogramList addAgentHistogramList) {
if (addAgentHistogramList == null) {
throw new NullPointerException("agentHistogram must not be null");
}
for (AgentHistogram agentHistogram : addAgentHistogramList.callHistogramMap.values()) {
addCallHistogram(agentHistogram);
for (AgentHistogram agentHistogram : addAgentHistogramList.agentHistogramMap.values()) {
addAgentHistogram(agentHistogram);
}
}
public Collection<AgentHistogram> getCallHistogramList() {
return callHistogramMap.values();
public Collection<AgentHistogram> getAgentHistogramList() {
return agentHistogramMap.values();
}
@Override
public String toString() {
return "AgentHistogramList{"
+ callHistogramMap +
+ agentHistogramMap +
'}';
}
public int size() {
return this.agentHistogramMap.size();
}
}
@@ -72,7 +72,7 @@ public class LinkCallDataMap {
for (Map.Entry<LinkKey, LinkCallData> linkKeyRawCallDataEntry : linkDataMap.entrySet()) {
final LinkKey key = linkKeyRawCallDataEntry.getKey();
final LinkCallData linkCallData = linkKeyRawCallDataEntry.getValue();
targetList.addCallHistogram(key.getToApplication(), key.getToServiceType(), linkCallData.getTimeHistogram());
targetList.addAgentHistogram(key.getToApplication(), key.getToServiceType(), linkCallData.getTimeHistogram());
}
return targetList;
}
@@ -84,7 +84,7 @@ public class LinkCallDataMap {
final LinkCallData linkCallData = linkKeyRawCallDataEntry.getValue();
// to의 ServiceType이 들어가야 한다.
// 여기서 source란 source의 입장에서 target 호출시의 데이터를 의미하는 것이기 때문에. ServiceType자체는 To의 ServiceType이 들어가야한다.
sourceList.addCallHistogram(key.getFromApplication(), key.getToServiceType(), linkCallData.getTimeHistogram());
sourceList.addAgentHistogram(key.getFromApplication(), key.getToServiceType(), linkCallData.getTimeHistogram());
}
return sourceList;
}
@@ -205,7 +205,7 @@ public class MapServiceImpl implements MapService {
for (LinkDataMap entry : list) {
for (LinkData linkData : entry.getLinkDataList()) {
AgentHistogramList sourceList = linkData.getSourceList();
Collection<AgentHistogram> agentHistogramList = sourceList.getCallHistogramList();
Collection<AgentHistogram> agentHistogramList = sourceList.getAgentHistogramList();
for (AgentHistogram histogram : agentHistogramList) {
for (TimeHistogram timeHistogram : histogram.getTimeHistogram()) {
Application toApplication = linkData.getToApplication();
@@ -1,6 +1,7 @@
package com.nhn.pinpoint.web.view;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.nhn.pinpoint.web.vo.Application;
import java.util.List;
@@ -10,11 +11,11 @@ import java.util.List;
@JsonSerialize(using=AgentResponseTimeViewModelSerializer.class)
public class AgentResponseTimeViewModel {
private final String agentName;
private final Application agentName;
private final List<ResponseTimeViewModel> responseTimeViewModel;
public AgentResponseTimeViewModel(String agentName, List<ResponseTimeViewModel> responseTimeViewModel) {
public AgentResponseTimeViewModel(Application agentName, List<ResponseTimeViewModel> responseTimeViewModel) {
if (agentName == null) {
throw new NullPointerException("agentName must not be null");
}
@@ -26,7 +27,7 @@ public class AgentResponseTimeViewModel {
}
public String getAgentName() {
return agentName;
return agentName.getName();
}
public List<ResponseTimeViewModel> getResponseTimeViewModel() {
@@ -69,7 +69,7 @@ public class LinkSerializer extends JsonSerializer<Link> {
private void writeAgentHistogram(String fieldName, AgentHistogramList agentHistogramList, JsonGenerator jgen) throws IOException {
jgen.writeFieldName(fieldName);
jgen.writeStartObject();
for (AgentHistogram agentHistogram : agentHistogramList.getCallHistogramList()) {
for (AgentHistogram agentHistogram : agentHistogramList.getAgentHistogramList()) {
jgen.writeFieldName(agentHistogram.getId());
jgen.writeObject(agentHistogram.getHistogram());
}
@@ -27,7 +27,7 @@ public class LinkSerializerTest {
public void testSerialize() throws Exception {
AgentHistogramList list = new AgentHistogramList();
AgentHistogram histogram = new AgentHistogram(new Application("test", ServiceType.TOMCAT));
list.addCallHistogram(histogram);
list.addAgentHistogram(histogram);
Node node1 = new Node(new Application("test1", ServiceType.TOMCAT));
Node node2 = new Node(new Application("test1", ServiceType.TOMCAT));