Skip to content

Commit e5d91eb

Browse files
Cleaned up the code
1 parent 6a2943b commit e5d91eb

5 files changed

Lines changed: 88 additions & 45 deletions

File tree

ojdbc-provider-observability/pom.xml

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,6 @@
5050
<artifactId>junit-jupiter-params</artifactId>
5151
<scope>test</scope>
5252
</dependency>
53-
<dependency>
54-
<groupId>io.opentelemetry</groupId>
55-
<artifactId>opentelemetry-sdk</artifactId>
56-
<version>${opentelemetry.version}</version>
57-
<scope>test</scope>
58-
</dependency>
59-
<dependency>
60-
<groupId>io.opentelemetry</groupId>
61-
<artifactId>opentelemetry-sdk-testing</artifactId>
62-
<version>${opentelemetry.version}</version>
63-
<scope>test</scope>
64-
</dependency>
6553
<dependency>
6654
<artifactId>ojdbc-provider-common</artifactId>
6755
<groupId>com.oracle.database.jdbc</groupId>

ojdbc-provider-observability/src/main/java/oracle/ucp/provider/observability/jfr/core/UCPEventFactory.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class UCPEventFactory {
2626
* @throws NullPointerException if parameters are null
2727
*/
2828
public static Event createEvent(
29-
UCPEventListener.EventType type, UCPEventContext ctx) {
29+
UCPEventListener.EventType type, UCPEventContext ctx) {
3030
Objects.requireNonNull(type, "EventType cannot be null");
3131
switch (type) {
3232
// Pool Lifecycle Events
@@ -61,25 +61,20 @@ public static Event createEvent(
6161

6262
default:
6363
throw new IllegalStateException(
64-
"Unexpected event type: " + type);
64+
"Unexpected event type: " + type);
6565
}
6666
}
6767

6868
/**
6969
* Creates and immediately records a JFR event for the UCP
70-
* operation. POOL_RESTARTING and POOL_RESTARTED events are
71-
* silently ignored.
70+
* operation.
7271
*
7372
* @param type UCP event type to record
7473
* @param ctx event context with pool metrics
7574
* @throws NullPointerException if parameters are null
7675
*/
7776
public static void recordEvent(
78-
UCPEventListener.EventType type, UCPEventContext ctx) {
79-
if (type == UCPEventListener.EventType.POOL_RESTARTING
80-
|| type == UCPEventListener.EventType.POOL_RESTARTED) {
81-
return;
82-
}
77+
UCPEventListener.EventType type, UCPEventContext ctx) {
8378
Event event = createEvent(type, ctx);
8479
event.commit();
8580
}

ojdbc-provider-observability/src/main/java/oracle/ucp/provider/observability/otel/OtelUCPEventListenerProvider.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@
2222
public final class OtelUCPEventListenerProvider
2323
implements UCPEventListenerProvider {
2424

25-
private static final UCPEventListener LISTENER =
26-
new OtelUCPEventListener();
25+
private final UCPEventListener listener = new OtelUCPEventListener();
2726

2827
@Override
2928
public String getName() {
@@ -32,7 +31,7 @@ public String getName() {
3231

3332
@Override
3433
public UCPEventListener getListener(Map<String, String> config) {
35-
return LISTENER;
34+
return listener;
3635
}
3736

3837
/**

ojdbc-provider-observability/src/test/java/oracle/ucp/provider/observability/JFRUCPEventListenerProviderTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,48 @@ public void testRecordedEventContainsMetrics() throws IOException {
226226
Files.deleteIfExists(recordingFile);
227227
}
228228

229+
@Test
230+
public void testRecordedEventContainsAvgWaitTime() throws IOException {
231+
UCPEventContext ctx = new UCPEventContext() {
232+
@Override public String poolName() { return "wait-pool"; }
233+
@Override public long timestamp() {
234+
return System.currentTimeMillis();
235+
}
236+
@Override public int borrowedConnectionsCount() { return 1; }
237+
@Override public int availableConnectionsCount() { return 1; }
238+
@Override public int totalConnections() { return 2; }
239+
@Override public int maxPoolSize() { return 10; }
240+
@Override public int minPoolSize() { return 2; }
241+
@Override public long getAverageConnectionWaitTime() { return 42; }
242+
@Override public int createdConnections() { return 2; }
243+
@Override public int closedConnections() { return 0; }
244+
@Override public String formattedTimestamp() {
245+
return new SimpleDateFormat("MMMM dd, yyyy HH:mm:ss.SSS z")
246+
.format(new Date(timestamp()));
247+
}
248+
};
249+
250+
UCPEventFactory.recordEvent(EventType.CONNECTION_BORROWED, ctx);
251+
252+
if (recording.getState() == RecordingState.RUNNING) {
253+
recording.stop();
254+
}
255+
Path recordingFile = Files.createTempFile("ucp-test", ".jfr");
256+
recording.dump(recordingFile);
257+
258+
RecordedEvent ucpEvent = RecordingFile.readAllEvents(recordingFile)
259+
.stream()
260+
.filter(e -> e.getEventType().getName()
261+
.equals("ucp.ConnectionBorrowed"))
262+
.findFirst()
263+
.orElse(null);
264+
265+
assertNotNull(ucpEvent, "Should find ConnectionBorrowed event");
266+
assertEquals(42L, ucpEvent.getLong("avgWaitTime"));
267+
268+
Files.deleteIfExists(recordingFile);
269+
}
270+
229271
@Test
230272
public void testEmptyPoolNameAccepted() {
231273
UCPEventContext ctx = createTestContext("", 1, 1, 10, 2);

ojdbc-provider-observability/src/test/java/oracle/ucp/provider/observability/OtelUCPTest.java

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package oracle.ucp.provider.observability;
22

33
import io.opentelemetry.api.GlobalOpenTelemetry;
4-
import io.opentelemetry.sdk.OpenTelemetrySdk;
5-
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
6-
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader;
4+
import io.opentelemetry.api.OpenTelemetry;
75
import oracle.ucp.events.core.UCPEventContext;
86
import oracle.ucp.events.core.UCPEventListener;
97
import oracle.ucp.provider.observability.otel.OtelUCPEventListenerProvider;
108
import org.junit.jupiter.api.AfterEach;
119
import org.junit.jupiter.api.BeforeEach;
1210
import org.junit.jupiter.api.Test;
11+
import org.mockito.Mockito;
1312

1413
import java.text.SimpleDateFormat;
1514
import java.util.Date;
@@ -20,22 +19,15 @@
2019

2120
public class OtelUCPTest {
2221

23-
private InMemoryMetricReader metricReader;
2422
private OtelUCPEventListenerProvider provider;
2523
private UCPEventListener listener;
2624

2725
@BeforeEach
2826
public void setup() {
2927
GlobalOpenTelemetry.resetForTest();
30-
31-
metricReader = InMemoryMetricReader.create();
32-
SdkMeterProvider meterProvider = SdkMeterProvider.builder()
33-
.registerMetricReader(metricReader)
34-
.build();
35-
36-
OpenTelemetrySdk.builder()
37-
.setMeterProvider(meterProvider)
38-
.buildAndRegisterGlobal();
28+
OpenTelemetry mockOTel = Mockito.mock(
29+
OpenTelemetry.class, Mockito.RETURNS_DEEP_STUBS);
30+
GlobalOpenTelemetry.set(mockOTel);
3931

4032
provider = new OtelUCPEventListenerProvider();
4133
listener = provider.getListener(null);
@@ -102,19 +94,46 @@ public void testNullEventTypeIgnored() {
10294
listener.onUCPEvent(null, ctx);
10395
}
10496

105-
@Test
106-
public void testEmptyPoolNameAccepted() {
107-
UCPEventContext ctx = createTestContext("", 1, 1, 10, 2);
108-
listener.onUCPEvent(EventType.CONNECTION_BORROWED, ctx);
109-
}
110-
11197
@Test
11298
public void testVeryLongPoolNameAccepted() {
11399
String longName = new String(new char[1000]).replace('\0', 'a');
114100
UCPEventContext ctx = createTestContext(longName, 1, 1, 10, 2);
115101
listener.onUCPEvent(EventType.POOL_CREATED, ctx);
116102
}
117103

104+
@Test
105+
public void testRapidFireEvents() {
106+
UCPEventContext ctx = createTestContext("rapid-pool", 1, 1, 10, 2);
107+
108+
for (int i = 0; i < 1000; i++) {
109+
listener.onUCPEvent(EventType.CONNECTION_BORROWED, ctx);
110+
}
111+
}
112+
113+
@Test
114+
public void testAllLifecycleEventsInSequence() {
115+
UCPEventContext ctx = createTestContext("lifecycle-pool", 1, 1, 10, 2);
116+
117+
listener.onUCPEvent(EventType.POOL_CREATED, ctx);
118+
listener.onUCPEvent(EventType.POOL_STARTING, ctx);
119+
listener.onUCPEvent(EventType.POOL_STARTED, ctx);
120+
listener.onUCPEvent(EventType.CONNECTION_CREATED, ctx);
121+
listener.onUCPEvent(EventType.CONNECTION_BORROWED, ctx);
122+
listener.onUCPEvent(EventType.CONNECTION_RETURNED, ctx);
123+
listener.onUCPEvent(EventType.POOL_REFRESHED, ctx);
124+
listener.onUCPEvent(EventType.POOL_RECYCLED, ctx);
125+
listener.onUCPEvent(EventType.POOL_PURGED, ctx);
126+
listener.onUCPEvent(EventType.CONNECTION_CLOSED, ctx);
127+
listener.onUCPEvent(EventType.POOL_STOPPED, ctx);
128+
listener.onUCPEvent(EventType.POOL_DESTROYED, ctx);
129+
}
130+
131+
@Test
132+
public void testEmptyPoolNameAccepted() {
133+
UCPEventContext ctx = createTestContext("", 1, 1, 10, 2);
134+
listener.onUCPEvent(EventType.CONNECTION_BORROWED, ctx);
135+
}
136+
118137
@Test
119138
public void testZeroValuesAccepted() {
120139
UCPEventContext ctx = createTestContext("pool1", 0, 0, 0, 0);
@@ -145,8 +164,8 @@ public void testConcurrentAccess() throws InterruptedException {
145164
final int threadId = i;
146165
threads[i] = new Thread(() -> {
147166
for (int j = 0; j < 10; j++) {
148-
UCPEventContext ctx = createTestContext("pool" + threadId, j, j,
149-
10, 2);
167+
UCPEventContext ctx = createTestContext(
168+
"pool" + threadId, j, j, 10, 2);
150169
listener.onUCPEvent(EventType.CONNECTION_BORROWED, ctx);
151170
}
152171
});

0 commit comments

Comments
 (0)