8000 refactor: remove EventMonitor altogether and improve counter reporting · smsilva/java-operator-sdk@045ae10 · GitHub
[go: up one dir, main page]

Skip to content

Commit 045ae10

Browse files
committed
refactor: remove EventMonitor altogether and improve counter reporting
1 parent 24d0902 commit 045ae10

File tree

4 files changed

+48
-61
lines changed

4 files changed

+48
-61
lines changed

micrometer-support/src/main/java/io/javaoperatorsdk/operator/monitoring/micrometer/MicrometerMetrics.java

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package io.javaoperatorsdk.operator.monitoring.micrometer;
22

33
import java.util.Collections;
4+
import java.util.LinkedList;
5+
import java.util.List;
46
import java.util.Map;
57

6-
import io.javaoperatorsdk.operator.api.monitoring.EventMonitor;
78
import io.javaoperatorsdk.operator.api.monitoring.Metrics;
89
import io.javaoperatorsdk.operator.processing.event.Event;
910
import io.micrometer.core.instrument.MeterRegistry;
@@ -13,17 +14,6 @@ public class MicrometerMetrics implements Metrics {
1314

1415
public static final String PREFIX = "operator.sdk.";
1516
private final MeterRegistry registry;
16-
private final EventMonitor monitor = new EventMonitor() {
17-
@Override
18-
public void processedEvent(Event event) {
19-
incrementProcessedEventsNumber();
20-
}
21-
22-
@Override
23-
public void failedEvent(Event event) {
24-
incrementControllerRetriesNumber();
25-
}
26-
};
2717

2818
public MicrometerMetrics(MeterRegistry registry) {
2919
this.registry = registry;
@@ -63,21 +53,37 @@ public void incrementControllerRetriesNumber() {
6353

6454
}
6555

66-
public void incrementProcessedEventsNumber() {
67-
registry
68-
.counter(
69-
PREFIX + "total.events.received", "events", "totalEvents", "type",
70-
"eventsReceived")
71-
.increment();
56+
public void processingEvent(Event event) {
57+
incrementCounter(event, "events.received");
58+
}
7259

60+
public void processedEvent(Event event) {
61+
incrementCounter(event, "events.processed");
62+
}
63+
64+
public void failedEvent(Event event, RuntimeException exception) {
65+
var cause = exception.getCause();
66+
if (cause == null) {
67+
cause = exception;
68+
} else if (cause instanceof RuntimeException) {
69+
cause = cause.getCause() != null ? cause.getCause() : cause;
70+
}
71+
incrementCounter(event, "events.failed", "exception", cause.getClass().getSimpleName());
7372
}
7473

7574
public <T extends Map<?, ?>> T monitorSizeOf(T map, String name) {
7675
return registry.gaugeMapSize(PREFIX + name + ".size", Collections.emptyList(), map);
7776
}
7877

79-
@Override
80-
public EventMonitor getEventMonitor() {
81-
return monitor;
78+
private void incrementCounter(Event event, String counterName, String... additionalTags) {
79+
final var id = event.getRelatedCustomResourceID();
80+
var tags = List.of("namespace", id.getNamespace().orElse(""),
81+
"scope", id.getNamespace().isPresent() ? "namespace" : "cluster",
82+
"type", event.getType().name());
83+
if (additionalTags != null && additionalTags.length > 0) {
84+
tags = new LinkedList<>(tags);
85+
tags.addAll(List.of(additionalTags));
86+
}
87+
registry.counter(PREFIX + counterName, tags.toArray(new String[0])).increment();
8288
}
8389
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/monitoring/EventMonitor.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/api/monitoring/Metrics.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,17 @@
22

33
import java.util.Map;
44

5+
import io.javaoperatorsdk.operator.processing.event.Event;
6+
57
public interface Metrics {
68
Metrics NOOP = new Metrics() {};
79

10+
default void processingEvent(Event event) {}
11+
12+
default void processedEvent(Event event) {}
13+
14+
default void failedEvent(Event event, RuntimeException exception) {}
15+
816

917
interface ControllerExecution<T> {
1018
String name();
@@ -20,15 +28,7 @@ default <T> T timeControllerExecution(ControllerExecution<T> execution) {
2028
return execution.execute();
2129
}
2230

23-
default void incrementControllerRetriesNumber() {}
24-
25-
default void incrementProcessedEventsNumber() {}
26-
2731
default <T extends Map<?, ?>> T monitorSizeOf(T map, String name) {
2832
return map;
2933
}
30-
31-
default EventMonitor getEventMonitor() {
32-
return EventMonitor.NOOP;
33-
}
3434
}

operator-framework-core/src/main/java/io/javaoperatorsdk/operator/processing/DefaultEventHandler.java

Lines changed: 13 additions & 14 deletions
77E9
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import io.javaoperatorsdk.operator.api.RetryInfo;
1717
import io.javaoperatorsdk.operator.api.config.ConfigurationService;
1818
import io.javaoperatorsdk.operator.api.config.ExecutorServiceManager;
19-
import io.javaoperatorsdk.operator.api.monitoring.EventMonitor;
19+
import io.javaoperatorsdk.operator.api.monitoring.Metrics;
2020
import io.javaoperatorsdk.operator.processing.event.CustomResourceID;
2121
import io.javaoperatorsdk.operator.processing.event.DefaultEventSourceManager;
2222
import io.javaoperatorsdk.operator.processing.event.Event;
@@ -43,7 +43,7 @@ public class DefaultEventHandler<R extends CustomResource<?, ?>> implements Even
4343
private final ExecutorService executor;
4444
private final String controllerName;
4545
private final ReentrantLock lock = new ReentrantLock();
46-
private final EventMonitor eventMonitor;
46+
private final Metrics metrics;
4747
private volatile boolean running;
4848
private final ResourceCache<R> resourceCache;
4949
private DefaultEventSourceManager<R> eventSourceManager;
@@ -56,7 +56,7 @@ public DefaultEventHandler(ConfiguredController<R> controller, ResourceCache<R>
5656
controller.getConfiguration().getName(),
5757
new EventDispatcher<>(controller),
5858
GenericRetry.fromConfiguration(controller.getConfiguration().getRetryConfiguration()),
59-
controller.getConfiguration().getConfigurationService().getMetrics().getEventMonitor(),
59+
controller.getConfiguration().getConfigurationService().getMetrics(),
6060
new EventMarker());
6161
}
6262

@@ -68,7 +68,7 @@ public DefaultEventHandler(ConfiguredController<R> controller, ResourceCache<R>
6868

6969
private DefaultEventHandler(ResourceCache<R> resourceCache, ExecutorService executor,
7070
String relatedControllerName,
71-
EventDispatcher<R> eventDispatcher, Retry retry, EventMonitor monitor,
71+
EventDispatcher<R> eventDispatcher, Retry retry, Metrics metrics,
7272
EventMarker eventMarker) {
7373
this.running = true;
7474
this.executor =
@@ -80,18 +80,14 @@ private DefaultEventHandler(ResourceCache<R> resourceCache, ExecutorService exec
8080
this.eventDispatcher = eventDispatcher;
8181
this.retry = retry;
8282
this.resourceCache = resourceCache;
83-
this.eventMonitor = monitor != null ? monitor : EventMonitor.NOOP;
83+
this.metrics = metrics != null ? metrics : Metrics.NOOP;
8484
this.eventMarker = eventMarker;
8585
}
8686

8787
public void setEventSourceManager(DefaultEventSourceManager<R> eventSourceManager) {
8888
this.eventSourceManager = eventSourceManager;
8989
}
9090

91-
private EventMonitor monitor() {
92-
return eventMonitor;
93-
}
94-
9591
@Override
9692
public void handleEvent(Event event) {
9793
lock.lock();
@@ -101,16 +97,17 @@ public void handleEvent(Event event) {
10197
log.debug("Skipping event: {} because the event handler is shutting down", event);
10298
return;
10399
}
104-
final var monitor = monitor();
105100
final var resourceID = event.getRelatedCustomResourceID();
106-
monitor.processedEvent(event);
101+
metrics.processingEvent(event);
107102

108103
handleEventMarking(event);
109104
if (!eventMarker.deleteEventPresent(resourceID)) {
110105
submitReconciliationExecution(event);
111106
} else {
112107
cleanupForDeletedEvent(event);
113108
}
109+
110+
metrics.processedEvent(event);
114111
} finally {
115112
lock.unlock();
116113
}
@@ -179,8 +176,8 @@ void eventProcessingFinished(
179176
// Either way we don't want to retry.
180177
if (isRetryConfigured() && postExecutionControl.exceptionDuringExecution() &&
181178
!eventMarker.deleteEventPresent(customResourceID)) {
182-
handleRetryOnException(executionScope);
183-
monitor().failedEvent(executionScope.getTriggeringEvent());
179+
handleRetryOnException(executionScope,
180+
postExecutionControl.getRuntimeException().orElseThrow());
184181
return;
185182
}
186183
cleanupOnSuccessfulExecution(executionScope);
@@ -247,7 +244,8 @@ private void reScheduleExecutionIfInstructed(PostExecutionControl<R> postExecuti
247244
* events (received meanwhile retry is in place or already in buffer) instantly or always wait
248245
* according to the retry timing if there was an exception.
249246
*/
250-
private void handleRetryOnException(ExecutionScope<R> executionScope) {
247+
private void handleRetryOnException(ExecutionScope<R> executionScope,
248+
RuntimeException exception) {
251249
RetryExecution execution = getOrInitRetryExecution(executionScope);
252250
var customResourceID = executionScope.getCustomResourceID();
253251
boolean eventPresent = eventMarker.eventPresent(customResourceID);
@@ -267,6 +265,7 @@ private void handleRetryOnException(ExecutionScope<R> executionScope) {
267265
"Scheduling timer event for retry with delay:{} for resource: {}",
268266
delay,
269267
customResourceID);
268+
metrics.failedEvent(executionScope.getTriggeringEvent(), exception);
270269
eventSourceManager
271270
.getRetryAndRescheduleTimerEventSource()
272271
.scheduleOnce(executionScope.getCustomResource(), delay);

0 commit comments

Comments
 (0)
0