From 9d606d8ff058b5a66b53b9255317c139c53effc7 Mon Sep 17 00:00:00 2001 From: Andrzej Bialecki Date: Tue, 27 Dec 2016 19:52:06 +0100 Subject: [PATCH] SOLR-9880: Add Ganglia, Graphite and SLF4J metrics reporters. --- lucene/ivy-versions.properties | 3 + solr/CHANGES.txt | 2 + .../reporters/SolrGangliaReporter.java | 144 +++++++++++++ .../reporters/SolrGraphiteReporter.java | 129 +++++++++++ .../metrics/reporters/SolrSlf4jReporter.java | 127 +++++++++++ .../test-files/solr/solr-gangliareporter.xml | 32 +++ .../test-files/solr/solr-graphitereporter.xml | 31 +++ .../test-files/solr/solr-slf4jreporter.xml | 35 +++ .../reporters/SolrGangliaReporterTest.java | 81 +++++++ .../reporters/SolrGraphiteReporterTest.java | 115 ++++++++++ .../reporters/SolrSlf4jReporterTest.java | 77 +++++++ solr/licenses/gmetric4j-1.0.7.jar.sha1 | 1 + solr/licenses/gmetric4j-LICENSE-BSD.txt | 31 +++ solr/licenses/gmetric4j-NOTICE.txt | 0 solr/licenses/metrics-ganglia-3.1.2.jar.sha1 | 1 + solr/licenses/metrics-ganglia-LICENSE-ASL.txt | 203 ++++++++++++++++++ solr/licenses/metrics-ganglia-NOTICE.txt | 12 ++ solr/licenses/metrics-graphite-3.1.2.jar.sha1 | 1 + .../licenses/metrics-graphite-LICENSE-ASL.txt | 203 ++++++++++++++++++ solr/licenses/metrics-graphite-NOTICE.txt | 12 ++ solr/server/ivy.xml | 3 + 21 files changed, 1243 insertions(+) create mode 100644 solr/core/src/java/org/apache/solr/metrics/reporters/SolrGangliaReporter.java create mode 100644 solr/core/src/java/org/apache/solr/metrics/reporters/SolrGraphiteReporter.java create mode 100644 solr/core/src/java/org/apache/solr/metrics/reporters/SolrSlf4jReporter.java create mode 100644 solr/core/src/test-files/solr/solr-gangliareporter.xml create mode 100644 solr/core/src/test-files/solr/solr-graphitereporter.xml create mode 100644 solr/core/src/test-files/solr/solr-slf4jreporter.xml create mode 100644 solr/core/src/test/org/apache/solr/metrics/reporters/SolrGangliaReporterTest.java create mode 100644 solr/core/src/test/org/apache/solr/metrics/reporters/SolrGraphiteReporterTest.java create mode 100644 solr/core/src/test/org/apache/solr/metrics/reporters/SolrSlf4jReporterTest.java create mode 100644 solr/licenses/gmetric4j-1.0.7.jar.sha1 create mode 100644 solr/licenses/gmetric4j-LICENSE-BSD.txt create mode 100644 solr/licenses/gmetric4j-NOTICE.txt create mode 100644 solr/licenses/metrics-ganglia-3.1.2.jar.sha1 create mode 100644 solr/licenses/metrics-ganglia-LICENSE-ASL.txt create mode 100644 solr/licenses/metrics-ganglia-NOTICE.txt create mode 100644 solr/licenses/metrics-graphite-3.1.2.jar.sha1 create mode 100644 solr/licenses/metrics-graphite-LICENSE-ASL.txt create mode 100644 solr/licenses/metrics-graphite-NOTICE.txt diff --git a/lucene/ivy-versions.properties b/lucene/ivy-versions.properties index 2f44f7e47bd..297d46c0123 100644 --- a/lucene/ivy-versions.properties +++ b/lucene/ivy-versions.properties @@ -71,10 +71,13 @@ com.sun.jersey.version = 1.9 /de.l3s.boilerpipe/boilerpipe = 1.1.0 /dom4j/dom4j = 1.6.1 /hsqldb/hsqldb = 1.8.0.10 +/info.ganglia.gmetric4j/gmetric4j = 1.0.7 /io.airlift/slice = 0.10 io.dropwizard.metrics.version = 3.1.2 /io.dropwizard.metrics/metrics-core = ${io.dropwizard.metrics.version} +/io.dropwizard.metrics/metrics-ganglia = ${io.dropwizard.metrics.version} +/io.dropwizard.metrics/metrics-graphite = ${io.dropwizard.metrics.version} /io.dropwizard.metrics/metrics-healthchecks = ${io.dropwizard.metrics.version} /io.dropwizard.metrics/metrics-jetty9 = ${io.dropwizard.metrics.version} /io.dropwizard.metrics/metrics-jvm = ${io.dropwizard.metrics.version} diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index fa8da6e3cef..f587109a48a 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -197,6 +197,8 @@ New Features * SOLR-9877: Use instrumented http client and connection pool. (shalin) +* SOLR-9880: Add Ganglia, Graphite and SLF4J metrics reporters. (ab) + Optimizations ---------------------- * SOLR-9704: Facet Module / JSON Facet API: Optimize blockChildren facets that have diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGangliaReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGangliaReporter.java new file mode 100644 index 00000000000..45561e58b58 --- /dev/null +++ b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGangliaReporter.java @@ -0,0 +1,144 @@ +/* + * 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.reporters; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import com.codahale.metrics.MetricFilter; +import com.codahale.metrics.ganglia.GangliaReporter; +import info.ganglia.gmetric4j.gmetric.GMetric; +import org.apache.solr.metrics.SolrMetricManager; +import org.apache.solr.metrics.SolrMetricReporter; + +/** + * + */ +public class SolrGangliaReporter extends SolrMetricReporter { + + private String host = null; + private int port = -1; + private boolean multicast; + private int period = 60; + private String instancePrefix = null; + private String filterPrefix = null; + private boolean testing; + private GangliaReporter reporter; + + // for unit tests + GMetric ganglia = null; + + /** + * Create a Ganglia reporter for metrics managed in a named registry. + * + * @param metricManager metric manager instance that manages the selected registry + * @param registryName registry to use, one of registries managed by + * {@link SolrMetricManager} + */ + public SolrGangliaReporter(SolrMetricManager metricManager, String registryName) { + super(metricManager, registryName); + } + + public void setHost(String host) { + this.host = host; + } + + public void setPort(int port) { + this.port = port; + } + + public void setPrefix(String prefix) { + this.instancePrefix = prefix; + } + + public void setFilter(String filter) { + this.filterPrefix = filter; + } + + + public void setPeriod(int period) { + this.period = period; + } + + public void setMulticast(boolean multicast) { + this.multicast = multicast; + } + + // only for unit tests! + public void setTesting(boolean testing) { + this.testing = testing; + } + + void setGMetric(GMetric ganglia) { + this.ganglia = ganglia; + } + + @Override + protected void validate() throws IllegalStateException { + if (host == null) { + throw new IllegalStateException("Init argument 'host' must be set to a valid Ganglia server name."); + } + if (port == -1) { + throw new IllegalStateException("Init argument 'port' must be set to a valid Ganglia server port."); + } + if (period < 1) { + throw new IllegalStateException("Init argument 'period' is in time unit 'seconds' and must be at least 1."); + } + if (!testing) { + start(); + } + } + + //this is a separate method for unit tests + void start() { + if (!testing) { + try { + ganglia = new GMetric(host, port, + multicast ? GMetric.UDPAddressingMode.MULTICAST : GMetric.UDPAddressingMode.UNICAST, + 1); + } catch (IOException ioe) { + throw new IllegalStateException("Exception connecting to Ganglia", ioe); + } + } + if (instancePrefix == null) { + instancePrefix = registryName; + } else { + instancePrefix = instancePrefix + "." + registryName; + } + GangliaReporter.Builder builder = GangliaReporter + .forRegistry(metricManager.registry(registryName)) + .convertRatesTo(TimeUnit.SECONDS) + .convertDurationsTo(TimeUnit.MILLISECONDS) + .prefixedWith(instancePrefix); + MetricFilter filter; + if (filterPrefix != null) { + filter = new SolrMetricManager.PrefixFilter(filterPrefix); + } else { + filter = MetricFilter.ALL; + } + builder = builder.filter(filter); + reporter = builder.build(ganglia); + reporter.start(period, TimeUnit.SECONDS); + } + + @Override + public void close() throws IOException { + if (reporter != null) { + reporter.close(); + } + } +} diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGraphiteReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGraphiteReporter.java new file mode 100644 index 00000000000..8565ce86c05 --- /dev/null +++ b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrGraphiteReporter.java @@ -0,0 +1,129 @@ +/* + * 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.reporters; + +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.util.concurrent.TimeUnit; + +import com.codahale.metrics.MetricFilter; +import com.codahale.metrics.graphite.Graphite; +import com.codahale.metrics.graphite.GraphiteReporter; +import com.codahale.metrics.graphite.GraphiteSender; +import com.codahale.metrics.graphite.PickledGraphite; +import org.apache.solr.metrics.SolrMetricManager; +import org.apache.solr.metrics.SolrMetricReporter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Metrics reporter that wraps {@link com.codahale.metrics.graphite.GraphiteReporter}. + */ +public class SolrGraphiteReporter extends SolrMetricReporter { + private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + private String host = null; + private int port = -1; + private int period = 60; + private boolean pickled = false; + private String instancePrefix = null; + private String filterPrefix = null; + private GraphiteReporter reporter = null; + + /** + * Create a Graphite reporter for metrics managed in a named registry. + * + * @param metricManager metric manager instance that manages the selected registry + * @param registryName registry to use, one of registries managed by + * {@link SolrMetricManager} + */ + public SolrGraphiteReporter(SolrMetricManager metricManager, String registryName) { + super(metricManager, registryName); + } + + public void setHost(String host) { + this.host = host; + } + + public void setPort(int port) { + this.port = port; + } + + public void setPrefix(String prefix) { + this.instancePrefix = prefix; + } + + public void setFilter(String filter) { + this.filterPrefix = filter; + } + + public void setPickled(boolean pickled) { + this.pickled = pickled; + } + + public void setPeriod(int period) { + this.period = period; + } + + @Override + protected void validate() throws IllegalStateException { + if (host == null) { + throw new IllegalStateException("Init argument 'host' must be set to a valid Graphite server name."); + } + if (port == -1) { + throw new IllegalStateException("Init argument 'port' must be set to a valid Graphite server port."); + } + if (reporter != null) { + throw new IllegalStateException("Already started once?"); + } + if (period < 1) { + throw new IllegalStateException("Init argument 'period' is in time unit 'seconds' and must be at least 1."); + } + final GraphiteSender graphite; + if (pickled) { + graphite = new PickledGraphite(host, port); + } else { + graphite = new Graphite(host, port); + } + if (instancePrefix == null) { + instancePrefix = registryName; + } else { + instancePrefix = instancePrefix + "." + registryName; + } + GraphiteReporter.Builder builder = GraphiteReporter + .forRegistry(metricManager.registry(registryName)) + .prefixedWith(instancePrefix) + .convertRatesTo(TimeUnit.SECONDS) + .convertDurationsTo(TimeUnit.MILLISECONDS); + MetricFilter filter; + if (filterPrefix != null) { + filter = new SolrMetricManager.PrefixFilter(filterPrefix); + } else { + filter = MetricFilter.ALL; + } + builder = builder.filter(filter); + reporter = builder.build(graphite); + reporter.start(period, TimeUnit.SECONDS); + } + + @Override + public void close() throws IOException { + if (reporter != null) { + reporter.close(); + } + } +} diff --git a/solr/core/src/java/org/apache/solr/metrics/reporters/SolrSlf4jReporter.java b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrSlf4jReporter.java new file mode 100644 index 00000000000..817dda17f94 --- /dev/null +++ b/solr/core/src/java/org/apache/solr/metrics/reporters/SolrSlf4jReporter.java @@ -0,0 +1,127 @@ +/* + * 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.reporters; + +import java.io.IOException; +import java.lang.invoke.MethodHandles; +import java.util.concurrent.TimeUnit; + +import com.codahale.metrics.MetricFilter; +import com.codahale.metrics.Slf4jReporter; +import org.apache.solr.metrics.SolrMetricManager; +import org.apache.solr.metrics.SolrMetricReporter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Metrics reporter that wraps {@link com.codahale.metrics.Slf4jReporter}. + * The following init arguments are supported: + * + */ +public class SolrSlf4jReporter extends SolrMetricReporter { + // we need this to pass validate-source-patterns + private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + private int period = 60; + private String instancePrefix = null; + private String logger = null; + private String filterPrefix = null; + private Slf4jReporter reporter; + + /** + * Create a SLF4J reporter for metrics managed in a named registry. + * + * @param metricManager metric manager instance that manages the selected registry + * @param registryName registry to use, one of registries managed by + * {@link SolrMetricManager} + */ + public SolrSlf4jReporter(SolrMetricManager metricManager, String registryName) { + super(metricManager, registryName); + } + + public void setPrefix(String prefix) { + this.instancePrefix = prefix; + } + + public void setFilter(String filter) { + this.filterPrefix = filter; + } + + public void setLogger(String logger) { + this.logger = logger; + } + + public void setPeriod(int period) { + this.period = period; + } + + @Override + protected void validate() throws IllegalStateException { + if (period < 1) { + throw new IllegalStateException("Init argument 'period' is in time unit 'seconds' and must be at least 1."); + } + if (instancePrefix == null) { + instancePrefix = registryName; + } else { + instancePrefix = instancePrefix + "." + registryName; + } + Slf4jReporter.Builder builder = Slf4jReporter + .forRegistry(metricManager.registry(registryName)) + .convertRatesTo(TimeUnit.SECONDS) + .convertDurationsTo(TimeUnit.MILLISECONDS); + + MetricFilter filter; + if (filterPrefix != null) { + filter = new SolrMetricManager.PrefixFilter(filterPrefix); + } else { + filter = MetricFilter.ALL; + } + builder = builder.filter(filter); + if (logger == null || logger.isEmpty()) { + // construct logger name from Group + if (pluginInfo.attributes.containsKey("group")) { + logger = SolrMetricManager.overridableRegistryName(pluginInfo.attributes.get("group")); + } else if (pluginInfo.attributes.containsKey("registry")) { + String reg = SolrMetricManager.overridableRegistryName(pluginInfo.attributes.get("registry")); + String[] names = reg.split("\\."); + if (names.length < 2) { + logger = reg; + } else { + logger = names[0] + "." + names[1]; + } + } + } + builder = builder.outputTo(LoggerFactory.getLogger(logger)); + reporter = builder.build(); + reporter.start(period, TimeUnit.SECONDS); + } + + @Override + public void close() throws IOException { + if (reporter != null) { + reporter.close(); + } + } +} diff --git a/solr/core/src/test-files/solr/solr-gangliareporter.xml b/solr/core/src/test-files/solr/solr-gangliareporter.xml new file mode 100644 index 00000000000..9e7233c9238 --- /dev/null +++ b/solr/core/src/test-files/solr/solr-gangliareporter.xml @@ -0,0 +1,32 @@ + + + + + + + localhost + 10000 + + 1 + test + cores + + true + + + diff --git a/solr/core/src/test-files/solr/solr-graphitereporter.xml b/solr/core/src/test-files/solr/solr-graphitereporter.xml new file mode 100644 index 00000000000..a0557df2e43 --- /dev/null +++ b/solr/core/src/test-files/solr/solr-graphitereporter.xml @@ -0,0 +1,31 @@ + + + + + + + localhost + ${mock-graphite-port} + + 1 + test + cores + false + + + diff --git a/solr/core/src/test-files/solr/solr-slf4jreporter.xml b/solr/core/src/test-files/solr/solr-slf4jreporter.xml new file mode 100644 index 00000000000..1a084161012 --- /dev/null +++ b/solr/core/src/test-files/solr/solr-slf4jreporter.xml @@ -0,0 +1,35 @@ + + + + + + + + 1 + test + cores + + + + 1 + test + cores + foobar + + + diff --git a/solr/core/src/test/org/apache/solr/metrics/reporters/SolrGangliaReporterTest.java b/solr/core/src/test/org/apache/solr/metrics/reporters/SolrGangliaReporterTest.java new file mode 100644 index 00000000000..b5b0f858395 --- /dev/null +++ b/solr/core/src/test/org/apache/solr/metrics/reporters/SolrGangliaReporterTest.java @@ -0,0 +1,81 @@ +/* + * 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.reporters; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import info.ganglia.gmetric4j.gmetric.GMetric; +import info.ganglia.gmetric4j.gmetric.GMetricSlope; +import info.ganglia.gmetric4j.gmetric.GMetricType; +import org.apache.commons.io.FileUtils; +import org.apache.solr.SolrTestCaseJ4; +import org.apache.solr.core.CoreContainer; +import org.apache.solr.core.NodeConfig; +import org.apache.solr.core.SolrResourceLoader; +import org.apache.solr.core.SolrXmlConfig; +import org.apache.solr.metrics.SolrMetricManager; +import org.apache.solr.metrics.SolrMetricReporter; +import org.apache.solr.util.TestHarness; +import org.junit.Test; + +import static org.mockito.Mockito.*; + +/** + * + */ +public class SolrGangliaReporterTest extends SolrTestCaseJ4 { + @Test + public void testReporter() throws Exception { + Path home = Paths.get(TEST_HOME()); + // define these properties, they are used in solrconfig.xml + System.setProperty("solr.test.sys.prop1", "propone"); + System.setProperty("solr.test.sys.prop2", "proptwo"); + + GMetric ganglia = mock(GMetric.class); + final List names = new ArrayList<>(); + doAnswer(invocation -> { + final Object[] args = invocation.getArguments(); + names.add((String)args[0]); + return null; + }).when(ganglia).announce(anyString(), anyString(), any(GMetricType.class), anyString(), any(GMetricSlope.class), anyInt(), anyInt(), anyString()); + String solrXml = FileUtils.readFileToString(Paths.get(home.toString(), "solr-gangliareporter.xml").toFile(), "UTF-8"); + NodeConfig cfg = SolrXmlConfig.fromString(new SolrResourceLoader(home), solrXml); + CoreContainer cc = createCoreContainer(cfg, + new TestHarness.TestCoresLocator(DEFAULT_TEST_CORENAME, initCoreDataDir.getAbsolutePath(), "solrconfig.xml", "schema.xml")); + h.coreName = DEFAULT_TEST_CORENAME; + SolrMetricManager metricManager = cc.getMetricManager(); + Map reporters = metricManager.getReporters("solr.node"); + assertEquals(1, reporters.size()); + SolrMetricReporter reporter = reporters.get("test"); + assertNotNull(reporter); + assertTrue(reporter instanceof SolrGangliaReporter); + SolrGangliaReporter gangliaReporter = (SolrGangliaReporter)reporter; + gangliaReporter.setGMetric(ganglia); + gangliaReporter.start(); + Thread.sleep(5000); + assertTrue(names.size() >= 3); + for (String name : names) { + assertTrue(name, name.startsWith("test.solr.node.cores.")); + } + } + +} diff --git a/solr/core/src/test/org/apache/solr/metrics/reporters/SolrGraphiteReporterTest.java b/solr/core/src/test/org/apache/solr/metrics/reporters/SolrGraphiteReporterTest.java new file mode 100644 index 00000000000..6773e0ca0e3 --- /dev/null +++ b/solr/core/src/test/org/apache/solr/metrics/reporters/SolrGraphiteReporterTest.java @@ -0,0 +1,115 @@ +/* + * 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.reporters; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.ServerSocket; +import java.net.Socket; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.commons.io.FileUtils; +import org.apache.solr.SolrTestCaseJ4; +import org.apache.solr.core.CoreContainer; +import org.apache.solr.core.NodeConfig; +import org.apache.solr.core.SolrResourceLoader; +import org.apache.solr.core.SolrXmlConfig; +import org.apache.solr.metrics.SolrMetricManager; +import org.apache.solr.metrics.SolrMetricReporter; +import org.apache.solr.util.TestHarness; +import org.junit.Test; + +/** + * + */ +public class SolrGraphiteReporterTest extends SolrTestCaseJ4 { + + @Test + public void testReporter() throws Exception { + Path home = Paths.get(TEST_HOME()); + // define these properties, they are used in solrconfig.xml + System.setProperty("solr.test.sys.prop1", "propone"); + System.setProperty("solr.test.sys.prop2", "proptwo"); + + MockGraphite mock = new MockGraphite(); + try { + mock.start(); + Thread.sleep(1000); + // define the port where MockGraphite is running + System.setProperty("mock-graphite-port", String.valueOf(mock.port)); + String solrXml = FileUtils.readFileToString(Paths.get(home.toString(), "solr-graphitereporter.xml").toFile(), "UTF-8"); + NodeConfig cfg = SolrXmlConfig.fromString(new SolrResourceLoader(home), solrXml); + CoreContainer cc = createCoreContainer(cfg, + new TestHarness.TestCoresLocator(DEFAULT_TEST_CORENAME, initCoreDataDir.getAbsolutePath(), "solrconfig.xml", "schema.xml")); + h.coreName = DEFAULT_TEST_CORENAME; + SolrMetricManager metricManager = cc.getMetricManager(); + Map reporters = metricManager.getReporters("solr.node"); + assertEquals(1, reporters.size()); + SolrMetricReporter reporter = reporters.get("test"); + assertNotNull(reporter); + assertTrue(reporter instanceof SolrGraphiteReporter); + Thread.sleep(5000); + assertTrue(mock.lines.size() >= 3); + for (String line : mock.lines) { + assertTrue(line, line.startsWith("test.solr.node.cores.")); + } + } finally { + mock.close(); + } + } + + private class MockGraphite extends Thread { + private List lines = new ArrayList<>(); + private ServerSocket server = null; + private int port; + private boolean stop; + + MockGraphite() throws Exception { + server = new ServerSocket(0); + port = server.getLocalPort(); + stop = false; + } + + public void run() { + while (!stop) { + try { + Socket s = server.accept(); + BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), "UTF-8")); + String line; + while ((line = br.readLine()) != null) { + lines.add(line); + } + } catch (Exception e) { + stop = true; + } + } + } + + public void close() throws Exception { + stop = true; + if (server != null) { + server.close(); + } + } + } + +} diff --git a/solr/core/src/test/org/apache/solr/metrics/reporters/SolrSlf4jReporterTest.java b/solr/core/src/test/org/apache/solr/metrics/reporters/SolrSlf4jReporterTest.java new file mode 100644 index 00000000000..47bf8e7216f --- /dev/null +++ b/solr/core/src/test/org/apache/solr/metrics/reporters/SolrSlf4jReporterTest.java @@ -0,0 +1,77 @@ +/* + * 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.reporters; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Map; + +import org.apache.commons.io.FileUtils; +import org.apache.solr.SolrTestCaseJ4; +import org.apache.solr.common.SolrDocumentList; +import org.apache.solr.core.CoreContainer; +import org.apache.solr.core.NodeConfig; +import org.apache.solr.core.SolrResourceLoader; +import org.apache.solr.core.SolrXmlConfig; +import org.apache.solr.logging.LogWatcher; +import org.apache.solr.logging.LogWatcherConfig; +import org.apache.solr.metrics.SolrMetricManager; +import org.apache.solr.metrics.SolrMetricReporter; +import org.apache.solr.util.TestHarness; +import org.junit.Test; + +/** + * + */ +public class SolrSlf4jReporterTest extends SolrTestCaseJ4 { + + @Test + public void testReporter() throws Exception { + LogWatcherConfig watcherCfg = new LogWatcherConfig(true, null, null, 100); + LogWatcher watcher = LogWatcher.newRegisteredLogWatcher(watcherCfg, null); + watcher.setThreshold("INFO"); + Path home = Paths.get(TEST_HOME()); + // define these properties, they are used in solrconfig.xml + System.setProperty("solr.test.sys.prop1", "propone"); + System.setProperty("solr.test.sys.prop2", "proptwo"); + + String solrXml = FileUtils.readFileToString(Paths.get(home.toString(), "solr-slf4jreporter.xml").toFile(), "UTF-8"); + NodeConfig cfg = SolrXmlConfig.fromString(new SolrResourceLoader(home), solrXml); + CoreContainer cc = createCoreContainer(cfg, + new TestHarness.TestCoresLocator(DEFAULT_TEST_CORENAME, initCoreDataDir.getAbsolutePath(), "solrconfig.xml", "schema.xml")); + h.coreName = DEFAULT_TEST_CORENAME; + SolrMetricManager metricManager = cc.getMetricManager(); + Map reporters = metricManager.getReporters("solr.node"); + assertEquals(2, reporters.size()); + SolrMetricReporter reporter = reporters.get("test1"); + assertNotNull(reporter); + assertTrue(reporter instanceof SolrSlf4jReporter); + reporter = reporters.get("test2"); + assertNotNull(reporter); + assertTrue(reporter instanceof SolrSlf4jReporter); + + watcher.reset(); + Thread.sleep(5000); + + SolrDocumentList history = watcher.getHistory(-1, null); + // dot-separated names are treated like class names and collapsed + // in regular log output, but here we get the full name + assertTrue(history.stream().filter(d -> "solr.node".equals(d.getFirstValue("logger"))).count() > 0); + assertTrue(history.stream().filter(d -> "foobar".equals(d.getFirstValue("logger"))).count() > 0); + } +} diff --git a/solr/licenses/gmetric4j-1.0.7.jar.sha1 b/solr/licenses/gmetric4j-1.0.7.jar.sha1 new file mode 100644 index 00000000000..ca2b05fe514 --- /dev/null +++ b/solr/licenses/gmetric4j-1.0.7.jar.sha1 @@ -0,0 +1 @@ +37a1cb0d8821cad9bd33f1ce454459fed18efa44 diff --git a/solr/licenses/gmetric4j-LICENSE-BSD.txt b/solr/licenses/gmetric4j-LICENSE-BSD.txt new file mode 100644 index 00000000000..bdb2cf4ea6e --- /dev/null +++ b/solr/licenses/gmetric4j-LICENSE-BSD.txt @@ -0,0 +1,31 @@ +Title: gmetric4j + +Copyright: + +Copyright (C) 2012 Daniel Pocock +Copyright (c) 2008-2011 Jasper Humphrey + +Based on: jmxetric by Jasper Humphrey (BSD style license) + +License: BSD terms + + Copyright (C) 2010-2012 Daniel Pocock + Copyright (c) 2008-2011 Jasper Humphrey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/solr/licenses/gmetric4j-NOTICE.txt b/solr/licenses/gmetric4j-NOTICE.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/solr/licenses/metrics-ganglia-3.1.2.jar.sha1 b/solr/licenses/metrics-ganglia-3.1.2.jar.sha1 new file mode 100644 index 00000000000..337754bf00a --- /dev/null +++ b/solr/licenses/metrics-ganglia-3.1.2.jar.sha1 @@ -0,0 +1 @@ +2a4e2fcd6436f9b1771f0f9b6bab445dddcf704f diff --git a/solr/licenses/metrics-ganglia-LICENSE-ASL.txt b/solr/licenses/metrics-ganglia-LICENSE-ASL.txt new file mode 100644 index 00000000000..ccb320c7daa --- /dev/null +++ b/solr/licenses/metrics-ganglia-LICENSE-ASL.txt @@ -0,0 +1,203 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2010-2012 Coda Hale and Yammer, Inc. + + Licensed 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. + diff --git a/solr/licenses/metrics-ganglia-NOTICE.txt b/solr/licenses/metrics-ganglia-NOTICE.txt new file mode 100644 index 00000000000..b4c6298472f --- /dev/null +++ b/solr/licenses/metrics-ganglia-NOTICE.txt @@ -0,0 +1,12 @@ +Metrics +Copyright 2010-2013 Coda Hale and Yammer, Inc. + +This product includes software developed by Coda Hale and Yammer, Inc. + +This product includes code derived from the JSR-166 project (ThreadLocalRandom, Striped64, +LongAdder), which was released with the following comments: + + Written by Doug Lea with assistance from members of JCP JSR-166 + Expert Group and released to the public domain, as explained at + http://creativecommons.org/publicdomain/zero/1.0/ + diff --git a/solr/licenses/metrics-graphite-3.1.2.jar.sha1 b/solr/licenses/metrics-graphite-3.1.2.jar.sha1 new file mode 100644 index 00000000000..34f01615d95 --- /dev/null +++ b/solr/licenses/metrics-graphite-3.1.2.jar.sha1 @@ -0,0 +1 @@ +15a68399652c6123fe6e4c82ac4f0749e2eb6583 diff --git a/solr/licenses/metrics-graphite-LICENSE-ASL.txt b/solr/licenses/metrics-graphite-LICENSE-ASL.txt new file mode 100644 index 00000000000..ccb320c7daa --- /dev/null +++ b/solr/licenses/metrics-graphite-LICENSE-ASL.txt @@ -0,0 +1,203 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2010-2012 Coda Hale and Yammer, Inc. + + Licensed 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. + diff --git a/solr/licenses/metrics-graphite-NOTICE.txt b/solr/licenses/metrics-graphite-NOTICE.txt new file mode 100644 index 00000000000..b4c6298472f --- /dev/null +++ b/solr/licenses/metrics-graphite-NOTICE.txt @@ -0,0 +1,12 @@ +Metrics +Copyright 2010-2013 Coda Hale and Yammer, Inc. + +This product includes software developed by Coda Hale and Yammer, Inc. + +This product includes code derived from the JSR-166 project (ThreadLocalRandom, Striped64, +LongAdder), which was released with the following comments: + + Written by Doug Lea with assistance from members of JCP JSR-166 + Expert Group and released to the public domain, as explained at + http://creativecommons.org/publicdomain/zero/1.0/ + diff --git a/solr/server/ivy.xml b/solr/server/ivy.xml index 8dc645a2917..c9b3a730143 100644 --- a/solr/server/ivy.xml +++ b/solr/server/ivy.xml @@ -36,6 +36,9 @@ + + +