Skip to content

Commit c92540e

Browse files
committed
feat: extract micrometer support into its own module
Fixes #576. This allows getting rid of mandatory micrometer dependency if users are not interested in having metrics.
1 parent e0da323 commit c92540e

File tree

5 files changed

+107
-138
lines changed

5 files changed

+107
-138
lines changed

micrometer-support/pom.xml

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>java-operator-sdk</artifactId>
7+
<groupId>io.javaoperatorsdk</groupId>
8+
<version>1.9.8-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>micrometer-support</artifactId>
13+
<name>Operator SDK - Micrometer Support</name>
14+
15+
<properties>
16+
<maven.compiler.source>11</maven.compiler.source>
17+
<maven.compiler.target>11</maven.compiler.target>
18+
</properties>
19+
20+
<dependencies>
21+
<dependency>
22+
<groupId>io.micrometer</groupId>
23+
<artifactId>micrometer-core</artifactId>
24+
</dependency>
25+
<dependency>
26+
<groupId>io.javaoperatorsdk</groupId>
27+
<artifactId>operator-framework-core</artifactId>
28+
</dependency>
29+
</dependencies>
30+
31+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package io.javaoperatorsdk.operator.micrometer;
2+
3+
import java.util.Collections;
4+
import java.util.Map;
5+
6+
import io.javaoperatorsdk.operator.Metrics;
7+
import io.javaoperatorsdk.operator.Metrics.ControllerExecution;
8+
import io.micrometer.core.instrument.MeterRegistry;
9+
import io.micrometer.core.instrument.Timer;
10+
11+
public class MicrometerMetrics implements Metrics {
12+
13+
public static final String PREFIX = "operator.sdk.";
14+
private final MeterRegistry registry;
15+
16+
public MicrometerMetrics(MeterRegistry registry) {
17+
this.registry = registry;
18+
}
19+
20+
public <T> T timeControllerExecution(ControllerExecution<T> execution) {
21+
final var name = execution.controllerName();
22+
final var execName = PREFIX + "controllers.execution." + execution.name();
23+
final var timer =
24+
Timer.builder(execName)
25+
.tags("controller", name)
26+
.publishPercentiles(0.3, 0.5, 0.95)
27+
.publishPercentileHistogram()
28+
.register(registry);
29+
try {
30+
final var result = timer.record(execution::execute);
31+
final var successType = execution.successTypeName(result);
32+
registry
33+
.counter(execName + ".success", "controller", name, "type", successType)
34+
.increment();
35+
return result;
36+
} catch (Exception e) {
37+
final var exception = e.getClass().getSimpleName();
38+
registry
39+
.counter(execName + ".failure", "controller", name, "exception", exception)
40+
.increment();
41+
throw e;
42+
}
43+
}
44+
45+
public void incrementControllerRetriesNumber() {
46+
registry
47+
.counter(
48+
PREFIX + "retry.on.exception", "retry", "retryCounter", "type",
49+
"retryException")
50+
.increment();
51+
52+
}
53+
54+
public void incrementProcessedEventsNumber() {
55+
registry
56+
.counter(
57+
PREFIX + "total.events.received", "events", "totalEvents", "type",
58+
"eventsReceived")
59+
.increment();
60+
61+
}
62+
63+
public <T extends Map<?, ?>> T monitorSizeOf(T map, String name) {
64+
return registry.gaugeMapSize(PREFIX + name + ".size", Collections.emptyList(), map);
65+
}
66+
}

operator-framework-core/pom.xml

-4
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,6 @@
6262
<groupId>org.slf4j</groupId>
6363
<artifactId>slf4j-api</artifactId>
6464
</dependency>
65-
<dependency>
66-
<groupId>io.micrometer</groupId>
67-
<artifactId>micrometer-core</artifactId>
68-
</dependency>
6965

7066
<dependency>
7167
<groupId>org.junit.jupiter</groupId>
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,12 @@
11
package io.javaoperatorsdk.operator;
22

3-
import java.util.Collections;
43
import java.util.Map;
5-
import java.util.concurrent.TimeUnit;
6-
import java.util.function.ToDoubleFunction;
7-
import java.util.function.ToLongFunction;
84

9-
import io.micrometer.core.instrument.Clock;
10-
import io.micrometer.core.instrument.Counter;
11-
import io.micrometer.core.instrument.DistributionSummary;
12-
import io.micrometer.core.instrument.FunctionCounter;
13-
import io.micrometer.core.instrument.FunctionTimer;
14-
import io.micrometer.core.instrument.Gauge;
15-
import io.micrometer.core.instrument.Measurement;
16-
import io.micrometer.core.instrument.Meter;
17-
import io.micrometer.core.instrument.MeterRegistry;
18-
import io.micrometer.core.instrument.Timer;
19-
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
20-
import io.micrometer.core.instrument.distribution.pause.PauseDetector;
21-
import io.micrometer.core.instrument.noop.NoopCounter;
22-
import io.micrometer.core.instrument.noop.NoopDistributionSummary;
23-
import io.micrometer.core.instrument.noop.NoopFunctionCounter;
24-
import io.micrometer.core.instrument.noop.NoopFunctionTimer;
25-
import io.micrometer.core.instrument.noop.NoopGauge;
26-
import io.micrometer.core.instrument.noop.NoopMeter;
27-
import io.micrometer.core.instrument.noop.NoopTimer;
5+
public interface Metrics {
6+
Metrics NOOP = new Metrics() {};
287

29-
public class Metrics {
30-
public static final Metrics NOOP = new Metrics(new NoopMeterRegistry(Clock.SYSTEM));
31-
public static final String PREFIX = "operator.sdk.";
32-
private final MeterRegistry registry;
338

34-
public Metrics(MeterRegistry registry) {
35-
this.registry = registry;
36-
}
37-
38-
public interface ControllerExecution<T> {
9+
interface ControllerExecution<T> {
3910
String name();
4011

4112
String controllerName();
@@ -45,111 +16,15 @@ public interface ControllerExecution<T> {
4516
T execute();
4617
}
4718

48-
public <T> T timeControllerExecution(ControllerExecution<T> execution) {
49-
final var name = execution.controllerName();
50-
final var execName = PREFIX + "controllers.execution." + execution.name();
51-
final var timer =
52-
Timer.builder(execName)
53-
.tags("controller", name)
54-
.publishPercentiles(0.3, 0.5, 0.95)
55-
.publishPercentileHistogram()
56-
.register(registry);
57-
try {
58-
final var result = timer.record(execution::execute);
59-
final var successType = execution.successTypeName(result);
60-
registry
61-
.counter(execName + ".success", "controller", name, "type", successType)
62-
.increment();
63-
return result;
64-
} catch (Exception e) {
65-
final var exception = e.getClass().getSimpleName();
66-
registry
67-
.counter(execName + ".failure", "controller", name, "exception", exception)
68-
.increment();
69-
throw e;
70-
}
71-
}
72-
73-
public void incrementControllerRetriesNumber() {
74-
registry
75-
.counter(
76-
PREFIX + "retry.on.exception", "retry", "retryCounter", "type",
77-
"retryException")
78-
.increment();
79-
19+
default <T> T timeControllerExecution(ControllerExecution<T> execution) {
20+
return execution.execute();
8021
}
8122

82-
public void incrementProcessedEventsNumber() {
83-
registry
84-
.counter(
85-
PREFIX + "total.events.received", "events", "totalEvents", "type",
86-
"eventsReceived")
87-
.increment();
88-
89-
}
90-
91-
public <T extends Map<?, ?>> T monitorSizeOf(T map, String name) {
92-
return registry.gaugeMapSize(PREFIX + name + ".size", Collections.emptyList(), map);
93-
}
94-
95-
public static class NoopMeterRegistry extends MeterRegistry {
96-
public NoopMeterRegistry(Clock clock) {
97-
super(clock);
98-
}
99-
100-
@Override
101-
protected <T> Gauge newGauge(Meter.Id id, T t, ToDoubleFunction<T> toDoubleFunction) {
102-
return new NoopGauge(id);
103-
}
104-
105-
@Override
106-
protected Counter newCounter(Meter.Id id) {
107-
return new NoopCounter(id);
108-
}
109-
110-
@Override
111-
protected Timer newTimer(
112-
Meter.Id id,
113-
DistributionStatisticConfig distributionStatisticConfig,
114-
PauseDetector pauseDetector) {
115-
return new NoopTimer(id);
116-
}
117-
118-
@Override
119-
protected DistributionSummary newDistributionSummary(
120-
Meter.Id id, DistributionStatisticConfig distributionStatisticConfig, double v) {
121-
return new NoopDistributionSummary(id);
122-
}
123-
124-
@Override
125-
protected Meter newMeter(Meter.Id id, Meter.Type type, Iterable<Measurement> iterable) {
126-
return new NoopMeter(id);
127-
}
128-
129-
@Override
130-
protected <T> FunctionTimer newFunctionTimer(
131-
Meter.Id id,
132-
T t,
133-
ToLongFunction<T> toLongFunction,
134-
ToDoubleFunction<T> toDoubleFunction,
135-
TimeUnit timeUnit) {
136-
return new NoopFunctionTimer(id);
137-
}
138-
139-
@Override
140-
protected <T> FunctionCounter newFunctionCounter(
141-
Meter.Id id, T t, ToDoubleFunction<T> toDoubleFunction) {
142-
return new NoopFunctionCounter(id);
143-
}
23+
default void incrementControllerRetriesNumber() {}
14424

145-
@Override
146-
protected TimeUnit getBaseTimeUnit() {
147-
return TimeUnit.SECONDS;
148-
}
25+
default void incrementProcessedEventsNumber() {}
14926

150-
@Override
151-
protected DistributionStatisticConfig defaultHistogramConfig() {
152-
return DistributionStatisticConfig.NONE;
153-
}
27+
default <T extends Map<?, ?>> T monitorSizeOf(T map, String name) {
28+
return map;
15429
}
15530
}

pom.xml

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
<module>operator-framework-junit5</module>
7979
<module>operator-framework</module>
8080
<module>samples</module>
81+
<module>micrometer-support</module>
8182
</modules>
8283

8384

0 commit comments

Comments
 (0)