blob: ec0da6261f6bc8ca99623192fcc05a07c49110de [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.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import com.codahale.metrics.Counter;
import com.codahale.metrics.Metric;
import com.codahale.metrics.MetricRegistry;
import org.apache.lucene.util.TestUtil;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.core.PluginInfo;
import org.apache.solr.core.SolrInfoBean;
import org.apache.solr.core.SolrResourceLoader;
import org.apache.solr.metrics.reporters.MockMetricReporter;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class SolrMetricManagerTest extends SolrTestCaseJ4 {
@Before
public void beforeTest() throws Exception {
System.setProperty("solr.disableDefaultJmxReporter", "false");
initCore("solrconfig.xml", "schema.xml");
}
@After
public void afterTest() throws Exception {
deleteCore();
}
@Test
public void testSwapRegistries() throws Exception {
Random r = random();
SolrMetricManager metricManager = new SolrMetricManager();
Map<String, Counter> metrics1 = SolrMetricTestUtils.getRandomMetrics(r, true);
Map<String, Counter> metrics2 = SolrMetricTestUtils.getRandomMetrics(r, true);
String fromName = "from-" + TestUtil.randomSimpleString(r, 1, 10);
String toName = "to-" + TestUtil.randomSimpleString(r, 1, 10);
// register test metrics
for (Map.Entry<String, Counter> entry : metrics1.entrySet()) {
metricManager.registerMetric(null, fromName, entry.getValue(), false, entry.getKey(), "metrics1");
}
for (Map.Entry<String, Counter> entry : metrics2.entrySet()) {
metricManager.registerMetric(null, toName, entry.getValue(), false, entry.getKey(), "metrics2");
}
assertEquals(metrics1.size(), metricManager.registry(fromName).getMetrics().size());
assertEquals(metrics2.size(), metricManager.registry(toName).getMetrics().size());
// swap
metricManager.swapRegistries(fromName, toName);
// check metrics
Map<String, Metric> fromMetrics = metricManager.registry(fromName).getMetrics();
assertEquals(metrics2.size(), fromMetrics.size());
for (Map.Entry<String, Counter> entry : metrics2.entrySet()) {
Object value = fromMetrics.get(SolrMetricManager.mkName(entry.getKey(), "metrics2"));
assertNotNull(value);
assertEquals(entry.getValue(), value);
}
Map<String, Metric> toMetrics = metricManager.registry(toName).getMetrics();
assertEquals(metrics1.size(), toMetrics.size());
for (Map.Entry<String, Counter> entry : metrics1.entrySet()) {
Object value = toMetrics.get(SolrMetricManager.mkName(entry.getKey(), "metrics1"));
assertNotNull(value);
assertEquals(entry.getValue(), value);
}
}
@Test
public void testRegisterAll() throws Exception {
Random r = random();
SolrMetricManager metricManager = new SolrMetricManager();
Map<String, Counter> metrics = SolrMetricTestUtils.getRandomMetrics(r, true);
MetricRegistry mr = new MetricRegistry();
for (Map.Entry<String, Counter> entry : metrics.entrySet()) {
mr.register(entry.getKey(), entry.getValue());
}
String registryName = TestUtil.randomSimpleString(r, 1, 10);
assertEquals(0, metricManager.registry(registryName).getMetrics().size());
// There is nothing registered so we should be error-free on the first pass
metricManager.registerAll(registryName, mr, false);
// this should re-register everything, and no errors
metricManager.registerAll(registryName, mr, true);
}
@Test
public void testClearMetrics() throws Exception {
Random r = random();
SolrMetricManager metricManager = new SolrMetricManager();
Map<String, Counter> metrics = SolrMetricTestUtils.getRandomMetrics(r, true);
String registryName = TestUtil.randomSimpleString(r, 1, 10);
for (Map.Entry<String, Counter> entry : metrics.entrySet()) {
metricManager.registerMetric(null, registryName, entry.getValue(), false, entry.getKey(), "foo", "bar");
}
for (Map.Entry<String, Counter> entry : metrics.entrySet()) {
metricManager.registerMetric(null, registryName, entry.getValue(), false, entry.getKey(), "foo", "baz");
}
for (Map.Entry<String, Counter> entry : metrics.entrySet()) {
metricManager.registerMetric(null, registryName, entry.getValue(), false, entry.getKey(), "foo");
}
assertEquals(metrics.size() * 3, metricManager.registry(registryName).getMetrics().size());
// clear all metrics with prefix "foo.bar."
Set<String> removed = metricManager.clearMetrics(registryName, "foo", "bar.");
assertEquals(metrics.size(), removed.size());
for (String s : removed) {
assertTrue(s.startsWith("foo.bar."));
}
removed = metricManager.clearMetrics(registryName, "foo", "baz.");
assertEquals(metrics.size(), removed.size());
for (String s : removed) {
assertTrue(s.startsWith("foo.baz."));
}
// perhaps surprisingly, this works too - see PrefixFilter docs
removed = metricManager.clearMetrics(registryName, "fo");
assertEquals(metrics.size(), removed.size());
for (String s : removed) {
assertTrue(s.startsWith("foo."));
}
}
@Test
public void testSimpleMetrics() throws Exception {
Random r = random();
SolrMetricManager metricManager = new SolrMetricManager();
String registryName = TestUtil.randomSimpleString(r, 1, 10);
metricManager.counter(null, registryName, "simple_counter", "foo", "bar");
metricManager.timer(null, registryName, "simple_timer", "foo", "bar");
metricManager.meter(null, registryName, "simple_meter", "foo", "bar");
metricManager.histogram(null, registryName, "simple_histogram", "foo", "bar");
Map<String, Metric> metrics = metricManager.registry(registryName).getMetrics();
assertEquals(4, metrics.size());
for (Map.Entry<String, Metric> entry : metrics.entrySet()) {
assertTrue(entry.getKey().startsWith("foo.bar.simple_"));
}
}
@Test
public void testRegistryName() throws Exception {
Random r = random();
String name = TestUtil.randomSimpleString(r, 1, 10);
String result = SolrMetricManager.getRegistryName(SolrInfoBean.Group.core, name, "collection1");
assertEquals("solr.core." + name + ".collection1", result);
// try it with already prefixed name - group will be ignored
result = SolrMetricManager.getRegistryName(SolrInfoBean.Group.core, result);
assertEquals("solr.core." + name + ".collection1", result);
// try it with already prefixed name but with additional segments
result = SolrMetricManager.getRegistryName(SolrInfoBean.Group.core, result, "shard1", "replica1");
assertEquals("solr.core." + name + ".collection1.shard1.replica1", result);
}
@Test
public void testReporters() throws Exception {
try (SolrResourceLoader loader = new SolrResourceLoader()) {
SolrMetricManager metricManager = new SolrMetricManager();
PluginInfo[] plugins = new PluginInfo[] {createPluginInfo("universal_foo", null, null), createPluginInfo("multigroup_foo", "jvm, node, core", null),
createPluginInfo("multiregistry_foo", null, "solr.node, solr.core.collection1"), createPluginInfo("specific_foo", null, "solr.core.collection1"), createPluginInfo("node_foo", "node", null),
createPluginInfo("core_foo", "core", null)};
String tag = "xyz";
metricManager.loadReporters(plugins, loader, null, null, tag, SolrInfoBean.Group.node);
Map<String,SolrMetricReporter> reporters = metricManager.getReporters(SolrMetricManager.getRegistryName(SolrInfoBean.Group.node));
assertEquals(4, reporters.size());
assertTrue(reporters.containsKey("universal_foo@" + tag));
assertTrue(reporters.containsKey("multigroup_foo@" + tag));
assertTrue(reporters.containsKey("node_foo@" + tag));
assertTrue(reporters.containsKey("multiregistry_foo@" + tag));
metricManager.loadReporters(plugins, loader, null, null, tag, SolrInfoBean.Group.core, "collection1");
reporters = metricManager.getReporters(SolrMetricManager.getRegistryName(SolrInfoBean.Group.core, "collection1"));
assertEquals(5, reporters.size());
assertTrue(reporters.containsKey("universal_foo@" + tag));
assertTrue(reporters.containsKey("multigroup_foo@" + tag));
assertTrue(reporters.containsKey("specific_foo@" + tag));
assertTrue(reporters.containsKey("core_foo@" + tag));
assertTrue(reporters.containsKey("multiregistry_foo@" + tag));
metricManager.loadReporters(plugins, loader, null, null, tag, SolrInfoBean.Group.jvm);
reporters = metricManager.getReporters(SolrMetricManager.getRegistryName(SolrInfoBean.Group.jvm));
assertEquals(2, reporters.size());
assertTrue(reporters.containsKey("universal_foo@" + tag));
assertTrue(reporters.containsKey("multigroup_foo@" + tag));
metricManager.removeRegistry("solr.jvm");
reporters = metricManager.getReporters(SolrMetricManager.getRegistryName(SolrInfoBean.Group.jvm));
assertEquals(0, reporters.size());
metricManager.removeRegistry("solr.node");
reporters = metricManager.getReporters(SolrMetricManager.getRegistryName(SolrInfoBean.Group.node));
assertEquals(0, reporters.size());
metricManager.removeRegistry("solr.core.collection1");
reporters = metricManager.getReporters(SolrMetricManager.getRegistryName(SolrInfoBean.Group.core, "collection1"));
assertEquals(0, reporters.size());
}
}
@Test
public void testDefaultCloudReporterPeriodUnchanged() throws Exception {
assertEquals(60, SolrMetricManager.DEFAULT_CLOUD_REPORTER_PERIOD);
}
private PluginInfo createPluginInfo(String name, String group, String registry) {
Map<String,String> attrs = new HashMap<>();
attrs.put("name", name);
attrs.put("class", MockMetricReporter.class.getName());
if (group != null) {
attrs.put("group", group);
}
if (registry != null) {
attrs.put("registry", registry);
}
NamedList initArgs = new NamedList();
initArgs.add("configurable", "true");
return new PluginInfo("SolrMetricReporter", attrs, initArgs, null);
}
}