From 47ba6e90c35f40e4f827c8727892e2426f5a7bc0 Mon Sep 17 00:00:00 2001 From: emeroad Date: Fri, 17 May 2024 17:20:33 +0900 Subject: [PATCH 1/2] [#11021] JsonFields optimization --- .../common/server/util/json/JsonFields.java | 95 ++++++++++++++----- .../server/util/json/JsonStringField.java | 26 ----- .../server/util/json/JsonFieldsTest.java | 35 ++++++- 3 files changed, 106 insertions(+), 50 deletions(-) delete mode 100644 commons-server/src/main/java/com/navercorp/pinpoint/common/server/util/json/JsonStringField.java diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/util/json/JsonFields.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/util/json/JsonFields.java index 7697629f98a1..612d9c1627a8 100644 --- a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/util/json/JsonFields.java +++ b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/util/json/JsonFields.java @@ -4,52 +4,67 @@ import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.google.common.collect.Iterators; import java.io.IOException; +import java.util.Arrays; +import java.util.Comparator; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Objects; +import java.util.RandomAccess; import java.util.function.Function; +import java.util.stream.Stream; @JsonSerialize(using = JsonFields.Serializer.class) -public class JsonFields implements Iterable>{ +public class JsonFields implements Iterable>, RandomAccess { - private final Map node; + private final JsonField[] fields; private final Function nameMapper; - JsonFields(Map node, Function nameMapper) { - this.node = Objects.requireNonNull(node, "node"); + JsonFields(JsonField[] fields, Function nameMapper) { + this.fields = Objects.requireNonNull(fields, "node"); this.nameMapper = Objects.requireNonNull(nameMapper, "nameMapper"); } - @Override - public String toString() { - return node.toString(); + public int size() { + return fields.length; + } + + public JsonField get(int index) { + Objects.checkIndex(index, fields.length); + return fields[index]; + } + + public boolean isEmpty() { + return fields.length == 0; } @Override - public Iterator> iterator() { - return Iterators.transform(node.entrySet().iterator(), this::toJsonField); + public Iterator> iterator() { + return stream().iterator(); } - private JsonField toJsonField(Map.Entry entry) { - K key = entry.getKey(); - String name = this.nameMapper.apply(key); - return new JsonStringField<>(name, entry.getValue()); + public Stream> stream() { + return Arrays.stream(fields); } + public Stream> nameStream() { + return stream() + .map(f -> JsonField.of(nameMapper.apply(f.name()), f.value())); + } + + public static class Serializer extends JsonSerializer> { @Override public void serialize(JsonFields fields, JsonGenerator gen, SerializerProvider serializers) throws IOException { final Function nameMapper = fields.nameMapper; gen.writeStartObject(); - for (Map.Entry entry : fields.node.entrySet()) { - String name = nameMapper.apply(entry.getKey()); + for (JsonField entry : fields.fields) { + String name = nameMapper.apply(entry.name()); gen.writeFieldName(name); - gen.writeObject(entry.getValue()); + gen.writeObject(entry.value()); } gen.writeEndObject(); } @@ -59,13 +74,24 @@ public static Builder newBuilder() { return new Builder<>(Object::toString); } - public static Builder newBuilder(Function keyMapper) { - return new Builder<>(keyMapper); + /** + * @param nameMapper nameMapper does not guarantee uniqueness. + */ + public static Builder newBuilder(Function nameMapper) { + return new Builder<>(nameMapper); + } + + @Override + public String toString() { + return Arrays.toString(fields); } public static class Builder { private final Map node; private final Function nameMapper; + // optional + private boolean throwIfDuplicateKeys = false; + private Comparator> comparator; Builder(Function nameMapper) { this.node = new LinkedHashMap<>(); @@ -74,18 +100,43 @@ public static class Builder { public Builder addField(K name, V value) { Objects.requireNonNull(name, "name"); - node.put(name, value); + final V duplicateKey = node.put(name, value); + if (throwIfDuplicateKeys) { + if (duplicateKey != null) { + throw new IllegalArgumentException("Duplicate key: " + name); + } + } return this; } public Builder addField(JsonField field) { Objects.requireNonNull(field, "field"); - node.put(field.name(), field.value()); + + this.addField(field.name(), field.value()); + return this; + } + + public Builder throwIfDuplicateKeys(boolean enable) { + this.throwIfDuplicateKeys = enable; + return this; + } + + public Builder comparator(Comparator> comparator) { + this.comparator = Objects.requireNonNull(comparator, "comparator"); return this; } public JsonFields build() { - return new JsonFields<>(node, nameMapper); + @SuppressWarnings("unchecked") + JsonField[] fields = new JsonField[node.size()]; + int index = 0; + for (Map.Entry entry : node.entrySet()) { + fields[index++] = JsonField.of(entry.getKey(), entry.getValue()); + } + if (comparator != null) { + Arrays.sort(fields, comparator); + } + return new JsonFields<>(fields, nameMapper); } } diff --git a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/util/json/JsonStringField.java b/commons-server/src/main/java/com/navercorp/pinpoint/common/server/util/json/JsonStringField.java deleted file mode 100644 index a30dcd74f7a4..000000000000 --- a/commons-server/src/main/java/com/navercorp/pinpoint/common/server/util/json/JsonStringField.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.navercorp.pinpoint.common.server.util.json; - -import java.util.Objects; - -public class JsonStringField implements JsonField { - private final String name; - private final V value; - - JsonStringField(String name, V value) { - this.name = Objects.requireNonNull(name, "name"); - this.value = value; - } - - public String name() { - return name; - } - - public V value() { - return value; - } - - @Override - public String toString() { - return name + ':' + value; - } -} diff --git a/commons-server/src/test/java/com/navercorp/pinpoint/common/server/util/json/JsonFieldsTest.java b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/util/json/JsonFieldsTest.java index 39f3576792c1..ad5056944cff 100644 --- a/commons-server/src/test/java/com/navercorp/pinpoint/common/server/util/json/JsonFieldsTest.java +++ b/commons-server/src/test/java/com/navercorp/pinpoint/common/server/util/json/JsonFieldsTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.Comparator; import java.util.LinkedHashMap; import java.util.Map; @@ -41,7 +42,7 @@ public String name() { } @Test - void testStringKey() throws Exception { + void stringKey() throws Exception { Map map = new LinkedHashMap<>(); map.put("key1", "value1"); @@ -87,7 +88,35 @@ void testIterator() { } @Test - public void jsonNodeFactory_sample() throws Exception { + void testSort() { + JsonFields.Builder builder = JsonFields.newBuilder(); + builder.comparator(Comparator.comparing(JsonField::name)); + + JsonFields fields = builder + .addField(3, 3) + .addField(2, 2) + .addField(1, 1) + .addField(0, 0) + .build(); + + for (int i = 0; i < fields.size(); i++) { + JsonField field = fields.get(i); + Assertions.assertEquals(i, field.name()); + } + } + + @Test + void throwIfDuplicateKeys() { + JsonFields.Builder builder = JsonFields.newBuilder(); + builder.throwIfDuplicateKeys(true); + + builder.addField("a", "1"); + + Assertions.assertThrows(IllegalArgumentException.class, () -> builder.addField("a", "2")); + } + + @Test + void jsonNodeFactory_sample() throws Exception { JsonNodeFactory factory = JsonNodeFactory.instance; ObjectNode jsonNodes = factory.objectNode(); jsonNodes.set("string", factory.pojoNode("value")); @@ -96,4 +125,6 @@ public void jsonNodeFactory_sample() throws Exception { String json = mapper.writeValueAsString(jsonNodes); logger.debug("json {}", json); } + + } \ No newline at end of file From 23dac92c830e96fd05f8688f533854e69dccb8ba Mon Sep 17 00:00:00 2001 From: emeroad Date: Fri, 17 May 2024 17:35:50 +0900 Subject: [PATCH 2/2] [#11021] Apply JsonFields --- .../histogram/AgentTimeHistogram.java | 24 ++++---- .../histogram/NodeHistogram.java | 9 +-- .../web/applicationmap/link/Link.java | 8 ++- .../web/view/AgentResponseTimeViewModel.java | 47 --------------- .../view/AgentResponseTimeViewModelList.java | 55 ------------------ ...ntResponseTimeViewModelListSerializer.java | 39 ------------- .../AgentResponseTimeViewModelSerializer.java | 33 ----------- .../ApplicationTimeHistogramViewModel.java | 21 ++----- .../pinpoint/web/view/LinkSerializer.java | 7 ++- .../view/NodeHistogramSummarySerializer.java | 16 ++++- .../pinpoint/web/view/NodeSerializer.java | 18 +++++- .../pinpoint/web/view/id/AgentNameView.java | 22 +++++++ .../histogram/AgentTimeHistogramTest.java | 27 +++------ .../service/FilteredMapServiceImplTest.java | 58 ++++++++++++------- 14 files changed, 126 insertions(+), 258 deletions(-) delete mode 100644 web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModel.java delete mode 100644 web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModelList.java delete mode 100644 web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModelListSerializer.java delete mode 100644 web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModelSerializer.java create mode 100644 web/src/main/java/com/navercorp/pinpoint/web/view/id/AgentNameView.java diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/histogram/AgentTimeHistogram.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/histogram/AgentTimeHistogram.java index 04bccf02afaf..6b9911f90817 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/histogram/AgentTimeHistogram.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/histogram/AgentTimeHistogram.java @@ -17,12 +17,14 @@ package com.navercorp.pinpoint.web.applicationmap.histogram; import com.google.common.collect.Ordering; +import com.navercorp.pinpoint.common.server.util.json.JsonField; +import com.navercorp.pinpoint.common.server.util.json.JsonFields; import com.navercorp.pinpoint.common.server.util.timewindow.TimeWindow; import com.navercorp.pinpoint.common.trace.ServiceType; import com.navercorp.pinpoint.web.applicationmap.rawdata.AgentHistogram; import com.navercorp.pinpoint.web.applicationmap.rawdata.AgentHistogramList; -import com.navercorp.pinpoint.web.view.AgentResponseTimeViewModel; import com.navercorp.pinpoint.web.view.TimeViewModel; +import com.navercorp.pinpoint.web.view.id.AgentNameView; import com.navercorp.pinpoint.web.vo.Application; import com.navercorp.pinpoint.web.vo.stat.SampledApdexScore; import com.navercorp.pinpoint.web.vo.stat.chart.agent.AgentStatPoint; @@ -48,8 +50,8 @@ public class AgentTimeHistogram { private static final Double DEFAULT_MAX_APDEX_SCORE = -2D; private static final String DEFAULT_AGENT_ID = "defaultAgentId"; - private static final Comparator AGENT_NAME_COMPARATOR - = Comparator.comparing(AgentResponseTimeViewModel::getAgentName); + private static final Comparator>> AGENT_NAME_COMPARATOR + = Comparator.comparing((jsonField) -> jsonField.name().agentName()); private static final Ordering histogramOrdering = Ordering.from(TimeHistogram.TIME_STAMP_ASC_COMPARATOR); @@ -66,17 +68,17 @@ public AgentTimeHistogram(Application application, AgentHistogramList agentHisto this.agentHistogramList = Objects.requireNonNull(agentHistogramList, "agentHistogramList"); } + public JsonFields> createViewModel(TimeHistogramFormat timeHistogramFormat) { - public List createViewModel(TimeHistogramFormat timeHistogramFormat) { - final List result = new ArrayList<>(); + JsonFields.Builder> builder = JsonFields.newBuilder(); + builder.comparator(AGENT_NAME_COMPARATOR); for (AgentHistogram agentHistogram : agentHistogramList.getAgentHistogramList()) { Application agentId = agentHistogram.getAgentId(); List timeList = histogramOrdering.sortedCopy(agentHistogram.getTimeHistogram()); - AgentResponseTimeViewModel model = createAgentResponseTimeViewModel(agentId, timeList, timeHistogramFormat); - result.add(model); + JsonField> model = createAgentResponseTimeViewModel(agentId, timeList, timeHistogramFormat); + builder.addField(model); } - result.sort(AGENT_NAME_COMPARATOR); - return result; + return builder.build(); } public Map> getTimeHistogramMap() { @@ -89,9 +91,9 @@ public Map> getTimeHistogramMap() { } - private AgentResponseTimeViewModel createAgentResponseTimeViewModel(Application agentName, List timeHistogramList, TimeHistogramFormat timeHistogramFormat) { + private JsonField> createAgentResponseTimeViewModel(Application agentName, List timeHistogramList, TimeHistogramFormat timeHistogramFormat) { List responseTimeViewModel = createResponseTimeViewModel(timeHistogramList, timeHistogramFormat); - return new AgentResponseTimeViewModel(agentName, responseTimeViewModel); + return JsonField.of(AgentNameView.of(agentName), responseTimeViewModel); } private List createResponseTimeViewModel(List timeHistogramList, TimeHistogramFormat timeHistogramFormat) { diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/histogram/NodeHistogram.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/histogram/NodeHistogram.java index c503a829d0ff..0f02b6121825 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/histogram/NodeHistogram.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/histogram/NodeHistogram.java @@ -17,8 +17,6 @@ package com.navercorp.pinpoint.web.applicationmap.histogram; import com.navercorp.pinpoint.common.server.util.time.Range; -import com.navercorp.pinpoint.web.view.AgentResponseTimeViewModelList; -import com.navercorp.pinpoint.web.view.TimeViewModel; import com.navercorp.pinpoint.web.view.histogram.HistogramView; import com.navercorp.pinpoint.web.vo.Application; import com.navercorp.pinpoint.web.vo.ResponseTime; @@ -118,12 +116,9 @@ public Map getAgentResponseStatisticsMap() { return map; } - public List getApplicationTimeHistogram(TimeHistogramFormat timeHistogramFormat) { - return applicationTimeHistogram.createViewModel(timeHistogramFormat); - } - public AgentResponseTimeViewModelList getAgentTimeHistogram(TimeHistogramFormat timeHistogramFormat) { - return new AgentResponseTimeViewModelList(agentTimeHistogram.createViewModel(timeHistogramFormat)); + public AgentTimeHistogram getAgentTimeHistogram() { + return agentTimeHistogram; } public List createAgentHistogramViewList() { diff --git a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/link/Link.java b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/link/Link.java index 4fd2e315720e..ab65b9dee950 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/link/Link.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/link/Link.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.navercorp.pinpoint.common.server.util.json.JsonFields; import com.navercorp.pinpoint.common.server.util.time.Range; import com.navercorp.pinpoint.common.trace.ServiceType; import com.navercorp.pinpoint.web.applicationmap.histogram.AgentTimeHistogram; @@ -30,9 +31,9 @@ import com.navercorp.pinpoint.web.applicationmap.rawdata.AgentHistogramList; import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkCallData; import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkCallDataMap; -import com.navercorp.pinpoint.web.view.AgentResponseTimeViewModelList; import com.navercorp.pinpoint.web.view.LinkSerializer; import com.navercorp.pinpoint.web.view.TimeViewModel; +import com.navercorp.pinpoint.web.view.id.AgentNameView; import com.navercorp.pinpoint.web.vo.Application; import java.util.Collection; @@ -213,11 +214,12 @@ public void addOutLink(LinkCallDataMap outLinkCallDataMap) { this.outLink.addLinkDataMap(outLinkCallDataMap); } - public AgentResponseTimeViewModelList getSourceAgentTimeSeriesHistogram() { + public JsonFields> getSourceAgentTimeSeriesHistogram() { // we need Target (to)'s time since time in link is RPC-based AgentTimeHistogramBuilder builder = new AgentTimeHistogramBuilder(toNode.getApplication(), range); AgentTimeHistogram applicationTimeSeriesHistogram = builder.buildSource(inLink); - return new AgentResponseTimeViewModelList(applicationTimeSeriesHistogram.createViewModel(timeHistogramFormat)); + + return applicationTimeSeriesHistogram.createViewModel(timeHistogramFormat); } public AgentTimeHistogram getTargetAgentTimeHistogram() { diff --git a/web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModel.java b/web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModel.java deleted file mode 100644 index ece06c2408df..000000000000 --- a/web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModel.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.web.view; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import com.navercorp.pinpoint.web.vo.Application; - -import java.util.List; -import java.util.Objects; - -/** - * @author emeroad - */ -@JsonSerialize(using=AgentResponseTimeViewModelSerializer.class) -public class AgentResponseTimeViewModel { - - private final Application agentName; - - private final List responseTimeViewModel; - - public AgentResponseTimeViewModel(Application agentName, List responseTimeViewModel) { - this.agentName = Objects.requireNonNull(agentName, "agentName"); - this.responseTimeViewModel = Objects.requireNonNull(responseTimeViewModel, "responseTimeViewModel"); - } - - public String getAgentName() { - return agentName.getName(); - } - - public List getResponseTimeViewModel() { - return responseTimeViewModel; - } -} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModelList.java b/web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModelList.java deleted file mode 100644 index 0806b86b4698..000000000000 --- a/web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModelList.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.web.view; - -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -import java.util.List; -import java.util.Objects; - -/** - * @author emeroad - */ -@JsonSerialize(using = AgentResponseTimeViewModelListSerializer.class) -public class AgentResponseTimeViewModelList { - - public static final String DEFAULT_FIELD_NAME = "agentTimeSeriesHistogram"; - - private String fieldName; - private final List agentResponseTimeViewModelList; - - public AgentResponseTimeViewModelList(List agentResponseTimeViewModelList) { - this(DEFAULT_FIELD_NAME, agentResponseTimeViewModelList); - } - - public AgentResponseTimeViewModelList(String fieldName, List agentResponseTimeViewModelList) { - this.fieldName = Objects.requireNonNull(fieldName, "fieldName"); - this.agentResponseTimeViewModelList = Objects.requireNonNull(agentResponseTimeViewModelList, "agentResponseTimeViewModelList"); - } - - public void setFieldName(String fieldName) { - this.fieldName = fieldName; - } - - public String getFieldName() { - return fieldName; - } - - public List getAgentResponseTimeViewModelList() { - return agentResponseTimeViewModelList; - } -} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModelListSerializer.java b/web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModelListSerializer.java deleted file mode 100644 index cd4693a562e5..000000000000 --- a/web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModelListSerializer.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.web.view; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; - -import java.io.IOException; - -/** - * @author emeroad - */ -public class AgentResponseTimeViewModelListSerializer extends JsonSerializer { - - @Override - public void serialize(AgentResponseTimeViewModelList viewModelList, JsonGenerator jgen, SerializerProvider provider) throws IOException { - jgen.writeFieldName(viewModelList.getFieldName()); - jgen.writeStartObject(); - for (AgentResponseTimeViewModel agentResponseTimeViewModel : viewModelList.getAgentResponseTimeViewModelList()) { - jgen.writeObject(agentResponseTimeViewModel); - } - jgen.writeEndObject(); - } -} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModelSerializer.java b/web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModelSerializer.java deleted file mode 100644 index 01bf2b0e5b34..000000000000 --- a/web/src/main/java/com/navercorp/pinpoint/web/view/AgentResponseTimeViewModelSerializer.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2014 NAVER Corp. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.navercorp.pinpoint.web.view; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; - -import java.io.IOException; -/** - * @author emeroad - */ -public class AgentResponseTimeViewModelSerializer extends JsonSerializer { - @Override - public void serialize(AgentResponseTimeViewModel value, JsonGenerator jgen, SerializerProvider provider) throws IOException { - jgen.writeFieldName(value.getAgentName()); - jgen.writeObject(value.getResponseTimeViewModel()); - } -} diff --git a/web/src/main/java/com/navercorp/pinpoint/web/view/ApplicationTimeHistogramViewModel.java b/web/src/main/java/com/navercorp/pinpoint/web/view/ApplicationTimeHistogramViewModel.java index 79e9bbdcdadd..3bdad9dfab5a 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/view/ApplicationTimeHistogramViewModel.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/view/ApplicationTimeHistogramViewModel.java @@ -21,6 +21,7 @@ import com.navercorp.pinpoint.web.applicationmap.histogram.TimeHistogramFormat; import com.navercorp.pinpoint.web.applicationmap.rawdata.AgentHistogram; import com.navercorp.pinpoint.web.applicationmap.rawdata.AgentHistogramList; +import com.navercorp.pinpoint.web.view.id.AgentNameView; import com.navercorp.pinpoint.web.vo.Application; import java.util.List; @@ -48,10 +49,10 @@ public ApplicationTimeHistogramViewModel(TimeHistogramFormat format, Application /** * @return JsonFields(String:AgentId, Histogram) */ - public JsonFields getSummary() { - JsonFields.Builder builder = JsonFields.newBuilder(); + public JsonFields getSummary() { + JsonFields.Builder builder = JsonFields.newBuilder(); for (AgentHistogram agentHistogram : agentHistogramList.getAgentHistogramList()) { - String agentName = agentHistogram.getAgentId().getName(); + AgentNameView agentName = AgentNameView.of(agentHistogram.getAgentId()); Histogram histogram = agentHistogram.getHistogram(); builder.addField(agentName, histogram); } @@ -61,19 +62,7 @@ public JsonFields getSummary() { /** * @return JsonFields(String:AgentId, value:List) */ - public JsonFields> getTimeSeries() { - List timeSeriesViewModel = getTimeSeriesViewModel(); - - JsonFields.Builder> builder = JsonFields.newBuilder(); - for (AgentResponseTimeViewModel model : timeSeriesViewModel) { - String agentName = model.getAgentName(); - List responseTimeViewModel = model.getResponseTimeViewModel(); - builder.addField(agentName, responseTimeViewModel); - } - return builder.build(); - } - - private List getTimeSeriesViewModel() { + public JsonFields> getTimeSeries() { AgentTimeHistogram histogram = new AgentTimeHistogram(application, agentHistogramList); return histogram.createViewModel(format); } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/view/LinkSerializer.java b/web/src/main/java/com/navercorp/pinpoint/web/view/LinkSerializer.java index 97f24f3d53d6..07b32ed0ca59 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/view/LinkSerializer.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/view/LinkSerializer.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; +import com.navercorp.pinpoint.common.server.util.json.JsonFields; import com.navercorp.pinpoint.web.applicationmap.histogram.Histogram; import com.navercorp.pinpoint.web.applicationmap.link.Link; import com.navercorp.pinpoint.web.applicationmap.link.LinkViews; @@ -26,6 +27,7 @@ import com.navercorp.pinpoint.web.applicationmap.nodes.ServerGroupList; import com.navercorp.pinpoint.web.applicationmap.rawdata.AgentHistogram; import com.navercorp.pinpoint.web.applicationmap.rawdata.AgentHistogramList; +import com.navercorp.pinpoint.web.view.id.AgentNameView; import com.navercorp.pinpoint.web.vo.Application; import com.navercorp.pinpoint.web.vo.ResponseTimeStatics; @@ -172,8 +174,9 @@ private void writeAgentHistogram(String fieldName, AgentHistogramList agentHisto } private void writeSourceAgentTimeSeriesHistogram(Link link, JsonGenerator jgen) throws IOException { - AgentResponseTimeViewModelList sourceAgentTimeSeriesHistogram = link.getSourceAgentTimeSeriesHistogram(); - sourceAgentTimeSeriesHistogram.setFieldName("sourceTimeSeriesHistogram"); + JsonFields> sourceAgentTimeSeriesHistogram = link.getSourceAgentTimeSeriesHistogram(); +// sourceAgentTimeSeriesHistogram.setFieldName("sourceTimeSeriesHistogram"); + jgen.writeFieldName("sourceTimeSeriesHistogram"); jgen.writeObject(sourceAgentTimeSeriesHistogram); } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/view/NodeHistogramSummarySerializer.java b/web/src/main/java/com/navercorp/pinpoint/web/view/NodeHistogramSummarySerializer.java index f34e7145d779..025e8327a257 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/view/NodeHistogramSummarySerializer.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/view/NodeHistogramSummarySerializer.java @@ -20,10 +20,15 @@ import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.navercorp.pinpoint.common.server.util.json.JacksonWriterUtils; +import com.navercorp.pinpoint.common.server.util.json.JsonFields; +import com.navercorp.pinpoint.web.applicationmap.histogram.AgentTimeHistogram; +import com.navercorp.pinpoint.web.applicationmap.histogram.ApplicationTimeHistogram; import com.navercorp.pinpoint.web.applicationmap.histogram.Histogram; import com.navercorp.pinpoint.web.applicationmap.histogram.NodeHistogram; +import com.navercorp.pinpoint.web.applicationmap.histogram.TimeHistogramFormat; import com.navercorp.pinpoint.web.applicationmap.nodes.NodeHistogramSummary; import com.navercorp.pinpoint.web.applicationmap.nodes.ServerGroupList; +import com.navercorp.pinpoint.web.view.id.AgentNameView; import com.navercorp.pinpoint.web.vo.ResponseTimeStatics; import java.io.IOException; @@ -68,15 +73,20 @@ private void writeHistogram(JsonGenerator jgen, NodeHistogramSummary nodeHistogr jgen.writeObjectField(ResponseTimeStatics.AGENT_RESPONSE_STATISTICS, nodeHistogram.getAgentResponseStatisticsMap()); } - List applicationTimeSeriesHistogram = nodeHistogram.getApplicationTimeHistogram(nodeHistogramSummary.getTimeHistogramFormat()); + final TimeHistogramFormat format = nodeHistogramSummary.getTimeHistogramFormat(); + + ApplicationTimeHistogram applicationTimeHistogram = nodeHistogram.getApplicationTimeHistogram(); + List applicationTimeSeriesHistogram = applicationTimeHistogram.createViewModel(format); if (applicationTimeSeriesHistogram == null) { JacksonWriterUtils.writeEmptyArray(jgen, "timeSeriesHistogram"); } else { jgen.writeObjectField("timeSeriesHistogram", applicationTimeSeriesHistogram); } - AgentResponseTimeViewModelList agentTimeSeriesHistogram = nodeHistogram.getAgentTimeHistogram(nodeHistogramSummary.getTimeHistogramFormat()); - jgen.writeObject(agentTimeSeriesHistogram); + AgentTimeHistogram agentTimeHistogram = nodeHistogram.getAgentTimeHistogram(); + JsonFields> agentFields = agentTimeHistogram.createViewModel(format); + jgen.writeFieldName(NodeSerializer.AGENT_TIME_SERIES_HISTOGRAM); + jgen.writeObject(agentFields); } } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/view/NodeSerializer.java b/web/src/main/java/com/navercorp/pinpoint/web/view/NodeSerializer.java index 2e80e2f17121..29bc180b5a1c 100644 --- a/web/src/main/java/com/navercorp/pinpoint/web/view/NodeSerializer.java +++ b/web/src/main/java/com/navercorp/pinpoint/web/view/NodeSerializer.java @@ -21,12 +21,17 @@ import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.util.NameTransformer; import com.navercorp.pinpoint.common.server.util.json.JacksonWriterUtils; +import com.navercorp.pinpoint.common.server.util.json.JsonFields; import com.navercorp.pinpoint.common.trace.ServiceType; +import com.navercorp.pinpoint.web.applicationmap.histogram.AgentTimeHistogram; +import com.navercorp.pinpoint.web.applicationmap.histogram.ApplicationTimeHistogram; import com.navercorp.pinpoint.web.applicationmap.histogram.Histogram; import com.navercorp.pinpoint.web.applicationmap.histogram.NodeHistogram; +import com.navercorp.pinpoint.web.applicationmap.histogram.TimeHistogramFormat; import com.navercorp.pinpoint.web.applicationmap.nodes.Node; import com.navercorp.pinpoint.web.applicationmap.nodes.NodeViews; import com.navercorp.pinpoint.web.applicationmap.nodes.ServerGroupList; +import com.navercorp.pinpoint.web.view.id.AgentNameView; import com.navercorp.pinpoint.web.vo.ResponseTimeStatics; import java.io.IOException; @@ -40,6 +45,8 @@ */ public class NodeSerializer extends JsonSerializer { + public static final String AGENT_TIME_SERIES_HISTOGRAM = "agentTimeSeriesHistogram"; + @Override public void serialize(Node node, JsonGenerator jgen, SerializerProvider provider) throws IOException { jgen.writeStartObject(); @@ -177,7 +184,10 @@ private void writeHistogram(Node node, JsonGenerator jgen, SerializerProvider pr if (!NodeViews.Simplified.inView(activeView)) { // FIXME isn't this all ServiceTypes that can be a node? if (serviceType.isWas() || serviceType.isUser() || serviceType.isTerminal() || serviceType.isUnknown() || serviceType.isQueue() || serviceType.isAlias()) { - List applicationTimeSeriesHistogram = nodeHistogram.getApplicationTimeHistogram(node.getTimeHistogramFormat()); + final TimeHistogramFormat format = node.getTimeHistogramFormat(); + + ApplicationTimeHistogram applicationTimeHistogram = nodeHistogram.getApplicationTimeHistogram(); + List applicationTimeSeriesHistogram = applicationTimeHistogram.createViewModel(format); if (applicationTimeSeriesHistogram == null) { JacksonWriterUtils.writeEmptyArray(jgen, "timeSeriesHistogram"); } else { @@ -185,8 +195,10 @@ private void writeHistogram(Node node, JsonGenerator jgen, SerializerProvider pr } if (NodeViews.Detailed.inView(activeView)) { - AgentResponseTimeViewModelList agentTimeSeriesHistogram = nodeHistogram.getAgentTimeHistogram(node.getTimeHistogramFormat()); - jgen.writeObject(agentTimeSeriesHistogram); + AgentTimeHistogram agentTimeHistogram = nodeHistogram.getAgentTimeHistogram(); + JsonFields> agentFields = agentTimeHistogram.createViewModel(format); + jgen.writeFieldName(AGENT_TIME_SERIES_HISTOGRAM); + jgen.writeObject(agentFields); } } } diff --git a/web/src/main/java/com/navercorp/pinpoint/web/view/id/AgentNameView.java b/web/src/main/java/com/navercorp/pinpoint/web/view/id/AgentNameView.java new file mode 100644 index 000000000000..0021f5c11c96 --- /dev/null +++ b/web/src/main/java/com/navercorp/pinpoint/web/view/id/AgentNameView.java @@ -0,0 +1,22 @@ +package com.navercorp.pinpoint.web.view.id; + +import com.navercorp.pinpoint.web.vo.Application; + +import java.util.Objects; + +public record AgentNameView(String agentName) { + + public static AgentNameView of(Application application) { + Objects.requireNonNull(application, "application"); + return new AgentNameView(application.getName()); + } + + public AgentNameView(String agentName) { + this.agentName = Objects.requireNonNull(agentName, "agentName"); + } + + @Override + public String toString() { + return agentName; + } +} diff --git a/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/histogram/AgentTimeHistogramTest.java b/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/histogram/AgentTimeHistogramTest.java index bd1dabb3209f..af13f7546ea2 100644 --- a/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/histogram/AgentTimeHistogramTest.java +++ b/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/histogram/AgentTimeHistogramTest.java @@ -16,18 +16,18 @@ package com.navercorp.pinpoint.web.applicationmap.histogram; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectMapper; import com.navercorp.pinpoint.common.server.util.json.Jackson; +import com.navercorp.pinpoint.common.server.util.json.JsonFields; import com.navercorp.pinpoint.common.server.util.time.Range; +import com.navercorp.pinpoint.common.server.util.timewindow.TimeWindow; +import com.navercorp.pinpoint.common.server.util.timewindow.TimeWindowSlotCentricSampler; import com.navercorp.pinpoint.common.trace.BaseHistogramSchema; import com.navercorp.pinpoint.common.trace.HistogramSchema; import com.navercorp.pinpoint.common.trace.ServiceType; import com.navercorp.pinpoint.web.applicationmap.rawdata.LinkCallDataMap; -import com.navercorp.pinpoint.common.server.util.timewindow.TimeWindow; -import com.navercorp.pinpoint.common.server.util.timewindow.TimeWindowSlotCentricSampler; -import com.navercorp.pinpoint.web.view.AgentResponseTimeViewModel; +import com.navercorp.pinpoint.web.view.TimeViewModel; +import com.navercorp.pinpoint.web.view.id.AgentNameView; import com.navercorp.pinpoint.web.vo.Application; import com.navercorp.pinpoint.web.vo.ResponseTime; import com.navercorp.pinpoint.web.vo.stat.SampledApdexScore; @@ -37,7 +37,6 @@ import org.junit.jupiter.api.Test; import java.io.IOException; -import java.io.StringWriter; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -61,21 +60,11 @@ public void testViewModel() throws IOException { List responseHistogramList = createResponseTime(app, "test1", "test2"); AgentTimeHistogram histogram = builder.build(responseHistogramList); - List viewModel = histogram.createViewModel(TimeHistogramFormat.V1); + JsonFields> viewModel = histogram.createViewModel(TimeHistogramFormat.V1); logger.debug("{}", viewModel); - JsonFactory jsonFactory = mapper.getFactory(); - StringWriter stringWriter = new StringWriter(); - JsonGenerator jsonGenerator = jsonFactory.createGenerator(stringWriter); - jsonGenerator.writeStartObject(); - for (AgentResponseTimeViewModel agentResponseTimeViewModel : viewModel) { - jsonGenerator.writeObject(agentResponseTimeViewModel); - } - jsonGenerator.writeEndObject(); - jsonGenerator.flush(); - jsonGenerator.close(); - logger.debug(stringWriter.toString()); - + String json = mapper.writeValueAsString(viewModel); + logger.debug(json); } @Test diff --git a/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapServiceImplTest.java b/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapServiceImplTest.java index 0d2289517c15..e7ecb431eaed 100644 --- a/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapServiceImplTest.java +++ b/web/src/test/java/com/navercorp/pinpoint/web/applicationmap/service/FilteredMapServiceImplTest.java @@ -19,7 +19,11 @@ import com.navercorp.pinpoint.common.server.bo.SpanBo; import com.navercorp.pinpoint.common.server.bo.SpanEventBo; +import com.navercorp.pinpoint.common.server.util.json.JsonField; +import com.navercorp.pinpoint.common.server.util.json.JsonFields; import com.navercorp.pinpoint.common.server.util.time.Range; +import com.navercorp.pinpoint.common.server.util.timewindow.TimeWindow; +import com.navercorp.pinpoint.common.server.util.timewindow.TimeWindowDownSampler; import com.navercorp.pinpoint.common.trace.HistogramSchema; import com.navercorp.pinpoint.common.trace.HistogramSlot; import com.navercorp.pinpoint.common.trace.ServiceType; @@ -30,6 +34,8 @@ import com.navercorp.pinpoint.web.applicationmap.appender.histogram.NodeHistogramAppenderFactory; import com.navercorp.pinpoint.web.applicationmap.appender.server.ServerInfoAppenderFactory; import com.navercorp.pinpoint.web.applicationmap.appender.server.datasource.AgentInfoServerGroupListDataSource; +import com.navercorp.pinpoint.web.applicationmap.histogram.AgentTimeHistogram; +import com.navercorp.pinpoint.web.applicationmap.histogram.ApplicationTimeHistogram; import com.navercorp.pinpoint.web.applicationmap.histogram.Histogram; import com.navercorp.pinpoint.web.applicationmap.histogram.NodeHistogram; import com.navercorp.pinpoint.web.applicationmap.histogram.TimeHistogramFormat; @@ -42,12 +48,9 @@ import com.navercorp.pinpoint.web.hyperlink.HyperLinkFactory; import com.navercorp.pinpoint.web.service.AgentInfoService; import com.navercorp.pinpoint.web.service.ServerInstanceDatasourceService; -import com.navercorp.pinpoint.common.server.util.timewindow.TimeWindow; -import com.navercorp.pinpoint.common.server.util.timewindow.TimeWindowDownSampler; -import com.navercorp.pinpoint.web.view.AgentResponseTimeViewModel; -import com.navercorp.pinpoint.web.view.AgentResponseTimeViewModelList; import com.navercorp.pinpoint.web.view.ResponseTimeViewModel; import com.navercorp.pinpoint.web.view.TimeViewModel; +import com.navercorp.pinpoint.web.view.id.AgentNameView; import com.navercorp.pinpoint.web.vo.Application; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; @@ -227,10 +230,12 @@ public void twoTier() { List expectedTimeCounts = List.of( new ResponseTimeViewModel.TimeCount(timeWindow.refineTimestamp(rootSpanCollectorAcceptTime), 1) ); - List applicationTimeHistogram = nodeHistogram.getApplicationTimeHistogram(node.getTimeHistogramFormat()); + + List applicationTimeHistogram = getApplicationTimeHistogram(nodeHistogram, node.getTimeHistogramFormat()); assertTimeHistogram(applicationTimeHistogram, histogramSchema.getFastSlot(), expectedTimeCounts); - AgentResponseTimeViewModelList agentTimeHistogram = nodeHistogram.getAgentTimeHistogram(TimeHistogramFormat.V1); - Assertions.assertTrue(agentTimeHistogram.getAgentResponseTimeViewModelList().isEmpty()); + JsonFields> agentTimeHistogram = getAgentTimeHistogram(nodeHistogram); +// AgentResponseTimeViewModelList agentTimeHistogram = agentTimeHistogram; + Assertions.assertTrue(agentTimeHistogram.isEmpty()); } else if (application.getName().equals("ROOT_APP") && application.getServiceType().getCode() == TestTraceUtils.TEST_STAND_ALONE_TYPE_CODE) { // ROOT_APP node NodeHistogram nodeHistogram = node.getNodeHistogram(); @@ -244,10 +249,11 @@ public void twoTier() { List expectedTimeCounts = List.of( new ResponseTimeViewModel.TimeCount(timeWindow.refineTimestamp(rootSpanCollectorAcceptTime), 1) ); - List applicationTimeHistogram = nodeHistogram.getApplicationTimeHistogram(node.getTimeHistogramFormat()); + List applicationTimeHistogram = getApplicationTimeHistogram(nodeHistogram, node.getTimeHistogramFormat()); assertTimeHistogram(applicationTimeHistogram, histogramSchema.getFastSlot(), expectedTimeCounts); - AgentResponseTimeViewModelList agentTimeHistogram = nodeHistogram.getAgentTimeHistogram(TimeHistogramFormat.V1); - assertAgentTimeHistogram(agentTimeHistogram.getAgentResponseTimeViewModelList(), "root-agent", histogramSchema.getFastSlot(), expectedTimeCounts); + JsonFields> agentTimeHistogram = getAgentTimeHistogram(nodeHistogram); +// AgentResponseTimeViewModelList agentTimeHistogram = nodeHistogram.getAgentTimeHistogram(TimeHistogramFormat.V1); + assertAgentTimeHistogram(agentTimeHistogram, "root-agent", histogramSchema.getFastSlot(), expectedTimeCounts); } else if (application.getName().equals("APP_A") && application.getServiceType().getCode() == TestTraceUtils.TEST_STAND_ALONE_TYPE_CODE) { // APP_A node NodeHistogram nodeHistogram = node.getNodeHistogram(); @@ -261,10 +267,11 @@ public void twoTier() { List expectedTimeCounts = List.of( new ResponseTimeViewModel.TimeCount(timeWindow.refineTimestamp(appASpanCollectorAcceptTime), 1) ); - List applicationTimeHistogram = nodeHistogram.getApplicationTimeHistogram(node.getTimeHistogramFormat()); + List applicationTimeHistogram = getApplicationTimeHistogram(nodeHistogram, node.getTimeHistogramFormat()); assertTimeHistogram(applicationTimeHistogram, histogramSchema.getFastSlot(), expectedTimeCounts); - AgentResponseTimeViewModelList agentTimeHistogram = nodeHistogram.getAgentTimeHistogram(TimeHistogramFormat.V1); - assertAgentTimeHistogram(agentTimeHistogram.getAgentResponseTimeViewModelList(), "app-a", histogramSchema.getFastSlot(), expectedTimeCounts); + JsonFields> agentTimeHistogram = getAgentTimeHistogram(nodeHistogram); +// AgentResponseTimeViewModelList agentTimeHistogram = nodeHistogram.getAgentTimeHistogram(TimeHistogramFormat.V1); + assertAgentTimeHistogram(agentTimeHistogram, "app-a", histogramSchema.getFastSlot(), expectedTimeCounts); } else if (application.getName().equals("CacheName") && application.getServiceType().getCode() == TestTraceUtils.CACHE_TYPE_CODE) { // CACHE node NodeHistogram nodeHistogram = node.getNodeHistogram(); @@ -278,10 +285,11 @@ public void twoTier() { List expectedTimeCounts = List.of( new ResponseTimeViewModel.TimeCount(timeWindow.refineTimestamp(appASpanStartTime + cacheStartElapsed), 1) ); - List applicationTimeHistogram = nodeHistogram.getApplicationTimeHistogram(node.getTimeHistogramFormat()); + List applicationTimeHistogram = getApplicationTimeHistogram(nodeHistogram, node.getTimeHistogramFormat()); assertTimeHistogram(applicationTimeHistogram, histogramSchema.getNormalSlot(), expectedTimeCounts); - AgentResponseTimeViewModelList agentTimeHistogram = nodeHistogram.getAgentTimeHistogram(TimeHistogramFormat.V1); - assertAgentTimeHistogram(agentTimeHistogram.getAgentResponseTimeViewModelList(), "1.1.1.1", histogramSchema.getNormalSlot(), expectedTimeCounts); + JsonFields> agentTimeHistogram = getAgentTimeHistogram(nodeHistogram); +// AgentResponseTimeViewModelList agentTimeHistogram = nodeHistogram.getAgentTimeHistogram(TimeHistogramFormat.V1); + assertAgentTimeHistogram(agentTimeHistogram, "1.1.1.1", histogramSchema.getNormalSlot(), expectedTimeCounts); } else { fail("Unexpected node : " + node); } @@ -335,6 +343,16 @@ public void twoTier() { } } + private List getApplicationTimeHistogram(NodeHistogram nodeHistogram, TimeHistogramFormat format) { + ApplicationTimeHistogram applicationTimeHistogram = nodeHistogram.getApplicationTimeHistogram(); + return applicationTimeHistogram.createViewModel(format); + } + + private JsonFields> getAgentTimeHistogram(NodeHistogram nodeHistogram) { + AgentTimeHistogram factory = nodeHistogram.getAgentTimeHistogram(); + return factory.createViewModel(TimeHistogramFormat.V1); + } + private void assertHistogram(Histogram histogram, int fastCount, int normalCount, int slowCount, int verySlowCount, int totalErrorCount) { Assertions.assertEquals(fastCount, histogram.getFastCount()); Assertions.assertEquals(normalCount, histogram.getNormalCount()); @@ -380,10 +398,10 @@ private void assertAgentHistogram(Map agentHistogramMap, Stri fail("Histogram not found for agent : " + agentId); } - private void assertAgentTimeHistogram(List histogramList, String agentId, HistogramSlot histogramSlot, List expectedTimeCounts) { - for (AgentResponseTimeViewModel histogram : histogramList) { - if (agentId.equals(histogram.getAgentName())) { - assertTimeHistogram(histogram.getResponseTimeViewModel(), histogramSlot, expectedTimeCounts); + private void assertAgentTimeHistogram(JsonFields> histogramList, String agentId, HistogramSlot histogramSlot, List expectedTimeCounts) { + for (JsonField> field : histogramList) { + if (agentId.equals(field.name().agentName())) { + assertTimeHistogram(field.value(), histogramSlot, expectedTimeCounts); return; } }