diff --git a/web/src/main/java/com/navercorp/pinpoint/web/service/AgentInfoServiceImpl.java b/web/src/main/java/com/navercorp/pinpoint/web/service/AgentInfoServiceImpl.java index 40505e67b67c..a381c7c5da17 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/service/AgentInfoServiceImpl.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/service/AgentInfoServiceImpl.java @@ -21,6 +21,7 @@ import com.navercorp.pinpoint.common.server.util.AgentEventType; import com.navercorp.pinpoint.common.server.util.AgentLifeCycleState; import com.navercorp.pinpoint.common.server.util.time.Range; +import com.navercorp.pinpoint.loader.service.ServiceTypeRegistryService; import com.navercorp.pinpoint.web.dao.AgentInfoDao; import com.navercorp.pinpoint.web.dao.AgentLifeCycleDao; import com.navercorp.pinpoint.web.dao.ApplicationIndexDao; @@ -79,16 +80,20 @@ public class AgentInfoServiceImpl implements AgentInfoService { private final AgentStatDao jvmGcDao; + private final ServiceTypeRegistryService serviceTypeRegistryService; + public AgentInfoServiceImpl(AgentEventService agentEventService, AgentWarningStatService agentWarningStatService, ApplicationIndexDao applicationIndexDao, AgentInfoDao agentInfoDao, AgentLifeCycleDao agentLifeCycleDao, - AgentStatDao jvmGcDao) { + AgentStatDao jvmGcDao, + ServiceTypeRegistryService serviceTypeRegistryService) { this.agentEventService = Objects.requireNonNull(agentEventService, "agentEventService"); this.agentWarningStatService = Objects.requireNonNull(agentWarningStatService, "agentWarningStatService"); this.applicationIndexDao = Objects.requireNonNull(applicationIndexDao, "applicationIndexDao"); this.agentInfoDao = Objects.requireNonNull(agentInfoDao, "agentInfoDao"); this.agentLifeCycleDao = Objects.requireNonNull(agentLifeCycleDao, "agentLifeCycleDao"); this.jvmGcDao = Objects.requireNonNull(jvmGcDao, "jvmGcDao"); + this.serviceTypeRegistryService = Objects.requireNonNull(serviceTypeRegistryService, "serviceTypeRegistryService"); } @Override @@ -138,22 +143,29 @@ public ApplicationAgentHostList getApplicationAgentHostList(int offset, int limi private ApplicationAgentHostList getApplicationAgentHostList0(int offset, int limit, int durationDays) { List applicationNameList = getApplicationNameList(applicationIndexDao.selectAllApplicationNames()); if (offset > applicationNameList.size()) { - return new ApplicationAgentHostList(offset, offset, applicationNameList.size()); + ApplicationAgentHostList.Builder builder = newBuilder(offset, offset, applicationNameList.size()); + return builder.build(); } - long timeStamp = System.currentTimeMillis(); + final long timeStamp = System.currentTimeMillis(); + + final int startIndex = offset - 1; + final int endIndex = Math.min(startIndex + limit, applicationNameList.size()); - int startIndex = offset - 1; - int endIndex = Math.min(startIndex + limit, applicationNameList.size()); - ApplicationAgentHostList applicationAgentHostList = new ApplicationAgentHostList(offset, endIndex, applicationNameList.size()); + ApplicationAgentHostList.Builder builder = newBuilder(offset, endIndex, applicationNameList.size()); for (int i = startIndex; i < endIndex; i++) { String applicationName = applicationNameList.get(i); List agentIdList = getAgentIdList(applicationName, durationDays); List agentInfoList = this.agentInfoDao.getAgentInfos(agentIdList, timeStamp); - applicationAgentHostList.put(applicationName, agentInfoList); + builder.addAgentInfo(applicationName, agentInfoList); } - return applicationAgentHostList; + return builder.build(); + } + + private ApplicationAgentHostList.Builder newBuilder(int offset, int endIndex, int totalApplications) { + return ApplicationAgentHostList.newBuilder(serviceTypeRegistryService, + offset, endIndex, totalApplications); } private List getAgentIdList(String applicationName, int durationDays) { diff --git a/web/src/main/java/com/navercorp/pinpoint/web/view/ApplicationAgentHostListSerializer.java b/web/src/main/java/com/navercorp/pinpoint/web/view/ApplicationAgentHostListSerializer.java deleted file mode 100644 index 36d619ef4583..000000000000 --- a/web/src/main/java/com/navercorp/pinpoint/web/view/ApplicationAgentHostListSerializer.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2016 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.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.navercorp.pinpoint.loader.service.ServiceTypeRegistryService; -import com.navercorp.pinpoint.common.trace.ServiceType; -import com.navercorp.pinpoint.web.vo.AgentInfo; -import com.navercorp.pinpoint.web.vo.ApplicationAgentHostList; -import org.apache.commons.lang3.StringUtils; - -import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -/** - * @author Taejin Koo - */ -public class ApplicationAgentHostListSerializer extends JsonSerializer { - - private final ServiceTypeRegistryService serviceTypeRegistryService; - - public ApplicationAgentHostListSerializer(ServiceTypeRegistryService serviceTypeRegistryService) { - this.serviceTypeRegistryService = Objects.requireNonNull(serviceTypeRegistryService, "serviceTypeRegistryService"); - } - - @Override - public void serialize(ApplicationAgentHostList applicationAgentHostList, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException { - jsonGenerator.writeStartObject(); - jsonGenerator.writeNumberField("startIndex", applicationAgentHostList.getStartApplicationIndex()); - jsonGenerator.writeNumberField("endIndex", applicationAgentHostList.getEndApplicationIndex()); - jsonGenerator.writeNumberField("totalApplications", applicationAgentHostList.getTotalApplications()); - - jsonGenerator.writeArrayFieldStart("applications"); - writeApplicationList(applicationAgentHostList, jsonGenerator); - jsonGenerator.writeEndArray(); - - jsonGenerator.writeEndObject(); - } - - private void writeApplicationList(ApplicationAgentHostList applicationAgentHostList, JsonGenerator jsonGenerator) throws IOException { - for (Map.Entry> e : applicationAgentHostList.getMap().entrySet()) { - jsonGenerator.writeStartObject(); - writeApplication(e.getKey(), e.getValue(), jsonGenerator); - jsonGenerator.writeEndObject(); - } - - } - - private void writeApplication(String applicationName, List agentInfoList, JsonGenerator jsonGenerator) throws IOException { - jsonGenerator.writeStringField("applicationName", applicationName); - - jsonGenerator.writeArrayFieldStart("agents"); - writeAgentList(agentInfoList, jsonGenerator); - jsonGenerator.writeEndArray(); - } - - private void writeAgentList(List agentInfoList, JsonGenerator jsonGenerator) throws IOException { - for (AgentInfo agentInfo : agentInfoList) { - jsonGenerator.writeStartObject(); - writeAgent(agentInfo, jsonGenerator); - jsonGenerator.writeEndObject(); - } - } - - private void writeAgent(AgentInfo agentInfo, JsonGenerator jsonGenerator) throws IOException { - jsonGenerator.writeStringField("agentId", StringUtils.defaultString(agentInfo.getAgentId(), "")); - - final ServiceType serviceType = serviceTypeRegistryService.findServiceType(agentInfo.getServiceTypeCode()); - jsonGenerator.writeStringField("serviceType", StringUtils.defaultString(serviceType.getDesc(), "")); - jsonGenerator.writeStringField("hostName", StringUtils.defaultString(agentInfo.getHostName(), "")); - jsonGenerator.writeStringField("ip", StringUtils.defaultString(agentInfo.getIp(), "")); - } - -} \ No newline at end of file diff --git a/web/src/main/java/com/navercorp/pinpoint/web/vo/ApplicationAgentHostList.java b/web/src/main/java/com/navercorp/pinpoint/web/vo/ApplicationAgentHostList.java index 96d9d22055d3..675f9b2ddffa 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/vo/ApplicationAgentHostList.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/vo/ApplicationAgentHostList.java @@ -15,63 +15,184 @@ package com.navercorp.pinpoint.web.vo; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.navercorp.pinpoint.web.view.ApplicationAgentHostListSerializer; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.navercorp.pinpoint.common.util.StringUtils; +import com.navercorp.pinpoint.loader.service.ServiceTypeRegistryService; import java.util.ArrayList; -import java.util.LinkedHashMap; +import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; /** * @author Taejin Koo */ -@JsonSerialize(using = ApplicationAgentHostListSerializer.class) public class ApplicationAgentHostList { - private final Map> map = new LinkedHashMap<>(); - private final int startApplicationIndex; private final int endApplicationIndex; private final int totalApplications; - public ApplicationAgentHostList(int startApplicationIndex, int endApplicationIndex, int totalApplications) { + private final List applications; + + public ApplicationAgentHostList(int startApplicationIndex, int endApplicationIndex, int totalApplications, + List applications) { this.startApplicationIndex = startApplicationIndex; this.endApplicationIndex = endApplicationIndex; this.totalApplications = totalApplications; + this.applications = Objects.requireNonNull(applications, "applications"); } + @JsonProperty("startIndex") public int getStartApplicationIndex() { return startApplicationIndex; } + @JsonProperty("endIndex") public int getEndApplicationIndex() { return endApplicationIndex; } + @JsonProperty("totalApplications") public int getTotalApplications() { return totalApplications; } - public Map> getMap() { - return map; + public List getApplications() { + return applications; } - public void put(String applicationName, List agentInfoList) { - if (applicationName == null) { - return; - } + @Override + public String toString() { + return "ApplicationAgentHostList{" + + "startApplicationIndex=" + startApplicationIndex + + ", endApplicationIndex=" + endApplicationIndex + + ", totalApplications=" + totalApplications + + ", applications=" + applications + + '}'; + } + + public static Builder newBuilder(ServiceTypeRegistryService serviceTypeRegistryService, + int startApplicationIndex, int endApplicationIndex, int totalApplications) { + return new Builder(startApplicationIndex, endApplicationIndex, totalApplications, serviceTypeRegistryService); + } - List value = map.computeIfAbsent(applicationName, k -> new ArrayList<>()); + public static class Builder { + private final int startApplicationIndex; + private final int endApplicationIndex; + private final int totalApplications; + private final ServiceTypeRegistryService serviceTypeRegistryService; - if (agentInfoList == null) { - return; + private final Map> map = new HashMap<>(); + + public Builder(int startApplicationIndex, int endApplicationIndex, int totalApplications, ServiceTypeRegistryService serviceTypeRegistryService) { + this.startApplicationIndex = startApplicationIndex; + this.endApplicationIndex = endApplicationIndex; + this.totalApplications = totalApplications; + this.serviceTypeRegistryService = Objects.requireNonNull(serviceTypeRegistryService, "serviceTypeRegistryService"); } - for (AgentInfo agentInfo : agentInfoList) { - if (agentInfo != null) { - value.add(agentInfo); + + public void addAgentInfo(String applicationName, List agentInfoList) { + if (applicationName == null) { + return; + } + + List value = map.computeIfAbsent(applicationName, k -> new ArrayList<>()); + + if (agentInfoList == null) { + return; } + + for (AgentInfo agentInfo : agentInfoList) { + if (agentInfo != null) { + value.add(newAgentHost(agentInfo)); + } + } + } + + private AgentHost newAgentHost(AgentInfo agentInfo) { + String agentId = StringUtils.defaultString(agentInfo.getAgentId(), ""); + String hostName = StringUtils.defaultString(agentInfo.getHostName(), ""); + String ip = StringUtils.defaultString(agentInfo.getIp(), ""); + String serviceType = serviceTypeRegistryService.findServiceType(agentInfo.getServiceTypeCode()).getDesc(); + return new AgentHost(agentId, hostName, ip, serviceType); + } + + public ApplicationAgentHostList build() { + List applicationInfos = buildApplicationInfo(this.map); + ApplicationAgentHostList agents = new ApplicationAgentHostList(startApplicationIndex, endApplicationIndex, totalApplications, + applicationInfos); + return agents; + } + + private List buildApplicationInfo(Map> map) { + List applications = map.entrySet().stream() + .map(Builder::newApplication) + .sorted(Comparator.comparing(ApplicationInfo::getApplicationName)) + .collect(Collectors.toList()); + return applications; + } + + + private static ApplicationInfo newApplication(Map.Entry> entry) { + String applicationName = entry.getKey(); + + List agentHosts = entry.getValue(); + agentHosts.sort(Comparator.comparing(AgentHost::getAgentId)); + + return new ApplicationInfo(applicationName, agentHosts); + } + } + + public static class ApplicationInfo { + private final String applicationName; + private final List agents; + + public ApplicationInfo(String applicationName, List agents) { + this.applicationName = Objects.requireNonNull(applicationName, "applicationName"); + this.agents = Objects.requireNonNull(agents, "agents"); + } + + public String getApplicationName() { + return applicationName; + } + + public List getAgents() { + return agents; + } + } + + public static class AgentHost { + private final String agentId; + private final String hostName; + private final String ip; + private final String serviceType; + + public AgentHost(String agentId, String hostName, String ip, String serviceType) { + this.agentId = Objects.requireNonNull(agentId, "agentId"); + this.hostName = Objects.requireNonNull(hostName, "hostName"); + this.ip = Objects.requireNonNull(ip, "ip"); + this.serviceType = Objects.requireNonNull(serviceType, "serviceType"); + } + + public String getAgentId() { + return agentId; + } + + public String getHostName() { + return hostName; + } + + public String getIp() { + return ip; + } + + public String getServiceType() { + return serviceType; } }