/* * 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.view; import com.navercorp.pinpoint.web.applicationmap.Link; import com.navercorp.pinpoint.web.applicationmap.Node; import com.navercorp.pinpoint.web.applicationmap.ServerInstanceList; import com.navercorp.pinpoint.web.applicationmap.histogram.Histogram; import com.navercorp.pinpoint.web.applicationmap.rawdata.AgentHistogram; import com.navercorp.pinpoint.web.applicationmap.rawdata.AgentHistogramList; import com.navercorp.pinpoint.web.vo.Application; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; import java.util.Collection; import java.util.List; /** * @author emeroad * @author netspider */ public class LinkSerializer extends JsonSerializer<Link> { @Override public void serialize(Link link, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeStringField("key", link.getLinkName()); // for servermap jgen.writeStringField("from", link.getFrom().getNodeName()); // necessary for go.js jgen.writeStringField("to", link.getTo().getNodeName()); // necessary for go.js // for FilterWizard. from, to agent mapping data writeAgentId("fromAgent", link.getFrom(), jgen); writeAgentId("toAgent", link.getTo(), jgen); writeSimpleNode("sourceInfo", link.getFrom(), jgen); writeSimpleNode("targetInfo", link.getTo(), jgen); Application filterApplication = link.getFilterApplication(); jgen.writeStringField("filterApplicationName", filterApplication.getName()); jgen.writeNumberField("filterApplicationServiceTypeCode", filterApplication.getServiceTypeCode()); jgen.writeStringField("filterApplicationServiceTypeName", filterApplication.getServiceType().getName()); if (link.isWasToWasLink()) { writeWasToWasTargetRpcList(link, jgen); } Histogram histogram = link.getHistogram(); jgen.writeNumberField("totalCount", histogram.getTotalCount()); // for go.js jgen.writeNumberField("errorCount", histogram.getTotalErrorCount()); jgen.writeNumberField("slowCount", histogram.getSlowCount()); jgen.writeObjectField("histogram", histogram); // data showing how agents call each of their respective links writeAgentHistogram("sourceHistogram", link.getSourceList(), jgen); writeAgentHistogram("targetHistogram", link.getTargetList(), jgen); writeTimeSeriesHistogram(link, jgen); writeSourceAgentTimeSeriesHistogram(link, jgen); // String state = link.getLinkState(); // jgen.writeStringField("state", state); // for go.js jgen.writeBooleanField("hasAlert", link.getLinkAlert()); // for go.js jgen.writeEndObject(); } private void writeAgentId(String fieldName, Node node, JsonGenerator jgen) throws IOException { if (node.getServiceType().isWas()) { jgen.writeFieldName(fieldName); jgen.writeStartArray(); ServerInstanceList serverInstanceList = node.getServerInstanceList(); if (serverInstanceList!= null) { for (String agentId : serverInstanceList.getAgentIdList()) { jgen.writeObject(agentId); } } jgen.writeEndArray(); } } private void writeWasToWasTargetRpcList(Link link, JsonGenerator jgen) throws IOException { // write additional information to be used for filtering failed WAS -> WAS call events. jgen.writeFieldName("filterTargetRpcList"); jgen.writeStartArray(); Collection<Application> sourceLinkTargetAgentList = link.getSourceLinkTargetAgentList(); for (Application application : sourceLinkTargetAgentList) { jgen.writeStartObject(); jgen.writeStringField("rpc", application.getName()); jgen.writeNumberField("rpcServiceTypeCode", application.getServiceTypeCode()); jgen.writeEndObject(); } jgen.writeEndArray(); } private void writeTimeSeriesHistogram(Link link, JsonGenerator jgen) throws IOException { List<ResponseTimeViewModel> sourceApplicationTimeSeriesHistogram = link.getLinkApplicationTimeSeriesHistogram(); jgen.writeFieldName("timeSeriesHistogram"); jgen.writeObject(sourceApplicationTimeSeriesHistogram); } private void writeAgentHistogram(String fieldName, AgentHistogramList agentHistogramList, JsonGenerator jgen) throws IOException { jgen.writeFieldName(fieldName); jgen.writeStartObject(); for (AgentHistogram agentHistogram : agentHistogramList.getAgentHistogramList()) { jgen.writeFieldName(agentHistogram.getId()); jgen.writeObject(agentHistogram.getHistogram()); } jgen.writeEndObject(); } private void writeSourceAgentTimeSeriesHistogram(Link link, JsonGenerator jgen) throws IOException { AgentResponseTimeViewModelList sourceAgentTimeSeriesHistogram = link.getSourceAgentTimeSeriesHistogram(); sourceAgentTimeSeriesHistogram.setFieldName("sourceTimeSeriesHistogram"); jgen.writeObject(sourceAgentTimeSeriesHistogram); } private void writeSimpleNode(String fieldName, Node node, JsonGenerator jgen) throws IOException { jgen.writeFieldName(fieldName); jgen.writeStartObject(); Application application = node.getApplication(); jgen.writeStringField("applicationName", application.getName()); jgen.writeStringField("serviceType", application.getServiceType().toString()); jgen.writeNumberField("serviceTypeCode", application.getServiceTypeCode()); jgen.writeBooleanField("isWas", application.getServiceType().isWas()); jgen.writeEndObject(); } }