Skip to content

Commit 047ac35

Browse files
committed
refactor: generify timing of controller execution
Introduce ControllerExecution interface to encapsulate a controller call that can be timed. Move logic of call to ConfiguredController where it's more logical so that Metrics class doesn't have any business logic anymore.
1 parent 899e05e commit 047ac35

File tree

3 files changed

+78
-75
lines changed

3 files changed

+78
-75
lines changed

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

Lines changed: 17 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,6 @@
44
import java.util.function.ToDoubleFunction;
55
import java.util.function.ToLongFunction;
66

7-
import io.fabric8.kubernetes.client.CustomResource;
8-
import io.javaoperatorsdk.operator.api.Context;
9-
import io.javaoperatorsdk.operator.api.DeleteControl;
10-
import io.javaoperatorsdk.operator.api.ResourceController;
11-
import io.javaoperatorsdk.operator.api.UpdateControl;
12-
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
137
import io.micrometer.core.instrument.Clock;
148
import io.micrometer.core.instrument.Counter;
159
import io.micrometer.core.instrument.DistributionSummary;
@@ -38,76 +32,36 @@ public Metrics(MeterRegistry registry) {
3832
this.registry = registry;
3933
}
4034

41-
public <R extends CustomResource> UpdateControl<R> timeControllerCreateOrUpdate(
42-
ResourceController<R> controller,
43-
ControllerConfiguration<R> configuration,
44-
R resource,
45-
Context<R> context) {
46-
final var name = configuration.getName();
47-
final var timer =
48-
Timer.builder("operator.sdk.controllers.execution.createorupdate")
49-
.tags("controller", name)
50-
.publishPercentiles(0.3, 0.5, 0.95)
51-
.publishPercentileHistogram()
52-
.register(registry);
53-
try {
54-
final var result = timer.record(() -> controller.createOrUpdateResource(resource, context));
55-
String successType = "cr";
56-
if (result.isUpdateStatusSubResource()) {
57-
successType = "status";
58-
}
59-
if (result.isUpdateCustomResourceAndStatusSubResource()) {
60-
successType = "both";
61-
}
62-
registry
63-
.counter(
64-
"operator.sdk.controllers.execution.success", "controller", name, "type", successType)
65-
.increment();
66-
return result;
67-
} catch (Exception e) {
68-
registry
69-
.counter(
70-
"operator.sdk.controllers.execution.failure",
71-
"controller",
72-
name,
73-
"exception",
74-
e.getClass().getSimpleName())
75-
.increment();
76-
throw e;
77-
}
35+
public interface ControllerExecution<T> {
36+
String name();
37+
38+
String controllerName();
39+
40+
String successTypeName(T result);
41+
42+
T execute();
7843
}
7944

80-
public DeleteControl timeControllerDelete(
81-
ResourceController controller,
82-
ControllerConfiguration configuration,
83-
CustomResource resource,
84-
Context context) {
85-
final var name = configuration.getName();
45+
public <T> T timeControllerExecution(ControllerExecution<T> execution) {
46+
final var name = execution.controllerName();
47+
final var execName = "operator.sdk.controllers.execution." + execution.name();
8648
final var timer =
87-
Timer.builder("operator.sdk.controllers.execution.delete")
49+
Timer.builder(execName)
8850
.tags("controller", name)
8951
.publishPercentiles(0.3, 0.5, 0.95)
9052
.publishPercentileHistogram()
9153
.register(registry);
9254
try {
93-
final var result = timer.record(() -> controller.deleteResource(resource, context));
94-
String successType = "notDelete";
95-
if (result == DeleteControl.DEFAULT_DELETE) {
96-
successType = "delete";
97-
}
55+
final var result = timer.record(execution::execute);
56+
final var successType = execution.successTypeName(result);
9857
registry
99-
.counter(
100-
"operator.sdk.controllers.execution.success", "controller", name, "type", successType)
58+
.counter(execName + ".success", "controller", name, "type", successType)
10159
.increment();
10260
return result;
10361
} catch (Exception e) {
62+
final var exception = e.getClass().getSimpleName();
10463
registry
105-
.counter(
106-
"operator.sdk.controllers.execution.failure",
107-
"controller",
108-
name,
109-
"exception",
110-
e.getClass().getSimpleName())
64+
.counter(execName + ".failure", "controller", name, "exception", exception)
11165
.increment();
11266
throw e;
11367
}

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

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.fabric8.kubernetes.client.dsl.MixedOperation;
1212
import io.fabric8.kubernetes.client.dsl.Resource;
1313
import io.javaoperatorsdk.operator.CustomResourceUtils;
14+
import io.javaoperatorsdk.operator.Metrics.ControllerExecution;
1415
import io.javaoperatorsdk.operator.MissingCRDException;
1516
import io.javaoperatorsdk.operator.OperatorException;
1617
import io.javaoperatorsdk.operator.api.Context;
@@ -38,12 +39,68 @@ public ConfiguredController(ResourceController<R> controller,
3839

3940
@Override
4041
public DeleteControl deleteResource(R resource, Context<R> context) {
41-
return controller.deleteResource(resource, context);
42+
return configuration.getConfigurationService().getMetrics().timeControllerExecution(
43+
new ControllerExecution<>() {
44+
@Override
45+
public String name() {
46+
return "delete";
47+
}
48+
49+
@Override
50+
public String controllerName() {
51+
return configuration.getName();
52+
}
53+
54+
@Override
55+
public String successTypeName(DeleteControl result) {
56+
switch (result) {
57+
case DEFAULT_DELETE:
58+
return "delete";
59+
case NO_FINALIZER_REMOVAL:
60+
return "finalizerNotRemoved";
61+
default:
62+
return "unknown";
63+
}
64+
}
65+
66+
@Override
67+
public DeleteControl execute() {
68+
return controller.deleteResource(resource, context);
69+
}
70+
});
4271
}
4372

4473
@Override
4574
public UpdateControl<R> createOrUpdateResource(R resource, Context<R> context) {
46-
return controller.createOrUpdateResource(resource, context);
75+
return configuration.getConfigurationService().getMetrics().timeControllerExecution(
76+
new ControllerExecution<>() {
77+
@Override
78+
public String name() {
79+
return "createOrUpdate";
80+
}
81+
82+
@Override
83+
public String controllerName() {
84+
return configuration.getName();
85+
}
86+
87+
@Override
88+
public String successTypeName(UpdateControl<R> result) {
89+
String successType = "cr";
90+
if (result.isUpdateStatusSubResource()) {
91+
successType = "status";
92+
}
93+
if (result.isUpdateCustomResourceAndStatusSubResource()) {
94+
successType = "both";
95+
}
96+
return successType;
97+
}
98+
99+
@Override
100+
public UpdateControl<R> execute() {
101+
return controller.createOrUpdateResource(resource, context);
102+
}
103+
});
47104
}
48105

49106
@Override

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,7 @@ private PostExecutionControl<R> handleCreateOrUpdate(
124124
getVersion(resource),
125125
executionScope);
126126

127-
UpdateControl<R> updateControl =
128-
configuration()
129-
.getConfigurationService()
130-
.getMetrics()
131-
.timeControllerCreateOrUpdate(controller, configuration(), resource, context);
127+
UpdateControl<R> updateControl = controller.createOrUpdateResource(resource, context);
132128
R updatedCustomResource = null;
133129
if (updateControl.isUpdateCustomResourceAndStatusSubResource()) {
134130
updatedCustomResource = updateCustomResource(updateControl.getCustomResource());
@@ -159,11 +155,7 @@ private PostExecutionControl<R> handleDelete(R resource, Context<R> context) {
159155
getName(resource),
160156
getVersion(resource));
161157

162-
DeleteControl deleteControl =
163-
configuration()
164-
.getConfigurationService()
165-
.getMetrics()
166-
.timeControllerDelete(controller, configuration(), resource, context);
158+
DeleteControl deleteControl = controller.deleteResource(resource, context);
167159
final var useFinalizer = configuration().useFinalizer();
168160
if (useFinalizer) {
169161
if (deleteControl == DeleteControl.DEFAULT_DELETE

0 commit comments

Comments
 (0)