Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,16 @@ class JmxConfig {
static final String JMX_REMOTE_PROFILE = PREFIX + "jmx.remote.profile";
static final String JMX_REALM = PREFIX + "jmx.realm";

static final List<String> JAVA_SYSTEM_PROPERTIES =
Arrays.asList(
"otel.resource.attributes",
"javax.net.ssl.keyStore",
"javax.net.ssl.keyStorePassword",
"javax.net.ssl.keyStoreType",
"javax.net.ssl.trustStore",
"javax.net.ssl.trustStorePassword",
"javax.net.ssl.trustStoreType");

static final List<String> AVAILABLE_TARGET_SYSTEMS =
Arrays.asList(
"activemq",
Expand Down Expand Up @@ -98,6 +108,21 @@ class JmxConfig {

remoteProfile = properties.getProperty(JMX_REMOTE_PROFILE);
realm = properties.getProperty(JMX_REALM);

// For the list of System Properties, if they have been set in the properties file
// they need to be set in Java System Properties.
JAVA_SYSTEM_PROPERTIES.forEach(
key -> {
// As properties file & command line properties are combined into properties
// at this point, only override if it was not already set via command line
if (System.getProperty(key) != null) {
return;
}
String value = properties.getProperty(key);
if (value != null) {
System.setProperty(key, value);
}
});
}

JmxConfig() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ private static void loadPropertiesFromStdin(Properties props) {
}
}

private static void loadPropertiesFromPath(Properties props, String path) {
public static void loadPropertiesFromPath(Properties props, String path) {
try (InputStream is = new FileInputStream(path)) {
props.load(is);
} catch (IOException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import java.util.Properties;
import org.junit.jupiter.api.Test;
import org.junitpioneer.jupiter.ClearSystemProperty;
import org.junitpioneer.jupiter.SetSystemProperty;
Expand Down Expand Up @@ -87,6 +88,72 @@ void specifiedValues() {
assertThat(config.realm).isEqualTo("myRealm");
}

@Test
void propertiesFile() {
Properties props = new Properties();
JmxMetrics.loadPropertiesFromPath(
props, ClassLoader.getSystemClassLoader().getResource("all.properties").getPath());
JmxConfig config = new JmxConfig(props);

assertThat(config.serviceUrl).isEqualTo("service:jmx:rmi:///jndi/rmi://myhost:12345/jmxrmi");
assertThat(config.groovyScript).isEqualTo("/my/groovy/script");
assertThat(config.targetSystem).isEqualTo("jvm,cassandra");
assertThat(config.targetSystems).containsOnly("jvm", "cassandra");
assertThat(config.intervalMilliseconds).isEqualTo(20000);
assertThat(config.metricsExporterType).isEqualTo("otlp");
assertThat(config.otlpExporterEndpoint).isEqualTo("https://myotlpendpoint");
assertThat(config.prometheusExporterHost).isEqualTo("host123.domain.com");
assertThat(config.prometheusExporterPort).isEqualTo(67890);
assertThat(config.username).isEqualTo("myUser\nname");
assertThat(config.password).isEqualTo("myPassw\\ord");
assertThat(config.remoteProfile).isEqualTo("SASL/DIGEST-MD5");
assertThat(config.realm).isEqualTo("myRealm");

// These properties are set from the config file loading into JmxConfig
assertThat(System.getProperty("otel.resource.attributes")).isEqualTo("one=two,three=four");
assertThat(System.getProperty("javax.net.ssl.keyStore")).isEqualTo("/my/key/store");
assertThat(System.getProperty("javax.net.ssl.keyStorePassword")).isEqualTo("abc123");
assertThat(System.getProperty("javax.net.ssl.keyStoreType")).isEqualTo("JKS");
assertThat(System.getProperty("javax.net.ssl.trustStore")).isEqualTo("/my/trust/store");
assertThat(System.getProperty("javax.net.ssl.trustStorePassword")).isEqualTo("def456");
assertThat(System.getProperty("javax.net.ssl.trustStoreType")).isEqualTo("JKS");
}

@Test
@SetSystemProperty(key = "otel.jmx.service.url", value = "myServiceUrl")
@SetSystemProperty(key = "otel.resource.attributes", value = "truth=yes")
void propertiesFileOverride() {
Properties props = new Properties();
JmxMetrics.loadPropertiesFromPath(
props, ClassLoader.getSystemClassLoader().getResource("all.properties").getPath());
JmxConfig config = new JmxConfig(props);

assertThat(config.serviceUrl).isEqualTo("myServiceUrl");
assertThat(config.groovyScript).isEqualTo("/my/groovy/script");
assertThat(config.targetSystem).isEqualTo("jvm,cassandra");
assertThat(config.targetSystems).containsOnly("jvm", "cassandra");
assertThat(config.intervalMilliseconds).isEqualTo(20000);
assertThat(config.metricsExporterType).isEqualTo("otlp");
assertThat(config.otlpExporterEndpoint).isEqualTo("https://myotlpendpoint");
assertThat(config.prometheusExporterHost).isEqualTo("host123.domain.com");
assertThat(config.prometheusExporterPort).isEqualTo(67890);
assertThat(config.username).isEqualTo("myUser\nname");
assertThat(config.password).isEqualTo("myPassw\\ord");
assertThat(config.remoteProfile).isEqualTo("SASL/DIGEST-MD5");
assertThat(config.realm).isEqualTo("myRealm");

// This property should retain the system property pre-defined and not be overwritten by the
// file
assertThat(System.getProperty("otel.resource.attributes")).isEqualTo("truth=yes");
// These properties are set from the config file loading into JmxConfig
assertThat(System.getProperty("javax.net.ssl.keyStore")).isEqualTo("/my/key/store");
assertThat(System.getProperty("javax.net.ssl.keyStorePassword")).isEqualTo("abc123");
assertThat(System.getProperty("javax.net.ssl.keyStoreType")).isEqualTo("JKS");
assertThat(System.getProperty("javax.net.ssl.trustStore")).isEqualTo("/my/trust/store");
assertThat(System.getProperty("javax.net.ssl.trustStorePassword")).isEqualTo("def456");
assertThat(System.getProperty("javax.net.ssl.trustStoreType")).isEqualTo("JKS");
}

@Test
@SetSystemProperty(key = "otel.jmx.interval.milliseconds", value = "abc")
void invalidInterval() {
Expand Down
21 changes: 21 additions & 0 deletions jmx-metrics/src/test/resources/all.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
otel.jmx.service.url=service:jmx:rmi:///jndi/rmi://myhost:12345/jmxrmi
otel.jmx.groovy.script=/my/groovy/script
otel.jmx.target.system=jvm,cassandra
otel.jmx.interval.milliseconds=20000
otel.metrics.exporter=otlp
otel.metric.export.interval=1000
otel.exporter.otlp.endpoint=https://myotlpendpoint
otel.exporter.prometheus.host=host123.domain.com
otel.exporter.prometheus.port=67890
otel.jmx.username=myUser\n\
name
otel.jmx.password=myPassw\\ord
otel.jmx.remote.profile=SASL/DIG\EST-MD5
otel.jmx.realm=myRealm
otel.resource.attributes=one=two,three=four
javax.net.ssl.keyStore=/my/key/store
javax.net.ssl.keyStorePassword=abc123
javax.net.ssl.keyStoreType=JKS
javax.net.ssl.trustStore=/my/trust/store
javax.net.ssl.trustStorePassword=def456
javax.net.ssl.trustStoreType=JKS