Skip to content

Introduce ConfiguredController concept, decouple Metrics code from business logic #517

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 23 commits into from
Aug 31, 2021
Merged
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
036e18c
refactor: make Operator only deal with ConfiguredController management
metacosm Aug 26, 2021
7feb861
fix: use resources method instead of deprecated customResources
metacosm Aug 26, 2021
d105dd6
feat: add direct access to custom resource client
metacosm Aug 26, 2021
b954a95
refactor: propagate use of ConfiguredController, generify some
metacosm Aug 26, 2021
aa6528f
fix: avoid crash if for some reason the build time is unavailable
metacosm Aug 26, 2021
992a4fa
feat: use ConfiguredController
metacosm Aug 26, 2021
d4e88e7
refactor: use non-deprecated replaceStatus method
metacosm Aug 26, 2021
f63ada0
refactor: more generification
metacosm Aug 26, 2021
d3331fe
chore: clean up unused code
metacosm Aug 26, 2021
4fadeaa
chore: use resources method instead of deprecated customResources
metacosm Aug 26, 2021
bcb3dc5
feat: add EventMonitor to decouple metrics from DefaultEventHandler
metacosm Aug 26, 2021
b391bf7
fix: use proper close method signature
metacosm Aug 26, 2021
4d0514b
refactor: use more appropriate method names
metacosm Aug 26, 2021
d2b3c79
refactor: simplify test-specific constructor
metacosm Aug 26, 2021
d811a17
refactor: use ReentrantLock instead of locking on Object
metacosm Aug 27, 2021
a1fcd5d
feat: improve error logging when cluster is not online
metacosm Aug 27, 2021
f988d41
refactor: generify timing of controller execution
metacosm Aug 27, 2021
be95a3a
chore: remove synchronization altogether
metacosm Aug 30, 2021
8e26e84
fix: avoid NPE in ConfiguredController.close if manager is not set
metacosm Aug 30, 2021
843f44b
fix: improper TestConfiguration implementation
metacosm Aug 30, 2021
e34bac9
feat: make AbstractControllerConfiguration directly usable
metacosm Aug 31, 2021
d3920bc
fix: add ControllerManager to handle controllers and status atomically
metacosm Aug 31, 2021
fcef377
fix: revert to use updateStatus for now
metacosm Aug 31, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,19 +1,29 @@
package io.javaoperatorsdk.operator;

import io.fabric8.kubernetes.client.CustomResource;
import io.javaoperatorsdk.operator.api.Context;
import io.javaoperatorsdk.operator.api.DeleteControl;
import io.javaoperatorsdk.operator.api.ResourceController;
import io.javaoperatorsdk.operator.api.UpdateControl;
import io.javaoperatorsdk.operator.api.config.ControllerConfiguration;
import io.micrometer.core.instrument.*;
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
import io.micrometer.core.instrument.distribution.pause.PauseDetector;
import io.micrometer.core.instrument.noop.*;
import java.util.concurrent.TimeUnit;
import java.util.function.ToDoubleFunction;
import java.util.function.ToLongFunction;

import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.DistributionSummary;
import io.micrometer.core.instrument.FunctionCounter;
import io.micrometer.core.instrument.FunctionTimer;
import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.Measurement;
import io.micrometer.core.instrument.Meter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
import io.micrometer.core.instrument.distribution.pause.PauseDetector;
import io.micrometer.core.instrument.noop.NoopCounter;
import io.micrometer.core.instrument.noop.NoopDistributionSummary;
import io.micrometer.core.instrument.noop.NoopFunctionCounter;
import io.micrometer.core.instrument.noop.NoopFunctionTimer;
import io.micrometer.core.instrument.noop.NoopGauge;
import io.micrometer.core.instrument.noop.NoopMeter;
import io.micrometer.core.instrument.noop.NoopTimer;

public class Metrics {
public static final Metrics NOOP = new Metrics(new NoopMeterRegistry(Clock.SYSTEM));
private final MeterRegistry registry;
@@ -22,82 +32,42 @@ public Metrics(MeterRegistry registry) {
this.registry = registry;
}

public <R extends CustomResource> UpdateControl<R> timeControllerCreateOrUpdate(
ResourceController<R> controller,
ControllerConfiguration<R> configuration,
R resource,
Context<R> context) {
final var name = configuration.getName();
final var timer =
Timer.builder("operator.sdk.controllers.execution.createorupdate")
.tags("controller", name)
.publishPercentiles(0.3, 0.5, 0.95)
.publishPercentileHistogram()
.register(registry);
try {
final var result = timer.record(() -> controller.createOrUpdateResource(resource, context));
String successType = "cr";
if (result.isUpdateStatusSubResource()) {
successType = "status";
}
if (result.isUpdateCustomResourceAndStatusSubResource()) {
successType = "both";
}
registry
.counter(
"operator.sdk.controllers.execution.success", "controller", name, "type", successType)
.increment();
return result;
} catch (Exception e) {
registry
.counter(
"operator.sdk.controllers.execution.failure",
"controller",
name,
"exception",
e.getClass().getSimpleName())
.increment();
throw e;
}
public interface ControllerExecution<T> {
String name();

String controllerName();

String successTypeName(T result);

T execute();
}

public DeleteControl timeControllerDelete(
ResourceController controller,
ControllerConfiguration configuration,
CustomResource resource,
Context context) {
final var name = configuration.getName();
public <T> T timeControllerExecution(ControllerExecution<T> execution) {
final var name = execution.controllerName();
final var execName = "operator.sdk.controllers.execution." + execution.name();
final var timer =
Timer.builder("operator.sdk.controllers.execution.delete")
Timer.builder(execName)
.tags("controller", name)
.publishPercentiles(0.3, 0.5, 0.95)
.publishPercentileHistogram()
.register(registry);
try {
final var result = timer.record(() -> controller.deleteResource(resource, context));
String successType = "notDelete";
if (result == DeleteControl.DEFAULT_DELETE) {
successType = "delete";
}
final var result = timer.record(execution::execute);
final var successType = execution.successTypeName(result);
registry
.counter(
"operator.sdk.controllers.execution.success", "controller", name, "type", successType)
.counter(execName + ".success", "controller", name, "type", successType)
.increment();
return result;
} catch (Exception e) {
final var exception = e.getClass().getSimpleName();
registry
.counter(
"operator.sdk.controllers.execution.failure",
"controller",
name,
"exception",
e.getClass().getSimpleName())
.counter(execName + ".failure", "controller", name, "exception", exception)
.increment();
throw e;
}
}

public void timeControllerRetry() {
public void incrementControllerRetriesNumber() {

registry
.counter(
@@ -107,7 +77,7 @@ public void timeControllerRetry() {

}

public void timeControllerEvents() {
public void incrementProcessedEventsNumber() {

registry
.counter(
Loading