Skip to content

Commit 8910a72

Browse files
committed
Cassandra support and integration test added.
1 parent a8b64c5 commit 8910a72

File tree

3 files changed

+323
-1
lines changed

3 files changed

+323
-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: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
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 java.time.Duration;
14+
import java.util.Arrays;
15+
import java.util.List;
16+
import java.util.function.Consumer;
17+
import io.opentelemetry.contrib.jmxscraper.JmxScraperContainer;
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(
30+
builder ->
31+
builder
32+
.from("cassandra:5.0.2")
33+
.build()))
34+
.withEnv(
35+
"JVM_EXTRA_OPTS",
36+
" -Dcassandra.jmx.remote.port="
37+
+ jmxPort
38+
+ " -Dcom.sun.management.jmxremote.rmi.port="
39+
+ jmxPort
40+
+ " -Dcom.sun.management.jmxremote.local.only=false"
41+
+ " -Dcom.sun.management.jmxremote.ssl=false"
42+
+ " -Dcom.sun.management.jmxremote.authenticate=false")
43+
.withStartupTimeout(Duration.ofMinutes(2))
44+
.waitingFor(Wait.forLogMessage(".*Startup complete.*", 1));
45+
}
46+
47+
@Override
48+
protected JmxScraperContainer customizeScraperContainer(JmxScraperContainer scraper) {
49+
return scraper.withTargetSystem("cassandra");
50+
}
51+
52+
@Override
53+
protected void verifyMetrics() {
54+
waitAndAssertMetrics(
55+
metric ->
56+
assertGauge(
57+
metric,
58+
"cassandra.client.request.range_slice.latency.50p",
59+
"Token range read request latency - 50th percentile",
60+
"us"),
61+
metric ->
62+
assertGauge(
63+
metric,
64+
"cassandra.client.request.range_slice.latency.99p",
65+
"Token range read request latency - 99th percentile",
66+
"us"),
67+
metric ->
68+
assertGauge(
69+
metric,
70+
"cassandra.client.request.range_slice.latency.max",
71+
"Maximum token range read request latency",
72+
"us"),
73+
metric ->
74+
assertGauge(
75+
metric,
76+
"cassandra.client.request.read.latency.50p",
77+
"Standard read request latency - 50th percentile",
78+
"us"),
79+
metric ->
80+
assertGauge(
81+
metric,
82+
"cassandra.client.request.read.latency.99p",
83+
"Standard read request latency - 99th percentile",
84+
"us"),
85+
metric ->
86+
assertGauge(
87+
metric,
88+
"cassandra.client.request.read.latency.max",
89+
"Maximum standard read request latency",
90+
"us"),
91+
metric ->
92+
assertGauge(
93+
metric,
94+
"cassandra.client.request.write.latency.50p",
95+
"Regular write request latency - 50th percentile",
96+
"us"),
97+
metric ->
98+
assertGauge(
99+
metric,
100+
"cassandra.client.request.write.latency.99p",
101+
"Regular write request latency - 99th percentile",
102+
"us"),
103+
metric ->
104+
assertGauge(
105+
metric,
106+
"cassandra.client.request.write.latency.max",
107+
"Maximum regular write request latency",
108+
"us"),
109+
metric ->
110+
assertSum(
111+
metric,
112+
"cassandra.compaction.tasks.completed",
113+
"Number of completed compactions since server [re]start",
114+
"1"),
115+
metric ->
116+
assertGauge(
117+
metric,
118+
"cassandra.compaction.tasks.pending",
119+
"Estimated number of compactions remaining to perform",
120+
"1"),
121+
metric ->
122+
assertSum(
123+
metric,
124+
"cassandra.storage.load.count",
125+
"Size of the on disk data size this node manages",
126+
"by",
127+
/* isMonotonic= */ false),
128+
metric ->
129+
assertSum(
130+
metric,
131+
"cassandra.storage.total_hints.count",
132+
"Number of hint messages written to this node since [re]start",
133+
"1"),
134+
metric ->
135+
assertSum(
136+
metric,
137+
"cassandra.storage.total_hints.in_progress.count",
138+
"Number of hints attempting to be sent currently",
139+
"1",
140+
/* isMonotonic= */ false),
141+
metric ->
142+
assertSumWithAttributes(
143+
metric,
144+
"cassandra.client.request.count",
145+
"Number of requests by operation",
146+
"1",
147+
attrs -> attrs.containsOnly(entry("operation", "RangeSlice")),
148+
attrs -> attrs.containsOnly(entry("operation", "Read")),
149+
attrs -> attrs.containsOnly(entry("operation", "Write"))),
150+
metric ->
151+
assertSumWithAttributes(
152+
metric,
153+
"cassandra.client.request.error.count",
154+
"Number of request errors by operation",
155+
"1",
156+
getRequestErrorCountAttributes()));
157+
}
158+
159+
@SuppressWarnings("unchecked")
160+
private static Consumer<MapAssert<String, String>>[] getRequestErrorCountAttributes() {
161+
List<String> operations = Arrays.asList("RangeSlice", "Read", "Write");
162+
List<String> statuses = Arrays.asList("Timeout", "Failure", "Unavailable");
163+
164+
return operations.stream()
165+
.flatMap(
166+
op ->
167+
statuses.stream()
168+
.map(
169+
st ->
170+
(Consumer<MapAssert<String, String>>)
171+
attrs ->
172+
attrs.containsOnly(
173+
entry("operation", op), entry("status", st))))
174+
.toArray(Consumer[]::new);
175+
}
176+
}
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)