/*
* 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.applicationmap.rawdata;
import com.navercorp.pinpoint.common.trace.ServiceType;
import com.navercorp.pinpoint.web.applicationmap.histogram.TimeHistogram;
import com.navercorp.pinpoint.web.util.TimeWindow;
import com.navercorp.pinpoint.web.vo.LinkKey;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* @author emeroad
*/
public class LinkCallDataMap {
// private final Logger logger = LoggerFactory.getLogger(this.getClass());
private final Map<LinkKey, LinkCallData> linkDataMap = new HashMap<>();
private final TimeWindow timeWindow;
public LinkCallDataMap() {
this(null);
}
public LinkCallDataMap(TimeWindow timeWindow) {
this.timeWindow = timeWindow;
}
public TimeWindow getTimeWindow() {
return this.timeWindow;
}
public void addCallData(String sourceAgentId, ServiceType sourceServiceType, String targetId, ServiceType targetServiceType, Collection<TimeHistogram> timeHistogramList) {
LinkKey linkKey = createLinkKey(sourceAgentId, sourceServiceType, targetId, targetServiceType);
LinkCallData linkCallData = getLinkCallData(linkKey);
linkCallData.addCallData(timeHistogramList);
}
public void addCallData(String sourceAgentId, ServiceType sourceServiceType, String targetId, ServiceType targetServiceType, long timestamp, short slot, long count) {
LinkKey linkKey = createLinkKey(sourceAgentId, sourceServiceType, targetId, targetServiceType);
LinkCallData linkCallData = getLinkCallData(linkKey);
linkCallData.addCallData(timestamp, slot, count);
}
private LinkKey createLinkKey(String sourceAgentId, ServiceType sourceServiceType, String targetId, ServiceType targetServiceType) {
return new LinkKey(sourceAgentId, sourceServiceType, targetId, targetServiceType);
}
public void addLinkDataMap(LinkCallDataMap target) {
if (target == null) {
throw new NullPointerException("target must not be null");
}
for (Map.Entry<LinkKey, LinkCallData> copyEntry : target.linkDataMap.entrySet()) {
final LinkKey key = copyEntry.getKey();
final LinkCallData copyLinkCallData = copyEntry.getValue();
LinkCallData linkCallData = getLinkCallData(key);
linkCallData.addRawCallData(copyLinkCallData);
}
}
private LinkCallData getLinkCallData(LinkKey key) {
final Map<LinkKey, LinkCallData> rawCallDataMap = this.linkDataMap;
LinkCallData linkCallData = rawCallDataMap.get(key);
if (linkCallData == null) {
linkCallData = new LinkCallData(key, timeWindow);
rawCallDataMap.put(key, linkCallData);
}
return linkCallData;
}
public Collection<LinkCallData> getLinkDataList() {
return linkDataMap.values();
}
public AgentHistogramList getTargetList() {
AgentHistogramList targetList = new AgentHistogramList();
for (Map.Entry<LinkKey, LinkCallData> linkKeyRawCallDataEntry : linkDataMap.entrySet()) {
final LinkKey key = linkKeyRawCallDataEntry.getKey();
final LinkCallData linkCallData = linkKeyRawCallDataEntry.getValue();
targetList.addAgentHistogram(key.getToApplication(), key.getToServiceType(), linkCallData.getTimeHistogram());
}
return targetList;
}
public AgentHistogramList getSourceList() {
AgentHistogramList sourceList = new AgentHistogramList();
for (Map.Entry<LinkKey, LinkCallData> linkKeyRawCallDataEntry : linkDataMap.entrySet()) {
final LinkKey key = linkKeyRawCallDataEntry.getKey();
final LinkCallData linkCallData = linkKeyRawCallDataEntry.getValue();
// need target (to) ServiceType
// the definition of source is data from the source when the source sends a request to a target.
// Thus ServiceType is the target's ServiceType
sourceList.addAgentHistogram(key.getFromApplication(), key.getToServiceType(), linkCallData.getTimeHistogram());
}
return sourceList;
}
@Override
public String toString() {
return "LinkCallDataMap{"
+ linkDataMap +
'}';
}
}