Skip to content

Commit

Permalink
[pinpoint-apm#2801] Add an option to exclude detailed histograms for …
Browse files Browse the repository at this point in the history
…server maps
  • Loading branch information
Xylus committed Jun 29, 2017
1 parent 5106b12 commit 82f0be0
Show file tree
Hide file tree
Showing 53 changed files with 855 additions and 470 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
package com.navercorp.pinpoint.web.applicationmap;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.navercorp.pinpoint.web.applicationmap.link.Link;
import com.navercorp.pinpoint.web.applicationmap.nodes.Node;

import java.util.Collection;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import com.navercorp.pinpoint.web.applicationmap.appender.histogram.NodeHistogramFactory;
import com.navercorp.pinpoint.web.applicationmap.appender.server.ServerInstanceListFactory;
import com.navercorp.pinpoint.web.applicationmap.link.LinkFactory.LinkType;
import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkDataDuplexMap;
import com.navercorp.pinpoint.web.vo.Application;

Expand All @@ -26,6 +27,8 @@
*/
public interface ApplicationMapBuilder {

ApplicationMapBuilder linkType(LinkType linkType);

ApplicationMapBuilder includeNodeHistogram(NodeHistogramFactory nodeHistogramFactory);

ApplicationMapBuilder includeServerInfo(ServerInstanceListFactory serverInstanceListFactory);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,15 @@
import com.navercorp.pinpoint.web.applicationmap.appender.server.EmptyServerInstanceListFactory;
import com.navercorp.pinpoint.web.applicationmap.appender.server.ServerInstanceListFactory;
import com.navercorp.pinpoint.web.applicationmap.histogram.NodeHistogram;
import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkData;
import com.navercorp.pinpoint.web.applicationmap.link.LinkFactory.LinkType;
import com.navercorp.pinpoint.web.applicationmap.link.LinkList;
import com.navercorp.pinpoint.web.applicationmap.link.LinkListFactory;
import com.navercorp.pinpoint.web.applicationmap.nodes.Node;
import com.navercorp.pinpoint.web.applicationmap.nodes.NodeList;
import com.navercorp.pinpoint.web.applicationmap.nodes.NodeListFactory;
import com.navercorp.pinpoint.web.applicationmap.nodes.ServerInstanceList;
import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkDataDuplexMap;
import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkDataMap;
import com.navercorp.pinpoint.web.vo.Application;
import com.navercorp.pinpoint.web.vo.LinkKey;
import com.navercorp.pinpoint.web.vo.Range;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -44,6 +48,7 @@ public class ApplicationMapBuilderV1 implements ApplicationMapBuilder {

private final Range range;

private LinkType linkType;
private NodeHistogramFactory nodeHistogramFactory;
private ServerInstanceListFactory serverInstanceListFactory;

Expand All @@ -54,6 +59,12 @@ public class ApplicationMapBuilderV1 implements ApplicationMapBuilder {
this.range = range;
}

@Override
public ApplicationMapBuilder linkType(LinkType linkType) {
this.linkType = linkType;
return this;
}

@Override
public ApplicationMapBuilder includeNodeHistogram(NodeHistogramFactory nodeHistogramFactory) {
this.nodeHistogramFactory = nodeHistogramFactory;
Expand Down Expand Up @@ -81,16 +92,30 @@ public ApplicationMap build(Application application) {
nodeList.addNode(node);
}
}

NodeHistogramFactory nodeHistogramFactory = this.nodeHistogramFactory;
if (nodeHistogramFactory == null) {
nodeHistogramFactory = new EmptyNodeHistogramFactory();
}
appendNodeResponseTime(nodeList, emptyLinkList, nodeHistogramFactory);

return new DefaultApplicationMap(range, nodeList, emptyLinkList);
}

@Override
public ApplicationMap build(LinkDataDuplexMap linkDataDuplexMap) {
if (linkDataDuplexMap == null) {
throw new NullPointerException("linkDataMap must not be null");
throw new NullPointerException("linkDataDuplexMap must not be null");
}
logger.info("Building application map");

LinkType linkType = this.linkType;
if (linkType == null) {
linkType = LinkType.DETAILED;
}
NodeList nodeList = buildNode(linkDataDuplexMap);
LinkList linkList = buildLink(nodeList, linkDataDuplexMap);

NodeList nodeList = NodeListFactory.createNodeList(linkDataDuplexMap);
LinkList linkList = LinkListFactory.createLinkList(linkType, nodeList, linkDataDuplexMap, range);

NodeHistogramFactory nodeHistogramFactory = this.nodeHistogramFactory;
if (nodeHistogramFactory == null) {
Expand All @@ -108,155 +133,6 @@ public ApplicationMap build(LinkDataDuplexMap linkDataDuplexMap) {
return map;
}

private NodeList buildNode(LinkDataDuplexMap linkDataDuplexMap) {
NodeList nodeList = new NodeList();
createNode(nodeList, linkDataDuplexMap.getSourceLinkDataMap());
logger.debug("node size:{}", nodeList.size());
createNode(nodeList, linkDataDuplexMap.getTargetLinkDataMap());
logger.debug("node size:{}", nodeList.size());

logger.debug("allNode:{}", nodeList.getNodeList());
return nodeList;
}

private void createNode(NodeList nodeList, LinkDataMap linkDataMap) {

for (LinkData linkData : linkDataMap.getLinkDataList()) {
final Application fromApplication = linkData.getFromApplication();
// FROM is either a CLIENT or a node
// cannot be RPC. Already converted to unknown.
if (!fromApplication.getServiceType().isRpcClient()) {
final boolean success = addNode(nodeList, fromApplication);
if (success) {
logger.debug("createSourceNode:{}", fromApplication);
}
} else {
logger.warn("found rpc fromNode linkData:{}", linkData);
}

final Application toApplication = linkData.getToApplication();
// FROM -> TO : TO is either a CLIENT or a node
if (!toApplication.getServiceType().isRpcClient()) {
final boolean success = addNode(nodeList, toApplication);
if (success) {
logger.debug("createTargetNode:{}", toApplication);
}
} else {
logger.warn("found rpc toNode:{}", linkData);
}
}
}

private boolean addNode(NodeList nodeList, Application application) {
if (nodeList.containsNode(application)) {
return false;
}
Node fromNode = new Node(application);
return nodeList.addNode(fromNode);
}

private LinkList buildLink(NodeList nodeList, LinkDataDuplexMap linkDataDuplexMap) {
// don't change
LinkList linkList = new LinkList();
createSourceLink(nodeList, linkList, linkDataDuplexMap.getSourceLinkDataMap());
logger.debug("link size:{}", linkList.size());
createTargetLink(nodeList, linkList, linkDataDuplexMap.getTargetLinkDataMap());
logger.debug("link size:{}", linkList.size());

for (Link link : linkList.getLinkList()) {
appendLinkHistogram(link, linkDataDuplexMap);
}
return linkList;
}

private void appendLinkHistogram(Link link, LinkDataDuplexMap linkDataDuplexMap) {
logger.debug("appendLinkHistogram link:{}", link);

LinkKey key = link.getLinkKey();
LinkData sourceLinkData = linkDataDuplexMap.getSourceLinkData(key);
if (sourceLinkData != null) {
link.addSource(sourceLinkData.getLinkCallDataMap());
}
LinkData targetLinkData = linkDataDuplexMap.getTargetLinkData(key);
if (targetLinkData != null) {
link.addTarget(targetLinkData.getLinkCallDataMap());
}
}

private void createSourceLink(NodeList nodeList, LinkList linkList, LinkDataMap linkDataMap) {
for (LinkData linkData : linkDataMap.getLinkDataList()) {
final Application fromApplicationId = linkData.getFromApplication();
Node fromNode = nodeList.findNode(fromApplicationId);

final Application toApplicationId = linkData.getToApplication();
Node toNode = nodeList.findNode(toApplicationId);

// rpc client missing
if (toNode == null) {
logger.warn("toNode rcp client not found:{}", toApplicationId);
continue;
}

// for RPC clients: skip if there is a dest application, convert to "unknown cloud" if not
// shouldn't really be necessary as rpc client toNodes are converted to unknown nodes beforehand.
if (toNode.getServiceType().isRpcClient()) {
if (!nodeList.containsNode(toNode.getApplication())) {
final Link link = addLink(linkList, fromNode, toNode, CreateType.Source);
if (link != null) {
logger.debug("createRpcSourceLink:{}", link);
}
}
} else {
final Link link = addLink(linkList, fromNode, toNode, CreateType.Source);
if (link != null) {
logger.debug("createSourceLink:{}", link);
}
}
}
}

private Link addLink(LinkList linkList, Node fromNode, Node toNode, CreateType createType) {
final Link link = new Link(createType, fromNode, toNode, range);
if (linkList.addLink(link)) {
return link;
} else {
return null;
}
}

private void createTargetLink(NodeList nodeList, LinkList linkList, LinkDataMap linkDataMap) {

for (LinkData linkData : linkDataMap.getLinkDataList()) {
final Application fromApplicationId = linkData.getFromApplication();
Node fromNode = nodeList.findNode(fromApplicationId);

final Application toApplicationId = linkData.getToApplication();
Node toNode = nodeList.findNode(toApplicationId);

// rpc client missing
if (fromNode == null) {
logger.warn("fromNode rcp client not found:{}", toApplicationId);
continue;
}

// for RPC clients: skip if there is a dest application, convert to "unknown cloud" if not
if (toNode.getServiceType().isRpcClient()) {
// check if "to" node exists
if (!nodeList.containsNode(toNode.getApplication())) {
final Link link = addLink(linkList, fromNode, toNode, CreateType.Target);
if (link != null) {
logger.debug("createRpcTargetLink:{}", link);
}
}
} else {
final Link link = addLink(linkList, fromNode, toNode, CreateType.Target);
if (link != null) {
logger.debug("createTargetLink:{}", link);
}
}
}
}

public void appendNodeResponseTime(NodeList nodeList, LinkList linkList, NodeHistogramFactory nodeHistogramFactory) {
final Collection<Node> nodes = nodeList.getNodeList();
for (Node node : nodes) {
Expand Down
Loading

0 comments on commit 82f0be0

Please sign in to comment.