/* * 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.common.trace.ServiceType; 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.histogram.NodeHistogram; 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.List; import java.util.Map; /** * @author emeroad * @usthor minwoo.jung */ public class NodeSerializer extends JsonSerializer<Node> { @Override public void serialize(Node node, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartObject(); // jgen.writeStringField("id", node.getNodeName()); jgen.writeStringField("key", node.getNodeName()); // necessary for go.js jgen.writeStringField("applicationName", node.getApplicationTextName()); // for go.js jgen.writeStringField("category", node.getServiceType().toString()); // necessary for go.js jgen.writeStringField("serviceType", node.getServiceType().toString()); final ServiceType serviceType = node.getApplication().getServiceType(); // if (serviceType.isUser()) { // jgen.writeStringField("fig", "Ellipse"); // } else if(serviceType.isWas()) { // jgen.writeStringField("fig", "RoundedRectangle"); // } else { // jgen.writeStringField("fig", "Rectangle"); // } jgen.writeStringField("serviceTypeCode", Short.toString(serviceType.getCode())); // jgen.writeStringField("terminal", Boolean.toString(serviceType.isTerminal())); jgen.writeBooleanField("isWas", serviceType.isWas()); // for go.js jgen.writeBooleanField("isQueue", serviceType.isQueue()); jgen.writeBooleanField("isAuthorized", node.isAuthorized()); writeHistogram(jgen, node); if (node.getServiceType().isUnknown()) { writeEmptyObject(jgen, "serverList"); jgen.writeNumberField("instanceCount", 0); } else { final ServerInstanceList serverInstanceList = node.getServerInstanceList(); if (serverInstanceList != null) { jgen.writeObjectField("serverList", serverInstanceList); jgen.writeNumberField("instanceCount", serverInstanceList.getInstanceCount()); } else { writeEmptyObject(jgen, "serverList"); jgen.writeNumberField("instanceCount", 0); } } jgen.writeEndObject(); } private void writeHistogram(JsonGenerator jgen, Node node) throws IOException { final ServiceType serviceType = node.getServiceType(); final NodeHistogram nodeHistogram = node.getNodeHistogram(); // FIXME isn't this all ServiceTypes that can be a node? if (serviceType.isWas() || serviceType.isTerminal() || serviceType.isUnknown() || serviceType.isUser() || serviceType.isQueue()) { Histogram applicationHistogram = nodeHistogram.getApplicationHistogram(); if (applicationHistogram == null) { writeEmptyObject(jgen, "histogram"); jgen.writeBooleanField("hasAlert", false); // for go.js } else { jgen.writeObjectField("histogram", applicationHistogram); jgen.writeNumberField("totalCount", applicationHistogram.getTotalCount()); // for go.js jgen.writeNumberField("errorCount", applicationHistogram.getTotalErrorCount()); jgen.writeNumberField("slowCount", applicationHistogram.getSlowCount()); if (applicationHistogram.getTotalCount() == 0) { jgen.writeBooleanField("hasAlert", false); // for go.js } else { long error = applicationHistogram.getTotalErrorCount() / applicationHistogram.getTotalCount(); if (error * 100 > 10) { jgen.writeBooleanField("hasAlert", true); // for go.js } else { jgen.writeBooleanField("hasAlert", false); // for go.js } } } Map<String, Histogram> agentHistogramMap = nodeHistogram.getAgentHistogramMap(); if(agentHistogramMap == null) { writeEmptyObject(jgen, "agentHistogram"); } else { jgen.writeObjectField("agentHistogram", agentHistogramMap); } } else { jgen.writeBooleanField("hasAlert", false); // for go.js } // FIXME isn't this all ServiceTypes that can be a node? if (serviceType.isWas() || serviceType.isUser() || serviceType.isTerminal() || serviceType.isUnknown() || serviceType.isQueue()) { List<ResponseTimeViewModel> applicationTimeSeriesHistogram = nodeHistogram.getApplicationTimeHistogram(); if (applicationTimeSeriesHistogram == null) { writeEmptyArray(jgen, "timeSeriesHistogram"); } else { jgen.writeObjectField("timeSeriesHistogram", applicationTimeSeriesHistogram); } AgentResponseTimeViewModelList agentTimeSeriesHistogram = nodeHistogram.getAgentTimeHistogram(); jgen.writeObject(agentTimeSeriesHistogram); } } private void writeEmptyArray(JsonGenerator jgen, String fieldName) throws IOException { jgen.writeFieldName(fieldName); jgen.writeStartArray(); jgen.writeEndArray(); } private void writeEmptyObject(JsonGenerator jgen, String fieldName) throws IOException { jgen.writeFieldName(fieldName); jgen.writeStartObject(); jgen.writeEndObject(); } }