Skip to content

Commit 4f2b5a9

Browse files
committed
add default views
1 parent d9bc6d1 commit 4f2b5a9

File tree

6 files changed

+47
-12
lines changed

6 files changed

+47
-12
lines changed

src/main/java/rocks/inspectit/ocelot/eum/server/configuration/model/metrics/definition/MetricDefinitionSettings.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88
import jakarta.validation.constraints.NotBlank;
99
import jakarta.validation.constraints.NotNull;
1010
import org.springframework.util.CollectionUtils;
11+
import rocks.inspectit.ocelot.eum.server.configuration.model.metrics.definition.view.AggregationType;
1112
import rocks.inspectit.ocelot.eum.server.configuration.model.metrics.definition.view.ViewDefinitionSettings;
1213

13-
import java.time.Duration;
14+
import java.util.HashMap;
1415
import java.util.Map;
1516

1617
/**
@@ -39,7 +40,7 @@ public class MetricDefinitionSettings {
3940

4041
@NotNull
4142
@Builder.Default
42-
private InstrumentValueType valueType = InstrumentValueType.DOUBLE;
43+
private InstrumentValueType valueType = InstrumentValueType.LONG;
4344

4445
/**
4546
* The description of the metric.
@@ -49,7 +50,6 @@ public class MetricDefinitionSettings {
4950

5051
/**
5152
* Maps view names to their definitions for the metric defined by this {@link MetricDefinitionSettings}.
52-
* If this map is null, OpenTelemetry will create a default view automatically.
5353
*/
5454
@Singular
5555
private Map<@NotBlank String, @Valid @NotNull ViewDefinitionSettings> views;
@@ -68,6 +68,32 @@ public MetricDefinitionSettings getCopyWithDefaultsPopulated(String metricName)
6868
if(!CollectionUtils.isEmpty(views)) {
6969
views.forEach((name, def) -> result.view(name, def.getCopyWithDefaultsPopulated(resultDescription, unit)));
7070
}
71+
else {
72+
/*
73+
If there are no views specified, we will create a default view which only sets the default
74+
OpenTelemetry aggregation for the particular instrument type.
75+
Otherwise, we would not know about this view and could not set a proper AttributesProcessor
76+
in the ViewManager to regulate, which attributes are allowed for the metric
77+
*/
78+
Map<String, ViewDefinitionSettings> defaultView = new HashMap<>();
79+
val builder = ViewDefinitionSettings.builder();
80+
switch (instrumentType) {
81+
case GAUGE:
82+
ViewDefinitionSettings gaugeView = builder.aggregation(AggregationType.LAST_VALUE).build();
83+
defaultView.put(metricName, gaugeView);
84+
break;
85+
case COUNTER:
86+
case UP_DOWN_COUNTER:
87+
ViewDefinitionSettings counterView = builder.aggregation(AggregationType.SUM).build();
88+
defaultView.put(metricName, counterView);
89+
break;
90+
case HISTOGRAM:
91+
ViewDefinitionSettings histogramView = builder.aggregation(AggregationType.HISTOGRAM).build();
92+
defaultView.put(metricName, histogramView);
93+
break;
94+
}
95+
result.views(defaultView);
96+
}
7197

7298
return result.build();
7399
}

src/main/java/rocks/inspectit/ocelot/eum/server/metrics/InstrumentManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public void createInstrument(String metricName, MetricDefinitionSettings metricD
6161
}
6262

6363
val views = populatedMetricDefinition.getViews();
64-
if(!CollectionUtils.isEmpty(views)) {
64+
if (!CollectionUtils.isEmpty(views)) {
6565
views.values().forEach(view -> attributesRegistry.processAttributeKeysForView(view));
6666
}
6767
}

src/main/java/rocks/inspectit/ocelot/eum/server/metrics/timewindow/worker/CachingMetricProducer.java renamed to src/main/java/rocks/inspectit/ocelot/eum/server/metrics/timewindow/worker/TimeWindowMetricProducer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import io.opentelemetry.sdk.metrics.data.MetricData;
55
import io.opentelemetry.sdk.metrics.export.MetricProducer;
66
import io.opentelemetry.sdk.resources.Resource;
7-
import lombok.AllArgsConstructor;
87
import org.springframework.beans.factory.annotation.Autowired;
98
import org.springframework.stereotype.Component;
109
import rocks.inspectit.ocelot.eum.server.metrics.timewindow.TimeWindowViewManager;
@@ -23,7 +22,7 @@
2322
* Otherwise, e.g. spamming F5 on the prometheus endpoint could lead to an increased CPU usage.
2423
*/
2524
@Component
26-
public class CachingMetricProducer implements MetricProducer {
25+
public class TimeWindowMetricProducer implements MetricProducer {
2726

2827
@Autowired
2928
private TimeWindowViewManager viewManager;

src/main/java/rocks/inspectit/ocelot/eum/server/opentelemetry/metrics/ViewManager.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@
1010
import rocks.inspectit.ocelot.eum.server.configuration.model.metrics.definition.MetricDefinitionSettings;
1111
import rocks.inspectit.ocelot.eum.server.configuration.model.metrics.definition.view.AggregationType;
1212
import rocks.inspectit.ocelot.eum.server.configuration.model.metrics.definition.view.ViewDefinitionSettings;
13+
import rocks.inspectit.ocelot.eum.server.metrics.InstrumentManager;
1314
import rocks.inspectit.ocelot.eum.server.metrics.timewindow.TimeWindowViewManager;
1415

1516
import java.util.*;
1617

1718
/**
18-
* Registers all user-specified metric views.
19+
* Stores all active OpenTelemetry metric views.
20+
* <br>
21+
* Note that if we do not register any view for an instrument (see {@link InstrumentManager}),
22+
* OpenTelemetry would use a default view automatically to record data.
23+
* However, this default view would not filter any attributes and thus would use every attribute,
24+
* which was passed during recording. To prevent this, we should register at least one view for every metric by ourselves.
1925
*/
2026
@Component
2127
public class ViewManager {
@@ -126,13 +132,17 @@ private View createView(String viewName, ViewDefinitionSettings settings) {
126132
.setDescription(settings.getDescription())
127133
.setAggregation(aggregation)
128134
.setCardinalityLimit(settings.getCardinalityLimit());
135+
boolean withCommonAttributes = settings.isWithCommonAttributes();
129136

130137
if (!CollectionUtils.isEmpty(settings.getAttributes())) {
131138
builder.setAttributeFilter((attribute) -> filterAttribute(settings, attribute));
132139
}
133-
else {
140+
else if (withCommonAttributes){
134141
builder.setAttributeFilter(this::isDefinedAsGlobal);
135142
}
143+
else {
144+
builder.setAttributeFilter((attr) -> false); // reject all attributes
145+
}
136146

137147
return builder.build();
138148
}

src/test/java/rocks/inspectit/ocelot/eum/server/metrics/InstrumentManagerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ void shouldCreateInstrumentAndProcessAttributes() {
4545
}
4646

4747
@Test
48-
void shouldCreateInstrumentAndNotProcessAttributesWhenNoViews() {
48+
void shouldCreateInstrumentAndProcessAttributesWhenNoViews() {
4949
MetricDefinitionSettings metric = new MetricDefinitionSettings();
5050

5151
manager.createInstrument(metricName, metric);
5252

5353
verify(factory).createInstrument(anyString(), any(MetricDefinitionSettings.class));
54-
verifyNoInteractions(registry);
54+
verify(registry).processAttributeKeysForView(any(ViewDefinitionSettings.class));
5555
}
5656

5757
@Test

src/test/java/rocks/inspectit/ocelot/eum/server/metrics/timewindow/worker/CachingMetricProducerTest.java renamed to src/test/java/rocks/inspectit/ocelot/eum/server/metrics/timewindow/worker/TimeWindowMetricProducerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@
2424
import static rocks.inspectit.ocelot.eum.server.metrics.timewindow.utils.TimeWindowTestUtils.assertTotalSeriesCount;
2525

2626
@ExtendWith(MockitoExtension.class)
27-
class CachingMetricProducerTest {
27+
class TimeWindowMetricProducerTest {
2828

2929
@Mock
3030
TimeWindowViewManager viewManager;
3131

3232
@InjectMocks
33-
CachingMetricProducer producer;
33+
TimeWindowMetricProducer producer;
3434

3535
@InjectMocks
3636
TimeWindowRecorder recorder;

0 commit comments

Comments
 (0)