diff --git a/collector/src/main/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFAgentStatMapper.java b/collector/src/main/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFAgentStatMapper.java index a93520ff6698..4e9410c9485a 100644 --- a/collector/src/main/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFAgentStatMapper.java +++ b/collector/src/main/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFAgentStatMapper.java @@ -17,6 +17,8 @@ import com.navercorp.pinpoint.common.server.bo.stat.*; import com.navercorp.pinpoint.thrift.dto.flink.TFAgentStat; +import com.navercorp.pinpoint.thrift.dto.flink.TFDataSourceList; +import com.navercorp.pinpoint.thrift.dto.flink.TFJvmGc; import java.util.*; @@ -29,6 +31,7 @@ public class TFAgentStatMapper { private static final TFTransactionMapper tFTransactionMapper = new TFTransactionMapper(); private static final TFActiveTraceMapper tFActiveTraceMapper = new TFActiveTraceMapper(); private static final TFResponseTimeMapper tFResponseTimeMapper = new TFResponseTimeMapper(); + private static final TFDataSourceListBoMapper tFDataSourceListBoMapper = new TFDataSourceListBoMapper(); public List map(AgentStatBo agentStatBo) { final TreeMap tFAgentStatMap = new TreeMap<>(); @@ -40,9 +43,21 @@ public List map(AgentStatBo agentStatBo) { insertTFTransaction(tFAgentStatMap, agentStatBo.getTransactionBos(), agentId, startTimestamp); insertTFActiveTrace(tFAgentStatMap, agentStatBo.getActiveTraceBos(), agentId, startTimestamp); insertTFResponseTime(tFAgentStatMap, agentStatBo.getResponseTimeBos(), agentId, startTimestamp); + insertTFDataSourceList(tFAgentStatMap, agentStatBo.getDataSourceListBos(), agentId, startTimestamp); return new ArrayList<>(tFAgentStatMap.values()); } + private void insertTFDataSourceList(TreeMap tFAgentStatMap, List dataSourceListBoList, String agentId, long startTimestamp) { + if (dataSourceListBoList == null) { + return; + } + + for (DataSourceListBo dataSourceListBo : dataSourceListBoList) { + TFAgentStat tFAgentStat = getOrCreateTFAgentStat(tFAgentStatMap, dataSourceListBo.getTimestamp(), agentId, startTimestamp); + tFAgentStat.setDataSourceList(tFDataSourceListBoMapper.map(dataSourceListBo)); + } + } + private void insertTFResponseTime(TreeMap tFAgentStatMap, List responseTimeBoList, String agentId, long startTimestamp) { if (responseTimeBoList == null) { return; @@ -52,7 +67,6 @@ private void insertTFResponseTime(TreeMap tFAgentStatMap, Lis TFAgentStat tFAgentStat = getOrCreateTFAgentStat(tFAgentStatMap, responseTimeBo.getTimestamp(), agentId, startTimestamp); tFAgentStat.setResponseTime(tFResponseTimeMapper.map(responseTimeBo)); } - } private void insertTFActiveTrace(TreeMap tFAgentStatMap, List activeTraceBoList, String agentId, long startTimestamp) { diff --git a/collector/src/main/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFDataSourceBoMapper.java b/collector/src/main/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFDataSourceBoMapper.java new file mode 100644 index 000000000000..00a84ef4b562 --- /dev/null +++ b/collector/src/main/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFDataSourceBoMapper.java @@ -0,0 +1,37 @@ +/* + * Copyright 2017 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.collector.mapper.thrift.stat; + +import com.navercorp.pinpoint.common.server.bo.stat.DataSourceBo; +import com.navercorp.pinpoint.thrift.dto.flink.TFDataSource; + + +/** + * @author minwoo.jung + */ +public class TFDataSourceBoMapper { + + public TFDataSource map(DataSourceBo dataSourceBo) { + TFDataSource tFDataSource = new TFDataSource(); + tFDataSource.setId(dataSourceBo.getId()); + tFDataSource.setServiceTypeCode(dataSourceBo.getServiceTypeCode()); + tFDataSource.setDatabaseName(dataSourceBo.getDatabaseName()); + tFDataSource.setUrl(dataSourceBo.getJdbcUrl()); + tFDataSource.setActiveConnectionSize(dataSourceBo.getActiveConnectionSize()); + tFDataSource.setMaxConnectionSize(dataSourceBo.getMaxConnectionSize()); + return tFDataSource; + } +} diff --git a/collector/src/main/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFDataSourceListBoMapper.java b/collector/src/main/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFDataSourceListBoMapper.java new file mode 100644 index 000000000000..f53047e13642 --- /dev/null +++ b/collector/src/main/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFDataSourceListBoMapper.java @@ -0,0 +1,47 @@ +/* + * Copyright 2017 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.collector.mapper.thrift.stat; + +import com.navercorp.pinpoint.common.server.bo.stat.DataSourceBo; +import com.navercorp.pinpoint.common.server.bo.stat.DataSourceListBo; +import com.navercorp.pinpoint.thrift.dto.flink.TFDataSource; +import com.navercorp.pinpoint.thrift.dto.flink.TFDataSourceList; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author minwoo.jung + */ +public class TFDataSourceListBoMapper { + + private static final TFDataSourceBoMapper tFDataSourceBoMapper = new TFDataSourceBoMapper(); + + public TFDataSourceList map(DataSourceListBo dataSourceListBo) { + List dataSourceBoList = dataSourceListBo.getList(); + List dataSourceList = new ArrayList<>(dataSourceBoList.size()); + + for (DataSourceBo dataSourceBo : dataSourceBoList) { + dataSourceList.add(tFDataSourceBoMapper.map(dataSourceBo)); + } + + TFDataSourceList tFDataSourceList = new TFDataSourceList(); + tFDataSourceList.setDataSourceList(dataSourceList); + + return tFDataSourceList; + } + +} diff --git a/collector/src/test/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFAgentStatMapperTest.java b/collector/src/test/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFAgentStatMapperTest.java index ca362bd46793..5af6e8867dc6 100644 --- a/collector/src/test/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFAgentStatMapperTest.java +++ b/collector/src/test/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFAgentStatMapperTest.java @@ -16,13 +16,17 @@ package com.navercorp.pinpoint.collector.mapper.thrift.stat; -import com.navercorp.pinpoint.common.server.bo.stat.AgentStatBo; -import com.navercorp.pinpoint.common.server.bo.stat.CpuLoadBo; -import com.navercorp.pinpoint.thrift.dto.flink.TFAgentStat; +import com.navercorp.pinpoint.common.server.bo.JvmGcType; +import com.navercorp.pinpoint.common.server.bo.codec.stat.join.ResponseTimeCodec; +import com.navercorp.pinpoint.common.server.bo.stat.*; +import com.navercorp.pinpoint.common.trace.SlotType; +import com.navercorp.pinpoint.thrift.dto.flink.*; import org.junit.Test; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static org.junit.Assert.*; @@ -96,8 +100,300 @@ private List createCpuLoadBoList() { cpuLoadBo2.setSystemCpuLoad(6); cpuLoadBoList.add(cpuLoadBo2); - return cpuLoadBoList; } + @Test + public void map2Test() throws Exception { + final AgentStatBo agentStatBo = new AgentStatBo(); + agentStatBo.setStartTimestamp(startTimestamp); + agentStatBo.setAgentId(TEST_AGENT); + agentStatBo.setDataSourceListBos(createDataSourceListBoList());; + + List tFAgentStatList = new TFAgentStatMapper().map(agentStatBo); + assertEquals(2, tFAgentStatList.size()); + + TFAgentStat tFAgentStat1 = tFAgentStatList.get(0); + assertEquals(tFAgentStat1.getAgentId(), TEST_AGENT); + assertEquals(tFAgentStat1.getStartTimestamp(), startTimestamp); + assertEquals(tFAgentStat1.getTimestamp(), collectTime1st); + assertEquals(tFAgentStat1.isSetDataSourceList(), true); + List dataSourceList1 = tFAgentStat1.getDataSourceList().getDataSourceList(); + assertEquals(dataSourceList1.size(), 2); + TFDataSource tfDataSource1_1 = dataSourceList1.get(0); + TFDataSource tfDataSource1_2 = dataSourceList1.get(1); + assertEquals(tfDataSource1_1.getId(), 1); + assertEquals(tfDataSource1_1.getUrl(), "jdbc:mysql"); + assertEquals(tfDataSource1_1.getServiceTypeCode(), 1000); + assertEquals(tfDataSource1_1.getActiveConnectionSize(), 15); + assertEquals(tfDataSource1_1.getMaxConnectionSize(), 30); + assertEquals(tfDataSource1_1.getDatabaseName(), "pinpoint1"); + assertEquals(tfDataSource1_2.getId(), 2); + assertEquals(tfDataSource1_2.getUrl(), "jdbc:mssql"); + assertEquals(tfDataSource1_2.getServiceTypeCode(), 2000); + assertEquals(tfDataSource1_2.getActiveConnectionSize(), 25); + assertEquals(tfDataSource1_2.getMaxConnectionSize(), 40); + assertEquals(tfDataSource1_2.getDatabaseName(), "pinpoint2"); + + + TFAgentStat tFAgentStat2 = tFAgentStatList.get(1); + assertEquals(tFAgentStat2.getAgentId(), TEST_AGENT); + assertEquals(tFAgentStat2.getStartTimestamp(), startTimestamp); + assertEquals(tFAgentStat2.getTimestamp(), collectTime2nd); + assertEquals(tFAgentStat2.isSetDataSourceList(), true); + List dataSourceList2 = tFAgentStat2.getDataSourceList().getDataSourceList(); + assertEquals(dataSourceList2.size(), 2); + TFDataSource tfDataSource2_1 = dataSourceList2.get(0); + TFDataSource tfDataSource2_2 = dataSourceList2.get(1); + assertEquals(tfDataSource2_1.getId(), 1); + assertEquals(tfDataSource2_1.getUrl(), "jdbc:mysql"); + assertEquals(tfDataSource2_1.getServiceTypeCode(), 1000); + assertEquals(tfDataSource2_1.getActiveConnectionSize(), 16); + assertEquals(tfDataSource2_1.getMaxConnectionSize(), 31); + assertEquals(tfDataSource2_1.getDatabaseName(), "pinpoint1"); + assertEquals(tfDataSource2_2.getId(), 2); + assertEquals(tfDataSource2_2.getUrl(), "jdbc:mssql"); + assertEquals(tfDataSource2_2.getServiceTypeCode(), 2000); + assertEquals(tfDataSource2_2.getActiveConnectionSize(), 26); + assertEquals(tfDataSource2_2.getMaxConnectionSize(), 41); + assertEquals(tfDataSource2_2.getDatabaseName(), "pinpoint2"); + } + + private List createDataSourceListBoList() { + List dataSourceListBoList = new ArrayList<>(); + + DataSourceListBo dataSourceListBo1 = new DataSourceListBo(); + dataSourceListBo1.setAgentId("test_agent1"); + dataSourceListBo1.setStartTimestamp(startTimestamp); + dataSourceListBo1.setTimestamp(collectTime1st); + + DataSourceBo dataSourceBo1_1 = new DataSourceBo(); + dataSourceBo1_1.setAgentId("test_agent1"); + dataSourceBo1_1.setTimestamp(collectTime1st); + dataSourceBo1_1.setServiceTypeCode((short) 1000); + dataSourceBo1_1.setJdbcUrl("jdbc:mysql"); + dataSourceBo1_1.setActiveConnectionSize(15); + dataSourceBo1_1.setMaxConnectionSize(30); + dataSourceBo1_1.setId(1); + dataSourceBo1_1.setDatabaseName("pinpoint1"); + DataSourceBo dataSourceBo1_2 = new DataSourceBo(); + dataSourceBo1_2.setAgentId("test_agent1"); + dataSourceBo1_2.setTimestamp(collectTime1st); + dataSourceBo1_2.setAgentId("test_agent1"); + dataSourceBo1_2.setServiceTypeCode((short) 2000); + dataSourceBo1_2.setJdbcUrl("jdbc:mssql"); + dataSourceBo1_2.setActiveConnectionSize(25); + dataSourceBo1_2.setMaxConnectionSize(40); + dataSourceBo1_2.setId(2); + dataSourceBo1_2.setDatabaseName("pinpoint2"); + dataSourceListBo1.add(dataSourceBo1_1); + dataSourceListBo1.add(dataSourceBo1_2); + + DataSourceListBo dataSourceListBo2 = new DataSourceListBo(); + dataSourceListBo2.setAgentId("test_agent1"); + dataSourceListBo2.setStartTimestamp(startTimestamp); + dataSourceListBo2.setTimestamp(collectTime2nd); + + DataSourceBo dataSourceBo2_1 = new DataSourceBo(); + dataSourceBo2_1.setAgentId("test_agent1"); + dataSourceBo2_1.setTimestamp(collectTime2nd); + dataSourceBo2_1.setServiceTypeCode((short) 1000); + dataSourceBo2_1.setJdbcUrl("jdbc:mysql"); + dataSourceBo2_1.setActiveConnectionSize(16); + dataSourceBo2_1.setMaxConnectionSize(31); + dataSourceBo2_1.setId(1); + dataSourceBo2_1.setDatabaseName("pinpoint1"); + DataSourceBo dataSourceBo2_2 = new DataSourceBo(); + dataSourceBo2_2.setAgentId("test_agent1"); + dataSourceBo2_2.setTimestamp(collectTime2nd); + dataSourceBo2_2.setAgentId("test_agent1"); + dataSourceBo2_2.setServiceTypeCode((short) 2000); + dataSourceBo2_2.setJdbcUrl("jdbc:mssql"); + dataSourceBo2_2.setActiveConnectionSize(26); + dataSourceBo2_2.setMaxConnectionSize(41); + dataSourceBo2_2.setId(2); + dataSourceBo2_2.setDatabaseName("pinpoint2"); + dataSourceListBo2.add(dataSourceBo2_1); + dataSourceListBo2.add(dataSourceBo2_2); + + dataSourceListBoList.add(dataSourceListBo1); + dataSourceListBoList.add(dataSourceListBo2); + + return dataSourceListBoList; + } + + @Test + public void map3Test() throws Exception { + final AgentStatBo agentStatBo = new AgentStatBo(); + agentStatBo.setStartTimestamp(startTimestamp); + agentStatBo.setAgentId(TEST_AGENT); + agentStatBo.setJvmGcBos(createJvmGcBoList()); + + List tFAgentStatList = new TFAgentStatMapper().map(agentStatBo); + assertEquals(2, tFAgentStatList.size()); + + TFAgentStat tFAgentStat1 = tFAgentStatList.get(0); + assertEquals(tFAgentStat1.getAgentId(), TEST_AGENT); + assertEquals(tFAgentStat1.getStartTimestamp(), startTimestamp); + assertEquals(tFAgentStat1.getTimestamp(), collectTime1st); + TFJvmGc tFJvmGc1 = tFAgentStat1.getGc(); + assertEquals(tFJvmGc1.getJvmMemoryHeapUsed(), 3000); + assertEquals(tFJvmGc1.getJvmMemoryNonHeapUsed(), 300); + + TFAgentStat tFAgentStat2 = tFAgentStatList.get(1); + assertEquals(tFAgentStat2.getAgentId(), TEST_AGENT); + assertEquals(tFAgentStat2.getStartTimestamp(), startTimestamp); + assertEquals(tFAgentStat2.getTimestamp(), collectTime2nd); + TFJvmGc tFJvmGc2 = tFAgentStat2.getGc(); + assertEquals(tFJvmGc2.getJvmMemoryHeapUsed(), 3100); + assertEquals(tFJvmGc2.getJvmMemoryNonHeapUsed(), 310); + } + + private List createJvmGcBoList() { + List jvmGcBoList = new ArrayList<>(); + + JvmGcBo jvmGcBo1 = new JvmGcBo(); + jvmGcBo1.setAgentId("test_agent1"); + jvmGcBo1.setStartTimestamp(startTimestamp); + jvmGcBo1.setTimestamp(collectTime1st); + jvmGcBo1.setGcType(JvmGcType.G1); + jvmGcBo1.setHeapUsed(3000); + jvmGcBo1.setHeapMax(5000); + jvmGcBo1.setNonHeapUsed(300); + jvmGcBo1.setNonHeapMax(500); + jvmGcBo1.setGcOldCount(5); + jvmGcBo1.setGcOldTime(10); + jvmGcBoList.add(jvmGcBo1); + + JvmGcBo jvmGcBo2 = new JvmGcBo(); + jvmGcBo2.setAgentId("test_agent1"); + jvmGcBo2.setStartTimestamp(startTimestamp); + jvmGcBo2.setTimestamp(collectTime2nd); + jvmGcBo2.setGcType(JvmGcType.G1); + jvmGcBo2.setHeapUsed(3100); + jvmGcBo2.setHeapMax(5100); + jvmGcBo2.setNonHeapUsed(310); + jvmGcBo2.setNonHeapMax(510); + jvmGcBo2.setGcOldCount(15); + jvmGcBo2.setGcOldTime(20); + jvmGcBoList.add(jvmGcBo2); + + return jvmGcBoList; + } + + @Test + public void map4Test() { + final AgentStatBo agentStatBo = new AgentStatBo(); + agentStatBo.setStartTimestamp(startTimestamp); + agentStatBo.setAgentId(TEST_AGENT); + agentStatBo.setActiveTraceBos(createActiveTraceBoList()); + + List tFAgentStatList = new TFAgentStatMapper().map(agentStatBo); + assertEquals(2, tFAgentStatList.size()); + + TFAgentStat tFAgentStat1 = tFAgentStatList.get(0); + assertEquals(tFAgentStat1.getAgentId(), TEST_AGENT); + assertEquals(tFAgentStat1.getStartTimestamp(), startTimestamp); + assertEquals(tFAgentStat1.getTimestamp(), collectTime1st); + TFActiveTrace activeTrace1 = tFAgentStat1.getActiveTrace(); + TFActiveTraceHistogram histogram1 = activeTrace1.getHistogram(); + List activeTraceCount1 = histogram1.getActiveTraceCount(); + assertEquals((int)activeTraceCount1.get(0), 30); + assertEquals((int)activeTraceCount1.get(1), 40); + assertEquals((int)activeTraceCount1.get(2), 10); + assertEquals((int)activeTraceCount1.get(3), 50); + + TFAgentStat tFAgentStat2 = tFAgentStatList.get(1); + assertEquals(tFAgentStat2.getAgentId(), TEST_AGENT); + assertEquals(tFAgentStat2.getStartTimestamp(), startTimestamp); + assertEquals(tFAgentStat2.getTimestamp(), collectTime2nd); + TFActiveTrace activeTrace2 = tFAgentStat2.getActiveTrace(); + TFActiveTraceHistogram histogram2 = activeTrace2.getHistogram(); + List activeTraceCount2 = histogram2.getActiveTraceCount(); + assertEquals((int)activeTraceCount2.get(0), 31); + assertEquals((int)activeTraceCount2.get(1), 41); + assertEquals((int)activeTraceCount2.get(2), 11); + assertEquals((int)activeTraceCount2.get(3), 51); + } + + private List createActiveTraceBoList() { + List activeTraceBoList = new ArrayList<>(); + + ActiveTraceBo activeTraceBo1 = new ActiveTraceBo(); + activeTraceBo1.setAgentId("test_agent1"); + activeTraceBo1.setStartTimestamp(startTimestamp); + activeTraceBo1.setTimestamp(collectTime1st); + activeTraceBo1.setVersion((short) 1); + activeTraceBo1.setHistogramSchemaType(2); + Map activeTraceCountMap1 = new HashMap<>(); + activeTraceCountMap1.put(SlotType.FAST, 30); + activeTraceCountMap1.put(SlotType.NORMAL, 40); + activeTraceCountMap1.put(SlotType.SLOW, 10); + activeTraceCountMap1.put(SlotType.VERY_SLOW, 50); + activeTraceBo1.setActiveTraceCounts(activeTraceCountMap1); + activeTraceBoList.add(activeTraceBo1); + + ActiveTraceBo activeTraceBo2 = new ActiveTraceBo(); + activeTraceBo2.setAgentId("test_agent1"); + activeTraceBo2.setStartTimestamp(startTimestamp); + activeTraceBo2.setTimestamp(collectTime2nd); + activeTraceBo2.setVersion((short) 1); + activeTraceBo2.setHistogramSchemaType(2); + Map activeTraceCountMap2 = new HashMap<>(); + activeTraceCountMap2.put(SlotType.FAST, 31); + activeTraceCountMap2.put(SlotType.NORMAL, 41); + activeTraceCountMap2.put(SlotType.SLOW, 11); + activeTraceCountMap2.put(SlotType.VERY_SLOW, 51); + activeTraceBo2.setActiveTraceCounts(activeTraceCountMap2); + activeTraceBoList.add(activeTraceBo2); + + return activeTraceBoList; + } + + @Test + public void map5Test() { + final AgentStatBo agentStatBo = new AgentStatBo(); + agentStatBo.setStartTimestamp(startTimestamp); + agentStatBo.setAgentId(TEST_AGENT); + agentStatBo.setResponseTimeBos(createResponseTimeBoList()); + + List tFAgentStatList = new TFAgentStatMapper().map(agentStatBo); + assertEquals(2, tFAgentStatList.size()); + + TFAgentStat tFAgentStat1 = tFAgentStatList.get(0); + assertEquals(tFAgentStat1.getAgentId(), TEST_AGENT); + assertEquals(tFAgentStat1.getStartTimestamp(), startTimestamp); + assertEquals(tFAgentStat1.getTimestamp(), collectTime1st); + TFResponseTime responseTime1 = tFAgentStat1.getResponseTime(); + assertEquals(responseTime1.getAvg(), 1000); + + TFAgentStat tFAgentStat2 = tFAgentStatList.get(1); + assertEquals(tFAgentStat2.getAgentId(), TEST_AGENT); + assertEquals(tFAgentStat2.getStartTimestamp(), startTimestamp); + assertEquals(tFAgentStat2.getTimestamp(), collectTime2nd); + TFResponseTime responseTime2 = tFAgentStat2.getResponseTime(); + assertEquals(responseTime2.getAvg(), 2000); + } + + private List createResponseTimeBoList() { + List responseTimeBoList = new ArrayList<>(); + + ResponseTimeBo responseTimeBo1 = new ResponseTimeBo(); + responseTimeBo1.setAvg(1000); + responseTimeBo1.setStartTimestamp(startTimestamp); + responseTimeBo1.setAgentId(TEST_AGENT); + responseTimeBo1.setTimestamp(collectTime1st); + responseTimeBoList.add(responseTimeBo1); + + ResponseTimeBo responseTimeBo2 = new ResponseTimeBo(); + responseTimeBo2.setAvg(2000); + responseTimeBo2.setStartTimestamp(startTimestamp); + responseTimeBo2.setAgentId(TEST_AGENT); + responseTimeBo2.setTimestamp(collectTime2nd); + responseTimeBoList.add(responseTimeBo2); + + return responseTimeBoList; + } + + } \ No newline at end of file diff --git a/collector/src/test/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFDataSourceBoMapperTest.java b/collector/src/test/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFDataSourceBoMapperTest.java new file mode 100644 index 000000000000..63f872c92e4a --- /dev/null +++ b/collector/src/test/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFDataSourceBoMapperTest.java @@ -0,0 +1,53 @@ +/* + * Copyright 2017 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.collector.mapper.thrift.stat; + +import com.navercorp.pinpoint.common.server.bo.stat.DataSourceBo; +import com.navercorp.pinpoint.thrift.dto.flink.TFDataSource; +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * @author minwoo.jung + */ +public class TFDataSourceBoMapperTest { + + public static final long timestamp = 1496370596375L; + + @Test + public void mapTest() { + DataSourceBo dataSourceBo = new DataSourceBo(); + dataSourceBo.setId(1); + dataSourceBo.setJdbcUrl("jdbc:mysql"); + dataSourceBo.setDatabaseName("pinpoint"); + dataSourceBo.setServiceTypeCode((short) 1000); + dataSourceBo.setTimestamp(timestamp); + dataSourceBo.setActiveConnectionSize(15); + dataSourceBo.setMaxConnectionSize(30); + + TFDataSourceBoMapper mapper = new TFDataSourceBoMapper(); + TFDataSource tFdataSource = mapper.map(dataSourceBo); + assertEquals(tFdataSource.getId(), 1); + assertEquals(tFdataSource.getServiceTypeCode(), 1000); + assertEquals(tFdataSource.getDatabaseName(), "pinpoint"); + assertEquals(tFdataSource.getUrl(), "jdbc:mysql"); + assertEquals(tFdataSource.getActiveConnectionSize(), 15); + assertEquals(tFdataSource.getMaxConnectionSize(), 30); + } + +} \ No newline at end of file diff --git a/collector/src/test/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFDataSourceListBoMapperTest.java b/collector/src/test/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFDataSourceListBoMapperTest.java new file mode 100644 index 000000000000..cd9bab2cabf7 --- /dev/null +++ b/collector/src/test/java/com/navercorp/pinpoint/collector/mapper/thrift/stat/TFDataSourceListBoMapperTest.java @@ -0,0 +1,88 @@ +/* + * Copyright 2017 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.collector.mapper.thrift.stat; + +import com.navercorp.pinpoint.common.server.bo.stat.DataSourceBo; +import com.navercorp.pinpoint.common.server.bo.stat.DataSourceListBo; +import com.navercorp.pinpoint.thrift.dto.flink.TFDataSource; +import com.navercorp.pinpoint.thrift.dto.flink.TFDataSourceList; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.*; + +/** + * @author minwoo.jung + */ +public class TFDataSourceListBoMapperTest { + + public static final long startTimestamp = 1496370596375L; + public static final long collectTime1st = startTimestamp + 5000; + + @Test + public void mapTest() { + DataSourceListBo dataSourceListBo = new DataSourceListBo(); + dataSourceListBo.setAgentId("test_agent1"); + dataSourceListBo.setStartTimestamp(startTimestamp); + dataSourceListBo.setTimestamp(collectTime1st); + + DataSourceBo dataSourceBo1 = new DataSourceBo(); + dataSourceBo1.setAgentId("test_agent1"); + dataSourceBo1.setTimestamp(collectTime1st); + dataSourceBo1.setServiceTypeCode((short) 1000); + dataSourceBo1.setJdbcUrl("jdbc:mysql"); + dataSourceBo1.setActiveConnectionSize(15); + dataSourceBo1.setMaxConnectionSize(30); + dataSourceBo1.setId(1); + dataSourceBo1.setDatabaseName("pinpoint1"); + DataSourceBo dataSourceBo2 = new DataSourceBo(); + dataSourceBo2.setAgentId("test_agent1"); + dataSourceBo2.setTimestamp(collectTime1st); + dataSourceBo2.setServiceTypeCode((short) 2000); + dataSourceBo2.setJdbcUrl("jdbc:mssql"); + dataSourceBo2.setActiveConnectionSize(25); + dataSourceBo2.setMaxConnectionSize(40); + dataSourceBo2.setId(2); + dataSourceBo2.setDatabaseName("pinpoint2"); + dataSourceListBo.add(dataSourceBo1); + dataSourceListBo.add(dataSourceBo2); + + TFDataSourceListBoMapper tFDataSourceListBoMapper = new TFDataSourceListBoMapper(); + TFDataSourceList tfDataSourceList = tFDataSourceListBoMapper.map(dataSourceListBo); + + List dataSourceList = tfDataSourceList.getDataSourceList(); + assertEquals(dataSourceList.size(), 2); + + TFDataSource tfDataSource1 = dataSourceList.get(0); + assertEquals(tfDataSource1.getId(), 1); + assertEquals(tfDataSource1.getUrl(), "jdbc:mysql"); + assertEquals(tfDataSource1.getDatabaseName(), "pinpoint1"); + assertEquals(tfDataSource1.getActiveConnectionSize(), 15); + assertEquals(tfDataSource1.getMaxConnectionSize(), 30); + assertEquals(tfDataSource1.getServiceTypeCode(), 1000); + + TFDataSource tfDataSource2 = dataSourceList.get(1); + assertEquals(tfDataSource2.getId(), 2); + assertEquals(tfDataSource2.getUrl(), "jdbc:mssql"); + assertEquals(tfDataSource2.getDatabaseName(), "pinpoint2"); + assertEquals(tfDataSource2.getActiveConnectionSize(), 25); + assertEquals(tfDataSource2.getMaxConnectionSize(), 40); + assertEquals(tfDataSource2.getServiceTypeCode(), 2000); + } +} \ No newline at end of file diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/ActiveTraceCodec.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/ActiveTraceCodec.java index bc18bda6b2ab..36176f414503 100644 --- a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/ActiveTraceCodec.java +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/ActiveTraceCodec.java @@ -122,7 +122,7 @@ public List decodeValues(Buffer valueBuffer, ApplicationStatDecoding AgentStatHeaderDecoder headerDecoder = new BitCountingHeaderDecoder(header); EncodingStrategy versionEncodingStrategy = UnsignedShortEncodingStrategy.getFromCode(headerDecoder.getCode()); EncodingStrategy schemaTypeEncodingStrategy = UnsignedIntegerEncodingStrategy.getFromCode(headerDecoder.getCode()); - EncodingStrategy totalCountsEncodingStrategy = UnsignedIntegerEncodingStrategy.getFromCode(headerDecoder.getCode()); + EncodingStrategy totalCountEncodingStrategy = UnsignedIntegerEncodingStrategy.getFromCode(headerDecoder.getCode()); EncodingStrategy minTotalCountEncodingStrategy = UnsignedIntegerEncodingStrategy.getFromCode(headerDecoder.getCode()); EncodingStrategy minTotalCountAgentIdEncodingStrategy = StringEncodingStrategy.getFromCode(headerDecoder.getCode()); EncodingStrategy maxTotalCountEncodingStrategy = UnsignedIntegerEncodingStrategy.getFromCode(headerDecoder.getCode()); @@ -130,7 +130,7 @@ public List decodeValues(Buffer valueBuffer, ApplicationStatDecoding List versionList = this.codec.decodeValues(valueBuffer, versionEncodingStrategy, numValues); List schemaTypeList = this.codec.decodeValues(valueBuffer, schemaTypeEncodingStrategy, numValues); - List totalCountList = this.codec.decodeValues(valueBuffer, totalCountsEncodingStrategy, numValues); + List totalCountList = this.codec.decodeValues(valueBuffer, totalCountEncodingStrategy, numValues); List minTotalCountList = this.codec.decodeValues(valueBuffer, minTotalCountEncodingStrategy, numValues); List minTotalCountAgentIdList = this.codec.decodeValues(valueBuffer, minTotalCountAgentIdEncodingStrategy, numValues); List maxTotalCountList = this.codec.decodeValues(valueBuffer, maxTotalCountEncodingStrategy, numValues); diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/CpuLoadDecoder.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/CpuLoadDecoder.java index 59b48c9c5aef..ab272d98c7e3 100644 --- a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/CpuLoadDecoder.java +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/CpuLoadDecoder.java @@ -28,7 +28,7 @@ public class CpuLoadDecoder extends ApplicationStatDecoder { @Autowired - public CpuLoadDecoder(List cpuLoadCodecs) { - super(cpuLoadCodecs); + public CpuLoadDecoder(List cpuLoadCodecList) { + super(cpuLoadCodecList); } } diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/DataSourceCodec.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/DataSourceCodec.java new file mode 100644 index 000000000000..8c7cc9e8e79d --- /dev/null +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/DataSourceCodec.java @@ -0,0 +1,213 @@ +/* + * Copyright 2017 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.common.server.bo.codec.stat.join; + +import com.navercorp.pinpoint.common.buffer.Buffer; +import com.navercorp.pinpoint.common.server.bo.codec.stat.AgentStatDataPointCodec; +import com.navercorp.pinpoint.common.server.bo.codec.stat.ApplicationStatCodec; +import com.navercorp.pinpoint.common.server.bo.codec.stat.header.AgentStatHeaderDecoder; +import com.navercorp.pinpoint.common.server.bo.codec.stat.header.AgentStatHeaderEncoder; +import com.navercorp.pinpoint.common.server.bo.codec.stat.header.BitCountingHeaderDecoder; +import com.navercorp.pinpoint.common.server.bo.codec.stat.header.BitCountingHeaderEncoder; +import com.navercorp.pinpoint.common.server.bo.codec.stat.strategy.StrategyAnalyzer; +import com.navercorp.pinpoint.common.server.bo.codec.stat.strategy.StringEncodingStrategy; +import com.navercorp.pinpoint.common.server.bo.codec.stat.strategy.UnsignedIntegerEncodingStrategy; +import com.navercorp.pinpoint.common.server.bo.codec.stat.strategy.UnsignedShortEncodingStrategy; +import com.navercorp.pinpoint.common.server.bo.codec.strategy.EncodingStrategy; +import com.navercorp.pinpoint.common.server.bo.serializer.stat.ApplicationStatDecodingContext; +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceBo; +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceListBo; +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinStatBo; +import org.apache.commons.collections.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author minwoo.jung + */ +@Component("joinDataSourceCodec") +public class DataSourceCodec implements ApplicationStatCodec { + + private static final byte VERSION = 1; + + private final AgentStatDataPointCodec codec; + + @Autowired + public DataSourceCodec(AgentStatDataPointCodec codec) { + Assert.notNull(codec, "agentStatDataPointCodec must not be null"); + this.codec = codec; + } + + @Override + public byte getVersion() { + return VERSION; + } + + @Override + public void encodeValues(Buffer valueBuffer, List JoinStatBoList) { + if (CollectionUtils.isEmpty(JoinStatBoList)) { + throw new IllegalArgumentException("joinDataSourceListBoList must not be empty"); + } + final List joinDataSourceListBoList = castJoinDataSourceListBoList(JoinStatBoList); + valueBuffer.putVInt(joinDataSourceListBoList.size()); + encodeTimestamps(valueBuffer, joinDataSourceListBoList); + encodeJoinDataSourceListBo(valueBuffer, joinDataSourceListBoList); + } + + private void encodeJoinDataSourceListBo(Buffer valueBuffer, List joinDataSourceListBoList) { + for (JoinDataSourceListBo joinDataSourceListBo : joinDataSourceListBoList) { + encodeJoinDataSourceBo(valueBuffer, joinDataSourceListBo.getJoinDataSourceBoList()); + } + } + + private void encodeJoinDataSourceBo(Buffer valueBuffer, List joinDataSourceBoList) { + final int numValues = joinDataSourceBoList.size(); + valueBuffer.putVInt(numValues); + + UnsignedShortEncodingStrategy.Analyzer.Builder serviceTypeAnalyzerBuilder = new UnsignedShortEncodingStrategy.Analyzer.Builder(); + StringEncodingStrategy.Analyzer.Builder jdbcUrlAnalyzerBuilder = new StringEncodingStrategy.Analyzer.Builder(); + UnsignedIntegerEncodingStrategy.Analyzer.Builder avgActiveConnectionSizeAnalyzerBuilder = new UnsignedIntegerEncodingStrategy.Analyzer.Builder(); + UnsignedIntegerEncodingStrategy.Analyzer.Builder minActiveConnectionSizeAnalyzerBuilder = new UnsignedIntegerEncodingStrategy.Analyzer.Builder(); + StringEncodingStrategy.Analyzer.Builder minActiveConnectionAgentIdAnalyzerBuilder = new StringEncodingStrategy.Analyzer.Builder(); + UnsignedIntegerEncodingStrategy.Analyzer.Builder maxActiveConnectionSizeAnalyzerBuilder = new UnsignedIntegerEncodingStrategy.Analyzer.Builder(); + StringEncodingStrategy.Analyzer.Builder maxActiveConnectionAgentIdAnalyzerBuilder = new StringEncodingStrategy.Analyzer.Builder(); + + for (JoinDataSourceBo joinDataSourceBo : joinDataSourceBoList) { + serviceTypeAnalyzerBuilder.addValue(joinDataSourceBo.getServiceTypeCode()); + jdbcUrlAnalyzerBuilder.addValue(joinDataSourceBo.getUrl()); + avgActiveConnectionSizeAnalyzerBuilder.addValue(joinDataSourceBo.getAvgActiveConnectionSize()); + minActiveConnectionSizeAnalyzerBuilder.addValue(joinDataSourceBo.getMinActiveConnectionSize()); + minActiveConnectionAgentIdAnalyzerBuilder.addValue(joinDataSourceBo.getMinActiveConnectionAgentId()); + maxActiveConnectionSizeAnalyzerBuilder.addValue(joinDataSourceBo.getMaxActiveConnectionSize()); + maxActiveConnectionAgentIdAnalyzerBuilder.addValue(joinDataSourceBo.getMaxActiveConnectionAgentId()); + } + + StrategyAnalyzer serviceTypeAnalyzer = serviceTypeAnalyzerBuilder.build(); + StrategyAnalyzer jdbcUrlAnalyzer = jdbcUrlAnalyzerBuilder.build(); + StrategyAnalyzer avgActiveConnectionSizeAnalyzer = avgActiveConnectionSizeAnalyzerBuilder.build(); + StrategyAnalyzer minActiveConnectionSizeAnalyzer = minActiveConnectionSizeAnalyzerBuilder.build(); + StrategyAnalyzer minActiveConnectionAgentIdAnalyzer = minActiveConnectionAgentIdAnalyzerBuilder.build(); + StrategyAnalyzer maxActiveConnectionSizeAnalyzer = maxActiveConnectionSizeAnalyzerBuilder.build(); + StrategyAnalyzer maxActiveConnectionAgentIdAnalyzer = maxActiveConnectionAgentIdAnalyzerBuilder.build(); + + AgentStatHeaderEncoder headerEncoder = new BitCountingHeaderEncoder(); + headerEncoder.addCode(serviceTypeAnalyzer.getBestStrategy().getCode()); + headerEncoder.addCode(jdbcUrlAnalyzer.getBestStrategy().getCode()); + headerEncoder.addCode(avgActiveConnectionSizeAnalyzer.getBestStrategy().getCode()); + headerEncoder.addCode(minActiveConnectionSizeAnalyzer.getBestStrategy().getCode()); + headerEncoder.addCode(minActiveConnectionAgentIdAnalyzer.getBestStrategy().getCode()); + headerEncoder.addCode(maxActiveConnectionSizeAnalyzer.getBestStrategy().getCode()); + headerEncoder.addCode(maxActiveConnectionAgentIdAnalyzer.getBestStrategy().getCode()); + + final byte[] header = headerEncoder.getHeader(); + valueBuffer.putPrefixedBytes(header); + + this.codec.encodeValues(valueBuffer, serviceTypeAnalyzer.getBestStrategy(), serviceTypeAnalyzer.getValues()); + this.codec.encodeValues(valueBuffer, jdbcUrlAnalyzer.getBestStrategy(), jdbcUrlAnalyzer.getValues()); + this.codec.encodeValues(valueBuffer, avgActiveConnectionSizeAnalyzer.getBestStrategy(), avgActiveConnectionSizeAnalyzer.getValues()); + this.codec.encodeValues(valueBuffer, minActiveConnectionSizeAnalyzer.getBestStrategy(), minActiveConnectionSizeAnalyzer.getValues()); + this.codec.encodeValues(valueBuffer, minActiveConnectionAgentIdAnalyzer.getBestStrategy(), minActiveConnectionAgentIdAnalyzer.getValues()); + this.codec.encodeValues(valueBuffer, maxActiveConnectionSizeAnalyzer.getBestStrategy(), maxActiveConnectionSizeAnalyzer.getValues()); + this.codec.encodeValues(valueBuffer, maxActiveConnectionAgentIdAnalyzer.getBestStrategy(), maxActiveConnectionAgentIdAnalyzer.getValues()); + } + + private void encodeTimestamps(Buffer valueBuffer, List joinDataSourceListBoList) { + List timestamps = new ArrayList(joinDataSourceListBoList.size()); + + for (JoinDataSourceListBo joinDataSourceListBo : joinDataSourceListBoList) { + timestamps.add(joinDataSourceListBo.getTimestamp()); + } + + codec.encodeTimestamps(valueBuffer, timestamps); + } + + private List castJoinDataSourceListBoList(List joinStatBoList) { + List joinDataSourceListBoList = new ArrayList(); + + for (JoinStatBo joinStatBo : joinStatBoList) { + joinDataSourceListBoList.add((JoinDataSourceListBo)joinStatBo); + } + + return joinDataSourceListBoList; + } + + @Override + public List decodeValues(Buffer valueBuffer, ApplicationStatDecodingContext decodingContext) { + final String id = decodingContext.getApplicationId(); + final long baseTimestamp = decodingContext.getBaseTimestamp(); + final long timestampDelta = decodingContext.getTimestampDelta(); + final long initialTimestamp = baseTimestamp + timestampDelta; + + int numValues = valueBuffer.readVInt(); + List timestampList = this.codec.decodeTimestamps(initialTimestamp, valueBuffer, numValues); + + List joinDataSourceListBoList = new ArrayList(numValues); + + for (int i = 0; i < numValues; ++i) { + JoinDataSourceListBo joinDataSourceListBo = new JoinDataSourceListBo(); + joinDataSourceListBo.setId(id); + joinDataSourceListBo.setTimestamp(timestampList.get(i)); + joinDataSourceListBo.setJoinDataSourceBoList(decodeJoinDataSourceBoList(valueBuffer)); + joinDataSourceListBoList.add(joinDataSourceListBo); + } + + return joinDataSourceListBoList; + } + + private List decodeJoinDataSourceBoList(Buffer valueBuffer) { + int numValues = valueBuffer.readVInt(); + final byte[] header = valueBuffer.readPrefixedBytes(); + AgentStatHeaderDecoder headerDecoder = new BitCountingHeaderDecoder(header); + + EncodingStrategy serviceTypeEncodingStrategy = UnsignedShortEncodingStrategy.getFromCode(headerDecoder.getCode()); + EncodingStrategy urlEncodingStrategy = StringEncodingStrategy.getFromCode(headerDecoder.getCode()); + EncodingStrategy avgActiveConnectionSizeEncodingStrategy = UnsignedIntegerEncodingStrategy.getFromCode(headerDecoder.getCode()); + EncodingStrategy minActiveConnectionSizeEncodingStrategy = UnsignedIntegerEncodingStrategy.getFromCode(headerDecoder.getCode()); + EncodingStrategy minActiveConnectionAgentIdEncodingStrategy = StringEncodingStrategy.getFromCode(headerDecoder.getCode()); + EncodingStrategy maxActiveConnectionSizeEncodingStrategy = UnsignedIntegerEncodingStrategy.getFromCode(headerDecoder.getCode()); + EncodingStrategy maxActiveConnectionAgentIdEncodingStrategy = StringEncodingStrategy.getFromCode(headerDecoder.getCode()); + + List serviceTypeCodeList = this.codec.decodeValues(valueBuffer, serviceTypeEncodingStrategy, numValues); + List jdbcUrlList = this.codec.decodeValues(valueBuffer, urlEncodingStrategy, numValues); + List avgActiveConnectionSizeCountList = this.codec.decodeValues(valueBuffer, avgActiveConnectionSizeEncodingStrategy, numValues); + List minActiveConnectionSizeCountList = this.codec.decodeValues(valueBuffer, minActiveConnectionSizeEncodingStrategy, numValues); + List minActiveConnectionAgentIdList = this.codec.decodeValues(valueBuffer, minActiveConnectionAgentIdEncodingStrategy, numValues); + List maxActiveConnectionSizeList = this.codec.decodeValues(valueBuffer, maxActiveConnectionSizeEncodingStrategy, numValues); + List maxActiveConnectionAgentIdList = this.codec.decodeValues(valueBuffer, maxActiveConnectionAgentIdEncodingStrategy, numValues); + + List joinDataSourceBoList = new ArrayList(numValues); + + for (int i = 0; i < numValues; ++i) { + JoinDataSourceBo joinDataSourceBo = new JoinDataSourceBo(); + joinDataSourceBo.setServiceTypeCode(serviceTypeCodeList.get(i)); + joinDataSourceBo.setUrl(jdbcUrlList.get(i)); + joinDataSourceBo.setAvgActiveConnectionSize(avgActiveConnectionSizeCountList.get(i)); + joinDataSourceBo.setMinActiveConnectionSize(minActiveConnectionSizeCountList.get(i)); + joinDataSourceBo.setMinActiveConnectionAgentId(minActiveConnectionAgentIdList.get(i)); + joinDataSourceBo.setMaxActiveConnectionSize(maxActiveConnectionSizeList.get(i)); + joinDataSourceBo.setMaxActiveConnectionAgentId(maxActiveConnectionAgentIdList.get(i)); + joinDataSourceBoList.add(joinDataSourceBo); + } + + return joinDataSourceBoList; + } + + +} diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/DataSourceDecoder.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/DataSourceDecoder.java new file mode 100644 index 000000000000..a6356b54f03f --- /dev/null +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/DataSourceDecoder.java @@ -0,0 +1,32 @@ +/* + * Copyright 2017 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.common.server.bo.codec.stat.join; + +import com.navercorp.pinpoint.common.server.bo.codec.stat.ApplicationStatDecoder; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author minwoo.jung + */ +@Component("joinDataSourceDecoder") +public class DataSourceDecoder extends ApplicationStatDecoder { + + public DataSourceDecoder(List dataSourceCodecList) { + super(dataSourceCodecList); + } +} diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/DataSourceEncoder.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/DataSourceEncoder.java new file mode 100644 index 000000000000..03c8cd484cdd --- /dev/null +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/DataSourceEncoder.java @@ -0,0 +1,32 @@ +/* + * Copyright 2017 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.common.server.bo.codec.stat.join; + +import com.navercorp.pinpoint.common.server.bo.codec.stat.ApplicationStatCodec; +import com.navercorp.pinpoint.common.server.bo.codec.stat.ApplicationStatEncoder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +/** + * @author minwoo.jung + */ +public class DataSourceEncoder extends ApplicationStatEncoder { + + @Autowired + private DataSourceEncoder(@Qualifier("joinDataSourceCodec") ApplicationStatCodec dataSourceCodec) { + super(dataSourceCodec); + } +} diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/serializer/stat/join/DataSourceSerializer.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/serializer/stat/join/DataSourceSerializer.java new file mode 100644 index 000000000000..6204ffdc2575 --- /dev/null +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/serializer/stat/join/DataSourceSerializer.java @@ -0,0 +1,30 @@ +/* + * Copyright 2017 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.common.server.bo.serializer.stat.join; + +import com.navercorp.pinpoint.common.server.bo.codec.stat.join.DataSourceEncoder; +import com.navercorp.pinpoint.common.server.bo.codec.stat.join.ResponseTimeEncoder; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author minwoo.jung + */ +public class DataSourceSerializer extends ApplicationStatSerializer { + @Autowired + public DataSourceSerializer(DataSourceEncoder dataSourceEncoder) { + super(dataSourceEncoder); + } +} diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinAgentStatBo.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinAgentStatBo.java index 8717ad88ed59..e3df5619b9bd 100644 --- a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinAgentStatBo.java +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinAgentStatBo.java @@ -34,6 +34,7 @@ public class JoinAgentStatBo implements JoinStatBo { private List joinTransactionBoList = Collections.emptyList(); private List joinActiveTraceBoList = Collections.emptyList(); private List joinResponseTimeBoList = Collections.emptyList(); + private List joinDataSourceListBoList = Collections.emptyList(); public List getJoinResponseTimeBoList() { return joinResponseTimeBoList; @@ -51,6 +52,10 @@ public void setJoinCpuLoadBoList(List joinCpuLoadBoList) { this.joinCpuLoadBoList = joinCpuLoadBoList; } + public void setJoinDataSourceListBoList(List joinDataSourceListBoList) { + this.joinDataSourceListBoList = joinDataSourceListBoList; + } + public String getId() { return agentId; } @@ -121,4 +126,8 @@ public void setJoinActiveTraceBoList(List joinActiveTraceBoLi public List getJoinActiveTraceBoList() { return joinActiveTraceBoList; } + + public List getJoinDataSourceListBoList() { + return joinDataSourceListBoList; + } } diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinApplicationStatBo.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinApplicationStatBo.java index d1b14aaa0911..57a595c421a5 100644 --- a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinApplicationStatBo.java +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinApplicationStatBo.java @@ -31,6 +31,7 @@ public class JoinApplicationStatBo implements JoinStatBo { private List joinTransactionBoList = Collections.emptyList(); private List joinActiveTraceBoList = Collections.emptyList(); private List joinResponseTimeBoList = Collections.emptyList(); + private List joinDataSourceListBoList = Collections.emptyList(); private long timestamp = Long.MIN_VALUE; private StatType statType = StatType.APP_STST; @@ -47,6 +48,7 @@ public static JoinApplicationStatBo joinApplicationStatBoByTimeSlice(final List< newJoinApplicationStatBo.setJoinTransactionBoList(joinTransactionBoByTimeSlice(joinApplicationStatBoList)); newJoinApplicationStatBo.setJoinActiveTraceBoList(joinActiveTraceBoByTimeSlice(joinApplicationStatBoList)); newJoinApplicationStatBo.setJoinResponseTimeBoList(joinResponseTimeBoByTimeSlice(joinApplicationStatBoList)); + newJoinApplicationStatBo.setJoinDataSourceListBoList(JoinDataSourceListBoBytTimeSlice(joinApplicationStatBoList)); newJoinApplicationStatBo.setTimestamp(extractMinTimestamp(newJoinApplicationStatBo)); return newJoinApplicationStatBo; } @@ -84,6 +86,12 @@ private static long extractMinTimestamp(JoinApplicationStatBo joinApplicationSta } } + for (JoinDataSourceListBo joinDataSourceListBo : joinApplicationStatBo.getJoinDataSourceListBoList()) { + if (joinDataSourceListBo.getTimestamp() < minTimestamp) { + minTimestamp = joinDataSourceListBo.getTimestamp(); + } + } + return minTimestamp; } @@ -115,6 +123,34 @@ private static List joinResponseTimeBoByTimeSlice(List JoinDataSourceListBoBytTimeSlice(List joinApplicationStatBoList) { + Map> joinDataSourceListBoMap = new HashMap>(); + + for (JoinApplicationStatBo joinApplicationStatBo : joinApplicationStatBoList) { + for (JoinDataSourceListBo joinDataSourceListBo : joinApplicationStatBo.getJoinDataSourceListBoList()) { + long shiftTimestamp = shiftTimestamp(joinDataSourceListBo.getTimestamp()); + List joinDataSourceListBoList = joinDataSourceListBoMap.get(shiftTimestamp); + + if (joinDataSourceListBoList == null) { + joinDataSourceListBoList = new ArrayList(); + joinDataSourceListBoMap.put(shiftTimestamp, joinDataSourceListBoList); + } + + joinDataSourceListBoList.add(joinDataSourceListBo); + } + } + + List newJoinDataSourceListBoList = new ArrayList(); + + for (Map.Entry> entry : joinDataSourceListBoMap.entrySet()) { + List joinDataSourceListBoList = entry.getValue(); + JoinDataSourceListBo joinDataSourceListBo = JoinDataSourceListBo.joinDataSourceListBoList(joinDataSourceListBoList, entry.getKey()); + newJoinDataSourceListBoList.add(joinDataSourceListBo); + } + + return newJoinDataSourceListBoList; + } + private static List joinActiveTraceBoByTimeSlice(List joinApplicationStatBoList) { Map> joinActiveTraceBoMap = new HashMap>(); @@ -320,6 +356,14 @@ public void setJoinResponseTimeBoList(List joinResponseTimeB this.joinResponseTimeBoList = joinResponseTimeBoList; } + public void setJoinDataSourceListBoList(List joinDataSourceListBoList) { + this.joinDataSourceListBoList = joinDataSourceListBoList; + } + + public List getJoinDataSourceListBoList() { + return joinDataSourceListBoList; + } + public static List createJoinApplicationStatBo(String applicationId, JoinAgentStatBo joinAgentStatBo, long rangeTime) { List joinApplicationStatBoList = new ArrayList(); List joinAgentStatBoList = splitJoinAgentStatBo(applicationId, joinAgentStatBo, rangeTime); @@ -333,6 +377,7 @@ public static List createJoinApplicationStatBo(String app joinApplicationStatBo.setJoinTransactionBoList(sliceJoinAgentStatBo.getJoinTransactionBoList()); joinApplicationStatBo.setJoinActiveTraceBoList(sliceJoinAgentStatBo.getJoinActiveTraceBoList()); joinApplicationStatBo.setJoinResponseTimeBoList(sliceJoinAgentStatBo.getJoinResponseTimeBoList()); + joinApplicationStatBo.setJoinDataSourceListBoList(sliceJoinAgentStatBo.getJoinDataSourceListBoList()); joinApplicationStatBoList.add(joinApplicationStatBo); } @@ -346,9 +391,33 @@ private static List splitJoinAgentStatBo(String applicationId, sliceJoinTransactionBo(applicationId, joinAgentStatBo, rangeTime, joinAgentStatBoMap); sliceJoinActiveTraceBo(applicationId, joinAgentStatBo, rangeTime, joinAgentStatBoMap); sliceJoinResponseTimeBo(applicationId, joinAgentStatBo, rangeTime, joinAgentStatBoMap); + sliceJoinDataSourceListBo(applicationId, joinAgentStatBo, rangeTime, joinAgentStatBoMap); return new ArrayList(joinAgentStatBoMap.values()); } + private static void sliceJoinDataSourceListBo(String applicationId, JoinAgentStatBo joinAgentStatBo, long rangeTime, Map joinAgentStatBoMap) { + Map> joinDataSourceListBoMap = new HashMap>(); + + for (JoinDataSourceListBo joinDataSourceListBo : joinAgentStatBo.getJoinDataSourceListBoList()) { + long timestamp = joinDataSourceListBo.getTimestamp(); + long time = timestamp - (timestamp % rangeTime); + + List joinDataSourceListBoList = joinDataSourceListBoMap.get(time); + + if (joinDataSourceListBoList == null) { + joinDataSourceListBoList = new ArrayList(); + joinDataSourceListBoMap.put(time, joinDataSourceListBoList); + } + + joinDataSourceListBoList.add(joinDataSourceListBo); + } + for (Map.Entry> entry : joinDataSourceListBoMap.entrySet()) { + long time = entry.getKey(); + JoinAgentStatBo sliceJoinAgentStatBo = getORCreateJoinAgentStatBo(applicationId, joinAgentStatBoMap, time); + sliceJoinAgentStatBo.setJoinDataSourceListBoList(entry.getValue()); + } + } + private static void sliceJoinResponseTimeBo(String applicationId, JoinAgentStatBo joinAgentStatBo, long rangeTime, Map joinAgentStatBoMap) { Map> joinResponseTimeBoMap = new HashMap>(); @@ -475,13 +544,14 @@ private static JoinAgentStatBo getORCreateJoinAgentStatBo(String applicationId, @Override public String toString() { return "JoinApplicationStatBo{" + - "applicationId='" + applicationId + '\'' + + ", timestamp=" + new Date(timestamp) + + ", applicationId='" + applicationId + '\'' + ", joinCpuLoadBoList=" + joinCpuLoadBoList + ", joinMemoryBoList=" + joinMemoryBoList + ", joinTransactionBoList=" + joinTransactionBoList + ", joinActiveTraceBoList=" + joinActiveTraceBoList + ", joinResponseTimeBoList=" + joinResponseTimeBoList + - ", timestamp=" + timestamp + + ", joinDataSourceListBoList=" + joinDataSourceListBoList + ", statType=" + statType + '}'; } diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinCpuLoadBo.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinCpuLoadBo.java index 806148a455c3..0e0817040b13 100644 --- a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinCpuLoadBo.java +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinCpuLoadBo.java @@ -66,20 +66,20 @@ public static JoinCpuLoadBo joinCpuLoadBoList(List joinCpuLoadBoL } JoinCpuLoadBo newJoinCpuLoadBo = new JoinCpuLoadBo(); - JoinCpuLoadBo initCpuLoadBo = joinCpuLoadBoList.get(0); - newJoinCpuLoadBo.setId(initCpuLoadBo.getId()); + JoinCpuLoadBo initJoinCpuLoadBo = joinCpuLoadBoList.get(0); + newJoinCpuLoadBo.setId(initJoinCpuLoadBo.getId()); newJoinCpuLoadBo.setTimestamp(timestamp); double sumJvmCpuLoad = 0D; - String maxJvmCpuAgentId = initCpuLoadBo.getMaxJvmCpuAgentId(); - double maxJvmCpuLoad = initCpuLoadBo.getMaxJvmCpuLoad(); - String minJvmCpuAgentId = initCpuLoadBo.getMinJvmCpuAgentId(); - double minJvmCpuLoad = initCpuLoadBo.getMinJvmCpuLoad(); + String maxJvmCpuAgentId = initJoinCpuLoadBo.getMaxJvmCpuAgentId(); + double maxJvmCpuLoad = initJoinCpuLoadBo.getMaxJvmCpuLoad(); + String minJvmCpuAgentId = initJoinCpuLoadBo.getMinJvmCpuAgentId(); + double minJvmCpuLoad = initJoinCpuLoadBo.getMinJvmCpuLoad(); double sumSystemCpuLoad = 0D; - String maxSysCpuAgentId = initCpuLoadBo.getMaxSysCpuAgentId(); - double maxSystemCpuLoad = initCpuLoadBo.getMaxSystemCpuLoad(); - String minSysCpuAgentId = initCpuLoadBo.getMinSysCpuAgentId(); - double minSystemCpuLoad = initCpuLoadBo.getMinSystemCpuLoad(); + String maxSysCpuAgentId = initJoinCpuLoadBo.getMaxSysCpuAgentId(); + double maxSystemCpuLoad = initJoinCpuLoadBo.getMaxSystemCpuLoad(); + String minSysCpuAgentId = initJoinCpuLoadBo.getMinSysCpuAgentId(); + double minSystemCpuLoad = initJoinCpuLoadBo.getMinSystemCpuLoad(); for (JoinCpuLoadBo joinCpuLoadBo : joinCpuLoadBoList) { sumJvmCpuLoad += joinCpuLoadBo.getJvmCpuLoad(); diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinDataSourceBo.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinDataSourceBo.java new file mode 100644 index 000000000000..f5c60c7c4f74 --- /dev/null +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinDataSourceBo.java @@ -0,0 +1,198 @@ +/* + * Copyright 2017 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.common.server.bo.stat.join; + +import com.navercorp.pinpoint.common.util.CollectionUtils; + +import java.util.List; + +/** + * @author minwoo.jung + */ +public class JoinDataSourceBo implements JoinStatBo { + public static final JoinDataSourceBo EMPTY_JOIN_DATA_SOURCE_BO = new JoinDataSourceBo(); + public static final int UNCOLLECTED_VALUE = -1; + private static final short UNDEFINED_CATEGORY = -1; + private static final String EMPTY_URL = ""; + + private short serviceTypeCode = UNDEFINED_CATEGORY; + private String url = EMPTY_URL; + private int avgActiveConnectionSize = UNCOLLECTED_VALUE; + private int minActiveConnectionSize = UNCOLLECTED_VALUE; + private String minActiveConnectionAgentId = UNKNOWN_AGENT; + private int maxActiveConnectionSize = UNCOLLECTED_VALUE; + private String maxActiveConnectionAgentId = UNKNOWN_AGENT; + + public JoinDataSourceBo() { + } + + public JoinDataSourceBo(short serviceTypeCode, String url, int avgActiveConnectionSize, int minActiveConnectionSize, String minActiveConnectionAgentId, int maxActiveConnectionSize, String maxActiveConnectionAgentId) { + this.serviceTypeCode = serviceTypeCode; + this.url = url; + this.avgActiveConnectionSize = avgActiveConnectionSize; + this.minActiveConnectionSize = minActiveConnectionSize; + this.minActiveConnectionAgentId = minActiveConnectionAgentId; + this.maxActiveConnectionSize = maxActiveConnectionSize; + this.maxActiveConnectionAgentId = maxActiveConnectionAgentId; + } + + public short getServiceTypeCode() { + return serviceTypeCode; + } + + public String getUrl() { + return url; + } + + public int getAvgActiveConnectionSize() { + return avgActiveConnectionSize; + } + + public int getMinActiveConnectionSize() { + return minActiveConnectionSize; + } + + public String getMinActiveConnectionAgentId() { + return minActiveConnectionAgentId; + } + + public int getMaxActiveConnectionSize() { + return maxActiveConnectionSize; + } + + public String getMaxActiveConnectionAgentId() { + return maxActiveConnectionAgentId; + } + + public void setServiceTypeCode(short serviceTypeCode) { + this.serviceTypeCode = serviceTypeCode; + } + + public void setUrl(String url) { + this.url = url; + } + + public void setAvgActiveConnectionSize(int avgActiveConnectionSize) { + this.avgActiveConnectionSize = avgActiveConnectionSize; + } + + public void setMinActiveConnectionSize(int minActiveConnectionSize) { + this.minActiveConnectionSize = minActiveConnectionSize; + } + + public void setMinActiveConnectionAgentId(String minActiveConnectionAgentId) { + this.minActiveConnectionAgentId = minActiveConnectionAgentId; + } + + public void setMaxActiveConnectionSize(int maxActiveConnectionSize) { + this.maxActiveConnectionSize = maxActiveConnectionSize; + } + + public void setMaxActiveConnectionAgentId(String maxActiveConnectionAgentId) { + this.maxActiveConnectionAgentId = maxActiveConnectionAgentId; + } + + @Override + public long getTimestamp() { + throw new UnsupportedOperationException(); + } + + @Override + public String getId() { + throw new UnsupportedOperationException(); + } + + public static JoinDataSourceBo joinDataSourceBoList(List joinDataSourceBoList) { + final int boCount = joinDataSourceBoList.size(); + + if (boCount == 0) { + return JoinDataSourceBo.EMPTY_JOIN_DATA_SOURCE_BO; + } + + final JoinDataSourceBo initJoindataSourceBo = joinDataSourceBoList.get(0); + int sumActiveConnectionSize = 0; + int maxActiveConnectionSize = initJoindataSourceBo.getMaxActiveConnectionSize(); + String maxActiveConnectionAgentId = initJoindataSourceBo.getMaxActiveConnectionAgentId(); + int minActiveConnectionSize = initJoindataSourceBo.getMinActiveConnectionSize(); + String minActiveConnectionAgentid = initJoindataSourceBo.getMinActiveConnectionAgentId(); + + for (JoinDataSourceBo joinDataSourceBo : joinDataSourceBoList) { + sumActiveConnectionSize += joinDataSourceBo.getAvgActiveConnectionSize(); + + if (joinDataSourceBo.getMaxActiveConnectionSize() > maxActiveConnectionSize) { + maxActiveConnectionSize = joinDataSourceBo.getMaxActiveConnectionSize(); + maxActiveConnectionAgentId = joinDataSourceBo.getMaxActiveConnectionAgentId(); + } + if (joinDataSourceBo.getMinActiveConnectionSize() < minActiveConnectionSize) { + minActiveConnectionSize = joinDataSourceBo.getMinActiveConnectionSize(); + minActiveConnectionAgentid = joinDataSourceBo.getMinActiveConnectionAgentId(); + } + } + + final JoinDataSourceBo newJoinDataSourceBo = new JoinDataSourceBo(); + newJoinDataSourceBo.setServiceTypeCode(initJoindataSourceBo.getServiceTypeCode()); + newJoinDataSourceBo.setUrl(initJoindataSourceBo.getUrl()); + newJoinDataSourceBo.setAvgActiveConnectionSize(sumActiveConnectionSize / boCount); + newJoinDataSourceBo.setMinActiveConnectionSize(minActiveConnectionSize); + newJoinDataSourceBo.setMinActiveConnectionAgentId(minActiveConnectionAgentid); + newJoinDataSourceBo.setMaxActiveConnectionSize(maxActiveConnectionSize); + newJoinDataSourceBo.setMaxActiveConnectionAgentId(maxActiveConnectionAgentId); + + return newJoinDataSourceBo; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + JoinDataSourceBo that = (JoinDataSourceBo) o; + + if (serviceTypeCode != that.serviceTypeCode) return false; + if (avgActiveConnectionSize != that.avgActiveConnectionSize) return false; + if (minActiveConnectionSize != that.minActiveConnectionSize) return false; + if (maxActiveConnectionSize != that.maxActiveConnectionSize) return false; + if (!url.equals(that.url)) return false; + if (!minActiveConnectionAgentId.equals(that.minActiveConnectionAgentId)) return false; + return maxActiveConnectionAgentId.equals(that.maxActiveConnectionAgentId); + + } + + @Override + public int hashCode() { + int result = (int) serviceTypeCode; + result = 31 * result + url.hashCode(); + result = 31 * result + avgActiveConnectionSize; + result = 31 * result + minActiveConnectionSize; + result = 31 * result + minActiveConnectionAgentId.hashCode(); + result = 31 * result + maxActiveConnectionSize; + result = 31 * result + maxActiveConnectionAgentId.hashCode(); + return result; + } + + @Override + public String toString() { + return "JoinDataSourceBo{" + + "serviceTypeCode=" + serviceTypeCode + + ", url='" + url + '\'' + + ", avgActiveConnectionSize=" + avgActiveConnectionSize + + ", minActiveConnectionSize=" + minActiveConnectionSize + + ", minActiveConnectionAgentId='" + minActiveConnectionAgentId + '\'' + + ", maxActiveConnectionSize=" + maxActiveConnectionSize + + ", maxActiveConnectionAgentId='" + maxActiveConnectionAgentId + '\'' + + '}'; + } +} diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinDataSourceListBo.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinDataSourceListBo.java new file mode 100644 index 000000000000..aa757e22808a --- /dev/null +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinDataSourceListBo.java @@ -0,0 +1,176 @@ +/* + * Copyright 2017 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.common.server.bo.stat.join; + +import com.navercorp.pinpoint.common.server.bo.stat.DataSourceBo; + +import java.util.*; + +/** + * @author minwoo.jung + */ +public class JoinDataSourceListBo implements JoinStatBo { + + public static final JoinDataSourceListBo EMPTY_JOIN_DATA_SOURCE_LIST_BO = new JoinDataSourceListBo(); + + private List joinDataSourceBoList = Collections.emptyList(); + private String id = UNKNOWN_ID; + private long timestamp = Long.MIN_VALUE; + + public JoinDataSourceListBo() { + } + + public JoinDataSourceListBo(String id, List joinDataSourceBoList, long timestamp) { + this.id = id; + this.timestamp = timestamp; + this.joinDataSourceBoList = joinDataSourceBoList; + } + + public List getJoinDataSourceBoList() { + return joinDataSourceBoList; + } + + public void setJoinDataSourceBoList(List joinDataSourceBoList) { + this.joinDataSourceBoList = joinDataSourceBoList; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public long getTimestamp() { + return timestamp; + } + + @Override + public String getId() { + return id; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public static JoinDataSourceListBo joinDataSourceListBoList(List joinDataSourceListBoList, Long timestamp) { + if (joinDataSourceListBoList.size() == 0) { + return EMPTY_JOIN_DATA_SOURCE_LIST_BO; + } + + JoinDataSourceListBo newJoinDataSourceListBo = new JoinDataSourceListBo(); + JoinDataSourceListBo initJoinDataSourceListBo = joinDataSourceListBoList.get(0); + newJoinDataSourceListBo.setId(initJoinDataSourceListBo.getId()); + newJoinDataSourceListBo.setTimestamp(timestamp); + newJoinDataSourceListBo.setJoinDataSourceBoList(joinDatasourceBo(joinDataSourceListBoList)); + + return newJoinDataSourceListBo; + } + + private static List joinDatasourceBo(List joinDataSourceListBoList) { + Map> dataSourceBoListMap = new HashMap>(); + + for (JoinDataSourceListBo joinDataSourceListBo : joinDataSourceListBoList) { + List dataSourceBoList = joinDataSourceListBo.getJoinDataSourceBoList(); + + for (JoinDataSourceBo joinDataSourceBo : dataSourceBoList) { + DataSourceKey dataSourceKey = new DataSourceKey(joinDataSourceBo.getUrl(), joinDataSourceBo.getServiceTypeCode()); + List joinDataSourceBoList = dataSourceBoListMap.get(dataSourceKey); + + if (joinDataSourceBoList == null) { + joinDataSourceBoList = new ArrayList(); + dataSourceBoListMap.put(dataSourceKey, joinDataSourceBoList); + } + + joinDataSourceBoList.add(joinDataSourceBo); + } + } + + List newJoinDatasourceBoList = new ArrayList(); + + for (List joinDataSourceBoList : dataSourceBoListMap.values()) { + JoinDataSourceBo newJoinDataSourceBo = JoinDataSourceBo.joinDataSourceBoList(joinDataSourceBoList); + newJoinDatasourceBoList.add(newJoinDataSourceBo); + } + + return newJoinDatasourceBoList; + } + + public static class DataSourceKey { + String url; + short serviceTypeCode; + + public DataSourceKey(String url, short serviceTypeCode) { + this.url = url; + this.serviceTypeCode = serviceTypeCode; + } + + public String getUrl() { + return url; + } + + public short getServiceTypeCode() { + return serviceTypeCode; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + DataSourceKey that = (DataSourceKey) o; + + if (serviceTypeCode != that.serviceTypeCode) return false; + return url != null ? url.equals(that.url) : that.url == null; + + } + + @Override + public int hashCode() { + int result = url != null ? url.hashCode() : 0; + result = 31 * result + serviceTypeCode; + return result; + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + JoinDataSourceListBo that = (JoinDataSourceListBo) o; + + if (timestamp != that.timestamp) return false; + if (!joinDataSourceBoList.equals(that.joinDataSourceBoList)) return false; + return id.equals(that.id); + } + + @Override + public int hashCode() { + int result = joinDataSourceBoList.hashCode(); + result = 31 * result + id.hashCode(); + result = 31 * result + (int) (timestamp ^ (timestamp >>> 32)); + return result; + } + + @Override + public String toString() { + return "JoinDataSourceListBo{" + + "timestamp=" + new Date(timestamp) + + "joinDataSourceBoList=" + joinDataSourceBoList + + ", id='" + id + '\'' + + '}'; + } +} diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinResponseTimeBo.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinResponseTimeBo.java index 159b575583ff..fe7ba49a7641 100644 --- a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinResponseTimeBo.java +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinResponseTimeBo.java @@ -123,7 +123,7 @@ public static JoinResponseTimeBo joinResponseTimeBoList(List for (JoinResponseTimeBo joinResponseTimeBo : joinResponseTimeBoList) { sumAvg += joinResponseTimeBo.getAvg(); - if(joinResponseTimeBo.getMaxAvg() > maxAvg) { + if (joinResponseTimeBo.getMaxAvg() > maxAvg) { maxAvg = joinResponseTimeBo.getMaxAvg(); maxAvgAgentId = joinResponseTimeBo.getMaxAvgAgentId(); } diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/StatType.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/StatType.java index 365b9f2ee5d8..ab2220565d0c 100644 --- a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/StatType.java +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/stat/join/StatType.java @@ -29,6 +29,7 @@ public enum StatType { APP_TRANSACTION_COUNT(4, "Application Transaction Count"), APP_ACTIVE_TRACE_COUNT(5, "Application Active trace Count"), APP_RESPONSE_TIME(6, "Application Response Time"), + APP_DATA_SOURCE(7, "Application data Source"), APP_STST_AGGRE(51, "Application stst aggregation"), APP_CPU_LOAD_AGGRE(52, "Application Cpu Usage aggregation"), @@ -36,13 +37,15 @@ public enum StatType { APP_TRANSACTION_COUNT_AGGRE(54, "Application Transaction count aggregation"), APP_ACTIVE_TRACE_COUNT_AGGRE(55, "Application Active trace count aggregation"), APP_RESPONSE_TIME_AGGRE(56, "Application Response Time aggregation"), + APP_DATA_SOURCE_AGGRE(57, "Application Data Source aggregation"), AGENT_STST_AGGRE(101, "Agent stst aggregation"), AGENT_CPU_LOAD_AGGRE(102, "Agent Cpu Usage aggregation"), AGENT_MEMORY_USED_AGGRE(103, "Agent Memory Usage aggregation"), AGENT_TRANSACTION_COUNT_AGGRE(104, "Agent Transaction count aggregation"), AGENT_ACTIVE_TRACE_COUNT_AGGRE(105, "Agent Active trace count aggregation"), - AGENT_RESPONSE_TIME_AGGRE(106, "Agent response time aggregation"); + AGENT_RESPONSE_TIME_AGGRE(106, "Agent response time aggregation"), + AGENT_DATA_SOURCE_AGGRE(107, "Agent data source aggregation"); public static final int TYPE_CODE_BYTE_LENGTH = 1; diff --git a/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/DataSourceCodecTest.java b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/DataSourceCodecTest.java new file mode 100644 index 000000000000..bbe3b1482f2a --- /dev/null +++ b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/DataSourceCodecTest.java @@ -0,0 +1,104 @@ +/* + * Copyright 2017 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.common.server.bo.codec.stat.join; + +import com.navercorp.pinpoint.common.buffer.AutomaticBuffer; +import com.navercorp.pinpoint.common.buffer.Buffer; +import com.navercorp.pinpoint.common.buffer.FixedBuffer; +import com.navercorp.pinpoint.common.server.bo.codec.stat.AgentStatDataPointCodec; +import com.navercorp.pinpoint.common.server.bo.serializer.stat.AgentStatUtils; +import com.navercorp.pinpoint.common.server.bo.serializer.stat.ApplicationStatDecodingContext; +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceBo; +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceListBo; +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinStatBo; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static org.junit.Assert.*; + +/** + * @author minwoo.jung + */ +public class DataSourceCodecTest { + + @Test + public void encodeAndDecodeTest() { + final String id = "test_app"; + final long currentTime = new Date().getTime(); + final AgentStatDataPointCodec agentStatDataPointCodec = new AgentStatDataPointCodec(); + final DataSourceCodec dataSourceCodec = new DataSourceCodec(agentStatDataPointCodec); + final List joinDataSourceListBoList = createJoinDataSourceListBoList(currentTime); + final Buffer encodedValueBuffer = new AutomaticBuffer(); + encodedValueBuffer.putByte(dataSourceCodec.getVersion()); + dataSourceCodec.encodeValues(encodedValueBuffer, joinDataSourceListBoList); + + final Buffer valueBuffer = new FixedBuffer(encodedValueBuffer.getBuffer());; + final long baseTimestamp = AgentStatUtils.getBaseTimestamp(currentTime); + final long timestampDelta = currentTime - baseTimestamp; + final ApplicationStatDecodingContext decodingContext = new ApplicationStatDecodingContext(); + decodingContext.setApplicationId(id); + decodingContext.setBaseTimestamp(baseTimestamp); + decodingContext.setTimestampDelta(timestampDelta); + + assertEquals(valueBuffer.readByte(), dataSourceCodec.getVersion()); + List decodedJoinDataSourceListBoList = dataSourceCodec.decodeValues(valueBuffer, decodingContext); + for (int i = 0 ; i < decodedJoinDataSourceListBoList.size(); ++i) { + assertTrue(decodedJoinDataSourceListBoList.get(i).equals(joinDataSourceListBoList.get(i))); + } + } + + private List createJoinDataSourceListBoList(long currentTime) { + final String id = "test_app"; + List joinDataSourceListBoList = new ArrayList(); + + JoinDataSourceListBo joinDataSourceListBo1 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(10), currentTime); + JoinDataSourceListBo joinDataSourceListBo2 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(20), currentTime + 5000); + JoinDataSourceListBo joinDataSourceListBo3 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(30), currentTime + 10000); + JoinDataSourceListBo joinDataSourceListBo4 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(40), currentTime + 15000); + JoinDataSourceListBo joinDataSourceListBo5 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(50), currentTime + 20000); + + joinDataSourceListBoList.add(joinDataSourceListBo1); + joinDataSourceListBoList.add(joinDataSourceListBo2); + joinDataSourceListBoList.add(joinDataSourceListBo3); + joinDataSourceListBoList.add(joinDataSourceListBo4); + joinDataSourceListBoList.add(joinDataSourceListBo5); + + return joinDataSourceListBoList; + } + + private List createJoinDataSourceBoList(int plus) { + List joinDataSourceBoList = new ArrayList(); + + JoinDataSourceBo joinDataSourceBo1 = new JoinDataSourceBo((short)1000, "jdbc:mysql", 30 + plus, 25 + plus, "agent_id_1", 60 + plus, "agent_id_6"); + JoinDataSourceBo joinDataSourceBo2 = new JoinDataSourceBo((short)2000, "jdbc:mssql", 20 + plus, 5 + plus, "agent_id_2", 30 + plus, "agent_id_7"); + JoinDataSourceBo joinDataSourceBo3 = new JoinDataSourceBo((short)3000, "jdbc:postgre", 10 + plus, 25 + plus, "agent_id_3", 50 + plus, "agent_id_8"); + JoinDataSourceBo joinDataSourceBo4 = new JoinDataSourceBo((short)4000, "jdbc:oracle", 40 + plus, 5 + plus, "agent_id_4", 70 + plus, "agent_id_9"); + JoinDataSourceBo joinDataSourceBo5 = new JoinDataSourceBo((short)5000, "jdbc:cubrid", 50 + plus, 25 + plus, "agent_id_5", 80 + plus, "agent_id_10"); + + joinDataSourceBoList.add(joinDataSourceBo1); + joinDataSourceBoList.add(joinDataSourceBo2); + joinDataSourceBoList.add(joinDataSourceBo3); + joinDataSourceBoList.add(joinDataSourceBo4); + joinDataSourceBoList.add(joinDataSourceBo5); + + return joinDataSourceBoList; + } + +} \ No newline at end of file diff --git a/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/ResponseTimeCodecTest.java b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/ResponseTimeCodecTest.java index bc2876065cfb..f5e61f351261 100644 --- a/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/ResponseTimeCodecTest.java +++ b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/codec/stat/join/ResponseTimeCodecTest.java @@ -67,10 +67,10 @@ private List createJoinResponseTimeBoList(long currentTime) { final String id = "test_app"; List joinResponseTimeBoList = new ArrayList(); JoinResponseTimeBo joinResponseTimeBo1 = new JoinResponseTimeBo(id, currentTime, 3000, 2, "app_1_1", 6000, "app_1_2"); - JoinResponseTimeBo joinResponseTimeBo2 = new JoinResponseTimeBo(id, currentTime, 4000, 200, "app_2_1", 9000, "app_2_2"); - JoinResponseTimeBo joinResponseTimeBo3 = new JoinResponseTimeBo(id, currentTime, 2000, 20, "app_3_1", 7000, "app_3_2"); - JoinResponseTimeBo joinResponseTimeBo4 = new JoinResponseTimeBo(id, currentTime, 5000, 20, "app_4_1", 8000, "app_4_2"); - JoinResponseTimeBo joinResponseTimeBo5 = new JoinResponseTimeBo(id, currentTime, 1000, 10, "app_5_1", 6600, "app_5_2"); + JoinResponseTimeBo joinResponseTimeBo2 = new JoinResponseTimeBo(id, currentTime + 5000, 4000, 200, "app_2_1", 9000, "app_2_2"); + JoinResponseTimeBo joinResponseTimeBo3 = new JoinResponseTimeBo(id, currentTime + 10000, 2000, 20, "app_3_1", 7000, "app_3_2"); + JoinResponseTimeBo joinResponseTimeBo4 = new JoinResponseTimeBo(id, currentTime + 15000, 5000, 20, "app_4_1", 8000, "app_4_2"); + JoinResponseTimeBo joinResponseTimeBo5 = new JoinResponseTimeBo(id, currentTime + 20000, 1000, 10, "app_5_1", 6600, "app_5_2"); joinResponseTimeBoList.add(joinResponseTimeBo1); joinResponseTimeBoList.add(joinResponseTimeBo2); joinResponseTimeBoList.add(joinResponseTimeBo3); diff --git a/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinApplicationStatBoTest.java b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinApplicationStatBoTest.java index 510fddf38491..44d787e89bf3 100644 --- a/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinApplicationStatBoTest.java +++ b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinApplicationStatBoTest.java @@ -850,7 +850,7 @@ private JoinApplicationStatBo createJoinApplicationStatBo5(final String id, fina private List createJoinResponseTimeList(String id, long currentTime, int plus) { final List joinResponseTimeBoList = new ArrayList(); - JoinResponseTimeBo joinResponseTimeBo1 = new JoinResponseTimeBo(id, currentTime, 300+ plus, 200 + plus, id + "_1", 6000 + plus, id + "_2"); + JoinResponseTimeBo joinResponseTimeBo1 = new JoinResponseTimeBo(id, currentTime, 300 + plus, 200 + plus, id + "_1", 6000 + plus, id + "_2"); JoinResponseTimeBo joinResponseTimeBo2 = new JoinResponseTimeBo(id, currentTime + 5000, 200 + plus, 50 + plus, id + "_1", 7000 + plus, id + "_2"); JoinResponseTimeBo joinResponseTimeBo3 = new JoinResponseTimeBo(id, currentTime + 10000, 400 + plus, 300 + plus, id + "_1", 8000 + plus, id + "_2"); JoinResponseTimeBo joinResponseTimeBo4 = new JoinResponseTimeBo(id, currentTime + 15000, 500 + plus, 400 + plus, id + "_1", 2000 + plus, id + "_2"); @@ -864,6 +864,269 @@ private List createJoinResponseTimeList(String id, long curr return joinResponseTimeBoList; } + @Test + public void joinApplicationStatBoByTimeSlice11Test() { + final long currentTime = 1487149800000L; // 18:10:00 15 2 2017 + List joinApplicationStatBoList = new ArrayList(); + joinApplicationStatBoList.add(createJoinApplicationStatBo6("id1", currentTime, 10)); + joinApplicationStatBoList.add(createJoinApplicationStatBo6("id2", currentTime + 1000, -40)); + joinApplicationStatBoList.add(createJoinApplicationStatBo6("id3", currentTime + 2000, -30)); + joinApplicationStatBoList.add(createJoinApplicationStatBo6("id4", currentTime + 3000, 40)); + joinApplicationStatBoList.add(createJoinApplicationStatBo6("id5", currentTime + 4000, -50)); + JoinApplicationStatBo resultJoinApplicationStatBo = JoinApplicationStatBo.joinApplicationStatBoByTimeSlice(joinApplicationStatBoList); + List joinDataSourceListBoList = resultJoinApplicationStatBo.getJoinDataSourceListBoList(); + Collections.sort(joinDataSourceListBoList, new ComparatorImpl6()); + + assertJoinDataSourceListBoList(joinDataSourceListBoList); + } + + @Test + public void joinApplicationStatBoByTimeSlice12Test() { + List joinApplicationStatBoList = new ArrayList(); + + List joinDataSourceLIstBoList1 = new ArrayList(); + List joinDataSourceBoList1 = new ArrayList(); + joinDataSourceBoList1.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 100, 60, "agent1", 200, "agent1")); + JoinDataSourceListBo joinDataSourceListBo1_1 = new JoinDataSourceListBo("agent1", joinDataSourceBoList1, 1498462545000L); + JoinDataSourceListBo joinDataSourceListBo1_2 = new JoinDataSourceListBo("agent1", joinDataSourceBoList1, 1498462550000L); + JoinDataSourceListBo joinDataSourceListBo1_3 = new JoinDataSourceListBo("agent1", joinDataSourceBoList1, 1498462555000L); + joinDataSourceLIstBoList1.add(joinDataSourceListBo1_1); + joinDataSourceLIstBoList1.add(joinDataSourceListBo1_2); + joinDataSourceLIstBoList1.add(joinDataSourceListBo1_3); + JoinApplicationStatBo joinApplicationStatBo1 = new JoinApplicationStatBo(); + joinApplicationStatBo1.setId("test_app"); + joinApplicationStatBo1.setJoinDataSourceListBoList(joinDataSourceLIstBoList1); + joinApplicationStatBo1.setTimestamp(1498462545000L); + joinApplicationStatBoList.add(joinApplicationStatBo1); + + List joinDataSourceLIstBoList2 = new ArrayList(); + List joinDataSourceBoList2_1 = new ArrayList(); + joinDataSourceBoList2_1.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 50, 20, "agent1", 230, "agent1")); + JoinDataSourceListBo joinResponseTimeBo2_1 = new JoinDataSourceListBo("agent1", joinDataSourceBoList2_1, 1498462545000L); + List joinDataSourceBoList2_2 = new ArrayList(); + joinDataSourceBoList2_2.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 200, 60, "agent2", 400, "agent2")); + JoinDataSourceListBo joinResponseTimeBo2_2 = new JoinDataSourceListBo("agent2", joinDataSourceBoList2_2, 1498462550000L); + List joinDataSourceBoList2_3 = new ArrayList(); + joinDataSourceBoList2_3.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 500, 10, "agent3", 100, "agent3")); + JoinDataSourceListBo joinResponseTimeBo2_3 = new JoinDataSourceListBo("agent3", joinDataSourceBoList2_3, 1498462555000L); + List joinDataSourceBoList2_4 = new ArrayList(); + joinDataSourceBoList2_4.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 400, 60, "agent3", 500, "agent3")); + JoinDataSourceListBo joinResponseTimeBo2_4 = new JoinDataSourceListBo("agent3", joinDataSourceBoList2_4, 1498462560000L); + joinDataSourceLIstBoList2.add(joinResponseTimeBo2_1); + joinDataSourceLIstBoList2.add(joinResponseTimeBo2_2); + joinDataSourceLIstBoList2.add(joinResponseTimeBo2_3); + joinDataSourceLIstBoList2.add(joinResponseTimeBo2_4); + JoinApplicationStatBo joinApplicationStatBo2 = new JoinApplicationStatBo(); + joinApplicationStatBo2.setId("test_app"); + joinApplicationStatBo2.setJoinDataSourceListBoList(joinDataSourceLIstBoList2); + joinApplicationStatBo2.setTimestamp(1498462545000L); + joinApplicationStatBoList.add(joinApplicationStatBo2); + + List joinResponseTimeBoList3 = new ArrayList(); + List joinDataSourceBoList3_1 = new ArrayList(); + joinDataSourceBoList3_1.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 150, 20, "agent1", 230, "agent1")); + JoinDataSourceListBo joinResponseTimeBo3_1 = new JoinDataSourceListBo("agent1", joinDataSourceBoList3_1, 1498462545000L); + List joinDataSourceBoList3_2 = new ArrayList(); + joinDataSourceBoList3_2.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 300, 10, "agent2", 400, "agent2")); + JoinDataSourceListBo joinResponseTimeBo3_2 = new JoinDataSourceListBo("agent2", joinDataSourceBoList3_2, 1498462550000L); + List joinDataSourceBoList3_3 = new ArrayList(); + joinDataSourceBoList3_3.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 30, 5, "agent2", 100, "agent2")); + JoinDataSourceListBo joinResponseTimeBo3_3 = new JoinDataSourceListBo("agent3", joinDataSourceBoList3_3, 1498462565000L); + joinResponseTimeBoList3.add(joinResponseTimeBo3_1); + joinResponseTimeBoList3.add(joinResponseTimeBo3_2); + joinResponseTimeBoList3.add(joinResponseTimeBo3_3); + JoinApplicationStatBo joinApplicationStatBo3 = new JoinApplicationStatBo(); + joinApplicationStatBo3.setId("test_app"); + joinApplicationStatBo3.setJoinDataSourceListBoList(joinResponseTimeBoList3); + joinApplicationStatBo3.setTimestamp(1498462545000L); + joinApplicationStatBoList.add(joinApplicationStatBo3); + + JoinApplicationStatBo joinApplicationStatBo = JoinApplicationStatBo.joinApplicationStatBoByTimeSlice(joinApplicationStatBoList); + assertEquals(joinApplicationStatBo.getId(), "test_app"); + assertEquals(joinApplicationStatBo.getTimestamp(), 1498462545000L); + List joinDataSourceListBoList = joinApplicationStatBo.getJoinDataSourceListBoList(); + Collections.sort(joinDataSourceListBoList, new ComparatorImpl6()); + assertEquals(joinDataSourceListBoList.size(), 5); + assertEquals(joinDataSourceListBoList.get(0).getJoinDataSourceBoList().get(0).getAvgActiveConnectionSize(), 100); + assertEquals(joinDataSourceListBoList.get(0).getJoinDataSourceBoList().size(), 1); + assertEquals(joinDataSourceListBoList.get(1).getJoinDataSourceBoList().get(0).getAvgActiveConnectionSize(), 200); + assertEquals(joinDataSourceListBoList.get(1).getJoinDataSourceBoList().size(), 1); + assertEquals(joinDataSourceListBoList.get(2).getJoinDataSourceBoList().get(0).getAvgActiveConnectionSize(), 300); + assertEquals(joinDataSourceListBoList.get(2).getJoinDataSourceBoList().size(), 1); + assertEquals(joinDataSourceListBoList.get(3).getJoinDataSourceBoList().get(0).getAvgActiveConnectionSize(), 400); + assertEquals(joinDataSourceListBoList.get(3).getJoinDataSourceBoList().size(), 1); + assertEquals(joinDataSourceListBoList.get(4).getJoinDataSourceBoList().get(0).getAvgActiveConnectionSize(), 30); + assertEquals(joinDataSourceListBoList.get(4).getJoinDataSourceBoList().size(), 1); + } + + private void assertJoinDataSourceListBoList(List joinDataSourceListBoList) { + assertEquals(joinDataSourceListBoList.size(), 5); + + JoinDataSourceListBo joinDataSourceListBo1 = joinDataSourceListBoList.get(0); + assertEquals(joinDataSourceListBo1.getId(), "id1"); + assertEquals(joinDataSourceListBo1.getTimestamp(), 1487149800000L); + List joinDataSourceBoList1 = joinDataSourceListBo1.getJoinDataSourceBoList(); + assertEquals(joinDataSourceBoList1.size(), 2); + JoinDataSourceBo joinDataSourceBo1_1 = joinDataSourceBoList1.get(0); + assertEquals(joinDataSourceBo1_1.getServiceTypeCode(), 1000); + assertEquals(joinDataSourceBo1_1.getUrl(), "jdbc:mysql"); + assertEquals(joinDataSourceBo1_1.getAvgActiveConnectionSize(), 286); + assertEquals(joinDataSourceBo1_1.getMinActiveConnectionSize(), 200); + assertEquals(joinDataSourceBo1_1.getMinActiveConnectionAgentId(), "agent_id_1_-50"); + assertEquals(joinDataSourceBo1_1.getMaxActiveConnectionSize(), 640); + assertEquals(joinDataSourceBo1_1.getMaxActiveConnectionAgentId(), "agent_id_6_40"); + JoinDataSourceBo joinDataSourceBo1_2 = joinDataSourceBoList1.get(1); + assertEquals(joinDataSourceBo1_2.getServiceTypeCode(), 2000); + assertEquals(joinDataSourceBo1_2.getUrl(), "jdbc:mssql"); + assertEquals(joinDataSourceBo1_2.getAvgActiveConnectionSize(), 386); + assertEquals(joinDataSourceBo1_2.getMinActiveConnectionSize(), 300); + assertEquals(joinDataSourceBo1_2.getMinActiveConnectionAgentId(), "agent_id_1_-50"); + assertEquals(joinDataSourceBo1_2.getMaxActiveConnectionSize(), 740); + assertEquals(joinDataSourceBo1_2.getMaxActiveConnectionAgentId(), "agent_id_6_40"); + + JoinDataSourceListBo joinDataSourceListBo2 = joinDataSourceListBoList.get(1); + assertEquals(joinDataSourceListBo2.getId(), "id1"); + assertEquals(joinDataSourceListBo2.getTimestamp(), 1487149805000L); + List joinDataSourceBoList2 = joinDataSourceListBo2.getJoinDataSourceBoList(); + assertEquals(joinDataSourceBoList2.size(), 2); + JoinDataSourceBo joinDataSourceBo2_1 = joinDataSourceBoList2.get(0); + assertEquals(joinDataSourceBo2_1.getServiceTypeCode(), 1000); + assertEquals(joinDataSourceBo2_1.getUrl(), "jdbc:mysql"); + assertEquals(joinDataSourceBo2_1.getAvgActiveConnectionSize(), 186); + assertEquals(joinDataSourceBo2_1.getMinActiveConnectionSize(), 0); + assertEquals(joinDataSourceBo2_1.getMinActiveConnectionAgentId(), "agent_id_2_-50"); + assertEquals(joinDataSourceBo2_1.getMaxActiveConnectionSize(), 740); + assertEquals(joinDataSourceBo2_1.getMaxActiveConnectionAgentId(), "agent_id_7_40"); + JoinDataSourceBo joinDataSourceBo2_2 = joinDataSourceBoList2.get(1); + assertEquals(joinDataSourceBo2_2.getServiceTypeCode(), 2000); + assertEquals(joinDataSourceBo2_2.getUrl(), "jdbc:mssql"); + assertEquals(joinDataSourceBo2_2.getAvgActiveConnectionSize(), 286); + assertEquals(joinDataSourceBo2_2.getMinActiveConnectionSize(), 100); + assertEquals(joinDataSourceBo2_2.getMinActiveConnectionAgentId(), "agent_id_2_-50"); + assertEquals(joinDataSourceBo2_2.getMaxActiveConnectionSize(), 840); + assertEquals(joinDataSourceBo2_2.getMaxActiveConnectionAgentId(), "agent_id_7_40"); + + JoinDataSourceListBo joinDataSourceListBo3 = joinDataSourceListBoList.get(2); + assertEquals(joinDataSourceListBo3.getId(), "id1"); + assertEquals(joinDataSourceListBo3.getTimestamp(), 1487149810000L); + List joinDataSourceBoList3 = joinDataSourceListBo3.getJoinDataSourceBoList(); + assertEquals(joinDataSourceBoList3.size(), 2); + JoinDataSourceBo joinDataSourceBo3_1 = joinDataSourceBoList3.get(0); + assertEquals(joinDataSourceBo3_1.getServiceTypeCode(), 1000); + assertEquals(joinDataSourceBo3_1.getUrl(), "jdbc:mysql"); + assertEquals(joinDataSourceBo3_1.getAvgActiveConnectionSize(), 486); + assertEquals(joinDataSourceBo3_1.getMinActiveConnectionSize(), 100); + assertEquals(joinDataSourceBo3_1.getMinActiveConnectionAgentId(), "agent_id_3_-50"); + assertEquals(joinDataSourceBo3_1.getMaxActiveConnectionSize(), 940); + assertEquals(joinDataSourceBo3_1.getMaxActiveConnectionAgentId(), "agent_id_8_40"); + JoinDataSourceBo joinDataSourceBo3_2 = joinDataSourceBoList3.get(1); + assertEquals(joinDataSourceBo3_2.getServiceTypeCode(), 2000); + assertEquals(joinDataSourceBo3_2.getUrl(), "jdbc:mssql"); + assertEquals(joinDataSourceBo3_2.getAvgActiveConnectionSize(), 586); + assertEquals(joinDataSourceBo3_2.getMinActiveConnectionSize(), 200); + assertEquals(joinDataSourceBo3_2.getMinActiveConnectionAgentId(), "agent_id_3_-50"); + assertEquals(joinDataSourceBo3_2.getMaxActiveConnectionSize(), 1040); + assertEquals(joinDataSourceBo3_2.getMaxActiveConnectionAgentId(), "agent_id_8_40"); + + JoinDataSourceListBo joinDataSourceListBo4 = joinDataSourceListBoList.get(3); + assertEquals(joinDataSourceListBo4.getId(), "id1"); + assertEquals(joinDataSourceListBo4.getTimestamp(), 1487149815000L); + List joinDataSourceBoList4 = joinDataSourceListBo4.getJoinDataSourceBoList(); + assertEquals(joinDataSourceBoList4.size(), 2); + JoinDataSourceBo joinDataSourceBo4_1 = joinDataSourceBoList4.get(0); + assertEquals(joinDataSourceBo4_1.getServiceTypeCode(), 1000); + assertEquals(joinDataSourceBo4_1.getUrl(), "jdbc:mysql"); + assertEquals(joinDataSourceBo4_1.getAvgActiveConnectionSize(), 386); + assertEquals(joinDataSourceBo4_1.getMinActiveConnectionSize(), 500); + assertEquals(joinDataSourceBo4_1.getMinActiveConnectionAgentId(), "agent_id_4_-50"); + assertEquals(joinDataSourceBo4_1.getMaxActiveConnectionSize(), 640); + assertEquals(joinDataSourceBo4_1.getMaxActiveConnectionAgentId(), "agent_id_9_40"); + JoinDataSourceBo joinDataSourceBo4_2 = joinDataSourceBoList4.get(1); + assertEquals(joinDataSourceBo4_2.getServiceTypeCode(), 2000); + assertEquals(joinDataSourceBo4_2.getUrl(), "jdbc:mssql"); + assertEquals(joinDataSourceBo4_2.getAvgActiveConnectionSize(), 486); + assertEquals(joinDataSourceBo4_2.getMinActiveConnectionSize(), 600); + assertEquals(joinDataSourceBo4_2.getMinActiveConnectionAgentId(), "agent_id_4_-50"); + assertEquals(joinDataSourceBo4_2.getMaxActiveConnectionSize(), 740); + assertEquals(joinDataSourceBo4_2.getMaxActiveConnectionAgentId(), "agent_id_9_40"); + + JoinDataSourceListBo joinDataSourceListBo5 = joinDataSourceListBoList.get(4); + assertEquals(joinDataSourceListBo5.getId(), "id1"); + assertEquals(joinDataSourceListBo5.getTimestamp(), 1487149820000L); + List joinDataSourceBoList5 = joinDataSourceListBo5.getJoinDataSourceBoList(); + assertEquals(joinDataSourceBoList5.size(), 2); + JoinDataSourceBo joinDataSourceBo5_1 = joinDataSourceBoList5.get(0); + assertEquals(joinDataSourceBo5_1.getServiceTypeCode(), 1000); + assertEquals(joinDataSourceBo5_1.getUrl(), "jdbc:mysql"); + assertEquals(joinDataSourceBo5_1.getAvgActiveConnectionSize(), 86); + assertEquals(joinDataSourceBo5_1.getMinActiveConnectionSize(), 700); + assertEquals(joinDataSourceBo5_1.getMinActiveConnectionAgentId(), "agent_id_5_-50"); + assertEquals(joinDataSourceBo5_1.getMaxActiveConnectionSize(), 840); + assertEquals(joinDataSourceBo5_1.getMaxActiveConnectionAgentId(), "agent_id_10_40"); + JoinDataSourceBo joinDataSourceBo5_2 = joinDataSourceBoList5.get(1); + assertEquals(joinDataSourceBo5_2.getServiceTypeCode(), 2000); + assertEquals(joinDataSourceBo5_2.getUrl(), "jdbc:mssql"); + assertEquals(joinDataSourceBo5_2.getAvgActiveConnectionSize(), 186); + assertEquals(joinDataSourceBo5_2.getMinActiveConnectionSize(), 800); + assertEquals(joinDataSourceBo5_2.getMinActiveConnectionAgentId(), "agent_id_5_-50"); + assertEquals(joinDataSourceBo5_2.getMaxActiveConnectionSize(), 940); + assertEquals(joinDataSourceBo5_2.getMaxActiveConnectionAgentId(), "agent_id_10_40"); + + } + + private class ComparatorImpl6 implements Comparator { + @Override + public int compare(JoinDataSourceListBo bo1, JoinDataSourceListBo bo2) { + return bo1.getTimestamp() < bo2.getTimestamp() ? -1 : 1; + } + } + + private JoinApplicationStatBo createJoinApplicationStatBo6(final String id, final long timestamp, final int plus) { + final JoinApplicationStatBo joinApplicationStatBo = new JoinApplicationStatBo(); + joinApplicationStatBo.setId(id); + joinApplicationStatBo.setJoinDataSourceListBoList(createJoinDataSourceListBoList(id, timestamp, plus)); + joinApplicationStatBo.setTimestamp(timestamp); + joinApplicationStatBo.setStatType(StatType.APP_STST); + return joinApplicationStatBo; + } + + private List createJoinDataSourceListBoList(String id, long currentTime, int plus) { + final List joinDataSourceListBoList = new ArrayList(); + + List joinDataSourceBoList1 = new ArrayList(); + joinDataSourceBoList1.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 300 + plus, 250 + plus, "agent_id_1_" + plus, 600 + plus, "agent_id_6_" + plus)); + joinDataSourceBoList1.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 400 + plus, 350 + plus, "agent_id_1_" + plus, 700 + plus, "agent_id_6_" + plus)); + JoinDataSourceListBo joinDataSourceListBo1 = new JoinDataSourceListBo(id, joinDataSourceBoList1, currentTime); + + List joinDataSourceBoList2 = new ArrayList(); + joinDataSourceBoList2.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 200 + plus, 50 + plus, "agent_id_2_" + plus, 700 + plus, "agent_id_7_" + plus)); + joinDataSourceBoList2.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 300 + plus, 150 + plus, "agent_id_2_" + plus, 800 + plus, "agent_id_7_" + plus)); + JoinDataSourceListBo joinDataSourceListBo2 = new JoinDataSourceListBo(id, joinDataSourceBoList2, currentTime + 5000); + + List joinDataSourceBoList3 = new ArrayList(); + joinDataSourceBoList3.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 500 + plus, 150 + plus, "agent_id_3_" + plus, 900 + plus, "agent_id_8_" + plus)); + joinDataSourceBoList3.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 600 + plus, 250 + plus, "agent_id_3_" + plus, 1000 + plus, "agent_id_8_" + plus)); + JoinDataSourceListBo joinDataSourceListBo3 = new JoinDataSourceListBo(id, joinDataSourceBoList3, currentTime + 10000); + + List joinDataSourceBoList4 = new ArrayList(); + joinDataSourceBoList4.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 400 + plus, 550 + plus, "agent_id_4_" + plus, 600 + plus, "agent_id_9_" + plus)); + joinDataSourceBoList4.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 500 + plus, 650 + plus, "agent_id_4_" + plus, 700 + plus, "agent_id_9_" + plus)); + JoinDataSourceListBo joinDataSourceListBo4 = new JoinDataSourceListBo(id, joinDataSourceBoList4, currentTime + 15000); + + List joinDataSourceBoList5 = new ArrayList(); + joinDataSourceBoList5.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 100 + plus, 750 + plus, "agent_id_5_" + plus, 800 + plus, "agent_id_10_" + plus)); + joinDataSourceBoList5.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 200 + plus, 850 + plus, "agent_id_5_" + plus, 900 + plus, "agent_id_10_" + plus)); + JoinDataSourceListBo joinDataSourceListBo5 = new JoinDataSourceListBo(id, joinDataSourceBoList5, currentTime + 20000); + + joinDataSourceListBoList.add(joinDataSourceListBo1); + joinDataSourceListBoList.add(joinDataSourceListBo2); + joinDataSourceListBoList.add(joinDataSourceListBo3); + joinDataSourceListBoList.add(joinDataSourceListBo4); + joinDataSourceListBoList.add(joinDataSourceListBo5); + + return joinDataSourceListBoList; + } + @Test public void createJoinApplicationStatBoTest() { JoinAgentStatBo joinAgentStatBo = new JoinAgentStatBo(); @@ -934,6 +1197,41 @@ public void createJoinApplicationStatBoTest() { joinResponseTimeBoList.add(joinResponseTimeBo5); joinAgentStatBo.setJoinResponseTimeBoList(joinResponseTimeBoList); + final List joinDataSourceListBoList = new ArrayList(); + + List joinDataSourceBoList1 = new ArrayList(); + joinDataSourceBoList1.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 300, 250, "agent_id_1", 600, "agent_id_6")); + joinDataSourceBoList1.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 400, 350, "agent_id_1", 700, "agent_id_6")); + JoinDataSourceListBo joinDataSourceListBo1 = new JoinDataSourceListBo("agent1", joinDataSourceBoList1, 1498462565000L); + + List joinDataSourceBoList2 = new ArrayList(); + joinDataSourceBoList2.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 200, 50, "agent_id_2", 700, "agent_id_7")); + joinDataSourceBoList2.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 300, 150, "agent_id_2", 800, "agent_id_7")); + JoinDataSourceListBo joinDataSourceListBo2 = new JoinDataSourceListBo("agent1", joinDataSourceBoList2, 1498462570000L); + + List joinDataSourceBoList3 = new ArrayList(); + joinDataSourceBoList3.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 500, 150, "agent_id_3", 900, "agent_id_8")); + joinDataSourceBoList3.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 600, 250, "agent_id_3", 1000, "agent_id_8")); + JoinDataSourceListBo joinDataSourceListBo3 = new JoinDataSourceListBo("agent1", joinDataSourceBoList3, 1498462575000L); + + List joinDataSourceBoList4 = new ArrayList(); + joinDataSourceBoList4.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 400, 550, "agent_id_4", 600, "agent_id_9")); + joinDataSourceBoList4.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 500, 650, "agent_id_4", 700, "agent_id_9")); + JoinDataSourceListBo joinDataSourceListBo4 = new JoinDataSourceListBo("agent1", joinDataSourceBoList4, 1498462580000L); + + List joinDataSourceBoList5 = new ArrayList(); + joinDataSourceBoList5.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 100, 750, "agent_id_5", 800, "agent_id_10")); + joinDataSourceBoList5.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 200, 850, "agent_id_5", 900, "agent_id_10")); + JoinDataSourceListBo joinDataSourceListBo5 = new JoinDataSourceListBo("agent1", joinDataSourceBoList5, 1498462585000L); + + joinDataSourceListBoList.add(joinDataSourceListBo1); + joinDataSourceListBoList.add(joinDataSourceListBo2); + joinDataSourceListBoList.add(joinDataSourceListBo3); + joinDataSourceListBoList.add(joinDataSourceListBo4); + joinDataSourceListBoList.add(joinDataSourceListBo5); + joinAgentStatBo.setJoinDataSourceListBoList(joinDataSourceListBoList); + + List joinApplicationStatBoList = JoinApplicationStatBo.createJoinApplicationStatBo("test_app", joinAgentStatBo, 60000); assertEquals(joinApplicationStatBoList.size(), 1); JoinApplicationStatBo joinApplicationStatBo = joinApplicationStatBoList.get(0); @@ -943,6 +1241,7 @@ public void createJoinApplicationStatBoTest() { assertEquals(joinApplicationStatBo.getJoinTransactionBoList().size(), 5); assertEquals(joinApplicationStatBo.getJoinActiveTraceBoList().size(), 5); assertEquals(joinApplicationStatBo.getJoinResponseTimeBoList().size(), 5); + assertEquals(joinApplicationStatBo.getJoinDataSourceListBoList().size(), 5); } @Test @@ -1015,6 +1314,40 @@ public void createJoinApplicationStatBo2Test() { joinResponseTimeBoList.add(joinResponseTimeBo5); joinAgentStatBo.setJoinResponseTimeBoList(joinResponseTimeBoList); + final List joinDataSourceListBoList = new ArrayList(); + + List joinDataSourceBoList1 = new ArrayList(); + joinDataSourceBoList1.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 300, 250, "agent_id_1", 600, "agent_id_6")); + joinDataSourceBoList1.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 400, 350, "agent_id_1", 700, "agent_id_6")); + JoinDataSourceListBo joinDataSourceListBo1 = new JoinDataSourceListBo("agent1", joinDataSourceBoList1, 1498462545000L); + + List joinDataSourceBoList2 = new ArrayList(); + joinDataSourceBoList2.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 200, 50, "agent_id_2", 700, "agent_id_7")); + joinDataSourceBoList2.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 300, 150, "agent_id_2", 800, "agent_id_7")); + JoinDataSourceListBo joinDataSourceListBo2 = new JoinDataSourceListBo("agent1", joinDataSourceBoList2, 1498462550000L); + + List joinDataSourceBoList3 = new ArrayList(); + joinDataSourceBoList3.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 500, 150, "agent_id_3", 900, "agent_id_8")); + joinDataSourceBoList3.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 600, 250, "agent_id_3", 1000, "agent_id_8")); + JoinDataSourceListBo joinDataSourceListBo3 = new JoinDataSourceListBo("agent1", joinDataSourceBoList3, 1498462555000L); + + List joinDataSourceBoList4 = new ArrayList(); + joinDataSourceBoList4.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 400, 550, "agent_id_4", 600, "agent_id_9")); + joinDataSourceBoList4.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 500, 650, "agent_id_4", 700, "agent_id_9")); + JoinDataSourceListBo joinDataSourceListBo4 = new JoinDataSourceListBo("agent1", joinDataSourceBoList4, 1498462560000L); + + List joinDataSourceBoList5 = new ArrayList(); + joinDataSourceBoList5.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 100, 750, "agent_id_5", 800, "agent_id_10")); + joinDataSourceBoList5.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 200, 850, "agent_id_5", 900, "agent_id_10")); + JoinDataSourceListBo joinDataSourceListBo5 = new JoinDataSourceListBo("agent1", joinDataSourceBoList5, 1498462565000L); + + joinDataSourceListBoList.add(joinDataSourceListBo1); + joinDataSourceListBoList.add(joinDataSourceListBo2); + joinDataSourceListBoList.add(joinDataSourceListBo3); + joinDataSourceListBoList.add(joinDataSourceListBo4); + joinDataSourceListBoList.add(joinDataSourceListBo5); + joinAgentStatBo.setJoinDataSourceListBoList(joinDataSourceListBoList); + List joinApplicationStatBoList = JoinApplicationStatBo.createJoinApplicationStatBo("test_app", joinAgentStatBo, 60000); assertEquals(joinApplicationStatBoList.size(), 2); for (JoinApplicationStatBo joinApplicationStatBo : joinApplicationStatBoList) { @@ -1025,12 +1358,14 @@ public void createJoinApplicationStatBo2Test() { assertEquals(joinApplicationStatBo.getJoinTransactionBoList().size(), 2); assertEquals(joinApplicationStatBo.getJoinActiveTraceBoList().size(), 2); assertEquals(joinApplicationStatBo.getJoinResponseTimeBoList().size(), 2); + assertEquals(joinApplicationStatBo.getJoinDataSourceListBoList().size(), 2); } else if (joinApplicationStatBo.getTimestamp() == 1498462500000L) { assertEquals(joinApplicationStatBo.getJoinCpuLoadBoList().size(), 3); assertEquals(joinApplicationStatBo.getJoinMemoryBoList().size(), 3); assertEquals(joinApplicationStatBo.getJoinTransactionBoList().size(), 3); assertEquals(joinApplicationStatBo.getJoinActiveTraceBoList().size(), 3); assertEquals(joinApplicationStatBo.getJoinResponseTimeBoList().size(), 3); + assertEquals(joinApplicationStatBo.getJoinDataSourceListBoList().size(), 3); } else { fail(); } @@ -1107,6 +1442,40 @@ public void createJoinApplicationStatBo3Test() { joinResponseTimeBoList.add(joinResponseTimeBo5); joinAgentStatBo.setJoinResponseTimeBoList(joinResponseTimeBoList); + final List joinDataSourceListBoList = new ArrayList(); + + List joinDataSourceBoList1 = new ArrayList(); + joinDataSourceBoList1.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 300, 250, "agent_id_1", 600, "agent_id_6")); + joinDataSourceBoList1.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 400, 350, "agent_id_1", 700, "agent_id_6")); + JoinDataSourceListBo joinDataSourceListBo1 = new JoinDataSourceListBo("agent1", joinDataSourceBoList1, 1498462545000L); + + List joinDataSourceBoList2 = new ArrayList(); + joinDataSourceBoList2.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 200, 50, "agent_id_2", 700, "agent_id_7")); + joinDataSourceBoList2.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 300, 150, "agent_id_2", 800, "agent_id_7")); + JoinDataSourceListBo joinDataSourceListBo2 = new JoinDataSourceListBo("agent1", joinDataSourceBoList2, 1498462550000L); + + List joinDataSourceBoList3 = new ArrayList(); + joinDataSourceBoList3.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 500, 150, "agent_id_3", 900, "agent_id_8")); + joinDataSourceBoList3.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 600, 250, "agent_id_3", 1000, "agent_id_8")); + JoinDataSourceListBo joinDataSourceListBo3 = new JoinDataSourceListBo("agent1", joinDataSourceBoList3, 1498462555000L); + + List joinDataSourceBoList4 = new ArrayList(); + joinDataSourceBoList4.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 400, 550, "agent_id_4", 600, "agent_id_9")); + joinDataSourceBoList4.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 500, 650, "agent_id_4", 700, "agent_id_9")); + JoinDataSourceListBo joinDataSourceListBo4 = new JoinDataSourceListBo("agent1", joinDataSourceBoList4, 1498462560000L); + + List joinDataSourceBoList5 = new ArrayList(); + joinDataSourceBoList5.add(new JoinDataSourceBo((short)1000, "jdbc:mysql", 100, 750, "agent_id_5", 800, "agent_id_10")); + joinDataSourceBoList5.add(new JoinDataSourceBo((short)2000, "jdbc:mssql", 200, 850, "agent_id_5", 900, "agent_id_10")); + JoinDataSourceListBo joinDataSourceListBo5 = new JoinDataSourceListBo("agent1", joinDataSourceBoList5, 1498462565000L); + + joinDataSourceListBoList.add(joinDataSourceListBo1); + joinDataSourceListBoList.add(joinDataSourceListBo2); + joinDataSourceListBoList.add(joinDataSourceListBo3); + joinDataSourceListBoList.add(joinDataSourceListBo4); + joinDataSourceListBoList.add(joinDataSourceListBo5); + joinAgentStatBo.setJoinDataSourceListBoList(joinDataSourceListBoList); + List joinApplicationStatBoList = JoinApplicationStatBo.createJoinApplicationStatBo("test_app", joinAgentStatBo, 10000); assertEquals(joinApplicationStatBoList.size(), 3); for (JoinApplicationStatBo joinApplicationStatBo : joinApplicationStatBoList) { @@ -1117,18 +1486,21 @@ public void createJoinApplicationStatBo3Test() { assertEquals(joinApplicationStatBo.getJoinTransactionBoList().size(), 2); assertEquals(joinApplicationStatBo.getJoinActiveTraceBoList().size(), 2); assertEquals(joinApplicationStatBo.getJoinResponseTimeBoList().size(), 2); + assertEquals(joinApplicationStatBo.getJoinDataSourceListBoList().size(), 2); } else if (joinApplicationStatBo.getTimestamp() == 1498462540000L) { assertEquals(joinApplicationStatBo.getJoinCpuLoadBoList().size(), 1); assertEquals(joinApplicationStatBo.getJoinMemoryBoList().size(), 1); assertEquals(joinApplicationStatBo.getJoinTransactionBoList().size(), 1); assertEquals(joinApplicationStatBo.getJoinActiveTraceBoList().size(), 1); assertEquals(joinApplicationStatBo.getJoinResponseTimeBoList().size(), 1); + assertEquals(joinApplicationStatBo.getJoinDataSourceListBoList().size(), 1); } else if (joinApplicationStatBo.getTimestamp() == 1498462550000L) { assertEquals(joinApplicationStatBo.getJoinCpuLoadBoList().size(), 2); assertEquals(joinApplicationStatBo.getJoinMemoryBoList().size(), 2); assertEquals(joinApplicationStatBo.getJoinTransactionBoList().size(), 2); assertEquals(joinApplicationStatBo.getJoinActiveTraceBoList().size(), 2); assertEquals(joinApplicationStatBo.getJoinResponseTimeBoList().size(), 2); + assertEquals(joinApplicationStatBo.getJoinDataSourceListBoList().size(), 2); } else { fail(); } diff --git a/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinDataSourceBoTest.java b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinDataSourceBoTest.java new file mode 100644 index 000000000000..b0275a0e65fc --- /dev/null +++ b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinDataSourceBoTest.java @@ -0,0 +1,66 @@ +/* + * Copyright 2017 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.common.server.bo.stat.join; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.*; + +/** + * @author minwoo.jung + */ +public class JoinDataSourceBoTest { + + @Test + public void joinDataSourceBoListTest() { + List joinDataSourceBoList = new ArrayList(); + + JoinDataSourceBo joinDataSourceBo1 = new JoinDataSourceBo((short)1000, "jdbc:mysql", 30, 25, "agent_id_1", 60, "agent_id_6"); + JoinDataSourceBo joinDataSourceBo2 = new JoinDataSourceBo((short)1000, "jdbc:mysql", 20, 5, "agent_id_2", 30, "agent_id_7"); + JoinDataSourceBo joinDataSourceBo3 = new JoinDataSourceBo((short)1000, "jdbc:mysql", 10, 25, "agent_id_3", 50, "agent_id_8"); + JoinDataSourceBo joinDataSourceBo4 = new JoinDataSourceBo((short)1000, "jdbc:mysql", 40, 4, "agent_id_4", 70, "agent_id_9"); + JoinDataSourceBo joinDataSourceBo5 = new JoinDataSourceBo((short)1000, "jdbc:mysql", 50, 25, "agent_id_5", 80, "agent_id_10"); + + joinDataSourceBoList.add(joinDataSourceBo1); + joinDataSourceBoList.add(joinDataSourceBo2); + joinDataSourceBoList.add(joinDataSourceBo3); + joinDataSourceBoList.add(joinDataSourceBo4); + joinDataSourceBoList.add(joinDataSourceBo5); + + JoinDataSourceBo joinDataSourceBo = JoinDataSourceBo.joinDataSourceBoList(joinDataSourceBoList); + + assertEquals(joinDataSourceBo.getServiceTypeCode(), 1000); + assertEquals(joinDataSourceBo.getUrl(), "jdbc:mysql"); + assertEquals(joinDataSourceBo.getAvgActiveConnectionSize(), 30); + assertEquals(joinDataSourceBo.getMinActiveConnectionSize(), 4); + assertEquals(joinDataSourceBo.getMinActiveConnectionAgentId(), "agent_id_4"); + assertEquals(joinDataSourceBo.getMaxActiveConnectionSize(), 80); + assertEquals(joinDataSourceBo.getMaxActiveConnectionAgentId(), "agent_id_10"); + } + + @Test + public void joinDataSourceBoList2Test() { + List joinDataSourceBoList = new ArrayList(); + JoinDataSourceBo joinDataSourceBo = JoinDataSourceBo.joinDataSourceBoList(joinDataSourceBoList); + + assertEquals(joinDataSourceBo, JoinDataSourceBo.EMPTY_JOIN_DATA_SOURCE_BO); + } + +} \ No newline at end of file diff --git a/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinDataSourceListBoTest.java b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinDataSourceListBoTest.java new file mode 100644 index 000000000000..9d6fd2240d54 --- /dev/null +++ b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/bo/stat/join/JoinDataSourceListBoTest.java @@ -0,0 +1,148 @@ +/* + * Copyright 2017 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.common.server.bo.stat.join; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import static org.junit.Assert.*; + +/** + * @author minwoo.jung + */ +public class JoinDataSourceListBoTest { + + @Test + public void joinDataSourceListBoListTest() { + final String id = "test_app"; + final long currentTime = System.currentTimeMillis(); + final List joinDataSourceListBoList = createJoinDataSourceListBoList(id, currentTime); + final JoinDataSourceListBo joinDataSourceListBo = JoinDataSourceListBo.joinDataSourceListBoList(joinDataSourceListBoList, currentTime); + + assertEquals(joinDataSourceListBo.getId(), id); + assertEquals(joinDataSourceListBo.getTimestamp(), currentTime); + List joinDataSourceBoList = joinDataSourceListBo.getJoinDataSourceBoList(); + Collections.sort(joinDataSourceBoList, new ComparatorImpl()); + + assertEquals(joinDataSourceBoList.size(), 5); + + JoinDataSourceBo joinDataSourceBo1 = joinDataSourceBoList.get(0); + assertEquals(joinDataSourceBo1.getServiceTypeCode(), 1000); + assertEquals(joinDataSourceBo1.getUrl(), "jdbc:mysql"); + assertEquals(joinDataSourceBo1.getAvgActiveConnectionSize(), 60); + assertEquals(joinDataSourceBo1.getMinActiveConnectionSize(), 35); + assertEquals(joinDataSourceBo1.getMinActiveConnectionAgentId(), "agent_id_1_10"); + assertEquals(joinDataSourceBo1.getMaxActiveConnectionSize(), 110); + assertEquals(joinDataSourceBo1.getMaxActiveConnectionAgentId(), "agent_id_6_50"); + + JoinDataSourceBo joinDataSourceBo2 = joinDataSourceBoList.get(1); + assertEquals(joinDataSourceBo2.getServiceTypeCode(), 2000); + assertEquals(joinDataSourceBo2.getUrl(), "jdbc:mssql"); + assertEquals(joinDataSourceBo2.getAvgActiveConnectionSize(), 50); + assertEquals(joinDataSourceBo2.getMinActiveConnectionSize(), 15); + assertEquals(joinDataSourceBo2.getMinActiveConnectionAgentId(), "agent_id_2_10"); + assertEquals(joinDataSourceBo2.getMaxActiveConnectionSize(), 80); + assertEquals(joinDataSourceBo2.getMaxActiveConnectionAgentId(), "agent_id_7_50"); + + JoinDataSourceBo joinDataSourceBo3 = joinDataSourceBoList.get(2); + assertEquals(joinDataSourceBo3.getServiceTypeCode(), 3000); + assertEquals(joinDataSourceBo3.getUrl(), "jdbc:postgre"); + assertEquals(joinDataSourceBo3.getAvgActiveConnectionSize(), 40); + assertEquals(joinDataSourceBo3.getMinActiveConnectionSize(), 35); + assertEquals(joinDataSourceBo3.getMinActiveConnectionAgentId(), "agent_id_3_10"); + assertEquals(joinDataSourceBo3.getMaxActiveConnectionSize(), 100); + assertEquals(joinDataSourceBo3.getMaxActiveConnectionAgentId(), "agent_id_8_50"); + + JoinDataSourceBo joinDataSourceBo4 = joinDataSourceBoList.get(3); + assertEquals(joinDataSourceBo4.getServiceTypeCode(), 4000); + assertEquals(joinDataSourceBo4.getUrl(), "jdbc:oracle"); + assertEquals(joinDataSourceBo4.getAvgActiveConnectionSize(), 70); + assertEquals(joinDataSourceBo4.getMinActiveConnectionSize(), 20); + assertEquals(joinDataSourceBo4.getMinActiveConnectionAgentId(), "agent_id_4_10"); + assertEquals(joinDataSourceBo4.getMaxActiveConnectionSize(), 120); + assertEquals(joinDataSourceBo4.getMaxActiveConnectionAgentId(), "agent_id_9_50"); + + + JoinDataSourceBo joinDataSourceBo5 = joinDataSourceBoList.get(4); + assertEquals(joinDataSourceBo5.getServiceTypeCode(), 5000); + assertEquals(joinDataSourceBo5.getUrl(), "jdbc:cubrid"); + assertEquals(joinDataSourceBo5.getAvgActiveConnectionSize(), 80); + assertEquals(joinDataSourceBo5.getMinActiveConnectionSize(), 35); + assertEquals(joinDataSourceBo5.getMinActiveConnectionAgentId(), "agent_id_5_10"); + assertEquals(joinDataSourceBo5.getMaxActiveConnectionSize(), 130); + assertEquals(joinDataSourceBo5.getMaxActiveConnectionAgentId(), "agent_id_10_50"); + } + + @Test + public void joinDataSourceListBoList2Test() { + final String id = "test_app"; + final long currentTime = System.currentTimeMillis(); + final List joinDataSourceListBoList = new ArrayList(0); + final JoinDataSourceListBo joinDataSourceListBo = JoinDataSourceListBo.joinDataSourceListBoList(joinDataSourceListBoList, currentTime); + assertEquals(joinDataSourceListBo, JoinDataSourceListBo.EMPTY_JOIN_DATA_SOURCE_LIST_BO); + } + + private class ComparatorImpl implements Comparator { + @Override + public int compare(JoinDataSourceBo bo1, JoinDataSourceBo bo2) { + return bo1.getServiceTypeCode() < bo2.getServiceTypeCode() ? -1 : 1; + } + } + + private List createJoinDataSourceListBoList(String id, long currentTime) { + + List joinDataSourceListBoList = new ArrayList(); + + JoinDataSourceListBo joinDataSourceListBo1 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(10), currentTime); + JoinDataSourceListBo joinDataSourceListBo2 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(20), currentTime); + JoinDataSourceListBo joinDataSourceListBo3 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(30), currentTime); + JoinDataSourceListBo joinDataSourceListBo4 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(40), currentTime); + JoinDataSourceListBo joinDataSourceListBo5 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(50), currentTime); + + joinDataSourceListBoList.add(joinDataSourceListBo1); + joinDataSourceListBoList.add(joinDataSourceListBo2); + joinDataSourceListBoList.add(joinDataSourceListBo3); + joinDataSourceListBoList.add(joinDataSourceListBo4); + joinDataSourceListBoList.add(joinDataSourceListBo5); + + return joinDataSourceListBoList; + } + + private List createJoinDataSourceBoList(int plus) { + List joinDataSourceBoList = new ArrayList(); + + JoinDataSourceBo joinDataSourceBo1 = new JoinDataSourceBo((short)1000, "jdbc:mysql", 30 + plus, 25 + plus, "agent_id_1_" + plus, 60 + plus, "agent_id_6_" + plus); + JoinDataSourceBo joinDataSourceBo2 = new JoinDataSourceBo((short)2000, "jdbc:mssql", 20 + plus, 5 + plus, "agent_id_2_" + plus, 30 + plus, "agent_id_7_" + plus); + JoinDataSourceBo joinDataSourceBo3 = new JoinDataSourceBo((short)3000, "jdbc:postgre", 10 + plus, 25 + plus, "agent_id_3_" + plus, 50 + plus, "agent_id_8_" + plus); + JoinDataSourceBo joinDataSourceBo4 = new JoinDataSourceBo((short)4000, "jdbc:oracle", 40 + plus, 10 + plus, "agent_id_4_" + plus, 70 + plus, "agent_id_9_" + plus); + JoinDataSourceBo joinDataSourceBo5 = new JoinDataSourceBo((short)5000, "jdbc:cubrid", 50 + plus, 25 + plus, "agent_id_5_" + plus, 80 + plus, "agent_id_10_" + plus); + + joinDataSourceBoList.add(joinDataSourceBo1); + joinDataSourceBoList.add(joinDataSourceBo2); + joinDataSourceBoList.add(joinDataSourceBo3); + joinDataSourceBoList.add(joinDataSourceBo4); + joinDataSourceBoList.add(joinDataSourceBo5); + + return joinDataSourceBoList; + } + + +} \ No newline at end of file diff --git a/flink/src/main/java/com/navercorp/pinpoint/flink/Bootstrap.java b/flink/src/main/java/com/navercorp/pinpoint/flink/Bootstrap.java index 4b205222ea17..f0627920283b 100644 --- a/flink/src/main/java/com/navercorp/pinpoint/flink/Bootstrap.java +++ b/flink/src/main/java/com/navercorp/pinpoint/flink/Bootstrap.java @@ -53,6 +53,7 @@ public class Bootstrap { private final TransactionDao transactionDao; private final ActiveTraceDao activeTraceDao; private final ResponseTimeDao responseTimeDao; + private final DataSourceDao dataSourceDao; private Bootstrap() { String[] SPRING_CONFIG_XML = new String[]{"applicationContext-flink.xml", "applicationContext-cache.xml"}; @@ -62,14 +63,14 @@ private Bootstrap() { flinkConfiguration = applicationContext.getBean("flinkConfiguration", FlinkConfiguration.class); tcpDispatchHandler = applicationContext.getBean("tcpDispatchHandler", TcpDispatchHandler.class); tcpSourceFunction = applicationContext.getBean("tcpSourceFunction", TcpSourceFunction.class); - statisticsDao = applicationContext.getBean("statisticsDao", StatisticsDao.class); applicationCache = applicationContext.getBean("applicationCache", ApplicationCache.class); + statisticsDao = applicationContext.getBean("statisticsDao", StatisticsDao.class); cpuLoadDao = applicationContext.getBean("cpuLoadDao", CpuLoadDao.class); memoryDao = applicationContext.getBean("memoryDao", MemoryDao.class); transactionDao = applicationContext.getBean("transactionDao", TransactionDao.class); activeTraceDao = applicationContext.getBean("activeTraceDao", ActiveTraceDao.class); responseTimeDao = applicationContext.getBean("responseTimeDao", ResponseTimeDao.class); - + dataSourceDao = applicationContext.getBean("dataSourceDao", DataSourceDao.class); } public static Bootstrap getInstance() { @@ -104,6 +105,10 @@ public ResponseTimeDao getResponseTimeDao() { return responseTimeDao; } + public DataSourceDao getDataSourceDao() { + return dataSourceDao; + } + public TbaseFlatMapper getTbaseFlatMapper() { return tbaseFlatMapper; } diff --git a/flink/src/main/java/com/navercorp/pinpoint/flink/dao/hbase/DataSourceDao.java b/flink/src/main/java/com/navercorp/pinpoint/flink/dao/hbase/DataSourceDao.java new file mode 100644 index 000000000000..e1d0040d0c36 --- /dev/null +++ b/flink/src/main/java/com/navercorp/pinpoint/flink/dao/hbase/DataSourceDao.java @@ -0,0 +1,63 @@ +/* + * Copyright 2017 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.flink.dao.hbase; + +import com.navercorp.pinpoint.common.hbase.HBaseTables; +import com.navercorp.pinpoint.common.hbase.HbaseTemplate2; +import com.navercorp.pinpoint.common.server.bo.serializer.stat.ApplicationStatHbaseOperationFactory; +import com.navercorp.pinpoint.common.server.bo.serializer.stat.join.DataSourceSerializer; +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinStatBo; +import com.navercorp.pinpoint.common.server.bo.stat.join.StatType; +import org.apache.commons.collections.CollectionUtils; +import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.client.Put; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @author minwoo.jung + */ +public class DataSourceDao { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private final HbaseTemplate2 hbaseTemplate2; + private final ApplicationStatHbaseOperationFactory applicationStatHbaseOperationFactory; + private final DataSourceSerializer dataSourceSerializer; + private final TableName APPLICATION_STAT_AGGRE = HBaseTables.APPLICATION_STAT_AGGRE; + + public DataSourceDao(HbaseTemplate2 hbaseTemplate2, ApplicationStatHbaseOperationFactory applicationStatHbaseOperationFactory, DataSourceSerializer dataSourceSerializer) { + this.hbaseTemplate2 = Objects.requireNonNull(hbaseTemplate2, "hbaseTemplate2 must not be null"); + this.applicationStatHbaseOperationFactory = Objects.requireNonNull(applicationStatHbaseOperationFactory, "applicationStatHbaseOperationFactory must not be null"); + this.dataSourceSerializer = Objects.requireNonNull(dataSourceSerializer, "dataSourceSerializer must not be null"); + } + + public void insert(String id, long timestamp, List joinResponseTimeBoList, StatType statType) { + if (logger.isInfoEnabled()) { + logger.info("[insert] {} : ({})", new Date(timestamp), joinResponseTimeBoList); + } + List responseTimePuts = applicationStatHbaseOperationFactory.createPuts(id, joinResponseTimeBoList, statType, dataSourceSerializer); + if (!responseTimePuts.isEmpty()) { + List rejectedPuts = hbaseTemplate2.asyncPut(APPLICATION_STAT_AGGRE, responseTimePuts); + if (CollectionUtils.isNotEmpty(rejectedPuts)) { + hbaseTemplate2.put(APPLICATION_STAT_AGGRE, rejectedPuts); + } + } + } +} diff --git a/flink/src/main/java/com/navercorp/pinpoint/flink/dao/hbase/StatisticsDao.java b/flink/src/main/java/com/navercorp/pinpoint/flink/dao/hbase/StatisticsDao.java index a9a266a4771d..376cb83d1307 100644 --- a/flink/src/main/java/com/navercorp/pinpoint/flink/dao/hbase/StatisticsDao.java +++ b/flink/src/main/java/com/navercorp/pinpoint/flink/dao/hbase/StatisticsDao.java @@ -43,6 +43,8 @@ public class StatisticsDao implements OutputFormat statData) throws IOException { JoinStatBo joinStatBo = (JoinStatBo)statData.f1; if (joinStatBo instanceof JoinAgentStatBo) { - logger.info("JoinAgentStatBo insert data : {}", joinStatBo); + if (logger.isInfoEnabled()) { + logger.info("JoinAgentStatBo insert data : {}", joinStatBo); + } + insertJoinAgentStatBo((JoinAgentStatBo)joinStatBo); } else if (joinStatBo instanceof JoinApplicationStatBo) { // logger.info("JoinApplicationStatBo insert data : " + joinStatBo); @@ -81,6 +87,7 @@ private void insertJoinApplicationStatBo(JoinApplicationStatBo joinApplicationSt List joinTransactionBoList = castJoinStatBoList(joinApplicationStatBo.getJoinTransactionBoList()); List joinActiveTraceBoList = castJoinStatBoList(joinApplicationStatBo.getJoinActiveTraceBoList()); List joinResponseTimeBoList = castJoinStatBoList(joinApplicationStatBo.getJoinResponseTimeBoList()); + List joinDataSourceBoList = castJoinStatBoList(joinApplicationStatBo.getJoinDataSourceListBoList()); if (joinApplicationStatBo.getStatType() == StatType.APP_STST_AGGRE) { // logger.info("insert application aggre : " + new Date(joinApplicationStatBo.getTimestamp()) + " ("+ joinApplicationStatBo.getApplicationId() + " )"); @@ -92,6 +99,7 @@ private void insertJoinApplicationStatBo(JoinApplicationStatBo joinApplicationSt transactionDao.insert(id, timestamp, joinTransactionBoList, StatType.APP_TRANSACTION_COUNT); activeTraceDao.insert(id, timestamp, joinActiveTraceBoList, StatType.APP_ACTIVE_TRACE_COUNT); responseTimeDao.insert(id, timestamp, joinResponseTimeBoList, StatType.APP_RESPONSE_TIME); + dataSourceDao.insert(id, timestamp, joinDataSourceBoList, StatType.APP_DATA_SOURCE); } } diff --git a/flink/src/main/java/com/navercorp/pinpoint/flink/mapper/thrift/stat/JoinAgentStatBoMapper.java b/flink/src/main/java/com/navercorp/pinpoint/flink/mapper/thrift/stat/JoinAgentStatBoMapper.java index 8f3182e34f80..9bb25f52fcd7 100644 --- a/flink/src/main/java/com/navercorp/pinpoint/flink/mapper/thrift/stat/JoinAgentStatBoMapper.java +++ b/flink/src/main/java/com/navercorp/pinpoint/flink/mapper/thrift/stat/JoinAgentStatBoMapper.java @@ -35,6 +35,7 @@ public class JoinAgentStatBoMapper implements ThriftBoMapper joinTransactionBoList = new ArrayList<>(agentStatSize); List joinActiveTraceBoList = new ArrayList<>(agentStatSize); List joinResponseTimeBoList = new ArrayList<>(agentStatSize); + List joinDataSourceListBoList = new ArrayList<>(agentStatSize); for (TFAgentStat tFAgentStat : tFAgentStatBatch.getAgentStats()) { createAndAddJoinCpuLoadBo(tFAgentStat, joinCpuLoadBoList); @@ -60,6 +62,7 @@ public JoinAgentStatBo map(TFAgentStatBatch tFAgentStatBatch) { createAndAddJoinTransactionBo(tFAgentStat, joinTransactionBoList); createAndAddJoinActiveTraceBo(tFAgentStat, joinActiveTraceBoList); createAndAddJoinResponseTimeBo(tFAgentStat, joinResponseTimeBoList); + createAndAddJoinDataSourceListBo(tFAgentStat, joinDataSourceListBoList); } joinAgentStatBo.setJoinCpuLoadBoList(joinCpuLoadBoList); @@ -67,12 +70,23 @@ public JoinAgentStatBo map(TFAgentStatBatch tFAgentStatBatch) { joinAgentStatBo.setJoinTransactionBoList(joinTransactionBoList); joinAgentStatBo.setJoinActiveTraceBoList(joinActiveTraceBoList); joinAgentStatBo.setJoinResponseTimeBoList(joinResponseTimeBoList); + joinAgentStatBo.setJoinDataSourceListBoList(joinDataSourceListBoList); joinAgentStatBo.setId(tFAgentStatBatch.getAgentId()); joinAgentStatBo.setAgentStartTimestamp(tFAgentStatBatch.getStartTimestamp()); joinAgentStatBo.setTimestamp(getTimeStamp(joinAgentStatBo)); return joinAgentStatBo; } + private void createAndAddJoinDataSourceListBo(TFAgentStat tFAgentStat, List joinDataSourceListBoList) { + JoinDataSourceListBo joinDataSourceListBo = joinDataSourceListBoMapper.map(tFAgentStat); + + if (joinDataSourceListBo == JoinDataSourceListBo.EMPTY_JOIN_DATA_SOURCE_LIST_BO) { + return; + } + + joinDataSourceListBoList.add(joinDataSourceListBo); + } + private void createAndAddJoinResponseTimeBo(TFAgentStat tFAgentStat, List joinResponseTimeBoList) { JoinResponseTimeBo joinResponseTimeBo = joinResponseTimeBoMapper.map(tFAgentStat); @@ -134,6 +148,12 @@ private long getTimeStamp(JoinAgentStatBo joinAgentStatBo) { return joinResponseTimeBoList.get(0).getTimestamp(); } + List joinDataSourceListBoList = joinAgentStatBo.getJoinDataSourceListBoList(); + + if (joinDataSourceListBoList.size() != 0) { + return joinDataSourceListBoList.get(0).getTimestamp(); + } + return Long.MIN_VALUE; } diff --git a/flink/src/main/java/com/navercorp/pinpoint/flink/mapper/thrift/stat/JoinDataSourceListBoMapper.java b/flink/src/main/java/com/navercorp/pinpoint/flink/mapper/thrift/stat/JoinDataSourceListBoMapper.java new file mode 100644 index 000000000000..f2d1e90d725d --- /dev/null +++ b/flink/src/main/java/com/navercorp/pinpoint/flink/mapper/thrift/stat/JoinDataSourceListBoMapper.java @@ -0,0 +1,71 @@ +/* + * Copyright 2017 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.flink.mapper.thrift.stat; + +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceBo; +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceListBo; +import com.navercorp.pinpoint.flink.mapper.thrift.ThriftBoMapper; +import com.navercorp.pinpoint.thrift.dto.flink.TFAgentStat; +import com.navercorp.pinpoint.thrift.dto.flink.TFDataSource; +import com.navercorp.pinpoint.thrift.dto.flink.TFDataSourceList; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author minwoo.jung + */ +public class JoinDataSourceListBoMapper implements ThriftBoMapper { + @Override + public JoinDataSourceListBo map(TFAgentStat tFAgentStat) { + if (!tFAgentStat.isSetDataSourceList()) { + return JoinDataSourceListBo.EMPTY_JOIN_DATA_SOURCE_LIST_BO; + } + + TFDataSourceList dataSourceList = tFAgentStat.getDataSourceList(); + if (!dataSourceList.isSetDataSourceList()) { + return JoinDataSourceListBo.EMPTY_JOIN_DATA_SOURCE_LIST_BO; + } + + List tFDataSourceList = dataSourceList.getDataSourceList(); + if (tFDataSourceList.size() == 0) { + return JoinDataSourceListBo.EMPTY_JOIN_DATA_SOURCE_LIST_BO; + } + + + final String agentId = tFAgentStat.getAgentId(); + JoinDataSourceListBo joinDataSourceListBo = new JoinDataSourceListBo(); + joinDataSourceListBo.setId(agentId); + joinDataSourceListBo.setTimestamp(tFAgentStat.getTimestamp()); + + List joinDataSourceBoList = new ArrayList<>(); + for (TFDataSource tFDataSource : tFDataSourceList) { + JoinDataSourceBo joinDataSourceBo = new JoinDataSourceBo(); + joinDataSourceBo.setServiceTypeCode(tFDataSource.getServiceTypeCode()); + joinDataSourceBo.setUrl(tFDataSource.getUrl()); + joinDataSourceBo.setAvgActiveConnectionSize(tFDataSource.getActiveConnectionSize()); + joinDataSourceBo.setMinActiveConnectionSize(tFDataSource.getActiveConnectionSize()); + joinDataSourceBo.setMinActiveConnectionAgentId(tFAgentStat.getAgentId()); + joinDataSourceBo.setMaxActiveConnectionSize(tFDataSource.getActiveConnectionSize()); + joinDataSourceBo.setMaxActiveConnectionAgentId(tFAgentStat.getAgentId()); + joinDataSourceBoList.add(joinDataSourceBo); + } + joinDataSourceListBo.setJoinDataSourceBoList(joinDataSourceBoList); + + return joinDataSourceListBo; + + } +} diff --git a/flink/src/main/resources/applicationContext-flink.xml b/flink/src/main/resources/applicationContext-flink.xml index 0fd26437a663..626a856584c5 100644 --- a/flink/src/main/resources/applicationContext-flink.xml +++ b/flink/src/main/resources/applicationContext-flink.xml @@ -73,6 +73,9 @@ + + + @@ -109,6 +112,12 @@ + + + + + + diff --git a/flink/src/test/java/com/navercorp/pinpoint/flink/mapper/thrift/stat/JoinDataSourceListBoMapperTest.java b/flink/src/test/java/com/navercorp/pinpoint/flink/mapper/thrift/stat/JoinDataSourceListBoMapperTest.java new file mode 100644 index 000000000000..ce305cb35e23 --- /dev/null +++ b/flink/src/test/java/com/navercorp/pinpoint/flink/mapper/thrift/stat/JoinDataSourceListBoMapperTest.java @@ -0,0 +1,108 @@ +/* + * Copyright 2017 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.flink.mapper.thrift.stat; + +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceBo; +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceListBo; +import com.navercorp.pinpoint.common.util.Assert; +import com.navercorp.pinpoint.thrift.dto.flink.TFAgentStat; +import com.navercorp.pinpoint.thrift.dto.flink.TFDataSource; +import com.navercorp.pinpoint.thrift.dto.flink.TFDataSourceList; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.*; + +/** + * @author minwoo.jung + */ +public class JoinDataSourceListBoMapperTest { + + @Test + public void mapTest() { + JoinDataSourceListBoMapper mapper = new JoinDataSourceListBoMapper(); + TFAgentStat tFAgentStat = new TFAgentStat(); + tFAgentStat.setAgentId("testAgent"); + tFAgentStat.setTimestamp(1491274138454L); + TFDataSourceList tFDataSourceList = new TFDataSourceList(); + + List dataSourceList = new ArrayList<>(); + TFDataSource tFDataSource1 = new TFDataSource(); + tFDataSource1.setUrl("jdbc:mysql"); + tFDataSource1.setMaxConnectionSize(30); + tFDataSource1.setActiveConnectionSize(13); + tFDataSource1.setDatabaseName("pinpoint"); + tFDataSource1.setServiceTypeCode((short) 1000); + TFDataSource tFDataSource2 = new TFDataSource(); + tFDataSource2.setUrl("jdbc:mssql"); + tFDataSource2.setMaxConnectionSize(31); + tFDataSource2.setActiveConnectionSize(23); + tFDataSource2.setDatabaseName("pinpoint"); + tFDataSource2.setServiceTypeCode((short) 2000); + dataSourceList.add(tFDataSource1); + dataSourceList.add(tFDataSource2); + + tFDataSourceList.setDataSourceList(dataSourceList); + tFAgentStat.setDataSourceList(tFDataSourceList); + JoinDataSourceListBo joinDataSourceListBo = mapper.map(tFAgentStat); + + assertEquals(joinDataSourceListBo.getId(), "testAgent"); + assertEquals(joinDataSourceListBo.getTimestamp(), 1491274138454L); + assertEquals(joinDataSourceListBo.getJoinDataSourceBoList().size(), 2); + + List joinDataSourceBoList = joinDataSourceListBo.getJoinDataSourceBoList(); + JoinDataSourceBo joinDataSourceBo1 = joinDataSourceBoList.get(0); + assertEquals(joinDataSourceBo1.getServiceTypeCode(), 1000); + assertEquals(joinDataSourceBo1.getUrl(), "jdbc:mysql"); + assertEquals(joinDataSourceBo1.getAvgActiveConnectionSize(), 13); + assertEquals(joinDataSourceBo1.getMinActiveConnectionSize(), 13); + assertEquals(joinDataSourceBo1.getMinActiveConnectionAgentId(), "testAgent"); + assertEquals(joinDataSourceBo1.getMaxActiveConnectionSize(), 13); + assertEquals(joinDataSourceBo1.getMaxActiveConnectionAgentId(), "testAgent"); + JoinDataSourceBo joinDataSourceBo2 = joinDataSourceBoList.get(1); + assertEquals(joinDataSourceBo2.getServiceTypeCode(), 2000); + assertEquals(joinDataSourceBo2.getUrl(), "jdbc:mssql"); + assertEquals(joinDataSourceBo2.getAvgActiveConnectionSize(), 23); + assertEquals(joinDataSourceBo2.getMinActiveConnectionSize(), 23); + assertEquals(joinDataSourceBo2.getMinActiveConnectionAgentId(), "testAgent"); + assertEquals(joinDataSourceBo2.getMaxActiveConnectionSize(), 23); + assertEquals(joinDataSourceBo2.getMaxActiveConnectionAgentId(), "testAgent"); + } + + + @Test + public void map2Test() { + JoinDataSourceListBoMapper mapper = new JoinDataSourceListBoMapper(); + TFAgentStat tFAgentStat = new TFAgentStat(); + tFAgentStat.setAgentId("testAgent"); + tFAgentStat.setTimestamp(1491274138454L); + JoinDataSourceListBo joinDataSourceListBo = mapper.map(tFAgentStat); + assertEquals(joinDataSourceListBo, JoinDataSourceListBo.EMPTY_JOIN_DATA_SOURCE_LIST_BO); + + TFDataSourceList tFDataSourceList = new TFDataSourceList(); + tFAgentStat.setDataSourceList(tFDataSourceList); + joinDataSourceListBo = mapper.map(tFAgentStat); + assertEquals(joinDataSourceListBo, JoinDataSourceListBo.EMPTY_JOIN_DATA_SOURCE_LIST_BO); + + List dataSourceList = new ArrayList<>(); + tFDataSourceList.setDataSourceList(dataSourceList); + joinDataSourceListBo = mapper.map(tFAgentStat); + assertEquals(joinDataSourceListBo, JoinDataSourceListBo.EMPTY_JOIN_DATA_SOURCE_LIST_BO); + } +} \ No newline at end of file diff --git a/web/src/main/java/com/navercorp/pinpoint/web/controller/ApplicationStatController.java b/web/src/main/java/com/navercorp/pinpoint/web/controller/ApplicationStatController.java index a0d8494b5450..54a7f90c96e8 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/controller/ApplicationStatController.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/controller/ApplicationStatController.java @@ -15,12 +15,8 @@ */ package com.navercorp.pinpoint.web.controller; -import com.navercorp.pinpoint.web.service.ApplicationCpuLoadService; +import com.navercorp.pinpoint.web.service.stat.*; import com.navercorp.pinpoint.web.service.ApplicationStatChartService; -import com.navercorp.pinpoint.web.service.stat.ApplicationActiveTraceService; -import com.navercorp.pinpoint.web.service.stat.ApplicationMemoryService; -import com.navercorp.pinpoint.web.service.stat.ApplicationResponseTimeService; -import com.navercorp.pinpoint.web.service.stat.ApplicationTransactionService; import com.navercorp.pinpoint.web.util.TimeWindow; import com.navercorp.pinpoint.web.util.TimeWindowSlotCentricSampler; import com.navercorp.pinpoint.web.vo.Range; @@ -34,6 +30,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import java.util.List; + /** * @author minwoo.jung */ @@ -103,5 +101,31 @@ public ApplicationResponseTimeController(ApplicationResponseTimeService applicat super(applicationResponseTimeService); } } + + @Controller + @RequestMapping("/getApplicationStat/dataSource/chart") + public static class ApplicationDataSourceController { + + private final Logger logger = LoggerFactory.getLogger(ApplicationDataSourceController.this.getClass()); + private ApplicationDataSourceService applicationDataSourceService; + + @Autowired + public ApplicationDataSourceController(ApplicationDataSourceService applicationDataSourceService) { + ApplicationDataSourceController.this.applicationDataSourceService = applicationDataSourceService; + } + + @RequestMapping(method = RequestMethod.GET) + @ResponseBody + public List getAgentStatChart(@RequestParam("applicationId") String applicationId, @RequestParam("from") long from, @RequestParam("to") long to) { + TimeWindowSlotCentricSampler sampler = new TimeWindowSlotCentricSampler(); + TimeWindow timeWindow = new TimeWindow(new Range(from, to), sampler); + try { + return this.applicationDataSourceService.selectApplicationChart(applicationId, timeWindow); + } catch (Exception e ) { + logger.error("error" , e); + throw e; + } + } + } } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/dao/ApplicationDataSourceDao.java b/web/src/main/java/com/navercorp/pinpoint/web/dao/ApplicationDataSourceDao.java new file mode 100644 index 000000000000..85b392e64215 --- /dev/null +++ b/web/src/main/java/com/navercorp/pinpoint/web/dao/ApplicationDataSourceDao.java @@ -0,0 +1,29 @@ +/* + * Copyright 2017 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.dao; + +import com.navercorp.pinpoint.web.util.TimeWindow; +import com.navercorp.pinpoint.web.vo.stat.AggreJoinDataSourceListBo; + +import java.util.List; + +/** + * @author minwoo.jung + */ +public interface ApplicationDataSourceDao { + + List getApplicationStatList(String applicationId, TimeWindow timeWindow); +} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/dao/hbase/HbaseApplicationDataSourceDao.java b/web/src/main/java/com/navercorp/pinpoint/web/dao/hbase/HbaseApplicationDataSourceDao.java new file mode 100644 index 000000000000..3a0e053441d3 --- /dev/null +++ b/web/src/main/java/com/navercorp/pinpoint/web/dao/hbase/HbaseApplicationDataSourceDao.java @@ -0,0 +1,69 @@ +/* + * Copyright 2017 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.dao.hbase; + +import com.navercorp.pinpoint.common.server.bo.codec.stat.join.DataSourceDecoder; +import com.navercorp.pinpoint.common.server.bo.stat.join.StatType; +import com.navercorp.pinpoint.web.dao.ApplicationDataSourceDao; +import com.navercorp.pinpoint.web.mapper.stat.ApplicationStatMapper; +import com.navercorp.pinpoint.web.mapper.stat.SampledApplicationStatResultExtractor; +import com.navercorp.pinpoint.web.mapper.stat.sampling.sampler.JoinDataSourceSampler; +import com.navercorp.pinpoint.web.util.TimeWindow; +import com.navercorp.pinpoint.web.vo.Range; +import com.navercorp.pinpoint.web.vo.stat.AggreJoinDataSourceListBo; +import com.navercorp.pinpoint.web.vo.stat.AggregationStatData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author minwoo.jung + */ +@Repository +public class HbaseApplicationDataSourceDao implements ApplicationDataSourceDao { + + @Autowired + private DataSourceDecoder dataSourceDecoder; + + @Autowired + private JoinDataSourceSampler dataSourceSampler; + + @Autowired + private HbaseApplicationStatDaoOperations operations; + + @Override + public List getApplicationStatList(String applicationId, TimeWindow timeWindow) { + long scanFrom = timeWindow.getWindowRange().getFrom(); + long scanTo = timeWindow.getWindowRange().getTo() + timeWindow.getWindowSlotSize(); + Range range = new Range(scanFrom, scanTo); + ApplicationStatMapper mapper = operations.createRowMapper(dataSourceDecoder, range); + SampledApplicationStatResultExtractor resultExtractor = new SampledApplicationStatResultExtractor(timeWindow, mapper, dataSourceSampler); + List aggregationStatDataList = operations.getSampledStatList(StatType.APP_DATA_SOURCE, resultExtractor, applicationId, range); + return cast(aggregationStatDataList); + } + + private List cast(List aggregationStatDataList) { + List aggreJoinDataSourceListBoList = new ArrayList<>(aggregationStatDataList.size()); + + for (AggregationStatData aggregationStatData : aggregationStatDataList) { + aggreJoinDataSourceListBoList.add((AggreJoinDataSourceListBo) aggregationStatData); + } + + return aggreJoinDataSourceListBoList; + } +} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/mapper/stat/sampling/sampler/JoinDataSourceSampler.java b/web/src/main/java/com/navercorp/pinpoint/web/mapper/stat/sampling/sampler/JoinDataSourceSampler.java new file mode 100644 index 000000000000..b997a0151fed --- /dev/null +++ b/web/src/main/java/com/navercorp/pinpoint/web/mapper/stat/sampling/sampler/JoinDataSourceSampler.java @@ -0,0 +1,53 @@ +/* + * Copyright 2017 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.mapper.stat.sampling.sampler; + +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinCpuLoadBo; +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceBo; +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceListBo; +import com.navercorp.pinpoint.web.vo.stat.AggreJoinDataSourceBo; +import com.navercorp.pinpoint.web.vo.stat.AggreJoinDataSourceListBo; +import com.navercorp.pinpoint.web.vo.stat.AggregationStatData; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author minwoo.jung + */ +@Component +public class JoinDataSourceSampler implements ApplicationStatSampler { + + @Override + public AggreJoinDataSourceListBo sampleDataPoints(int index, long timestamp, List joinDataSourceListBoList, JoinDataSourceListBo previousJoinDataSourceListBo) { + if (joinDataSourceListBoList.size() == 0) { + return AggreJoinDataSourceListBo.createUncollectedObject(timestamp); + } + + JoinDataSourceListBo joinDataSourceListBo = JoinDataSourceListBo.joinDataSourceListBoList(joinDataSourceListBoList, timestamp); + String id = joinDataSourceListBo.getId(); + List joinDataSourceBoList = joinDataSourceListBo.getJoinDataSourceBoList(); + List aggreJoinDataSourceBoList = new ArrayList<>(joinDataSourceBoList.size()); + + for (JoinDataSourceBo joinDataSourceBo : joinDataSourceBoList) { + aggreJoinDataSourceBoList.add(new AggreJoinDataSourceBo(joinDataSourceBo.getServiceTypeCode(), joinDataSourceBo.getUrl(), joinDataSourceBo.getAvgActiveConnectionSize(), joinDataSourceBo.getMinActiveConnectionSize(), joinDataSourceBo.getMinActiveConnectionAgentId(), joinDataSourceBo.getMaxActiveConnectionSize(), joinDataSourceBo.getMaxActiveConnectionAgentId(), timestamp)); + } + + AggreJoinDataSourceListBo aggreJoinDataSourceListBo = new AggreJoinDataSourceListBo(id, aggreJoinDataSourceBoList, timestamp); + return aggreJoinDataSourceListBo; + } +} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/service/ApplicationCpuLoadService.java b/web/src/main/java/com/navercorp/pinpoint/web/service/stat/ApplicationCpuLoadService.java similarity index 91% rename from web/src/main/java/com/navercorp/pinpoint/web/service/ApplicationCpuLoadService.java rename to web/src/main/java/com/navercorp/pinpoint/web/service/stat/ApplicationCpuLoadService.java index f456264f052b..3728fef0f51d 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/service/ApplicationCpuLoadService.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/service/stat/ApplicationCpuLoadService.java @@ -5,7 +5,7 @@ * 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 + * 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, @@ -13,9 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.navercorp.pinpoint.web.service; +package com.navercorp.pinpoint.web.service.stat; import com.navercorp.pinpoint.web.dao.ApplicationCpuLoadDao; +import com.navercorp.pinpoint.web.service.ApplicationStatChartService; import com.navercorp.pinpoint.web.util.TimeWindow; import com.navercorp.pinpoint.web.vo.stat.AggreJoinCpuLoadBo; import com.navercorp.pinpoint.web.vo.stat.chart.ApplicationCpuLoadChartGroup; diff --git a/web/src/main/java/com/navercorp/pinpoint/web/service/stat/ApplicationDataSourceService.java b/web/src/main/java/com/navercorp/pinpoint/web/service/stat/ApplicationDataSourceService.java new file mode 100644 index 000000000000..da7eddf74a30 --- /dev/null +++ b/web/src/main/java/com/navercorp/pinpoint/web/service/stat/ApplicationDataSourceService.java @@ -0,0 +1,98 @@ +/* + * Copyright 2017 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.service.stat; + +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceListBo.DataSourceKey; +import com.navercorp.pinpoint.common.service.ServiceTypeRegistryService; +import com.navercorp.pinpoint.web.dao.ApplicationDataSourceDao; +import com.navercorp.pinpoint.web.util.TimeWindow; +import com.navercorp.pinpoint.web.vo.stat.AggreJoinDataSourceBo; +import com.navercorp.pinpoint.web.vo.stat.AggreJoinDataSourceListBo; +import com.navercorp.pinpoint.web.vo.stat.chart.ApplicationDataSourceChartGroup; +import com.navercorp.pinpoint.web.vo.stat.chart.ApplicationStatChartGroup; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * @author minwoo.jung + */ +@Service +public class ApplicationDataSourceService { + + @Autowired + private ApplicationDataSourceDao applicationDataSourceDao; + + @Autowired + private ServiceTypeRegistryService serviceTypeRegistryService; + + private static final AggreJoinDataSourceBoComparator comparator = new AggreJoinDataSourceBoComparator(); + + public List selectApplicationChart(String applicationId, TimeWindow timeWindow) { + if (applicationId == null) { + throw new NullPointerException("applicationId must not be null"); + } + if (timeWindow == null) { + throw new NullPointerException("timeWindow must not be null"); + } + + List aggreJoinDataSourceListBoList = this.applicationDataSourceDao.getApplicationStatList(applicationId, timeWindow); + Map> aggreJoinDataSourceBoMap = classifyByDataSourceUrl(aggreJoinDataSourceListBoList); + List result = new ArrayList(); + + for (Map.Entry> entry: aggreJoinDataSourceBoMap.entrySet()) { + DataSourceKey dataSourceKey = entry.getKey(); + String serviceTypeName = serviceTypeRegistryService.findServiceType((short) dataSourceKey.getServiceTypeCode()).getName(); + result.add(new ApplicationDataSourceChartGroup(timeWindow, dataSourceKey.getUrl(), serviceTypeName, entry.getValue())); + } + + return result; + } + + + protected Map> classifyByDataSourceUrl(List aggreJoinDataSourceListBoList) { + + Map> aggreJoinDataSourceBoMap = new HashMap<>(); + + for (AggreJoinDataSourceListBo aggreJoinDataSourceListBo : aggreJoinDataSourceListBoList) { + for (AggreJoinDataSourceBo aggreJoinDataSourceBo : aggreJoinDataSourceListBo.getAggreJoinDataSourceBoList()) { + DataSourceKey dataSourceKey = new DataSourceKey(aggreJoinDataSourceBo.getUrl(), aggreJoinDataSourceBo.getServiceTypeCode()); + List aggreJoinDataSourceBoList = aggreJoinDataSourceBoMap.get(dataSourceKey); + + if (aggreJoinDataSourceBoList == null) { + aggreJoinDataSourceBoList = new ArrayList(); + aggreJoinDataSourceBoMap.put(dataSourceKey, aggreJoinDataSourceBoList); + } + + aggreJoinDataSourceBoList.add(aggreJoinDataSourceBo); + } + } + + for(List aggreJoinDataSourceBoList : aggreJoinDataSourceBoMap.values()) { + Collections.sort(aggreJoinDataSourceBoList, comparator); + } + + return aggreJoinDataSourceBoMap; + } + + private static class AggreJoinDataSourceBoComparator implements Comparator { + @Override + public int compare(AggreJoinDataSourceBo bo1, AggreJoinDataSourceBo bo2) { + return bo1.getTimestamp() < bo2.getTimestamp() ? -1 : 1; + } + } +} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/AggreJoinDataSourceBo.java b/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/AggreJoinDataSourceBo.java new file mode 100644 index 000000000000..4de6c42949d1 --- /dev/null +++ b/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/AggreJoinDataSourceBo.java @@ -0,0 +1,39 @@ +/* + * Copyright 2017 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.vo.stat; + +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceBo; + +import java.util.List; + +/** + * @author minwoo.jung + */ +public class AggreJoinDataSourceBo extends JoinDataSourceBo implements AggregationStatData { + + private long timestamp = Long.MIN_VALUE; + + + public AggreJoinDataSourceBo(short serviceTypeCode, String url, int avgActiveConnectionSize, int minActiveConnectionSize, String minActiveConnectionAgentId, int maxActiveConnectionSize, String maxActiveConnectionAgentId ,long timestamp) { + super(serviceTypeCode, url, avgActiveConnectionSize, minActiveConnectionSize, minActiveConnectionAgentId, maxActiveConnectionSize, maxActiveConnectionAgentId); + this.timestamp = timestamp; + } + + @Override + public long getTimestamp() { + return timestamp; + } +} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/AggreJoinDataSourceListBo.java b/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/AggreJoinDataSourceListBo.java new file mode 100644 index 000000000000..e64f5652edb3 --- /dev/null +++ b/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/AggreJoinDataSourceListBo.java @@ -0,0 +1,56 @@ +/* + * Copyright 2017 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.vo.stat; + +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceBo; +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceListBo; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author minwoo.jung + */ +public class AggreJoinDataSourceListBo extends JoinDataSourceListBo implements AggregationStatData { + + + public AggreJoinDataSourceListBo() { + } + + public AggreJoinDataSourceListBo(String id, List aggreJoinDataSourceBoList, long timestamp) { + super(id, aggreJoinDataSourceBoList, timestamp); + } + + public static AggreJoinDataSourceListBo createUncollectedObject(long timestamp) { + AggreJoinDataSourceListBo aggreJoinDataSourceListBo = new AggreJoinDataSourceListBo(); + aggreJoinDataSourceListBo.setTimestamp(timestamp); + return aggreJoinDataSourceListBo; + } + + public List getAggreJoinDataSourceBoList() { + return castAggreJoinDataSourceBo(getJoinDataSourceBoList()); + } + + private List castAggreJoinDataSourceBo(List joinDataSourceBoList) { + List aggreJoinDataSourceListBoList = new ArrayList<>(joinDataSourceBoList.size()); + + for (JoinDataSourceBo joinDataSourceBo : joinDataSourceBoList) { + aggreJoinDataSourceListBoList.add((AggreJoinDataSourceBo)joinDataSourceBo); + } + + return aggreJoinDataSourceListBoList; + } +} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationCpuLoadChartGroup.java b/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationCpuLoadChartGroup.java index 729dd2cee2a3..5a9eee3db983 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationCpuLoadChartGroup.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationCpuLoadChartGroup.java @@ -30,7 +30,7 @@ */ public class ApplicationCpuLoadChartGroup implements ApplicationStatChartGroup { - private static final UncollectedCpuLoadPointCreater UNCOLLECTED_CPULOADPOINT = new UncollectedCpuLoadPointCreater(); + private static final UncollectedCpuLoadPointCreater UNCOLLECTED_CPULOAD_POINT = new UncollectedCpuLoadPointCreater(); private final Map cpuLoadChartMap; @@ -49,8 +49,8 @@ public ApplicationCpuLoadChartGroup(TimeWindow timeWindow, List dataSourceChartMap; + + public enum DataSourceChartType implements ChartType { + ACTIVE_CONNECTION_SIZE + } + + public ApplicationDataSourceChartGroup(TimeWindow timeWindow, String url, String serviceTypeCodeName, List aggreJoinDataSourceBoList) { + this.url = url; + this.serviceTypeCodeName = serviceTypeCodeName; + this.dataSourceChartMap = new HashMap<>(); + List activeConnectionCountList = new ArrayList<>(aggreJoinDataSourceBoList.size()); + + for (AggreJoinDataSourceBo aggreJoinDataSourceBo : aggreJoinDataSourceBoList) { + activeConnectionCountList.add(new DataSourcePoint(aggreJoinDataSourceBo.getTimestamp(), aggreJoinDataSourceBo.getMinActiveConnectionSize(), aggreJoinDataSourceBo.getMinActiveConnectionAgentId(), aggreJoinDataSourceBo.getMaxActiveConnectionSize(), aggreJoinDataSourceBo.getMaxActiveConnectionAgentId(), aggreJoinDataSourceBo.getAvgActiveConnectionSize())); + } + + dataSourceChartMap.put(DataSourceChartType.ACTIVE_CONNECTION_SIZE, new TimeSeriesChartBuilder(timeWindow, UNCOLLECTED_DATASOURCE_POINT).build(activeConnectionCountList)); + } + + public String getJdbcUrl() { + return url; + } + + public String getServiceTypeCodeName() { + return serviceTypeCodeName; + } + + @Override + public Map getCharts() { + return dataSourceChartMap; + } +} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationMemoryChartGroup.java b/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationMemoryChartGroup.java index 10a9af326652..3e110aa18d97 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationMemoryChartGroup.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationMemoryChartGroup.java @@ -29,7 +29,7 @@ */ public class ApplicationMemoryChartGroup implements ApplicationStatChartGroup { - public static final UncollectedMemoryPointCreater UNCOLLECTED_MEMORYPOINT = new UncollectedMemoryPointCreater(); + public static final UncollectedMemoryPointCreater UNCOLLECTED_MEMORY_POINT = new UncollectedMemoryPointCreater(); private final Map memoryChartMap; public enum MemoryChartType implements ChartType { @@ -47,8 +47,8 @@ public ApplicationMemoryChartGroup(TimeWindow timeWindow, List responseTimeChartMap; @@ -45,7 +45,7 @@ public ApplicationResponseTimeChartGroup(TimeWindow timeWindow, List joinDataSourceBoList = aggreJoinDataSourceListBo.getAggreJoinDataSourceBoList(); + Collections.sort(joinDataSourceBoList, new ComparatorImpl()); + + assertEquals(joinDataSourceBoList.size(), 5); + + AggreJoinDataSourceBo aggreJoinDataSourceBo1 = joinDataSourceBoList.get(0); + assertEquals(aggreJoinDataSourceBo1.getServiceTypeCode(), 1000); + assertEquals(aggreJoinDataSourceBo1.getUrl(), "jdbc:mysql"); + assertEquals(aggreJoinDataSourceBo1.getAvgActiveConnectionSize(), 60); + assertEquals(aggreJoinDataSourceBo1.getMinActiveConnectionSize(), 35); + assertEquals(aggreJoinDataSourceBo1.getMinActiveConnectionAgentId(), "agent_id_1_10"); + assertEquals(aggreJoinDataSourceBo1.getMaxActiveConnectionSize(), 110); + assertEquals(aggreJoinDataSourceBo1.getMaxActiveConnectionAgentId(), "agent_id_6_50"); + + AggreJoinDataSourceBo aggreJoinDataSourceBo2 = joinDataSourceBoList.get(1); + assertEquals(aggreJoinDataSourceBo2.getServiceTypeCode(), 2000); + assertEquals(aggreJoinDataSourceBo2.getUrl(), "jdbc:mssql"); + assertEquals(aggreJoinDataSourceBo2.getAvgActiveConnectionSize(), 50); + assertEquals(aggreJoinDataSourceBo2.getMinActiveConnectionSize(), 15); + assertEquals(aggreJoinDataSourceBo2.getMinActiveConnectionAgentId(), "agent_id_2_10"); + assertEquals(aggreJoinDataSourceBo2.getMaxActiveConnectionSize(), 80); + assertEquals(aggreJoinDataSourceBo2.getMaxActiveConnectionAgentId(), "agent_id_7_50"); + + AggreJoinDataSourceBo aggreJoinDataSourceBo3 = joinDataSourceBoList.get(2); + assertEquals(aggreJoinDataSourceBo3.getServiceTypeCode(), 3000); + assertEquals(aggreJoinDataSourceBo3.getUrl(), "jdbc:postgre"); + assertEquals(aggreJoinDataSourceBo3.getAvgActiveConnectionSize(), 40); + assertEquals(aggreJoinDataSourceBo3.getMinActiveConnectionSize(), 35); + assertEquals(aggreJoinDataSourceBo3.getMinActiveConnectionAgentId(), "agent_id_3_10"); + assertEquals(aggreJoinDataSourceBo3.getMaxActiveConnectionSize(), 100); + assertEquals(aggreJoinDataSourceBo3.getMaxActiveConnectionAgentId(), "agent_id_8_50"); + + AggreJoinDataSourceBo aggreJoinDataSourceBo4 = joinDataSourceBoList.get(3); + assertEquals(aggreJoinDataSourceBo4.getServiceTypeCode(), 4000); + assertEquals(aggreJoinDataSourceBo4.getUrl(), "jdbc:oracle"); + assertEquals(aggreJoinDataSourceBo4.getAvgActiveConnectionSize(), 70); + assertEquals(aggreJoinDataSourceBo4.getMinActiveConnectionSize(), 20); + assertEquals(aggreJoinDataSourceBo4.getMinActiveConnectionAgentId(), "agent_id_4_10"); + assertEquals(aggreJoinDataSourceBo4.getMaxActiveConnectionSize(), 120); + assertEquals(aggreJoinDataSourceBo4.getMaxActiveConnectionAgentId(), "agent_id_9_50"); + + AggreJoinDataSourceBo aggreJoinDataSourceBo5 = joinDataSourceBoList.get(4); + assertEquals(aggreJoinDataSourceBo5.getServiceTypeCode(), 5000); + assertEquals(aggreJoinDataSourceBo5.getUrl(), "jdbc:cubrid"); + assertEquals(aggreJoinDataSourceBo5.getAvgActiveConnectionSize(), 80); + assertEquals(aggreJoinDataSourceBo5.getMinActiveConnectionSize(), 35); + assertEquals(aggreJoinDataSourceBo5.getMinActiveConnectionAgentId(), "agent_id_5_10"); + assertEquals(aggreJoinDataSourceBo5.getMaxActiveConnectionSize(), 130); + assertEquals(aggreJoinDataSourceBo5.getMaxActiveConnectionAgentId(), "agent_id_10_50"); + } + + private class ComparatorImpl implements Comparator { + @Override + public int compare(JoinDataSourceBo bo1, JoinDataSourceBo bo2) { + return bo1.getServiceTypeCode() < bo2.getServiceTypeCode() ? -1 : 1; + } + } + + private List createJoinDataSourceListBoList(String id, long currentTime) { + List joinDataSourceListBoList = new ArrayList(); + + JoinDataSourceListBo joinDataSourceListBo1 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(10), currentTime + 5000); + JoinDataSourceListBo joinDataSourceListBo2 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(20), currentTime + 10000); + JoinDataSourceListBo joinDataSourceListBo3 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(30), currentTime + 15000); + JoinDataSourceListBo joinDataSourceListBo4 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(40), currentTime + 20000); + JoinDataSourceListBo joinDataSourceListBo5 = new JoinDataSourceListBo(id, createJoinDataSourceBoList(50), currentTime + 25000); + + joinDataSourceListBoList.add(joinDataSourceListBo1); + joinDataSourceListBoList.add(joinDataSourceListBo2); + joinDataSourceListBoList.add(joinDataSourceListBo3); + joinDataSourceListBoList.add(joinDataSourceListBo4); + joinDataSourceListBoList.add(joinDataSourceListBo5); + + return joinDataSourceListBoList; + } + + private List createJoinDataSourceBoList(int plus) { + List joinDataSourceBoList = new ArrayList(); + + JoinDataSourceBo joinDataSourceBo1 = new JoinDataSourceBo((short) 1000, "jdbc:mysql", 30 + plus, 25 + plus, "agent_id_1_" + plus, 60 + plus, "agent_id_6_" + plus); + JoinDataSourceBo joinDataSourceBo2 = new JoinDataSourceBo((short) 2000, "jdbc:mssql", 20 + plus, 5 + plus, "agent_id_2_" + plus, 30 + plus, "agent_id_7_" + plus); + JoinDataSourceBo joinDataSourceBo3 = new JoinDataSourceBo((short) 3000, "jdbc:postgre", 10 + plus, 25 + plus, "agent_id_3_" + plus, 50 + plus, "agent_id_8_" + plus); + JoinDataSourceBo joinDataSourceBo4 = new JoinDataSourceBo((short) 4000, "jdbc:oracle", 40 + plus, 10 + plus, "agent_id_4_" + plus, 70 + plus, "agent_id_9_" + plus); + JoinDataSourceBo joinDataSourceBo5 = new JoinDataSourceBo((short) 5000, "jdbc:cubrid", 50 + plus, 25 + plus, "agent_id_5_" + plus, 80 + plus, "agent_id_10_" + plus); + + joinDataSourceBoList.add(joinDataSourceBo1); + joinDataSourceBoList.add(joinDataSourceBo2); + joinDataSourceBoList.add(joinDataSourceBo3); + joinDataSourceBoList.add(joinDataSourceBo4); + joinDataSourceBoList.add(joinDataSourceBo5); + + return joinDataSourceBoList; + } +} \ No newline at end of file diff --git a/web/src/test/java/com/navercorp/pinpoint/web/service/stat/ApplicationDataSourceServiceTest.java b/web/src/test/java/com/navercorp/pinpoint/web/service/stat/ApplicationDataSourceServiceTest.java new file mode 100644 index 000000000000..8e8e8a2d952b --- /dev/null +++ b/web/src/test/java/com/navercorp/pinpoint/web/service/stat/ApplicationDataSourceServiceTest.java @@ -0,0 +1,82 @@ +/* + * Copyright 2017 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.service.stat; + +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceBo; +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceListBo; +import com.navercorp.pinpoint.web.mapper.TimestampFilter; +import com.navercorp.pinpoint.web.vo.stat.AggreJoinDataSourceBo; +import com.navercorp.pinpoint.web.vo.stat.AggreJoinDataSourceListBo; +import org.junit.Test; + +import java.security.Timestamp; +import java.util.*; + +import static org.junit.Assert.*; + +/** + * @author minwoo.jung + */ +public class ApplicationDataSourceServiceTest { + @Test + public void classifyByDataSourceUrlTest() throws Exception { + final String id = "test_app"; + long timestamp = new Date().getTime(); + ApplicationDataSourceService applicationDataSourceService = new ApplicationDataSourceService(); + + Map> dataSourceKeyListMap = applicationDataSourceService.classifyByDataSourceUrl(createJoinDataSourceListBoList(id, timestamp)); + + assertEquals(dataSourceKeyListMap.size(), 5); + } + + private List createJoinDataSourceListBoList(String id, long currentTime) { + List aggreJoinDataSourceListBoList = new ArrayList(); + + AggreJoinDataSourceListBo aggreJoinDataSourceListBo1 = new AggreJoinDataSourceListBo(id, createJoinDataSourceBoList(10, currentTime + 5000), currentTime + 5000); + AggreJoinDataSourceListBo aggreJoinDataSourceListBo2 = new AggreJoinDataSourceListBo(id, createJoinDataSourceBoList(20, currentTime + 10000), currentTime + 10000); + AggreJoinDataSourceListBo aggreJoinDataSourceListBo3 = new AggreJoinDataSourceListBo(id, createJoinDataSourceBoList(30, currentTime + 15000), currentTime + 15000); + AggreJoinDataSourceListBo aggreJoinDataSourceListBo4 = new AggreJoinDataSourceListBo(id, createJoinDataSourceBoList(40, currentTime + 20000), currentTime + 20000); + AggreJoinDataSourceListBo aggreJoinDataSourceListBo5 = new AggreJoinDataSourceListBo(id, createJoinDataSourceBoList(50, currentTime + 25000), currentTime + 25000); + + aggreJoinDataSourceListBoList.add(aggreJoinDataSourceListBo1); + aggreJoinDataSourceListBoList.add(aggreJoinDataSourceListBo2); + aggreJoinDataSourceListBoList.add(aggreJoinDataSourceListBo3); + aggreJoinDataSourceListBoList.add(aggreJoinDataSourceListBo4); + aggreJoinDataSourceListBoList.add(aggreJoinDataSourceListBo5); + + return aggreJoinDataSourceListBoList; + } + + private List createJoinDataSourceBoList(int plus, long timestamp) { + List joinDataSourceBoList = new ArrayList(); + + AggreJoinDataSourceBo joinDataSourceBo1 = new AggreJoinDataSourceBo((short) 1000, "jdbc:mysql", 30 + plus, 25 + plus, "agent_id_1_" + plus, 60 + plus, "agent_id_6_" + plus, timestamp); + AggreJoinDataSourceBo joinDataSourceBo2 = new AggreJoinDataSourceBo((short) 2000, "jdbc:mssql", 20 + plus, 5 + plus, "agent_id_2_" + plus, 30 + plus, "agent_id_7_" + plus, timestamp); + AggreJoinDataSourceBo joinDataSourceBo3 = new AggreJoinDataSourceBo((short) 3000, "jdbc:postgre", 10 + plus, 25 + plus, "agent_id_3_" + plus, 50 + plus, "agent_id_8_" + plus, timestamp); + AggreJoinDataSourceBo joinDataSourceBo4 = new AggreJoinDataSourceBo((short) 4000, "jdbc:oracle", 40 + plus, 10 + plus, "agent_id_4_" + plus, 70 + plus, "agent_id_9_" + plus, timestamp); + AggreJoinDataSourceBo joinDataSourceBo5 = new AggreJoinDataSourceBo((short) 5000, "jdbc:cubrid", 50 + plus, 25 + plus, "agent_id_5_" + plus, 80 + plus, "agent_id_10_" + plus, timestamp); + + joinDataSourceBoList.add(joinDataSourceBo1); + joinDataSourceBoList.add(joinDataSourceBo2); + joinDataSourceBoList.add(joinDataSourceBo3); + joinDataSourceBoList.add(joinDataSourceBo4); + joinDataSourceBoList.add(joinDataSourceBo5); + + return joinDataSourceBoList; + } + +} \ No newline at end of file diff --git a/web/src/test/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationCpuLoadChartGroupTest.java b/web/src/test/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationCpuLoadChartGroupTest.java index 48253f68c397..1cc46af43b83 100644 --- a/web/src/test/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationCpuLoadChartGroupTest.java +++ b/web/src/test/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationCpuLoadChartGroupTest.java @@ -72,6 +72,7 @@ public void createApplicationCpuLoadChartGroupTest() throws Exception { } private void testSysCpuLoad(CpuLoadPoint cpuLoadPoint, AggreJoinCpuLoadBo aggreJoinCpuLoadBo) { + assertEquals(cpuLoadPoint.getxVal(), aggreJoinCpuLoadBo.getTimestamp()); assertEquals(cpuLoadPoint.getyValForAvg(), aggreJoinCpuLoadBo.getSystemCpuLoad(), 0); assertEquals(cpuLoadPoint.getyValForMin(), aggreJoinCpuLoadBo.getMinSystemCpuLoad(), 0); assertEquals(cpuLoadPoint.getyValForMax(), aggreJoinCpuLoadBo.getMaxSystemCpuLoad(), 0); diff --git a/web/src/test/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationDataSourceChartGroupTest.java b/web/src/test/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationDataSourceChartGroupTest.java new file mode 100644 index 000000000000..bad10ea3ff71 --- /dev/null +++ b/web/src/test/java/com/navercorp/pinpoint/web/vo/stat/chart/ApplicationDataSourceChartGroupTest.java @@ -0,0 +1,78 @@ +/* + * Copyright 2017 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.vo.stat.chart; + +import com.navercorp.pinpoint.common.server.bo.stat.join.JoinDataSourceBo; +import com.navercorp.pinpoint.web.util.TimeWindow; +import com.navercorp.pinpoint.web.vo.Range; +import com.navercorp.pinpoint.web.vo.stat.AggreJoinDataSourceBo; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.*; + +/** + * @author minwoo.jung + */ +public class ApplicationDataSourceChartGroupTest { + + @Test + public void createApplicationDataSourceChartGroup() { + long time = 1495418083250L; + Range range = new Range(time - 240000, time); + TimeWindow timeWindow = new TimeWindow(range); + + List aggreJoinDataSourceBoList = new ArrayList<>(); + AggreJoinDataSourceBo aggreJoinDataSourceBo1 = new AggreJoinDataSourceBo((short)1000, "jdbc:mysql", 30, 25, "agent_id_1", 60, "agent_id_6", time); + AggreJoinDataSourceBo aggreJoinDataSourceBo2 = new AggreJoinDataSourceBo((short)1000, "jdbc:mysql", 20, 5, "agent_id_2", 30, "agent_id_7", time - 60000); + AggreJoinDataSourceBo aggreJoinDataSourceBo3 = new AggreJoinDataSourceBo((short)1000, "jdbc:mysql", 10, 25, "agent_id_3", 50, "agent_id_8", time - 120000); + AggreJoinDataSourceBo aggreJoinDataSourceBo4 = new AggreJoinDataSourceBo((short)1000, "jdbc:mysql", 40, 4, "agent_id_4", 70, "agent_id_9", time - 180000); + AggreJoinDataSourceBo aggreJoinDataSourceBo5 = new AggreJoinDataSourceBo((short)1000, "jdbc:mysql", 50, 25, "agent_id_5", 80, "agent_id_10", time - 240000); + aggreJoinDataSourceBoList.add(aggreJoinDataSourceBo1); + aggreJoinDataSourceBoList.add(aggreJoinDataSourceBo2); + aggreJoinDataSourceBoList.add(aggreJoinDataSourceBo3); + aggreJoinDataSourceBoList.add(aggreJoinDataSourceBo4); + aggreJoinDataSourceBoList.add(aggreJoinDataSourceBo5); + + ApplicationDataSourceChartGroup applicationDataSourceChartGroup = new ApplicationDataSourceChartGroup(timeWindow, "jdbc:mysql", "dbcp2", aggreJoinDataSourceBoList); + Map charts = applicationDataSourceChartGroup.getCharts(); + assertEquals(1, charts.size()); + + Chart dataSourceChart = charts.get(ApplicationDataSourceChartGroup.DataSourceChartType.ACTIVE_CONNECTION_SIZE); + List dataSourcePoints = dataSourceChart.getPoints(); + assertEquals(5, dataSourcePoints.size()); + int index = dataSourcePoints.size(); + + for (Point point : dataSourcePoints) { + testDataSource((DataSourcePoint)point, aggreJoinDataSourceBoList.get(--index)); + } + } + + private void testDataSource(DataSourcePoint dataSourcePoint, AggreJoinDataSourceBo aggreJoinDataSourceBo) { + assertEquals(dataSourcePoint.getxVal(), aggreJoinDataSourceBo.getTimestamp()); + assertEquals(dataSourcePoint.getyValForAvg(), aggreJoinDataSourceBo.getAvgActiveConnectionSize(), 0); + assertEquals(dataSourcePoint.getyValForMin(), aggreJoinDataSourceBo.getMinActiveConnectionSize(), 0); + assertEquals(dataSourcePoint.getyValForMax(), aggreJoinDataSourceBo.getMaxActiveConnectionSize(), 0); + assertEquals(dataSourcePoint.getAgentIdForMin(), aggreJoinDataSourceBo.getMinActiveConnectionAgentId()); + assertEquals(dataSourcePoint.getAgentIdForMax(), aggreJoinDataSourceBo.getMaxActiveConnectionAgentId()); + } + + +} \ No newline at end of file