NIFI-7942 Fixing ordering issue when counter based metrics are added by component

Signed-off-by: Pierre Villard <pierre.villard.fr@gmail.com>

This closes #4621.
This commit is contained in:
Bence Simon 2020-10-26 16:12:37 +01:00 committed by Pierre Villard
parent 718b77c7c4
commit c8ea7523ef
No known key found for this signature in database
GPG Key ID: F92A93B30C07C6D5
2 changed files with 42 additions and 3 deletions

View File

@ -28,9 +28,11 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class StatusHistoryUtil {
@ -76,13 +78,24 @@ public class StatusHistoryUtil {
}
public static List<StatusDescriptorDTO> createFieldDescriptorDtos(final Collection<MetricDescriptor<?>> metricDescriptors) {
final StatusDescriptorDTO[] result = new StatusDescriptorDTO[metricDescriptors.size()];
final StatusDescriptorDTO[] standardMetricDescriptors = new StatusDescriptorDTO[metricDescriptors.size()];
final List<StatusDescriptorDTO> counterMetricDescriptors = new LinkedList<>();
for (final MetricDescriptor<?> metricDescriptor : metricDescriptors) {
result[metricDescriptor.getMetricIdentifier()] = createStatusDescriptorDto(metricDescriptor);
if (metricDescriptor instanceof StandardMetricDescriptor) {
standardMetricDescriptors[metricDescriptor.getMetricIdentifier()] = createStatusDescriptorDto(metricDescriptor);
} else if (metricDescriptor instanceof CounterMetricDescriptor) {
counterMetricDescriptors.add(createStatusDescriptorDto(metricDescriptor));
} else {
throw new IllegalArgumentException("Unknown metric descriptor type: " + metricDescriptor.getClass().getName());
}
}
return Arrays.asList(result);
// Ordered standard metric descriptors are added first than counter metric descriptors in the order of appearance.
final List<StatusDescriptorDTO> result = new ArrayList<>(metricDescriptors.size());
result.addAll(Arrays.asList(standardMetricDescriptors).stream().filter(i -> i != null).collect(Collectors.toList()));
result.addAll(counterMetricDescriptors);
return result;
}
public static List<StatusDescriptorDTO> createFieldDescriptorDtos(final StatusHistory statusHistory) {

View File

@ -71,4 +71,30 @@ public class StatusHistoryUtilTest {
// then
Assert.assertEquals(expected, result);
}
@Test
public void testCreateFieldDescriptorDtosWhenCounterTypeAppears() {
// given
final Collection<MetricDescriptor<?>> metricDescriptors = Arrays.asList(
new CounterMetricDescriptor<>("fieldCounter1", "FieldCounter1", "Field Counter 1", MetricDescriptor.Formatter.COUNT, __ -> 3L),
new StandardMetricDescriptor<>(() -> 1, "field2", "Field2", "Field 2", MetricDescriptor.Formatter.COUNT, __ -> 2L),
new CounterMetricDescriptor<>("fieldCounter2", "FieldCounter2", "Field Counter 2", MetricDescriptor.Formatter.COUNT, __ -> 4L),
new StandardMetricDescriptor<>(() -> 0, "field1", "Field1", "Field 1", MetricDescriptor.Formatter.COUNT, __ -> 1L),
new CounterMetricDescriptor<>("fieldCounter3", "FieldCounter3", "Field Counter 3", MetricDescriptor.Formatter.COUNT, __ -> 5L)
);
final List<StatusDescriptorDTO> expected = Arrays.asList(
new StatusDescriptorDTO("field1", "Field1", "Field 1", MetricDescriptor.Formatter.COUNT.name()),
new StatusDescriptorDTO("field2", "Field2", "Field 2", MetricDescriptor.Formatter.COUNT.name()),
new StatusDescriptorDTO("fieldCounter1", "FieldCounter1", "Field Counter 1", MetricDescriptor.Formatter.COUNT.name()),
new StatusDescriptorDTO("fieldCounter2", "FieldCounter2", "Field Counter 2", MetricDescriptor.Formatter.COUNT.name()),
new StatusDescriptorDTO("fieldCounter3", "FieldCounter3", "Field Counter 3", MetricDescriptor.Formatter.COUNT.name())
);
// when
final List<StatusDescriptorDTO> result = StatusHistoryUtil.createFieldDescriptorDtos(metricDescriptors);
// then
Assert.assertEquals(expected, result);
}
}