Skip to content

Commit b206856

Browse files
authored
feat(preset): add preset template and rule for Hibernate JFR (#750)
1 parent fceff9d commit b206856

File tree

7 files changed

+100
-34
lines changed

7 files changed

+100
-34
lines changed

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
<quarkus.platform.group-id>io.quarkus.platform</quarkus.platform.group-id>
4747
<quarkus.platform.version>3.15.3</quarkus.platform.version>
4848
<quarkus-quinoa.version>2.5.1</quarkus-quinoa.version>
49+
<org.hibernate.orm.hibernate.jfr.version>6.6.3.Final</org.hibernate.orm.hibernate.jfr.version><!-- TODO is there some way to grab the Hibernate version used by Quarkus to match this version? -->
4950
<org.codehaus.mojo.build.helper.plugin.version>3.6.0</org.codehaus.mojo.build.helper.plugin.version>
5051
<org.codehaus.mojo.exec.plugin.version>3.5.0</org.codehaus.mojo.exec.plugin.version>
5152
<assembly-plugin.version>3.7.1</assembly-plugin.version>
@@ -199,6 +200,11 @@
199200
<groupId>io.quarkus</groupId>
200201
<artifactId>quarkus-hibernate-validator</artifactId>
201202
</dependency>
203+
<dependency>
204+
<groupId>org.hibernate.orm</groupId>
205+
<artifactId>hibernate-jfr</artifactId>
206+
<version>${org.hibernate.orm.hibernate.jfr.version}</version>
207+
</dependency>
202208
<dependency>
203209
<groupId>io.quarkus</groupId>
204210
<artifactId>quarkus-jdbc-postgresql</artifactId>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"name": "hibernate",
3+
"description": "Preset Automated Rule for enabling Hibernate ORM events when available",
4+
"eventSpecifier": "template=Hibernate,type=PRESET",
5+
"matchExpression": "jfrEventTypeIds(target).exists(x, x.startsWith(\"org.hibernate.orm.\"))",
6+
"enabled": false
7+
}

src/main/docker/include/rule_presets/quarkus.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
"name": "quarkus",
33
"description": "Preset Automated Rule for enabling Quarkus framework-specific events when available",
44
"eventSpecifier": "template=Quarkus,type=PRESET",
5-
"matchExpression": "jfrEventTypeIds(target).exists(x, x.startsWith(\"quarkus\"))",
5+
"matchExpression": "jfrEventTypeIds(target).exists(x, x.startsWith(\"quarkus.\"))",
66
"enabled": false
77
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<configuration version="2.0" label="Hibernate" description="Hibernate ORM events" provider="Cryostat">
3+
<event name="org.hibernate.orm.CacheGet">
4+
<setting name="enabled">true</setting>
5+
</event>
6+
<event name="org.hibernate.orm.CachePut">
7+
<setting name="enabled">true</setting>
8+
</event>
9+
<event name="org.hibernate.orm.DirtyCalculationEvent">
10+
<setting name="enabled">true</setting>
11+
</event>
12+
<event name="org.hibernate.orm.FlushEvent">
13+
<setting name="enabled">true</setting>
14+
</event>
15+
<event name="org.hibernate.orm.JdbcBatchExecution">
16+
<setting name="enabled">true</setting>
17+
</event>
18+
<event name="org.hibernate.orm.JdbcConnectionAcquisition">
19+
<setting name="enabled">true</setting>
20+
</event>
21+
<event name="org.hibernate.orm.JdbcConnectionRelease">
22+
<setting name="enabled">true</setting>
23+
</event>
24+
<event name="org.hibernate.orm.JdbcPreparedStatementCreation">
25+
<setting name="enabled">true</setting>
26+
</event>
27+
<event name="org.hibernate.orm.JdbcPreparedStatementExecution">
28+
<setting name="enabled">true</setting>
29+
</event>
30+
<event name="org.hibernate.orm.PartialFlushEvent">
31+
<setting name="enabled">true</setting>
32+
</event>
33+
<event name="org.hibernate.orm.PrePartialFlushEvent">
34+
<setting name="enabled">true</setting>
35+
</event>
36+
<event name="org.hibernate.orm.SessionClosed">
37+
<setting name="enabled">true</setting>
38+
</event>
39+
<event name="org.hibernate.orm.SessionOpen">
40+
<setting name="enabled">true</setting>
41+
</event>
42+
</configuration>
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<configuration version="2.0" label="Quarkus" description="Quarkus-specific REST events" provider="Cryostat">
3-
<event name="quarkus.Rest">
4-
<setting name="enabled">true</setting>
5-
</event>
6-
<event name="quarkus.RestStart">
7-
<setting name="enabled">true</setting>
8-
</event>
9-
<event name="quarkus.RestEnd">
10-
<setting name="enabled">true</setting>
11-
</event>
3+
<event name="quarkus.Rest">
4+
<setting name="enabled">true</setting>
5+
</event>
6+
<event name="quarkus.RestStart">
7+
<setting name="enabled">true</setting>
8+
</event>
9+
<event name="quarkus.RestEnd">
10+
<setting name="enabled">true</setting>
11+
</event>
1212
</configuration>

src/test/java/itest/PresetRulesIT.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
package itest;
1717

1818
import java.io.File;
19+
import java.util.Arrays;
20+
import java.util.List;
1921
import java.util.concurrent.CompletableFuture;
2022
import java.util.concurrent.TimeUnit;
2123

@@ -29,10 +31,14 @@
2931
import org.hamcrest.MatcherAssert;
3032
import org.hamcrest.Matchers;
3133
import org.junit.jupiter.api.Test;
34+
import org.junit.jupiter.params.ParameterizedTest;
35+
import org.junit.jupiter.params.provider.MethodSource;
3236

3337
@QuarkusIntegrationTest
3438
public class PresetRulesIT extends StandardSelfTest {
3539

40+
static final String[] RULE_NAMES = new String[] {"quarkus", "hibernate"};
41+
3642
@Test
3743
public void shouldListPresetRules() throws Exception {
3844
CompletableFuture<JsonArray> future = new CompletableFuture<>();
@@ -46,32 +52,26 @@ public void shouldListPresetRules() throws Exception {
4652
future.complete(ar.result().bodyAsJsonArray());
4753
});
4854
JsonArray response = future.get(REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS);
49-
MatcherAssert.assertThat(response.size(), Matchers.equalTo(1));
55+
MatcherAssert.assertThat(response.size(), Matchers.equalTo(RULE_NAMES.length));
5056
}
5157

52-
@Test
53-
public void shouldHavePresetQuarkusRule() throws Exception {
54-
String url = "/api/v4/rules/quarkus";
58+
static List<String> ruleNames() {
59+
return Arrays.asList(RULE_NAMES);
60+
}
61+
62+
@ParameterizedTest
63+
@MethodSource("ruleNames")
64+
public void shouldHavePresetRules(String ruleName) throws Exception {
65+
String url = String.format("/api/v4/rules/%s", ruleName);
5566
File file =
56-
downloadFile(url, "quarkus", ".json")
67+
downloadFile(url, ruleName, ".json")
5768
.get(REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS)
5869
.toFile();
5970

6071
ObjectMapper mapper = new ObjectMapper();
6172
JsonNode json = mapper.readTree(file);
6273

63-
MatcherAssert.assertThat(json.get("name").asText(), Matchers.equalTo("quarkus"));
64-
MatcherAssert.assertThat(
65-
json.get("description").asText(),
66-
Matchers.equalTo(
67-
"Preset Automated Rule for enabling Quarkus framework-specific events when"
68-
+ " available"));
69-
MatcherAssert.assertThat(
70-
json.get("eventSpecifier").asText(),
71-
Matchers.equalTo("template=Quarkus,type=PRESET"));
72-
MatcherAssert.assertThat(
73-
json.get("matchExpression").asText(),
74-
Matchers.equalTo("jfrEventTypeIds(target).exists(x, x.startsWith(\"quarkus\"))"));
74+
MatcherAssert.assertThat(json.get("name").asText(), Matchers.equalTo(ruleName));
7575
MatcherAssert.assertThat(json.get("enabled").asBoolean(), Matchers.is(false));
7676
}
7777
}

src/test/java/itest/PresetTemplatesIT.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
package itest;
1717

1818
import java.io.File;
19+
import java.util.Arrays;
20+
import java.util.List;
1921
import java.util.concurrent.CompletableFuture;
2022
import java.util.concurrent.TimeUnit;
2123

@@ -33,10 +35,14 @@
3335
import org.hamcrest.Matchers;
3436
import org.junit.jupiter.api.Assertions;
3537
import org.junit.jupiter.api.Test;
38+
import org.junit.jupiter.params.ParameterizedTest;
39+
import org.junit.jupiter.params.provider.MethodSource;
3640

3741
@QuarkusIntegrationTest
3842
public class PresetTemplatesIT extends StandardSelfTest {
3943

44+
static final String[] TEMPLATE_NAMES = new String[] {"Quarkus", "Hibernate"};
45+
4046
@Test
4147
public void shouldListPresetTemplates() throws Exception {
4248
CompletableFuture<JsonArray> future = new CompletableFuture<>();
@@ -50,14 +56,19 @@ public void shouldListPresetTemplates() throws Exception {
5056
future.complete(ar.result().bodyAsJsonArray());
5157
});
5258
JsonArray response = future.get(REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS);
53-
MatcherAssert.assertThat(response.size(), Matchers.equalTo(1));
59+
MatcherAssert.assertThat(response.size(), Matchers.equalTo(TEMPLATE_NAMES.length));
5460
}
5561

56-
@Test
57-
public void shouldHavePresetQuarkusTemplate() throws Exception {
58-
String url = "/api/v4/event_templates/PRESET/Quarkus";
62+
static List<String> templateNames() {
63+
return Arrays.asList(TEMPLATE_NAMES);
64+
}
65+
66+
@ParameterizedTest
67+
@MethodSource("templateNames")
68+
public void shouldHaveExpectedPresetTemplates(String templateName) throws Exception {
69+
String url = String.format("/api/v4/event_templates/PRESET/%s", templateName);
5970
File file =
60-
downloadFile(url, "quarkus", ".jfc")
71+
downloadFile(url, templateName, ".jfc")
6172
.get(REQUEST_TIMEOUT_SECONDS, TimeUnit.SECONDS)
6273
.toFile();
6374

@@ -77,7 +88,7 @@ public void shouldHavePresetQuarkusTemplate() throws Exception {
7788

7889
MatcherAssert.assertThat(labelAttr, Matchers.notNullValue());
7990

80-
String templateName = labelAttr.getExplicitValue();
81-
MatcherAssert.assertThat(templateName, Matchers.equalTo("Quarkus"));
91+
String name = labelAttr.getExplicitValue();
92+
MatcherAssert.assertThat(name, Matchers.equalTo(templateName));
8293
}
8394
}

0 commit comments

Comments
 (0)