-
Notifications
You must be signed in to change notification settings - Fork 129
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Integration test activemq #1497
Changes from all commits
49cfb99
a8f8ace
e1043d1
5948f57
7f7681b
93bf770
ac67d0f
97038df
67a50a0
26efa72
edb3d6e
3a36466
70d0bb0
12e6533
172846c
898c3c8
da8f4d8
2260258
59e1e6f
df4e149
80f5e88
055813c
9d6fd15
5b046cb
36bc5aa
3f7d02f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,152 @@ | ||
/* | ||
* Copyright The OpenTelemetry Authors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package io.opentelemetry.contrib.jmxscraper.target_systems; | ||
|
||
import static io.opentelemetry.contrib.jmxscraper.target_systems.MetricAssertions.assertGaugeWithAttributes; | ||
import static io.opentelemetry.contrib.jmxscraper.target_systems.MetricAssertions.assertSumWithAttributes; | ||
import static org.assertj.core.api.Assertions.entry; | ||
|
||
import io.opentelemetry.contrib.jmxscraper.JmxScraperContainer; | ||
import java.time.Duration; | ||
import org.testcontainers.containers.GenericContainer; | ||
import org.testcontainers.containers.wait.strategy.Wait; | ||
import org.testcontainers.images.builder.ImageFromDockerfile; | ||
|
||
public class ActiveMqIntegrationTest extends TargetSystemIntegrationTest { | ||
|
||
@Override | ||
protected GenericContainer<?> createTargetContainer(int jmxPort) { | ||
return new GenericContainer<>( | ||
new ImageFromDockerfile() | ||
.withDockerfileFromBuilder( | ||
builder -> builder.from("apache/activemq-classic:5.18.6").build())) | ||
.withEnv( | ||
"JAVA_TOOL_OPTIONS", | ||
"-Dcom.sun.management.jmxremote.port=" | ||
+ jmxPort | ||
+ " -Dcom.sun.management.jmxremote.rmi.port=" | ||
+ jmxPort | ||
+ " -Dcom.sun.management.jmxremote.ssl=false" | ||
+ " -Dcom.sun.management.jmxremote.authenticate=false") | ||
.withStartupTimeout(Duration.ofMinutes(2)) | ||
.waitingFor(Wait.forListeningPort()); | ||
} | ||
|
||
@Override | ||
protected JmxScraperContainer customizeScraperContainer(JmxScraperContainer scraper) { | ||
return scraper.withTargetSystem("activemq"); | ||
} | ||
|
||
@Override | ||
protected void verifyMetrics() { | ||
waitAndAssertMetrics( | ||
metric -> | ||
assertSumWithAttributes( | ||
metric, | ||
"activemq.consumer.count", | ||
"The number of consumers currently reading from the broker.", | ||
"consumers", | ||
/* isMonotonic= */ false, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [for reviewer] isMonotonic=false was added due to updatedDefinition of asserSumWithAttributes. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For all of the 3 metrics that are non-monotonic here I think it was probably a bug in the original test of the groovy version. The fact that they all have |
||
attrs -> | ||
attrs.containsOnly( | ||
entry("destination", "ActiveMQ.Advisory.MasterBroker"), | ||
entry("broker", "localhost"))), | ||
metric -> | ||
assertSumWithAttributes( | ||
metric, | ||
"activemq.producer.count", | ||
"The number of producers currently attached to the broker.", | ||
"producers", | ||
/* isMonotonic= */ false, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [for reviewer] isMonotonic=false was added due to updatedDefinition of asserSumWithAttributes. |
||
attrs -> | ||
attrs.containsOnly( | ||
entry("destination", "ActiveMQ.Advisory.MasterBroker"), | ||
entry("broker", "localhost"))), | ||
metric -> | ||
assertSumWithAttributes( | ||
metric, | ||
"activemq.connection.count", | ||
"The total number of current connections.", | ||
"connections", | ||
/* isMonotonic= */ false, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [for reviewer] isMonotonic=false was added due to updatedDefinition of asserSumWithAttributes. |
||
attrs -> attrs.containsOnly(entry("broker", "localhost"))), | ||
metric -> | ||
assertGaugeWithAttributes( | ||
metric, | ||
"activemq.memory.usage", | ||
"The percentage of configured memory used.", | ||
"%", | ||
attrs -> | ||
attrs.containsOnly( | ||
entry("destination", "ActiveMQ.Advisory.MasterBroker"), | ||
entry("broker", "localhost"))), | ||
metric -> | ||
assertGaugeWithAttributes( | ||
metric, | ||
"activemq.disk.store_usage", | ||
"The percentage of configured disk used for persistent messages.", | ||
"%", | ||
attrs -> attrs.containsOnly(entry("broker", "localhost"))), | ||
metric -> | ||
assertGaugeWithAttributes( | ||
metric, | ||
"activemq.disk.temp_usage", | ||
"The percentage of configured disk used for non-persistent messages.", | ||
"%", | ||
attrs -> attrs.containsOnly(entry("broker", "localhost"))), | ||
metric -> | ||
assertSumWithAttributes( | ||
metric, | ||
"activemq.message.current", | ||
"The current number of messages waiting to be consumed.", | ||
"messages", | ||
/* isMonotonic= */ false, | ||
attrs -> | ||
attrs.containsOnly( | ||
entry("destination", "ActiveMQ.Advisory.MasterBroker"), | ||
entry("broker", "localhost"))), | ||
metric -> | ||
assertSumWithAttributes( | ||
metric, | ||
"activemq.message.expired", | ||
"The total number of messages not delivered because they expired.", | ||
"messages", | ||
attrs -> | ||
attrs.containsOnly( | ||
entry("destination", "ActiveMQ.Advisory.MasterBroker"), | ||
entry("broker", "localhost"))), | ||
metric -> | ||
assertSumWithAttributes( | ||
metric, | ||
"activemq.message.enqueued", | ||
"The total number of messages received by the broker.", | ||
"messages", | ||
attrs -> | ||
attrs.containsOnly( | ||
entry("destination", "ActiveMQ.Advisory.MasterBroker"), | ||
entry("broker", "localhost"))), | ||
metric -> | ||
assertSumWithAttributes( | ||
metric, | ||
"activemq.message.dequeued", | ||
"The total number of messages delivered to consumers.", | ||
"messages", | ||
attrs -> | ||
attrs.containsOnly( | ||
entry("destination", "ActiveMQ.Advisory.MasterBroker"), | ||
entry("broker", "localhost"))), | ||
metric -> | ||
assertGaugeWithAttributes( | ||
metric, | ||
"activemq.message.wait_time.avg", | ||
"The average time a message was held on a destination.", | ||
"ms", | ||
attrs -> | ||
attrs.containsOnly( | ||
entry("destination", "ActiveMQ.Advisory.MasterBroker"), | ||
entry("broker", "localhost")))); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -72,10 +72,23 @@ static void assertSumWithAttributes( | |
String description, | ||
String unit, | ||
Consumer<MapAssert<String, String>>... attributeGroupAssertions) { | ||
assertSumWithAttributes( | ||
metric, name, description, unit, /* isMonotonic= */ true, attributeGroupAssertions); | ||
} | ||
|
||
@SafeVarargs | ||
static void assertSumWithAttributes( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [for reviewer] This override method is added to support 'monotonic' flag and metric attributes at he same time. |
||
Metric metric, | ||
String name, | ||
String description, | ||
String unit, | ||
boolean isMonotonic, | ||
Consumer<MapAssert<String, String>>... attributeGroupAssertions) { | ||
assertThat(metric.getName()).isEqualTo(name); | ||
assertThat(metric.getDescription()).isEqualTo(description); | ||
assertThat(metric.getUnit()).isEqualTo(unit); | ||
assertThat(metric.hasSum()).isTrue(); | ||
assertThat(metric.getSum().getIsMonotonic()).isEqualTo(isMonotonic); | ||
assertAttributedPoints(metric.getSum().getDataPointsList(), attributeGroupAssertions); | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -30,7 +30,6 @@ protected GenericContainer<?> createTargetContainer(int jmxPort) { | |
"https://tomcat.apache.org/tomcat-9.0-doc/appdev/sample/sample.war", | ||
"/usr/local/tomcat/webapps/ROOT.war") | ||
.build())) | ||
.withEnv("LOCAL_JMX", "no") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is not needed for Tomcat. |
||
.withEnv( | ||
"CATALINA_OPTS", | ||
"-Dcom.sun.management.jmxremote.local.only=false" | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -78,7 +78,7 @@ public static void main(String[] args) { | |
System.err.println("Unable to connect " + e.getMessage()); | ||
System.exit(2); | ||
} catch (RuntimeException e) { | ||
System.err.println("ERROR: " + e.getMessage()); | ||
e.printStackTrace(System.err); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Simple printing Exception message is not enough here. We lose a lot of information regarding the issue. Stacktrace is better |
||
System.exit(3); | ||
} | ||
} | ||
|
robsunday marked this conversation as resolved.
Show resolved
Hide resolved
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
--- | ||
rules: | ||
- beans: | ||
- org.apache.activemq:type=Broker,brokerName=*,destinationType=Queue,destinationName=* | ||
- org.apache.activemq:type=Broker,brokerName=*,destinationType=Topic,destinationName=* | ||
metricAttribute: | ||
destination: param(destinationName) | ||
broker: param(brokerName) | ||
prefix: activemq. | ||
mapping: | ||
ProducerCount: | ||
metric: producer.count | ||
# Unit name inherited from activemq.groovy file. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. [minor] for those adding a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Eventually we are going to use original *.yaml files from JMX Insights, right? I think we may not need to update this file and added these comments for informational purposes only. But if you have different opinion then I can add TODOs :-), not a problem. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, those are likely to remain "as is", and regarding their location having them in a dedicated folder might also make sense when we reorganize but it's another topic. I'm just trying to not to forget about this, but a TODO here is probably not the best choice, it's probably better to add this to the issue where we listed all the supported systems for feature parity: open-telemetry/opentelemetry-java-instrumentation#12158 so I've updated it to ensure we don't forget about it. |
||
# Will be updated to {} semconv notation when we switch to use original files from JMX Insights | ||
unit: "producers" | ||
type: updowncounter | ||
desc: The number of producers currently attached to the broker. | ||
ConsumerCount: | ||
metric: consumer.count | ||
# Unit name inherited from activemq.groovy file. | ||
# Will be updated to {} semconv notation when we switch to use original files from JMX Insights | ||
unit: "consumers" | ||
type: updowncounter | ||
desc: The number of consumers currently reading from the broker. | ||
MemoryPercentUsage: | ||
metric: memory.usage | ||
unit: "%" | ||
type: gauge | ||
desc: The percentage of configured memory used. | ||
QueueSize: | ||
metric: message.current | ||
# Unit name inherited from activemq.groovy file. | ||
# Will be updated to {} semconv notation when we switch to use original files from JMX Insights | ||
unit: "messages" | ||
type: updowncounter | ||
desc: The current number of messages waiting to be consumed. | ||
ExpiredCount: | ||
metric: message.expired | ||
# Unit name inherited from activemq.groovy file. | ||
# Will be updated to {} semconv notation when we switch to use original files from JMX Insights | ||
unit: "messages" | ||
type: counter | ||
desc: The total number of messages not delivered because they expired. | ||
EnqueueCount: | ||
metric: message.enqueued | ||
# Unit name inherited from activemq.groovy file. | ||
# Will be updated to {} semconv notation when we switch to use original files from JMX Insights | ||
unit: "messages" | ||
type: counter | ||
desc: The total number of messages received by the broker. | ||
DequeueCount: | ||
metric: message.dequeued | ||
# Unit name inherited from activemq.groovy file. | ||
# Will be updated to {} semconv notation when we switch to use original files from JMX Insights | ||
unit: "messages" | ||
type: counter | ||
desc: The total number of messages delivered to consumers. | ||
AverageEnqueueTime: | ||
metric: message.wait_time.avg | ||
unit: ms | ||
type: gauge | ||
desc: The average time a message was held on a destination. | ||
|
||
- bean: org.apache.activemq:type=Broker,brokerName=* | ||
metricAttribute: | ||
# minor divergence from activemq.groovy to capture broker name, making it closer to | ||
# the definition in JMX Insights | ||
broker: param(brokerName) | ||
robsunday marked this conversation as resolved.
Show resolved
Hide resolved
|
||
prefix: activemq. | ||
unit: "%" | ||
type: gauge | ||
mapping: | ||
CurrentConnectionsCount: | ||
metric: connection.count | ||
type: updowncounter | ||
# Unit name inherited from activemq.groovy file. | ||
# Will be updated to {} semconv notation when we switch to use original files from JMX Insights | ||
unit: "connections" | ||
desc: The total number of current connections. | ||
StorePercentUsage: | ||
metric: disk.store_usage | ||
desc: The percentage of configured disk used for persistent messages. | ||
TempPercentUsage: | ||
metric: disk.temp_usage | ||
desc: The percentage of configured disk used for non-persistent messages. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[for reviewer] Updated activemq docker image to the most recent ActiveMQ Classic version (from rmohr/activemq:5.15.9 used in JMX Metric Gatherer)