Skip to content

Commit 2251a88

Browse files
authored
Cassandra support and integration test added. (#1515)
1 parent cdde090 commit 2251a88

File tree

3 files changed

+319
-1
lines changed

3 files changed

+319
-1
lines changed

jmx-scraper/src/integrationTest/java/io/opentelemetry/contrib/jmxscraper/JmxScraperContainer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class JmxScraperContainer extends GenericContainer<JmxScraperContainer> {
2828
private final Set<String> customYamlFiles;
2929

3030
public JmxScraperContainer(String otlpEndpoint) {
31-
super("openjdk:8u272-jre-slim");
31+
super("openjdk:8u342-jre-slim");
3232

3333
String scraperJarPath = System.getProperty("shadow.jar.path");
3434
assertThat(scraperJarPath).isNotNull();
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.contrib.jmxscraper.target_systems;
7+
8+
import static io.opentelemetry.contrib.jmxscraper.target_systems.MetricAssertions.assertGauge;
9+
import static io.opentelemetry.contrib.jmxscraper.target_systems.MetricAssertions.assertSum;
10+
import static io.opentelemetry.contrib.jmxscraper.target_systems.MetricAssertions.assertSumWithAttributes;
11+
import static org.assertj.core.api.Assertions.entry;
12+
13+
import io.opentelemetry.contrib.jmxscraper.JmxScraperContainer;
14+
import java.time.Duration;
15+
import java.util.Arrays;
16+
import java.util.List;
17+
import java.util.function.Consumer;
18+
import org.assertj.core.api.MapAssert;
19+
import org.testcontainers.containers.GenericContainer;
20+
import org.testcontainers.containers.wait.strategy.Wait;
21+
import org.testcontainers.images.builder.ImageFromDockerfile;
22+
23+
public class CassandraIntegrationTest extends TargetSystemIntegrationTest {
24+
25+
@Override
26+
protected GenericContainer<?> createTargetContainer(int jmxPort) {
27+
return new GenericContainer<>(
28+
new ImageFromDockerfile()
29+
.withDockerfileFromBuilder(builder -> builder.from("cassandra:5.0.2").build()))
30+
.withEnv(
31+
"JVM_EXTRA_OPTS",
32+
" -Dcassandra.jmx.remote.port="
33+
+ jmxPort
34+
+ " -Dcom.sun.management.jmxremote.rmi.port="
35+
+ jmxPort
36+
+ " -Dcom.sun.management.jmxremote.local.only=false"
37+
+ " -Dcom.sun.management.jmxremote.ssl=false"
38+
+ " -Dcom.sun.management.jmxremote.authenticate=false")
39+
.withStartupTimeout(Duration.ofMinutes(2))
40+
.waitingFor(Wait.forLogMessage(".*Startup complete.*", 1));
41+
}
42+
43+
@Override
44+
protected JmxScraperContainer customizeScraperContainer(JmxScraperContainer scraper) {
45+
return scraper.withTargetSystem("cassandra");
46+
}
47+
48+
@Override
49+
protected void verifyMetrics() {
50+
waitAndAssertMetrics(
51+
metric ->
52+
assertGauge(
53+
metric,
54+
"cassandra.client.request.range_slice.latency.50p",
55+
"Token range read request latency - 50th percentile",
56+
"us"),
57+
metric ->
58+
assertGauge(
59+
metric,
60+
"cassandra.client.request.range_slice.latency.99p",
61+
"Token range read request latency - 99th percentile",
62+
"us"),
63+
metric ->
64+
assertGauge(
65+
metric,
66+
"cassandra.client.request.range_slice.latency.max",
67+
"Maximum token range read request latency",
68+
"us"),
69+
metric ->
70+
assertGauge(
71+
metric,
72+
"cassandra.client.request.read.latency.50p",
73+
"Standard read request latency - 50th percentile",
74+
"us"),
75+
metric ->
76+
assertGauge(
77+
metric,
78+
"cassandra.client.request.read.latency.99p",
79+
"Standard read request latency - 99th percentile",
80+
"us"),
81+
metric ->
82+
assertGauge(
83+
metric,
84+
"cassandra.client.request.read.latency.max",
85+
"Maximum standard read request latency",
86+
"us"),
87+
metric ->
88+
assertGauge(
89+
metric,
90+
"cassandra.client.request.write.latency.50p",
91+
"Regular write request latency - 50th percentile",
92+
"us"),
93+
metric ->
94+
assertGauge(
95+
metric,
96+
"cassandra.client.request.write.latency.99p",
97+
"Regular write request latency - 99th percentile",
98+
"us"),
99+
metric ->
100+
assertGauge(
101+
metric,
102+
"cassandra.client.request.write.latency.max",
103+
"Maximum regular write request latency",
104+
"us"),
105+
metric ->
106+
assertSum(
107+
metric,
108+
"cassandra.compaction.tasks.completed",
109+
"Number of completed compactions since server [re]start",
110+
"1"),
111+
metric ->
112+
assertGauge(
113+
metric,
114+
"cassandra.compaction.tasks.pending",
115+
"Estimated number of compactions remaining to perform",
116+
"1"),
117+
metric ->
118+
assertSum(
119+
metric,
120+
"cassandra.storage.load.count",
121+
"Size of the on disk data size this node manages",
122+
"by",
123+
/* isMonotonic= */ false),
124+
metric ->
125+
assertSum(
126+
metric,
127+
"cassandra.storage.total_hints.count",
128+
"Number of hint messages written to this node since [re]start",
129+
"1"),
130+
metric ->
131+
assertSum(
132+
metric,
133+
"cassandra.storage.total_hints.in_progress.count",
134+
"Number of hints attempting to be sent currently",
135+
"1",
136+
/* isMonotonic= */ false),
137+
metric ->
138+
assertSumWithAttributes(
139+
metric,
140+
"cassandra.client.request.count",
141+
"Number of requests by operation",
142+
"1",
143+
attrs -> attrs.containsOnly(entry("operation", "RangeSlice")),
144+
attrs -> attrs.containsOnly(entry("operation", "Read")),
145+
attrs -> attrs.containsOnly(entry("operation", "Write"))),
146+
metric ->
147+
assertSumWithAttributes(
148+
metric,
149+
"cassandra.client.request.error.count",
150+
"Number of request errors by operation",
151+
"1",
152+
getRequestErrorCountAttributes()));
153+
}
154+
155+
@SuppressWarnings("unchecked")
156+
private static Consumer<MapAssert<String, String>>[] getRequestErrorCountAttributes() {
157+
List<String> operations = Arrays.asList("RangeSlice", "Read", "Write");
158+
List<String> statuses = Arrays.asList("Timeout", "Failure", "Unavailable");
159+
160+
return operations.stream()
161+
.flatMap(
162+
op ->
163+
statuses.stream()
164+
.map(
165+
st ->
166+
(Consumer<MapAssert<String, String>>)
167+
attrs ->
168+
attrs.containsOnly(
169+
entry("operation", op), entry("status", st))))
170+
.toArray(Consumer[]::new);
171+
}
172+
}
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
rules:
2+
3+
# Compaction task
4+
- bean: org.apache.cassandra.metrics:type=Compaction,name=CompletedTasks
5+
mapping:
6+
Value:
7+
metric: cassandra.compaction.tasks.completed
8+
type: counter
9+
unit: "1"
10+
desc: Number of completed compactions since server [re]start
11+
12+
- bean: org.apache.cassandra.metrics:type=Compaction,name=PendingTasks
13+
mapping:
14+
Value:
15+
metric: cassandra.compaction.tasks.pending
16+
type: gauge
17+
unit: "1"
18+
desc: Estimated number of compactions remaining to perform
19+
20+
# Storage
21+
- bean: org.apache.cassandra.metrics:type=Storage,name=Load
22+
mapping:
23+
Count:
24+
metric: cassandra.storage.load.count
25+
type: updowncounter
26+
unit: by
27+
desc: Size of the on disk data size this node manages
28+
29+
- bean: org.apache.cassandra.metrics:type=Storage,name=TotalHints
30+
mapping:
31+
Count:
32+
metric: cassandra.storage.total_hints.count
33+
type: counter
34+
unit: "1"
35+
desc: Number of hint messages written to this node since [re]start
36+
37+
- bean: org.apache.cassandra.metrics:type=Storage,name=TotalHintsInProgress
38+
mapping:
39+
Count:
40+
metric: cassandra.storage.total_hints.in_progress.count
41+
type: updowncounter
42+
unit: "1"
43+
desc: Number of hints attempting to be sent currently
44+
45+
# Client latency
46+
- bean: org.apache.cassandra.metrics:type=ClientRequest,scope=RangeSlice,name=Latency
47+
prefix: cassandra.client.request.range_slice.latency.
48+
unit: us
49+
type: gauge
50+
mapping:
51+
50thPercentile:
52+
metric: 50p
53+
desc: Token range read request latency - 50th percentile
54+
99thPercentile:
55+
metric: 99p
56+
desc: Token range read request latency - 99th percentile
57+
Max:
58+
metric: max
59+
desc: Maximum token range read request latency
60+
61+
- bean: org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Latency
62+
prefix: cassandra.client.request.read.latency.
63+
unit: us
64+
type: gauge
65+
mapping:
66+
50thPercentile:
67+
metric: 50p
68+
desc: Standard read request latency - 50th percentile
69+
99thPercentile:
70+
metric: 99p
71+
desc: Standard read request latency - 99th percentile
72+
Max:
73+
metric: max
74+
desc: Maximum standard read request latency
75+
76+
- bean: org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Latency
77+
prefix: cassandra.client.request.write.latency.
78+
unit: us
79+
type: gauge
80+
mapping:
81+
50thPercentile:
82+
metric: 50p
83+
desc: Regular write request latency - 50th percentile
84+
99thPercentile:
85+
metric: 99p
86+
desc: Regular write request latency - 99th percentile
87+
Max:
88+
metric: max
89+
desc: Maximum regular write request latency
90+
91+
# Client request count
92+
- beans:
93+
- org.apache.cassandra.metrics:type=ClientRequest,scope=RangeSlice,name=Latency
94+
- org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Latency
95+
- org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Latency
96+
metricAttribute:
97+
operation: param(scope)
98+
mapping:
99+
Count:
100+
metric: cassandra.client.request.count
101+
type: counter
102+
unit: "1"
103+
desc: Number of requests by operation
104+
105+
# Client error count
106+
- beans:
107+
- org.apache.cassandra.metrics:type=ClientRequest,scope=RangeSlice,name=Unavailables
108+
- org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Unavailables
109+
- org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Unavailables
110+
metricAttribute:
111+
operation: param(scope)
112+
status: const(Unavailable)
113+
mapping:
114+
Count:
115+
metric: cassandra.client.request.error.count
116+
type: counter
117+
unit: "1"
118+
desc: Number of request errors by operation
119+
120+
- beans:
121+
- org.apache.cassandra.metrics:type=ClientRequest,scope=RangeSlice,name=Timeouts
122+
- org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Timeouts
123+
- org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Timeouts
124+
metricAttribute:
125+
operation: param(scope)
126+
status: const(Timeout)
127+
mapping:
128+
Count:
129+
metric: cassandra.client.request.error.count
130+
type: counter
131+
unit: "1"
132+
desc: Number of request errors by operation
133+
134+
- beans:
135+
- org.apache.cassandra.metrics:type=ClientRequest,scope=RangeSlice,name=Failures
136+
- org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Failures
137+
- org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Failures
138+
metricAttribute:
139+
operation: param(scope)
140+
status: const(Failure)
141+
mapping:
142+
Count:
143+
metric: cassandra.client.request.error.count
144+
type: counter
145+
unit: "1"
146+
desc: Number of request errors by operation

0 commit comments

Comments
 (0)