Skip to content

Commit 2ebfe99

Browse files
author
Sam DeHaan
authored
Update cassandra jmx metrics script to combine similar metrics into labelled metric (#118)
* Update cassandra script to combine similar metrics into labelled metric * Appease spotless * Rename status All to Ok * Update abstract integration data point asserts * Address PR feedback * Update cassandra metrics documentation
1 parent f5a170c commit 2ebfe99

File tree

4 files changed

+156
-158
lines changed

4 files changed

+156
-158
lines changed

jmx-metrics/docs/target-systems/cassandra.md

Lines changed: 6 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,11 @@ These metrics are sourced from Cassandra's exposed Dropwizard Metrics for each n
1717
* Unit: `µs`
1818
* Instrument Type: DoubleValueObserver
1919

20-
* Name: `cassandra.client.request.range_slice.latency.count`
21-
* Description: Number of token range read request operations
22-
* Unit: `1`
23-
* Instrument Type: LongSumObserver
24-
2520
* Name: `cassandra.client.request.range_slice.latency.max`
2621
* Description: Maximum token range read request latency
2722
* Unit: `µs`
2823
* Instrument Type: DoubleValueObserver
2924

30-
* Name: `cassandra.client.request.range_slice.timeout.count`
31-
* Description: Number of token range read request timeouts encountered
32-
* Unit: `1`
33-
* Instrument Type: LongSumObserver
34-
35-
* Name: `cassandra.client.request.range_slice.unavailable.count`
36-
* Description: Number of token range read request unavailable exceptions encountered
37-
* Unit: `1`
38-
* Instrument Type: LongSumObserver
39-
4025
* Name: `cassandra.client.request.read.latency.50p`
4126
* Description: Standard read request latency - 50th percentile
4227
* Unit: `µs`
@@ -47,26 +32,11 @@ These metrics are sourced from Cassandra's exposed Dropwizard Metrics for each n
4732
* Unit: `µs`
4833
* Instrument Type: DoubleValueObserver
4934

50-
* Name: `cassandra.client.request.read.latency.count`
51-
* Description: Number of standard read request operations
52-
* Unit: `1`
53-
* Instrument Type: LongSumObserver
54-
5535
* Name: `cassandra.client.request.read.latency.max`
5636
* Description: Maximum standard read request latency
5737
* Unit: `µs`
5838
* Instrument Type: DoubleValueObserver
5939

60-
* Name: `cassandra.client.request.read.timeout.count`
61-
* Description: Number of standard read request timeouts encountered
62-
* Unit: `1`
63-
* Instrument Type: LongSumObserver
64-
65-
* Name: `cassandra.client.request.read.unavailable.count`
66-
* Description: Number of standard read request unavailable exceptions encountered
67-
* Unit: `1`
68-
* Instrument Type: LongSumObserver
69-
7040
* Name: `cassandra.client.request.write.latency.50p`
7141
* Description: Regular write request latency - 50th percentile
7242
* Unit: `µs`
@@ -77,23 +47,20 @@ These metrics are sourced from Cassandra's exposed Dropwizard Metrics for each n
7747
* Unit: `µs`
7848
* Instrument Type: DoubleValueObserver
7949

80-
* Name: `cassandra.client.request.write.latency.count`
81-
* Description: Number of regular write request operations
82-
* Unit: `1`
83-
* Instrument Type: LongSumObserver
84-
8550
* Name: `cassandra.client.request.write.latency.max`
8651
* Description: Maximum regular write request latency
8752
* Unit: `µs`
8853
* Instrument Type: DoubleValueObserver
8954

90-
* Name: `cassandra.client.request.write.timeout.count`
91-
* Description: Number of regular write request timeouts encountered
55+
* Name: `cassandra.client.request.count`
56+
* Description: Number of requests by operation
57+
* Labels: `operation`
9258
* Unit: `1`
9359
* Instrument Type: LongSumObserver
9460

95-
* Name: `cassandra.client.request.write.unavailable.count`
96-
* Description: Number of regular write request unavailable exceptions encountered
61+
* Name: `cassandra.client.request.error.count`
62+
* Description: Number of request errors by operation
63+
* Labels: `operation`, `status`
9764
* Unit: `1`
9865
* Instrument Type: LongSumObserver
9966

jmx-metrics/src/integrationTest/java/io/opentelemetry/contrib/jmxmetrics/AbstractIntegrationTest.java

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@
1616
import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest;
1717
import io.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceResponse;
1818
import io.opentelemetry.proto.collector.metrics.v1.MetricsServiceGrpc;
19+
import io.opentelemetry.proto.common.v1.KeyValue;
1920
import io.opentelemetry.proto.metrics.v1.Metric;
2021
import io.opentelemetry.proto.metrics.v1.NumberDataPoint;
2122
import io.opentelemetry.proto.metrics.v1.ResourceMetrics;
2223
import java.time.Duration;
2324
import java.util.ArrayList;
2425
import java.util.Arrays;
2526
import java.util.Collection;
27+
import java.util.HashMap;
2628
import java.util.List;
29+
import java.util.Map;
2730
import java.util.concurrent.BlockingQueue;
2831
import java.util.concurrent.LinkedBlockingDeque;
2932
import java.util.function.Consumer;
@@ -179,30 +182,59 @@ protected void assertTypedSum(
179182
assertTypedPoints(metric.getSum().getDataPointsList(), types);
180183
}
181184

185+
protected void assertSumWithAttributes(
186+
Metric metric,
187+
String name,
188+
String description,
189+
String unit,
190+
List<Map<String, String>> attributeGroups) {
191+
assertThat(metric.getName()).isEqualTo(name);
192+
assertThat(metric.getDescription()).isEqualTo(description);
193+
assertThat(metric.getUnit()).isEqualTo(unit);
194+
assertThat(metric.hasSum()).isTrue();
195+
assertAttributedPoints(metric.getSum().getDataPointsList(), attributeGroups);
196+
}
197+
182198
private static final String expectedMeterVersion() {
183199
// Automatically set by gradle when running the tests
184200
String version = System.getProperty("gradle.project.version");
185201
assert version != null && !version.isEmpty();
186202
return version;
187203
}
188204

189-
@SuppressWarnings("unchecked")
190205
private static void assertTypedPoints(List<NumberDataPoint> points, List<String> types) {
206+
List<Map<String, String>> expectedAttributes =
207+
types.stream()
208+
.map(
209+
type ->
210+
new HashMap<String, String>() {
211+
{
212+
put("name", type);
213+
}
214+
})
215+
.collect(Collectors.toList());
216+
217+
assertAttributedPoints(points, expectedAttributes);
218+
}
219+
220+
@SuppressWarnings("unchecked")
221+
private static void assertAttributedPoints(
222+
List<NumberDataPoint> points, List<Map<String, String>> attributeGroups) {
191223
assertThat(points)
224+
.extracting(
225+
numberDataPoint ->
226+
numberDataPoint.getAttributesList().stream()
227+
.collect(
228+
Collectors.toMap(
229+
KeyValue::getKey, keyValue -> keyValue.getValue().getStringValue())))
192230
.satisfiesExactlyInAnyOrder(
193-
types.stream()
231+
attributeGroups.stream()
194232
.map(
195-
type ->
196-
(Consumer<NumberDataPoint>)
197-
point ->
198-
assertThat(point.getAttributesList())
199-
.singleElement()
200-
.satisfies(
201-
attribute -> {
202-
assertThat(attribute.getKey()).isEqualTo("name");
203-
assertThat(attribute.getValue().getStringValue())
204-
.isEqualTo(type);
205-
}))
233+
expected ->
234+
(Consumer<Map<String, String>>)
235+
pointAttributes ->
236+
assertThat(pointAttributes)
237+
.containsExactlyInAnyOrderEntriesOf(expected))
206238
.toArray(Consumer[]::new));
207239
}
208240

jmx-metrics/src/integrationTest/java/io/opentelemetry/contrib/jmxmetrics/target_systems/CassandraIntegrationTest.java

Lines changed: 53 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77

88
import io.opentelemetry.contrib.jmxmetrics.AbstractIntegrationTest;
99
import java.time.Duration;
10+
import java.util.Arrays;
11+
import java.util.HashMap;
12+
import java.util.List;
13+
import java.util.Map;
14+
import java.util.stream.Collectors;
1015
import org.junit.jupiter.api.Test;
1116
import org.testcontainers.containers.GenericContainer;
1217
import org.testcontainers.containers.Network;
@@ -48,30 +53,12 @@ void endToEnd() {
4853
"cassandra.client.request.range_slice.latency.99p",
4954
"Token range read request latency - 99th percentile",
5055
"µs"),
51-
metric ->
52-
assertSum(
53-
metric,
54-
"cassandra.client.request.range_slice.latency.count",
55-
"Number of token range read request operations",
56-
"1"),
5756
metric ->
5857
assertGauge(
5958
metric,
6059
"cassandra.client.request.range_slice.latency.max",
6160
"Maximum token range read request latency",
6261
"µs"),
63-
metric ->
64-
assertSum(
65-
metric,
66-
"cassandra.client.request.range_slice.timeout.count",
67-
"Number of token range read request timeouts encountered",
68-
"1"),
69-
metric ->
70-
assertSum(
71-
metric,
72-
"cassandra.client.request.range_slice.unavailable.count",
73-
"Number of token range read request unavailable exceptions encountered",
74-
"1"),
7562
metric ->
7663
assertGauge(
7764
metric,
@@ -84,30 +71,12 @@ void endToEnd() {
8471
"cassandra.client.request.read.latency.99p",
8572
"Standard read request latency - 99th percentile",
8673
"µs"),
87-
metric ->
88-
assertSum(
89-
metric,
90-
"cassandra.client.request.read.latency.count",
91-
"Number of standard read request operations",
92-
"1"),
9374
metric ->
9475
assertGauge(
9576
metric,
9677
"cassandra.client.request.read.latency.max",
9778
"Maximum standard read request latency",
9879
"µs"),
99-
metric ->
100-
assertSum(
101-
metric,
102-
"cassandra.client.request.read.timeout.count",
103-
"Number of standard read request timeouts encountered",
104-
"1"),
105-
metric ->
106-
assertSum(
107-
metric,
108-
"cassandra.client.request.read.unavailable.count",
109-
"Number of standard read request unavailable exceptions encountered",
110-
"1"),
11180
metric ->
11281
assertGauge(
11382
metric,
@@ -120,30 +89,12 @@ void endToEnd() {
12089
"cassandra.client.request.write.latency.99p",
12190
"Regular write request latency - 99th percentile",
12291
"µs"),
123-
metric ->
124-
assertSum(
125-
metric,
126-
"cassandra.client.request.write.latency.count",
127-
"Number of regular write request operations",
128-
"1"),
12992
metric ->
13093
assertGauge(
13194
metric,
13295
"cassandra.client.request.write.latency.max",
13396
"Maximum regular write request latency",
13497
"µs"),
135-
metric ->
136-
assertSum(
137-
metric,
138-
"cassandra.client.request.write.timeout.count",
139-
"Number of regular write request timeouts encountered",
140-
"1"),
141-
metric ->
142-
assertSum(
143-
metric,
144-
"cassandra.client.request.write.unavailable.count",
145-
"Number of regular write request unavailable exceptions encountered",
146-
"1"),
14798
metric ->
14899
assertSum(
149100
metric,
@@ -175,6 +126,53 @@ void endToEnd() {
175126
"cassandra.storage.total_hints.in_progress.count",
176127
"Number of hints attempting to be sent currently",
177128
"1",
178-
false));
129+
false),
130+
metric ->
131+
assertSumWithAttributes(
132+
metric,
133+
"cassandra.client.request.count",
134+
"Number of requests by operation",
135+
"1",
136+
getRequestCountAttributes()),
137+
metric ->
138+
assertSumWithAttributes(
139+
metric,
140+
"cassandra.client.request.error.count",
141+
"Number of request errors by operation",
142+
"1",
143+
getRequestErrorCountAttributes()));
144+
}
145+
146+
private List<Map<String, String>> getRequestCountAttributes() {
147+
List<String> operations = Arrays.asList("RangeSlice", "Read", "Write");
148+
149+
return operations.stream()
150+
.map(
151+
op ->
152+
new HashMap<String, String>() {
153+
{
154+
put("operation", op);
155+
}
156+
})
157+
.collect(Collectors.toList());
158+
}
159+
160+
private List<Map<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+
new HashMap<String, String>() {
171+
{
172+
put("operation", op);
173+
put("status", st);
174+
}
175+
}))
176+
.collect(Collectors.toList());
179177
}
180178
}

0 commit comments

Comments
 (0)