blob: 7c007cb00d04e7bc09f6bf7798f27d08a53e6dc8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.solr.metrics;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Map;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.Metric;
import org.apache.commons.io.FileUtils;
import org.apache.solr.SolrJettyTestBase;
import org.apache.solr.core.NodeConfig;
import org.apache.solr.core.SolrXmlConfig;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Test {@link OperatingSystemMetricSet} and proper JVM metrics registration.
*/
public class JvmMetricsTest extends SolrJettyTestBase {
static final String[] STRING_OS_METRICS = {
"arch",
"name",
"version"
};
static final String[] NUMERIC_OS_METRICS = {
"availableProcessors",
"systemLoadAverage"
};
static final String[] BUFFER_METRICS = {
"direct.Count",
"direct.MemoryUsed",
"direct.TotalCapacity",
"mapped.Count",
"mapped.MemoryUsed",
"mapped.TotalCapacity"
};
@BeforeClass
public static void beforeTest() throws Exception {
createAndStartJetty(legacyExampleCollection1SolrHome());
}
@Test
public void testOperatingSystemMetricSet() throws Exception {
OperatingSystemMetricSet set = new OperatingSystemMetricSet();
Map<String, Metric> metrics = set.getMetrics();
assertTrue(metrics.size() > 0);
for (String metric : NUMERIC_OS_METRICS) {
Gauge<?> gauge = (Gauge<?>)metrics.get(metric);
assertNotNull(metric, gauge);
double value = ((Number)gauge.getValue()).doubleValue();
// SystemLoadAverage on Windows may be -1.0
assertTrue("unexpected value of " + metric + ": " + value, value >= 0 || value == -1.0);
}
for (String metric : STRING_OS_METRICS) {
Gauge<?> gauge = (Gauge<?>)metrics.get(metric);
assertNotNull(metric, gauge);
String value = (String)gauge.getValue();
assertNotNull(value);
assertFalse(value.isEmpty());
}
}
@Test
public void testAltBufferPoolMetricSet() throws Exception {
AltBufferPoolMetricSet set = new AltBufferPoolMetricSet();
Map<String, Metric> metrics = set.getMetrics();
assertTrue(metrics.size() > 0);
for (String name : BUFFER_METRICS) {
assertNotNull(name, metrics.get(name));
Object g = metrics.get(name);
assertTrue(g instanceof Gauge);
Object v = ((Gauge)g).getValue();
assertTrue(v instanceof Long);
}
}
@Test
public void testSystemProperties() throws Exception {
if (System.getProperty("basicauth") == null) {
// make sure it's set
System.setProperty("basicauth", "foo:bar");
}
SolrMetricManager metricManager = jetty.getCoreContainer().getMetricManager();
Map<String,Metric> metrics = metricManager.registry("solr.jvm").getMetrics();
MetricsMap map = (MetricsMap)((SolrMetricManager.GaugeWrapper)metrics.get("system.properties")).getGauge();
assertNotNull(map);
Map<String,Object> values = map.getValue();
System.getProperties().forEach((k, v) -> {
if (NodeConfig.NodeConfigBuilder.DEFAULT_HIDDEN_SYS_PROPS.contains(k)) {
assertNull("hidden property " + k + " present!", values.get(k));
} else {
assertEquals(v, values.get(String.valueOf(k)));
}
});
}
@Test
public void testHiddenSysProps() throws Exception {
Path home = Paths.get(TEST_HOME());
// default config
String solrXml = FileUtils.readFileToString(Paths.get(home.toString(), "solr.xml").toFile(), "UTF-8");
NodeConfig config = SolrXmlConfig.fromString(home, solrXml);
NodeConfig.NodeConfigBuilder.DEFAULT_HIDDEN_SYS_PROPS.forEach(s -> {
assertTrue(s, config.getMetricsConfig().getHiddenSysProps().contains(s));
});
// custom config
solrXml = FileUtils.readFileToString(home.resolve("solr-hiddensysprops.xml").toFile(), "UTF-8");
NodeConfig config2 = SolrXmlConfig.fromString(home, solrXml);
Arrays.asList("foo", "bar", "baz").forEach(s -> {
assertTrue(s, config2.getMetricsConfig().getHiddenSysProps().contains(s));
});
}
@Test
public void testSetupJvmMetrics() throws Exception {
SolrMetricManager metricManager = jetty.getCoreContainer().getMetricManager();
Map<String,Metric> metrics = metricManager.registry("solr.jvm").getMetrics();
assertTrue(metrics.size() > 0);
assertTrue(metrics.toString(), metrics.entrySet().stream().filter(e -> e.getKey().startsWith("buffers.")).count() > 0);
assertTrue(metrics.toString(), metrics.entrySet().stream().filter(e -> e.getKey().startsWith("classes.")).count() > 0);
assertTrue(metrics.toString(), metrics.entrySet().stream().filter(e -> e.getKey().startsWith("os.")).count() > 0);
assertTrue(metrics.toString(), metrics.entrySet().stream().filter(e -> e.getKey().startsWith("gc.")).count() > 0);
assertTrue(metrics.toString(), metrics.entrySet().stream().filter(e -> e.getKey().startsWith("memory.")).count() > 0);
assertTrue(metrics.toString(), metrics.entrySet().stream().filter(e -> e.getKey().startsWith("threads.")).count() > 0);
assertTrue(metrics.toString(), metrics.entrySet().stream().filter(e -> e.getKey().startsWith("system.")).count() > 0);
}
}