Skip to content

Commit 055813c

Browse files
committed
ActiveMQ Classic integration test
1 parent 80f5e88 commit 055813c

File tree

6 files changed

+365
-5
lines changed

6 files changed

+365
-5
lines changed
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
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.assertGaugeWithAttributes;
9+
import static io.opentelemetry.contrib.jmxscraper.target_systems.MetricAssertions.assertSumWithAttributes;
10+
import static org.assertj.core.api.Assertions.entry;
11+
12+
import io.opentelemetry.contrib.jmxscraper.JmxScraperContainer;
13+
import java.time.Duration;
14+
import org.testcontainers.containers.GenericContainer;
15+
import org.testcontainers.containers.wait.strategy.Wait;
16+
import org.testcontainers.images.builder.ImageFromDockerfile;
17+
import org.testcontainers.utility.MountableFile;
18+
19+
public class ActiveMqIntegrationTest extends TargetSystemIntegrationTest {
20+
21+
@Override
22+
protected GenericContainer<?> createTargetContainer(int jmxPort) {
23+
return new GenericContainer<>(
24+
new ImageFromDockerfile()
25+
.withDockerfileFromBuilder(
26+
builder -> builder.from("apache/activemq-classic:5.18.6").build()))
27+
.withEnv("LOCAL_JMX", "no")
28+
.withCopyFileToContainer(
29+
MountableFile.forClasspathResource("activemq/env"), "/opt/apache-activemq/bin/env")
30+
.withEnv(
31+
"ACTIVEMQ_JMX_OPTS",
32+
"-Dcom.sun.management.jmxremote.port="
33+
+ jmxPort
34+
+ " -Dcom.sun.management.jmxremote.rmi.port="
35+
+ jmxPort
36+
+ " -Dcom.sun.management.jmxremote.ssl=false"
37+
+ " -Dcom.sun.management.jmxremote.authenticate=false")
38+
.withStartupTimeout(Duration.ofMinutes(2))
39+
.waitingFor(Wait.forListeningPort());
40+
}
41+
42+
@Override
43+
protected JmxScraperContainer customizeScraperContainer(JmxScraperContainer scraper) {
44+
return scraper.withTargetSystem("activemq");
45+
}
46+
47+
@Override
48+
protected void verifyMetrics() {
49+
waitAndAssertMetrics(
50+
metric ->
51+
assertSumWithAttributes(
52+
metric,
53+
"activemq.consumer.count",
54+
"The number of consumers currently reading from the broker.",
55+
"consumers",
56+
/* isMonotonic= */ false,
57+
attrs ->
58+
attrs.containsOnly(
59+
entry("destination", "ActiveMQ.Advisory.MasterBroker"),
60+
entry("broker", "localhost"))),
61+
metric ->
62+
assertSumWithAttributes(
63+
metric,
64+
"activemq.producer.count",
65+
"The number of producers currently attached to the broker.",
66+
"producers",
67+
/* isMonotonic= */ false,
68+
attrs ->
69+
attrs.containsOnly(
70+
entry("destination", "ActiveMQ.Advisory.MasterBroker"),
71+
entry("broker", "localhost"))),
72+
metric ->
73+
assertSumWithAttributes(
74+
metric,
75+
"activemq.connection.count",
76+
"The total number of current connections.",
77+
"connections",
78+
/* isMonotonic= */ false,
79+
attrs -> attrs.containsOnly(entry("broker", "localhost"))),
80+
metric ->
81+
assertGaugeWithAttributes(
82+
metric,
83+
"activemq.memory.usage",
84+
"The percentage of configured memory used.",
85+
"%",
86+
attrs ->
87+
attrs.containsOnly(
88+
entry("destination", "ActiveMQ.Advisory.MasterBroker"),
89+
entry("broker", "localhost"))),
90+
metric ->
91+
assertGaugeWithAttributes(
92+
metric,
93+
"activemq.disk.store_usage",
94+
"The percentage of configured disk used for persistent messages.",
95+
"%",
96+
attrs -> attrs.containsOnly(entry("broker", "localhost"))),
97+
metric ->
98+
assertGaugeWithAttributes(
99+
metric,
100+
"activemq.disk.temp_usage",
101+
"The percentage of configured disk used for non-persistent messages.",
102+
"%",
103+
attrs -> attrs.containsOnly(entry("broker", "localhost"))),
104+
metric ->
105+
assertSumWithAttributes(
106+
metric,
107+
"activemq.message.current",
108+
"The current number of messages waiting to be consumed.",
109+
"messages",
110+
/* isMonotonic= */ false,
111+
attrs ->
112+
attrs.containsOnly(
113+
entry("destination", "ActiveMQ.Advisory.MasterBroker"),
114+
entry("broker", "localhost"))),
115+
metric ->
116+
assertSumWithAttributes(
117+
metric,
118+
"activemq.message.expired",
119+
"The total number of messages not delivered because they expired.",
120+
"messages",
121+
attrs ->
122+
attrs.containsOnly(
123+
entry("destination", "ActiveMQ.Advisory.MasterBroker"),
124+
entry("broker", "localhost"))),
125+
metric ->
126+
assertSumWithAttributes(
127+
metric,
128+
"activemq.message.enqueued",
129+
"The total number of messages received by the broker.",
130+
"messages",
131+
attrs ->
132+
attrs.containsOnly(
133+
entry("destination", "ActiveMQ.Advisory.MasterBroker"),
134+
entry("broker", "localhost"))),
135+
metric ->
136+
assertSumWithAttributes(
137+
metric,
138+
"activemq.message.dequeued",
139+
"The total number of messages delivered to consumers.",
140+
"messages",
141+
attrs ->
142+
attrs.containsOnly(
143+
entry("destination", "ActiveMQ.Advisory.MasterBroker"),
144+
entry("broker", "localhost"))),
145+
metric ->
146+
assertGaugeWithAttributes(
147+
metric,
148+
"activemq.message.wait_time.avg",
149+
"The average time a message was held on a destination.",
150+
"ms",
151+
attrs ->
152+
attrs.containsOnly(
153+
entry("destination", "ActiveMQ.Advisory.MasterBroker"),
154+
entry("broker", "localhost"))));
155+
}
156+
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,23 @@ static void assertSumWithAttributes(
7272
String description,
7373
String unit,
7474
Consumer<MapAssert<String, String>>... attributeGroupAssertions) {
75+
assertSumWithAttributes(
76+
metric, name, description, unit, /* isMonotonic= */ true, attributeGroupAssertions);
77+
}
78+
79+
@SafeVarargs
80+
static void assertSumWithAttributes(
81+
Metric metric,
82+
String name,
83+
String description,
84+
String unit,
85+
boolean isMonotonic,
86+
Consumer<MapAssert<String, String>>... attributeGroupAssertions) {
7587
assertThat(metric.getName()).isEqualTo(name);
7688
assertThat(metric.getDescription()).isEqualTo(description);
7789
assertThat(metric.getUnit()).isEqualTo(unit);
7890
assertThat(metric.hasSum()).isTrue();
91+
assertThat(metric.getSum().getIsMonotonic()).isEqualTo(isMonotonic);
7992
assertAttributedPoints(metric.getSum().getDataPointsList(), attributeGroupAssertions);
8093
}
8194

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,28 @@
66
package io.opentelemetry.contrib.jmxscraper.target_systems;
77

88
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.awaitility.Awaitility.await;
910

1011
import com.linecorp.armeria.server.ServerBuilder;
1112
import com.linecorp.armeria.server.grpc.GrpcService;
1213
import com.linecorp.armeria.testing.junit5.server.ServerExtension;
1314
import io.grpc.stub.StreamObserver;
14-
import io.opentelemetry.contrib.jmxscraper.JmxConnectorBuilder;
1515
import io.opentelemetry.contrib.jmxscraper.JmxScraperContainer;
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 java.io.IOException;
19+
import io.opentelemetry.proto.metrics.v1.Metric;
20+
import io.opentelemetry.proto.metrics.v1.ResourceMetrics;
21+
import java.time.Duration;
2022
import java.util.ArrayList;
23+
import java.util.Arrays;
24+
import java.util.Collection;
2125
import java.util.List;
2226
import java.util.concurrent.BlockingQueue;
2327
import java.util.concurrent.ExecutionException;
2428
import java.util.concurrent.LinkedBlockingDeque;
25-
import javax.management.remote.JMXConnector;
29+
import java.util.function.Consumer;
30+
import java.util.stream.Collectors;
2631
import org.junit.jupiter.api.AfterAll;
2732
import org.junit.jupiter.api.AfterEach;
2833
import org.junit.jupiter.api.BeforeAll;

jmx-scraper/src/main/java/io/opentelemetry/contrib/jmxscraper/JmxScraper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public static void main(String[] args) {
7878
System.err.println("Unable to connect " + e.getMessage());
7979
System.exit(2);
8080
} catch (RuntimeException e) {
81-
System.err.println("ERROR: " + e.getMessage());
81+
e.printStackTrace(System.err);
8282
System.exit(3);
8383
}
8484
}
@@ -180,7 +180,7 @@ private static void addRulesForSystem(String system, MetricConfiguration conf) {
180180
RuleParser parserInstance = RuleParser.get();
181181
parserInstance.addMetricDefsTo(conf, inputStream, system);
182182
} else {
183-
throw new IllegalArgumentException("No support for system" + system);
183+
throw new IllegalArgumentException("No support for system " + system);
184184
}
185185
} catch (Exception e) {
186186
throw new IllegalStateException("Error while loading rules for system " + system, e);
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
---
2+
rules:
3+
- beans:
4+
- org.apache.activemq:type=Broker,brokerName=*,destinationType=Queue,destinationName=*
5+
- org.apache.activemq:type=Broker,brokerName=*,destinationType=Topic,destinationName=*
6+
metricAttribute:
7+
destination: param(destinationName)
8+
broker: param(brokerName)
9+
prefix: activemq.
10+
mapping:
11+
ProducerCount:
12+
metric: producer.count
13+
unit: "producers"
14+
type: updowncounter
15+
desc: The number of producers currently attached to the broker.
16+
ConsumerCount:
17+
metric: consumer.count
18+
unit: "consumers"
19+
type: updowncounter
20+
desc: The number of consumers currently reading from the broker.
21+
MemoryPercentUsage:
22+
metric: memory.usage
23+
unit: "%"
24+
type: gauge
25+
desc: The percentage of configured memory used.
26+
QueueSize:
27+
metric: message.current
28+
unit: "messages"
29+
type: updowncounter
30+
desc: The current number of messages waiting to be consumed.
31+
ExpiredCount:
32+
metric: message.expired
33+
unit: "messages"
34+
type: counter
35+
desc: The total number of messages not delivered because they expired.
36+
EnqueueCount:
37+
metric: message.enqueued
38+
unit: "messages"
39+
type: counter
40+
desc: The total number of messages received by the broker.
41+
DequeueCount:
42+
metric: message.dequeued
43+
unit: "messages"
44+
type: counter
45+
desc: The total number of messages delivered to consumers.
46+
AverageEnqueueTime:
47+
metric: message.wait_time.avg
48+
unit: ms
49+
type: gauge
50+
desc: The average time a message was held on a destination.
51+
52+
- bean: org.apache.activemq:type=Broker,brokerName=*
53+
metricAttribute:
54+
broker: param(brokerName)
55+
prefix: activemq.
56+
unit: "%"
57+
type: gauge
58+
mapping:
59+
CurrentConnectionsCount:
60+
metric: connection.count
61+
type: updowncounter
62+
unit: "connections"
63+
desc: The total number of current connections.
64+
StorePercentUsage:
65+
metric: disk.store_usage
66+
desc: The percentage of configured disk used for persistent messages.
67+
TempPercentUsage:
68+
metric: disk.temp_usage
69+
desc: The percentage of configured disk used for non-persistent messages.

0 commit comments

Comments
 (0)