mirror of https://github.com/apache/lucene.git
SOLR-13434: OpenTracing support for Solr (#685)
This commit is contained in:
parent
bd3cc0b6a1
commit
301ea0e462
|
@ -0,0 +1,10 @@
|
||||||
|
<component name="libraryTable">
|
||||||
|
<library name="Solr jaeger tracer configurator library">
|
||||||
|
<CLASSES>
|
||||||
|
<root url="file://$PROJECT_DIR$/solr/contrib/jaegertracer-configurator/lib" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES />
|
||||||
|
<jarDirectory url="file://$PROJECT_DIR$/solr/contrib/jaegertracer-configurator/lib" recursive="false" />
|
||||||
|
</library>
|
||||||
|
</component>
|
|
@ -59,6 +59,7 @@
|
||||||
<module group="Solr/Contrib" filepath="$PROJECT_DIR$/solr/contrib/langid/langid.iml" />
|
<module group="Solr/Contrib" filepath="$PROJECT_DIR$/solr/contrib/langid/langid.iml" />
|
||||||
<module group="Solr/Contrib" filepath="$PROJECT_DIR$/solr/contrib/ltr/ltr.iml" />
|
<module group="Solr/Contrib" filepath="$PROJECT_DIR$/solr/contrib/ltr/ltr.iml" />
|
||||||
<module group="Solr/Contrib" filepath="$PROJECT_DIR$/solr/contrib/prometheus-exporter/prometheus-exporter.iml" />
|
<module group="Solr/Contrib" filepath="$PROJECT_DIR$/solr/contrib/prometheus-exporter/prometheus-exporter.iml" />
|
||||||
|
<module group="Solr/Contrib" filepath="$PROJECT_DIR$/solr/contrib/jaegertracer-configurator/jaegertracer-configurator.iml" />
|
||||||
<module group="Solr/Contrib" filepath="$PROJECT_DIR$/solr/contrib/velocity/velocity.iml" />
|
<module group="Solr/Contrib" filepath="$PROJECT_DIR$/solr/contrib/velocity/velocity.iml" />
|
||||||
</modules>
|
</modules>
|
||||||
</component>
|
</component>
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="false">
|
||||||
|
<output url="file://$MODULE_DIR$/../../../idea-build/solr/contrib/jaegertracer-configurator/classes/java" />
|
||||||
|
<output-test url="file://$MODULE_DIR$/../../../idea-build/solr/contrib/jaegertracer-configurator/classes/test" />
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/test" isTestSource="true" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/test-files" type="java-test-resource" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src/java" isTestSource="false" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
<orderEntry type="library" scope="TEST" name="JUnit" level="project" />
|
||||||
|
<orderEntry type="library" name="Solr core library" level="project" />
|
||||||
|
<orderEntry type="library" name="Solrj library" level="project" />
|
||||||
|
<orderEntry type="module-library" scope="TEST">
|
||||||
|
<library>
|
||||||
|
<CLASSES>
|
||||||
|
<root url="file://$MODULE_DIR$/lib" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES />
|
||||||
|
<jarDirectory url="file://$MODULE_DIR$/lib" recursive="false" />
|
||||||
|
</library>
|
||||||
|
</orderEntry>
|
||||||
|
<orderEntry type="module" scope="TEST" module-name="lucene-test-framework" />
|
||||||
|
<orderEntry type="module" scope="TEST" module-name="solr-test-framework" />
|
||||||
|
<orderEntry type="library" name="Solr core library" level="project" />
|
||||||
|
<orderEntry type="library" name="Solrj library" level="project" />
|
||||||
|
<orderEntry type="library" name="Solr jaeger tracer configurator library" level="project" />
|
||||||
|
<orderEntry type="module" module-name="lucene-core" />
|
||||||
|
<orderEntry type="module" module-name="solr-core" />
|
||||||
|
<orderEntry type="module" module-name="solrj" />
|
||||||
|
<orderEntry type="module" module-name="analysis-common" />
|
||||||
|
</component>
|
||||||
|
</module>
|
|
@ -16,6 +16,7 @@
|
||||||
<orderEntry type="library" name="Solr core library" level="project" />
|
<orderEntry type="library" name="Solr core library" level="project" />
|
||||||
<orderEntry type="library" name="Solr example library" level="project" />
|
<orderEntry type="library" name="Solr example library" level="project" />
|
||||||
<orderEntry type="library" name="Solrj library" level="project" />
|
<orderEntry type="library" name="Solrj library" level="project" />
|
||||||
|
<orderEntry type="library" name="Solr test framework library" level="project" />
|
||||||
<orderEntry type="module" module-name="lucene-test-framework" />
|
<orderEntry type="module" module-name="lucene-test-framework" />
|
||||||
<orderEntry type="module" module-name="analysis-common" />
|
<orderEntry type="module" module-name="analysis-common" />
|
||||||
<orderEntry type="module" module-name="solrj" />
|
<orderEntry type="module" module-name="solrj" />
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<parent>
|
||||||
|
<groupId>org.apache.solr</groupId>
|
||||||
|
<artifactId>solr-parent</artifactId>
|
||||||
|
<version>@version@</version>
|
||||||
|
<relativePath>../../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
<groupId>org.apache.solr</groupId>
|
||||||
|
<artifactId>solr-jaegertracer-configurator</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<name>Apache Solr Jaeger Tracer Configurator Package</name>
|
||||||
|
<description>
|
||||||
|
Apache Solr Jaeger Tracer Configurator Package
|
||||||
|
</description>
|
||||||
|
<properties>
|
||||||
|
<module-directory>solr/contrib/jaegertracer-configurator</module-directory>
|
||||||
|
<relative-top-level>../../../..</relative-top-level>
|
||||||
|
<module-path>${relative-top-level}/${module-directory}</module-path>
|
||||||
|
</properties>
|
||||||
|
<scm>
|
||||||
|
<connection>scm:git:${vc-anonymous-base-url}</connection>
|
||||||
|
<developerConnection>scm:git:${vc-dev-base-url}</developerConnection>
|
||||||
|
<url>${vc-browse-base-url};f=${module-directory}</url>
|
||||||
|
</scm>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<!-- lucene-test-framework dependency must be declared before lucene-core -->
|
||||||
|
<!-- This dependency cannot be put into solr-parent, because local -->
|
||||||
|
<!-- dependencies are always ordered before inherited dependencies. -->
|
||||||
|
<groupId>org.apache.lucene</groupId>
|
||||||
|
<artifactId>lucene-test-framework</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.solr</groupId>
|
||||||
|
<artifactId>solr-test-framework</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
@solr-jaegertracer-configurator.internal.dependencies@
|
||||||
|
@solr-jaegertracer-configurator.external.dependencies@
|
||||||
|
@solr-jaegertracer-configurator.internal.test.dependencies@
|
||||||
|
@solr-jaegertracer-configurator.external.test.dependencies@
|
||||||
|
</dependencies>
|
||||||
|
<build>
|
||||||
|
<sourceDirectory>${module-path}/src/java</sourceDirectory>
|
||||||
|
<testSourceDirectory>${module-path}/src/test</testSourceDirectory>
|
||||||
|
<testResources>
|
||||||
|
<testResource>
|
||||||
|
<directory>${module-path}/src/test-files</directory>
|
||||||
|
</testResource>
|
||||||
|
<testResource>
|
||||||
|
<directory>${top-level}/dev-tools/maven/solr</directory>
|
||||||
|
<includes>
|
||||||
|
<include>maven.testlogging.properties</include>
|
||||||
|
</includes>
|
||||||
|
</testResource>
|
||||||
|
</testResources>
|
||||||
|
</build>
|
||||||
|
</project>
|
|
@ -37,6 +37,7 @@
|
||||||
<module>dataimporthandler</module>
|
<module>dataimporthandler</module>
|
||||||
<module>dataimporthandler-extras</module>
|
<module>dataimporthandler-extras</module>
|
||||||
<module>extraction</module>
|
<module>extraction</module>
|
||||||
|
<module>jaegertracer-configurator</module>
|
||||||
<module>langid</module>
|
<module>langid</module>
|
||||||
<module>ltr</module>
|
<module>ltr</module>
|
||||||
<module>prometheus-exporter</module>
|
<module>prometheus-exporter</module>
|
||||||
|
|
|
@ -66,9 +66,19 @@ io.dropwizard.metrics.version = 4.0.5
|
||||||
/io.dropwizard.metrics/metrics-jmx = ${io.dropwizard.metrics.version}
|
/io.dropwizard.metrics/metrics-jmx = ${io.dropwizard.metrics.version}
|
||||||
/io.dropwizard.metrics/metrics-jvm = ${io.dropwizard.metrics.version}
|
/io.dropwizard.metrics/metrics-jvm = ${io.dropwizard.metrics.version}
|
||||||
|
|
||||||
|
io.jaegertracing.version = 0.35.5
|
||||||
|
/io.jaegertracing/jaeger-core = ${io.jaegertracing.version}
|
||||||
|
/io.jaegertracing/jaeger-thrift = ${io.jaegertracing.version}
|
||||||
|
|
||||||
io.netty.netty-all.version = 4.0.52.Final
|
io.netty.netty-all.version = 4.0.52.Final
|
||||||
/io.netty/netty-all = ${io.netty.netty-all.version}
|
/io.netty/netty-all = ${io.netty.netty-all.version}
|
||||||
|
|
||||||
|
io.opentracing.version = 0.33.0
|
||||||
|
/io.opentracing/opentracing-api = ${io.opentracing.version}
|
||||||
|
/io.opentracing/opentracing-mock = ${io.opentracing.version}
|
||||||
|
/io.opentracing/opentracing-noop = ${io.opentracing.version}
|
||||||
|
/io.opentracing/opentracing-util = ${io.opentracing.version}
|
||||||
|
|
||||||
io.prometheus.version = 0.2.0
|
io.prometheus.version = 0.2.0
|
||||||
/io.prometheus/simpleclient = ${io.prometheus.version}
|
/io.prometheus/simpleclient = ${io.prometheus.version}
|
||||||
/io.prometheus/simpleclient_common = ${io.prometheus.version}
|
/io.prometheus/simpleclient_common = ${io.prometheus.version}
|
||||||
|
@ -182,6 +192,9 @@ org.apache.poi.version = 4.0.0
|
||||||
/org.apache.poi/poi-ooxml-schemas = ${org.apache.poi.version}
|
/org.apache.poi/poi-ooxml-schemas = ${org.apache.poi.version}
|
||||||
/org.apache.poi/poi-scratchpad = ${org.apache.poi.version}
|
/org.apache.poi/poi-scratchpad = ${org.apache.poi.version}
|
||||||
|
|
||||||
|
org.apache.thrift.version = 0.12.0
|
||||||
|
/org.apache.thrift/libthrift = ${org.apache.thrift.version}
|
||||||
|
|
||||||
org.apache.tika.version = 1.19.1
|
org.apache.tika.version = 1.19.1
|
||||||
/org.apache.tika/tika-core = ${org.apache.tika.version}
|
/org.apache.tika/tika-core = ${org.apache.tika.version}
|
||||||
/org.apache.tika/tika-java7 = ${org.apache.tika.version}
|
/org.apache.tika/tika-java7 = ${org.apache.tika.version}
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
Welcome to Apache Solr Jaeger Tracer Configurator
|
||||||
|
========
|
||||||
|
|
||||||
|
Apache Solr Jaeger Tracer Configurator (solr-jaegertracer) provides a way for you to expose Solr's tracing to Jaeger.
|
||||||
|
|
||||||
|
# Setup Jaeger Tracer Configurator
|
||||||
|
|
||||||
|
Note that all library of solr-jaegertracer must be included in the classpath of all nodes then Jaeger tracer can be setup in `solr.xml` like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
<tracerConfig name="tracerConfig" class="org.apache.solr.jaeger.JaegerTracerConfigurator">
|
||||||
|
<str name="agentHost">localhost</str>
|
||||||
|
<int name="agentPort">5775</int>
|
||||||
|
<bool name="logSpans">true</bool>
|
||||||
|
<int name="flushInterval">1000</int>
|
||||||
|
<int name="maxQueueSize">10000</int>
|
||||||
|
</tracerConfig>
|
||||||
|
```
|
||||||
|
|
||||||
|
List of parameters for JaegerTracerConfigurator include:
|
||||||
|
|Parameter|Type|Required|Default|Description|
|
||||||
|
|---------|----|--------|-------|-----------|
|
||||||
|
|agentHost|string|Yes||The host of Jaeger backend|
|
||||||
|
|agentPort|int|Yes||The port of Jaeger port|
|
||||||
|
|logsSpans|bool|No|true|Whether the tracer should also log the spans|
|
||||||
|
|flushInterval|int|No|5000|The tracer's flush interval (ms)|
|
||||||
|
|maxQueueSize|int|No|10000|The tracer's maximum queue size|
|
||||||
|
|
||||||
|
Other parameters which are not listed above can be configured using System Properties or Environment Variables. The full list are listed at [Jaeger-README](https://github.com/jaegertracing/jaeger-client-java/blob/master/jaeger-core/README.md).
|
||||||
|
|
||||||
|
By default the sampling rate is 0.1%, this value can be changed by updating
|
||||||
|
key `samplePercentage` of cluster properties. I.e: `/admin/collections?action=CLUSTERPROP&name=propertyName&samplePercentage=100`.
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<project name="solr-jaegertracer-configurator" default="default">
|
||||||
|
|
||||||
|
<description>
|
||||||
|
Jaeger tracer configurator for tracing Solr using OpenTracing with Jaeger backend.
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<import file="../contrib-build.xml"/>
|
||||||
|
|
||||||
|
<path id="classpath">
|
||||||
|
<path refid="solr.base.classpath"/>
|
||||||
|
</path>
|
||||||
|
|
||||||
|
<target name="compile-core" depends="solr-contrib-build.compile-core"/>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,32 @@
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
<ivy-module version="2.0">
|
||||||
|
<info organisation="org.apache.solr" module="jaegertracer-configurator"/>
|
||||||
|
<configurations defaultconfmapping="compile->master;test->master">
|
||||||
|
<conf name="compile" transitive="false"/>
|
||||||
|
<conf name="test" transitive="false"/>
|
||||||
|
</configurations>
|
||||||
|
<dependencies>
|
||||||
|
<dependency org="io.jaegertracing" name="jaeger-core" rev="${/io.jaegertracing/jaeger-core}" conf="compile"/>
|
||||||
|
<dependency org="io.jaegertracing" name="jaeger-thrift" rev="${/io.jaegertracing/jaeger-thrift}" conf="compile"/>
|
||||||
|
<dependency org="org.apache.thrift" name="libthrift" rev="${/org.apache.thrift/libthrift}" conf="compile"/>
|
||||||
|
|
||||||
|
<exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/>
|
||||||
|
</dependencies>
|
||||||
|
</ivy-module>
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*
|
||||||
|
* 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.jaeger;
|
||||||
|
|
||||||
|
import io.jaegertracing.Configuration;
|
||||||
|
import io.jaegertracing.internal.samplers.ConstSampler;
|
||||||
|
import io.opentracing.Tracer;
|
||||||
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
import org.apache.solr.core.TracerConfigurator;
|
||||||
|
|
||||||
|
public class JaegerTracerConfigurator extends TracerConfigurator {
|
||||||
|
public static final String AGENT_HOST = "agentHost";
|
||||||
|
public static final String AGENT_PORT = "agentPort";
|
||||||
|
public static final String LOG_SPANS = "logSpans";
|
||||||
|
public static final String FLUSH_INTERVAL = "flushInterval";
|
||||||
|
public static final String MAX_QUEUE_SIZE = "maxQueueSize";
|
||||||
|
|
||||||
|
private volatile Tracer tracer;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Tracer getTracer() {
|
||||||
|
return tracer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(NamedList args) {
|
||||||
|
Object host = args.get(AGENT_HOST);
|
||||||
|
if (!(host instanceof String)) {
|
||||||
|
throw new IllegalArgumentException("Expected a required string for param '" + AGENT_HOST + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
Object portArg = args.get(AGENT_PORT);
|
||||||
|
if (!(portArg instanceof Integer)) {
|
||||||
|
throw new IllegalArgumentException("Expected a required int for param '" + AGENT_PORT + "'");
|
||||||
|
}
|
||||||
|
int port = (Integer) portArg;
|
||||||
|
|
||||||
|
Boolean logSpans = args.getBooleanArg(LOG_SPANS);
|
||||||
|
if (logSpans == null)
|
||||||
|
logSpans = true;
|
||||||
|
|
||||||
|
Object flushIntervalArg = args.get(FLUSH_INTERVAL);
|
||||||
|
if (flushIntervalArg != null && !(flushIntervalArg instanceof Integer)) {
|
||||||
|
throw new IllegalArgumentException("Expected a required int for param '" + FLUSH_INTERVAL +"'");
|
||||||
|
}
|
||||||
|
int flushInterval = flushIntervalArg == null ? 1000 : (Integer) flushIntervalArg;
|
||||||
|
|
||||||
|
Object maxQueueArgs = args.get(MAX_QUEUE_SIZE);
|
||||||
|
if (maxQueueArgs != null && !(maxQueueArgs instanceof Integer)) {
|
||||||
|
throw new IllegalArgumentException("Expected a required int for param '" + MAX_QUEUE_SIZE +"'");
|
||||||
|
}
|
||||||
|
int maxQueue = maxQueueArgs == null ? 10000 : (Integer) maxQueueArgs;
|
||||||
|
|
||||||
|
Configuration.SamplerConfiguration samplerConfig = new Configuration.SamplerConfiguration()
|
||||||
|
.withType(ConstSampler.TYPE)
|
||||||
|
.withParam(1);
|
||||||
|
|
||||||
|
Configuration.ReporterConfiguration reporterConfig = Configuration.ReporterConfiguration.fromEnv();
|
||||||
|
Configuration.SenderConfiguration senderConfig = reporterConfig.getSenderConfiguration()
|
||||||
|
.withAgentHost(host.toString())
|
||||||
|
.withAgentPort(port);
|
||||||
|
|
||||||
|
reporterConfig.withLogSpans(logSpans)
|
||||||
|
.withFlushInterval(flushInterval)
|
||||||
|
.withMaxQueueSize(maxQueue)
|
||||||
|
.withSender(senderConfig);
|
||||||
|
tracer = new Configuration("solr")
|
||||||
|
.withSampler(samplerConfig)
|
||||||
|
.withReporter(reporterConfig)
|
||||||
|
.getTracer();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
<schema name="minimal" version="1.1">
|
||||||
|
<fieldType name="string" class="solr.StrField"/>
|
||||||
|
<fieldType name="int" class="${solr.tests.IntegerFieldType}" docValues="${solr.tests.numeric.dv}" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
|
||||||
|
<fieldType name="long" class="${solr.tests.LongFieldType}" docValues="${solr.tests.numeric.dv}" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
|
||||||
|
<dynamicField name="*" type="string" indexed="true" stored="true"/>
|
||||||
|
<!-- for versioning -->
|
||||||
|
<field name="_version_" type="long" indexed="true" stored="true"/>
|
||||||
|
<field name="_root_" type="string" indexed="true" stored="true" multiValued="false" required="false"/>
|
||||||
|
<field name="id" type="string" indexed="true" stored="true"/>
|
||||||
|
<dynamicField name="*_s" type="string" indexed="true" stored="true" />
|
||||||
|
<uniqueKey>id</uniqueKey>
|
||||||
|
</schema>
|
|
@ -0,0 +1,51 @@
|
||||||
|
<?xml version="1.0" ?>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Minimal solrconfig.xml with /select, /admin and /update only -->
|
||||||
|
|
||||||
|
<config>
|
||||||
|
|
||||||
|
<dataDir>${solr.data.dir:}</dataDir>
|
||||||
|
|
||||||
|
<directoryFactory name="DirectoryFactory"
|
||||||
|
class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>
|
||||||
|
<schemaFactory class="ClassicIndexSchemaFactory"/>
|
||||||
|
|
||||||
|
<luceneMatchVersion>${tests.luceneMatchVersion:LATEST}</luceneMatchVersion>
|
||||||
|
|
||||||
|
<updateHandler class="solr.DirectUpdateHandler2">
|
||||||
|
<commitWithin>
|
||||||
|
<softCommit>${solr.commitwithin.softcommit:true}</softCommit>
|
||||||
|
</commitWithin>
|
||||||
|
<updateLog class="${solr.ulog:solr.UpdateLog}"></updateLog>
|
||||||
|
</updateHandler>
|
||||||
|
|
||||||
|
<requestHandler name="/select" class="solr.SearchHandler">
|
||||||
|
<lst name="defaults">
|
||||||
|
<str name="echoParams">explicit</str>
|
||||||
|
<str name="indent">true</str>
|
||||||
|
<str name="df">text</str>
|
||||||
|
</lst>
|
||||||
|
|
||||||
|
</requestHandler>
|
||||||
|
<indexConfig>
|
||||||
|
<mergeScheduler class="${solr.mscheduler:org.apache.lucene.index.ConcurrentMergeScheduler}"/>
|
||||||
|
: </indexConfig>
|
||||||
|
</config>
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
solr.xml mimicking the old default solr.xml
|
||||||
|
-->
|
||||||
|
|
||||||
|
<solr>
|
||||||
|
|
||||||
|
<str name="shareSchema">${shareSchema:false}</str>
|
||||||
|
<str name="configSetBaseDir">${configSetBaseDir:configsets}</str>
|
||||||
|
<str name="coreRootDirectory">${coreRootDirectory:.}</str>
|
||||||
|
<str name="collectionsHandler">${collectionsHandler:solr.CollectionsHandler}</str>
|
||||||
|
|
||||||
|
<shardHandlerFactory name="shardHandlerFactory" class="HttpShardHandlerFactory">
|
||||||
|
<str name="urlScheme">${urlScheme:}</str>
|
||||||
|
<int name="socketTimeout">${socketTimeout:90000}</int>
|
||||||
|
<int name="connTimeout">${connTimeout:15000}</int>
|
||||||
|
<str name="shardsWhitelist">${solr.tests.shardsWhitelist:}</str>
|
||||||
|
</shardHandlerFactory>
|
||||||
|
|
||||||
|
<tracerConfig name="tracerConfig" class="org.apache.solr.jaeger.JaegerTracerConfigurator">
|
||||||
|
<str name="agentHost">localhost</str>
|
||||||
|
<int name="agentPort">5775</int>
|
||||||
|
<bool name="logSpans">true</bool>
|
||||||
|
<int name="flushInterval">1000</int>
|
||||||
|
<int name="maxQueueSize">10000</int>
|
||||||
|
</tracerConfig>
|
||||||
|
|
||||||
|
<solrcloud>
|
||||||
|
<str name="host">127.0.0.1</str>
|
||||||
|
<int name="hostPort">${hostPort:8983}</int>
|
||||||
|
<str name="hostContext">${hostContext:solr}</str>
|
||||||
|
<int name="zkClientTimeout">${solr.zkclienttimeout:30000}</int>
|
||||||
|
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
|
||||||
|
<int name="leaderVoteWait">${leaderVoteWait:10000}</int>
|
||||||
|
<int name="distribUpdateConnTimeout">${distribUpdateConnTimeout:45000}</int>
|
||||||
|
<int name="distribUpdateSoTimeout">${distribUpdateSoTimeout:340000}</int>
|
||||||
|
<str name="zkCredentialsProvider">${zkCredentialsProvider:org.apache.solr.common.cloud.DefaultZkCredentialsProvider}</str>
|
||||||
|
<str name="zkACLProvider">${zkACLProvider:org.apache.solr.common.cloud.DefaultZkACLProvider}</str>
|
||||||
|
</solrcloud>
|
||||||
|
<metrics>
|
||||||
|
<reporter name="default" class="org.apache.solr.metrics.reporters.SolrJmxReporter">
|
||||||
|
<str name="rootName">solr_${hostPort:8983}</str>
|
||||||
|
</reporter>
|
||||||
|
</metrics>
|
||||||
|
</solr>
|
|
@ -0,0 +1,124 @@
|
||||||
|
/*
|
||||||
|
* 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.jaeger;
|
||||||
|
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.apache.solr.SolrTestCaseJ4;
|
||||||
|
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
|
||||||
|
import org.apache.solr.cloud.MiniSolrCloudCluster;
|
||||||
|
import org.apache.solr.cloud.SolrCloudTestCase;
|
||||||
|
import org.apache.solr.common.SolrException;
|
||||||
|
import org.apache.solr.common.cloud.ZkStateReader;
|
||||||
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
import org.apache.solr.common.util.TimeSource;
|
||||||
|
import org.apache.solr.util.TimeOut;
|
||||||
|
import org.apache.solr.util.tracing.GlobalTracer;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.apache.solr.jaeger.JaegerTracerConfigurator.AGENT_HOST;
|
||||||
|
import static org.apache.solr.jaeger.JaegerTracerConfigurator.AGENT_PORT;
|
||||||
|
import static org.apache.solr.jaeger.JaegerTracerConfigurator.FLUSH_INTERVAL;
|
||||||
|
import static org.apache.solr.jaeger.JaegerTracerConfigurator.LOG_SPANS;
|
||||||
|
import static org.apache.solr.jaeger.JaegerTracerConfigurator.MAX_QUEUE_SIZE;
|
||||||
|
|
||||||
|
public class TestJaegerConfigurator extends SolrTestCaseJ4 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testInjected() throws Exception{
|
||||||
|
MiniSolrCloudCluster cluster = new SolrCloudTestCase.Builder(1, createTempDir())
|
||||||
|
.addConfig("config", TEST_PATH().resolve("collection1").resolve("conf"))
|
||||||
|
.withSolrXml(getFile("solr/solr.xml").toPath())
|
||||||
|
.build();
|
||||||
|
CollectionAdminRequest.setClusterProperty(ZkStateReader.SAMPLE_PERCENTAGE, "100.0")
|
||||||
|
.process(cluster.getSolrClient());
|
||||||
|
try {
|
||||||
|
TimeOut timeOut = new TimeOut(2, TimeUnit.MINUTES, TimeSource.NANO_TIME);
|
||||||
|
timeOut.waitFor("Waiting for GlobalTracer is registered", () -> GlobalTracer.getTracer() instanceof io.jaegertracing.internal.JaegerTracer);
|
||||||
|
} finally {
|
||||||
|
cluster.shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO add integration test with Jaeger run on a container
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRequiredParameters() throws IOException {
|
||||||
|
JaegerTracerConfigurator configurator = new JaegerTracerConfigurator();
|
||||||
|
NamedList initArgs = new NamedList();
|
||||||
|
IllegalArgumentException exc = expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
|
||||||
|
assertTrue(exc.getMessage().contains(AGENT_HOST) || exc.getMessage().contains(AGENT_PORT));
|
||||||
|
initArgs.add(AGENT_HOST, "localhost");
|
||||||
|
|
||||||
|
exc = expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
|
||||||
|
assertTrue(exc.getMessage().contains(AGENT_PORT));
|
||||||
|
initArgs.add(AGENT_PORT, 5775);
|
||||||
|
|
||||||
|
// no exception should be thrown
|
||||||
|
configurator.init(initArgs);
|
||||||
|
((Closeable)configurator.getTracer()).close();
|
||||||
|
|
||||||
|
initArgs.add(LOG_SPANS, true);
|
||||||
|
initArgs.add(FLUSH_INTERVAL, 1000);
|
||||||
|
initArgs.add(MAX_QUEUE_SIZE, 10000);
|
||||||
|
configurator.init(initArgs);
|
||||||
|
((Closeable)configurator.getTracer()).close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIncorrectFormat() {
|
||||||
|
JaegerTracerConfigurator configurator = new JaegerTracerConfigurator();
|
||||||
|
NamedList initArgs = new NamedList();
|
||||||
|
initArgs.add(AGENT_HOST, 100);
|
||||||
|
initArgs.add(AGENT_PORT, 5775);
|
||||||
|
|
||||||
|
IllegalArgumentException exc = expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
|
||||||
|
assertTrue(exc.getMessage().contains(AGENT_HOST));
|
||||||
|
|
||||||
|
initArgs.clear();
|
||||||
|
initArgs.add(AGENT_HOST, "localhost");
|
||||||
|
initArgs.add(AGENT_PORT, "5775");
|
||||||
|
exc = expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
|
||||||
|
assertTrue(exc.getMessage().contains(AGENT_PORT));
|
||||||
|
|
||||||
|
initArgs.clear();
|
||||||
|
initArgs.add(AGENT_HOST, "localhost");
|
||||||
|
initArgs.add(AGENT_PORT, 5775);
|
||||||
|
initArgs.add(LOG_SPANS, 10);
|
||||||
|
SolrException solrExc = expectThrows(SolrException.class, () -> configurator.init(initArgs));
|
||||||
|
assertTrue(solrExc.getMessage().contains(LOG_SPANS));
|
||||||
|
|
||||||
|
initArgs.clear();
|
||||||
|
initArgs.add(AGENT_HOST, "localhost");
|
||||||
|
initArgs.add(AGENT_PORT, 5775);
|
||||||
|
initArgs.add(FLUSH_INTERVAL, "10");
|
||||||
|
exc = expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
|
||||||
|
assertTrue(exc.getMessage().contains(FLUSH_INTERVAL));
|
||||||
|
|
||||||
|
initArgs.clear();
|
||||||
|
initArgs.add(AGENT_HOST, "localhost");
|
||||||
|
initArgs.add(AGENT_PORT, 5775);
|
||||||
|
initArgs.add(MAX_QUEUE_SIZE, "10");
|
||||||
|
exc = expectThrows(IllegalArgumentException.class, () -> configurator.init(initArgs));
|
||||||
|
assertTrue(exc.getMessage().contains(MAX_QUEUE_SIZE));
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,6 +30,10 @@
|
||||||
</configurations>
|
</configurations>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
|
<dependency org="io.opentracing" name="opentracing-api" rev="${/io.opentracing/opentracing-api}" conf="compile"/>
|
||||||
|
<dependency org="io.opentracing" name="opentracing-noop" rev="${/io.opentracing/opentracing-noop}" conf="compile"/>
|
||||||
|
<dependency org="io.opentracing" name="opentracing-util" rev="${/io.opentracing/opentracing-util}" conf="compile"/>
|
||||||
|
|
||||||
<dependency org="commons-codec" name="commons-codec" rev="${/commons-codec/commons-codec}" conf="compile"/>
|
<dependency org="commons-codec" name="commons-codec" rev="${/commons-codec/commons-codec}" conf="compile"/>
|
||||||
<dependency org="commons-io" name="commons-io" rev="${/commons-io/commons-io}" conf="compile"/>
|
<dependency org="commons-io" name="commons-io" rev="${/commons-io/commons-io}" conf="compile"/>
|
||||||
<dependency org="org.apache.commons" name="commons-exec" rev="${/org.apache.commons/commons-exec}" conf="compile"/>
|
<dependency org="org.apache.commons" name="commons-exec" rev="${/org.apache.commons/commons-exec}" conf="compile"/>
|
||||||
|
|
|
@ -617,8 +617,11 @@ public class CoreContainer {
|
||||||
hostName = cfg.getNodeName();
|
hostName = cfg.getNodeName();
|
||||||
|
|
||||||
zkSys.initZooKeeper(this, solrHome, cfg.getCloudConfig());
|
zkSys.initZooKeeper(this, solrHome, cfg.getCloudConfig());
|
||||||
if(isZooKeeperAware()) pkiAuthenticationPlugin = new PKIAuthenticationPlugin(this, zkSys.getZkController().getNodeName(),
|
if(isZooKeeperAware()) {
|
||||||
(PublicKeyHandler) containerHandlers.get(PublicKeyHandler.PATH));
|
pkiAuthenticationPlugin = new PKIAuthenticationPlugin(this, zkSys.getZkController().getNodeName(),
|
||||||
|
(PublicKeyHandler) containerHandlers.get(PublicKeyHandler.PATH));
|
||||||
|
TracerConfigurator.loadTracer(loader, cfg.getTracerConfiguratorPluginInfo(), getZkController().getZkStateReader());
|
||||||
|
}
|
||||||
|
|
||||||
MDCLoggingContext.setNode(this);
|
MDCLoggingContext.setNode(this);
|
||||||
|
|
||||||
|
|
|
@ -77,6 +77,8 @@ public class NodeConfig {
|
||||||
|
|
||||||
private final PluginInfo transientCacheConfig;
|
private final PluginInfo transientCacheConfig;
|
||||||
|
|
||||||
|
private final PluginInfo tracerConfig;
|
||||||
|
|
||||||
private NodeConfig(String nodeName, Path coreRootDirectory, Path solrDataHome, Integer booleanQueryMaxClauseCount,
|
private NodeConfig(String nodeName, Path coreRootDirectory, Path solrDataHome, Integer booleanQueryMaxClauseCount,
|
||||||
Path configSetBaseDirectory, String sharedLibDirectory,
|
Path configSetBaseDirectory, String sharedLibDirectory,
|
||||||
PluginInfo shardHandlerFactoryConfig, UpdateShardHandlerConfig updateShardHandlerConfig,
|
PluginInfo shardHandlerFactoryConfig, UpdateShardHandlerConfig updateShardHandlerConfig,
|
||||||
|
@ -85,7 +87,7 @@ public class NodeConfig {
|
||||||
LogWatcherConfig logWatcherConfig, CloudConfig cloudConfig, Integer coreLoadThreads, int replayUpdatesThreads,
|
LogWatcherConfig logWatcherConfig, CloudConfig cloudConfig, Integer coreLoadThreads, int replayUpdatesThreads,
|
||||||
int transientCacheSize, boolean useSchemaCache, String managementPath, SolrResourceLoader loader,
|
int transientCacheSize, boolean useSchemaCache, String managementPath, SolrResourceLoader loader,
|
||||||
Properties solrProperties, PluginInfo[] backupRepositoryPlugins,
|
Properties solrProperties, PluginInfo[] backupRepositoryPlugins,
|
||||||
MetricsConfig metricsConfig, PluginInfo transientCacheConfig) {
|
MetricsConfig metricsConfig, PluginInfo transientCacheConfig, PluginInfo tracerConfig) {
|
||||||
this.nodeName = nodeName;
|
this.nodeName = nodeName;
|
||||||
this.coreRootDirectory = coreRootDirectory;
|
this.coreRootDirectory = coreRootDirectory;
|
||||||
this.solrDataHome = solrDataHome;
|
this.solrDataHome = solrDataHome;
|
||||||
|
@ -111,6 +113,7 @@ public class NodeConfig {
|
||||||
this.backupRepositoryPlugins = backupRepositoryPlugins;
|
this.backupRepositoryPlugins = backupRepositoryPlugins;
|
||||||
this.metricsConfig = metricsConfig;
|
this.metricsConfig = metricsConfig;
|
||||||
this.transientCacheConfig = transientCacheConfig;
|
this.transientCacheConfig = transientCacheConfig;
|
||||||
|
this.tracerConfig = tracerConfig;
|
||||||
|
|
||||||
if (this.cloudConfig != null && this.getCoreLoadThreadCount(false) < 2) {
|
if (this.cloudConfig != null && this.getCoreLoadThreadCount(false) < 2) {
|
||||||
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
|
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR,
|
||||||
|
@ -226,6 +229,10 @@ public class NodeConfig {
|
||||||
|
|
||||||
public PluginInfo getTransientCachePluginInfo() { return transientCacheConfig; }
|
public PluginInfo getTransientCachePluginInfo() { return transientCacheConfig; }
|
||||||
|
|
||||||
|
public PluginInfo getTracerConfiguratorPluginInfo() {
|
||||||
|
return tracerConfig;
|
||||||
|
}
|
||||||
|
|
||||||
public static class NodeConfigBuilder {
|
public static class NodeConfigBuilder {
|
||||||
|
|
||||||
private Path coreRootDirectory;
|
private Path coreRootDirectory;
|
||||||
|
@ -253,6 +260,7 @@ public class NodeConfig {
|
||||||
private PluginInfo[] backupRepositoryPlugins;
|
private PluginInfo[] backupRepositoryPlugins;
|
||||||
private MetricsConfig metricsConfig;
|
private MetricsConfig metricsConfig;
|
||||||
private PluginInfo transientCacheConfig;
|
private PluginInfo transientCacheConfig;
|
||||||
|
private PluginInfo tracerConfig;
|
||||||
|
|
||||||
private final SolrResourceLoader loader;
|
private final SolrResourceLoader loader;
|
||||||
private final String nodeName;
|
private final String nodeName;
|
||||||
|
@ -410,12 +418,17 @@ public class NodeConfig {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public NodeConfigBuilder setTracerConfig(PluginInfo tracerConfig) {
|
||||||
|
this.tracerConfig = tracerConfig;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public NodeConfig build() {
|
public NodeConfig build() {
|
||||||
return new NodeConfig(nodeName, coreRootDirectory, solrDataHome, booleanQueryMaxClauseCount,
|
return new NodeConfig(nodeName, coreRootDirectory, solrDataHome, booleanQueryMaxClauseCount,
|
||||||
configSetBaseDirectory, sharedLibDirectory, shardHandlerFactoryConfig,
|
configSetBaseDirectory, sharedLibDirectory, shardHandlerFactoryConfig,
|
||||||
updateShardHandlerConfig, coreAdminHandlerClass, collectionsAdminHandlerClass, healthCheckHandlerClass, infoHandlerClass, configSetsHandlerClass,
|
updateShardHandlerConfig, coreAdminHandlerClass, collectionsAdminHandlerClass, healthCheckHandlerClass, infoHandlerClass, configSetsHandlerClass,
|
||||||
logWatcherConfig, cloudConfig, coreLoadThreads, replayUpdatesThreads, transientCacheSize, useSchemaCache, managementPath, loader, solrProperties,
|
logWatcherConfig, cloudConfig, coreLoadThreads, replayUpdatesThreads, transientCacheSize, useSchemaCache, managementPath, loader, solrProperties,
|
||||||
backupRepositoryPlugins, metricsConfig, transientCacheConfig);
|
backupRepositoryPlugins, metricsConfig, transientCacheConfig, tracerConfig);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,6 +100,7 @@ public class SolrXmlConfig {
|
||||||
configBuilder.setUpdateShardHandlerConfig(updateConfig);
|
configBuilder.setUpdateShardHandlerConfig(updateConfig);
|
||||||
configBuilder.setShardHandlerFactoryConfig(getShardHandlerFactoryPluginInfo(config));
|
configBuilder.setShardHandlerFactoryConfig(getShardHandlerFactoryPluginInfo(config));
|
||||||
configBuilder.setSolrCoreCacheFactoryConfig(getTransientCoreCacheFactoryPluginInfo(config));
|
configBuilder.setSolrCoreCacheFactoryConfig(getTransientCoreCacheFactoryPluginInfo(config));
|
||||||
|
configBuilder.setTracerConfig(getTracerPluginInfo(config));
|
||||||
configBuilder.setLogWatcherConfig(loadLogWatcherConfig(config, "solr/logging/*[@name]", "solr/logging/watcher/*[@name]"));
|
configBuilder.setLogWatcherConfig(loadLogWatcherConfig(config, "solr/logging/*[@name]", "solr/logging/watcher/*[@name]"));
|
||||||
configBuilder.setSolrProperties(loadProperties(config));
|
configBuilder.setSolrProperties(loadProperties(config));
|
||||||
if (cloudConfig != null)
|
if (cloudConfig != null)
|
||||||
|
@ -553,4 +554,9 @@ public class SolrXmlConfig {
|
||||||
Node node = config.getNode("solr/transientCoreCacheFactory", false);
|
Node node = config.getNode("solr/transientCoreCacheFactory", false);
|
||||||
return (node == null) ? null : new PluginInfo(node, "transientCoreCacheFactory", false, true);
|
return (node == null) ? null : new PluginInfo(node, "transientCoreCacheFactory", false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static PluginInfo getTracerPluginInfo(XmlConfigFile config) {
|
||||||
|
Node node = config.getNode("solr/tracerConfig", false);
|
||||||
|
return (node == null) ? null : new PluginInfo(node, "tracerConfig", false, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* 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.core;
|
||||||
|
|
||||||
|
import java.lang.invoke.MethodHandles;
|
||||||
|
|
||||||
|
import io.opentracing.Tracer;
|
||||||
|
import io.opentracing.noop.NoopTracerFactory;
|
||||||
|
import org.apache.solr.common.cloud.ZkStateReader;
|
||||||
|
import org.apache.solr.util.plugin.NamedListInitializedPlugin;
|
||||||
|
import org.apache.solr.util.tracing.GlobalTracer;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public abstract class TracerConfigurator implements NamedListInitializedPlugin {
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
|
||||||
|
|
||||||
|
public abstract Tracer getTracer();
|
||||||
|
|
||||||
|
public static void loadTracer(SolrResourceLoader loader, PluginInfo info, ZkStateReader stateReader) {
|
||||||
|
if (info == null) {
|
||||||
|
// in case of a Tracer is registered to OpenTracing through javaagent
|
||||||
|
if (io.opentracing.util.GlobalTracer.isRegistered()) {
|
||||||
|
GlobalTracer.setup(io.opentracing.util.GlobalTracer.get());
|
||||||
|
registerListener(stateReader);
|
||||||
|
} else {
|
||||||
|
GlobalTracer.setup(NoopTracerFactory.create());
|
||||||
|
GlobalTracer.get().setSamplePercentage(0.0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
TracerConfigurator configurator = loader
|
||||||
|
.newInstance(info.className, TracerConfigurator.class);
|
||||||
|
configurator.init(info.initArgs);
|
||||||
|
|
||||||
|
GlobalTracer.setup(configurator.getTracer());
|
||||||
|
registerListener(stateReader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void registerListener(ZkStateReader stateReader) {
|
||||||
|
stateReader.registerClusterPropertiesListener(properties -> {
|
||||||
|
if (properties.containsKey(ZkStateReader.SAMPLE_PERCENTAGE)) {
|
||||||
|
try {
|
||||||
|
double sampleRate = Double.parseDouble(properties.get(ZkStateReader.SAMPLE_PERCENTAGE).toString());
|
||||||
|
GlobalTracer.get().setSamplePercentage(sampleRate);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
log.error("Unable to set sample rate", e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
GlobalTracer.get().setSamplePercentage(0.1);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -33,6 +33,10 @@ import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
import io.opentracing.Span;
|
||||||
|
import io.opentracing.Tracer;
|
||||||
|
import io.opentracing.propagation.Format;
|
||||||
import org.apache.solr.client.solrj.SolrRequest;
|
import org.apache.solr.client.solrj.SolrRequest;
|
||||||
import org.apache.solr.client.solrj.SolrResponse;
|
import org.apache.solr.client.solrj.SolrResponse;
|
||||||
import org.apache.solr.client.solrj.SolrServerException;
|
import org.apache.solr.client.solrj.SolrServerException;
|
||||||
|
@ -60,6 +64,8 @@ import org.apache.solr.common.util.StrUtils;
|
||||||
import org.apache.solr.core.CoreDescriptor;
|
import org.apache.solr.core.CoreDescriptor;
|
||||||
import org.apache.solr.request.SolrQueryRequest;
|
import org.apache.solr.request.SolrQueryRequest;
|
||||||
import org.apache.solr.request.SolrRequestInfo;
|
import org.apache.solr.request.SolrRequestInfo;
|
||||||
|
import org.apache.solr.util.tracing.GlobalTracer;
|
||||||
|
import org.apache.solr.util.tracing.SolrRequestCarrier;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.slf4j.MDC;
|
import org.slf4j.MDC;
|
||||||
|
@ -147,6 +153,8 @@ public class HttpShardHandler extends ShardHandler {
|
||||||
public void submit(final ShardRequest sreq, final String shard, final ModifiableSolrParams params) {
|
public void submit(final ShardRequest sreq, final String shard, final ModifiableSolrParams params) {
|
||||||
// do this outside of the callable for thread safety reasons
|
// do this outside of the callable for thread safety reasons
|
||||||
final List<String> urls = getURLs(shard);
|
final List<String> urls = getURLs(shard);
|
||||||
|
final Tracer tracer = GlobalTracer.getTracer();
|
||||||
|
final Span span = tracer != null? tracer.activeSpan() : null;
|
||||||
|
|
||||||
Callable<ShardResponse> task = () -> {
|
Callable<ShardResponse> task = () -> {
|
||||||
|
|
||||||
|
@ -165,6 +173,9 @@ public class HttpShardHandler extends ShardHandler {
|
||||||
params.remove(CommonParams.VERSION);
|
params.remove(CommonParams.VERSION);
|
||||||
|
|
||||||
QueryRequest req = makeQueryRequest(sreq, params, shard);
|
QueryRequest req = makeQueryRequest(sreq, params, shard);
|
||||||
|
if (tracer != null && span != null) {
|
||||||
|
tracer.inject(span.context(), Format.Builtin.HTTP_HEADERS, new SolrRequestCarrier(req));
|
||||||
|
}
|
||||||
req.setMethod(SolrRequest.METHOD.POST);
|
req.setMethod(SolrRequest.METHOD.POST);
|
||||||
SolrRequestInfo requestInfo = SolrRequestInfo.getRequestInfo();
|
SolrRequestInfo requestInfo = SolrRequestInfo.getRequestInfo();
|
||||||
if (requestInfo != null) req.setUserPrincipal(requestInfo.getReq().getUserPrincipal());
|
if (requestInfo != null) req.setUserPrincipal(requestInfo.getReq().getUserPrincipal());
|
||||||
|
|
|
@ -26,6 +26,7 @@ import java.util.function.Supplier;
|
||||||
|
|
||||||
import org.apache.solr.cloud.CloudDescriptor;
|
import org.apache.solr.cloud.CloudDescriptor;
|
||||||
import org.apache.solr.cloud.ZkController;
|
import org.apache.solr.cloud.ZkController;
|
||||||
|
import org.apache.solr.common.StringUtils;
|
||||||
import org.apache.solr.core.CoreContainer;
|
import org.apache.solr.core.CoreContainer;
|
||||||
import org.apache.solr.core.CoreDescriptor;
|
import org.apache.solr.core.CoreDescriptor;
|
||||||
import org.apache.solr.core.SolrCore;
|
import org.apache.solr.core.SolrCore;
|
||||||
|
@ -37,6 +38,7 @@ import org.slf4j.MDC;
|
||||||
* {@link #setCoreDescriptor(CoreContainer, CoreDescriptor)} and then {@link #clear()} in a finally block.
|
* {@link #setCoreDescriptor(CoreContainer, CoreDescriptor)} and then {@link #clear()} in a finally block.
|
||||||
*/
|
*/
|
||||||
public class MDCLoggingContext {
|
public class MDCLoggingContext {
|
||||||
|
public static final String TRACE_ID = "trace_id";
|
||||||
// When a thread sets context and finds that the context is already set, we should noop and ignore the finally clear
|
// When a thread sets context and finds that the context is already set, we should noop and ignore the finally clear
|
||||||
private static ThreadLocal<Integer> CALL_DEPTH = ThreadLocal.withInitial(new Supplier<Integer>() {
|
private static ThreadLocal<Integer> CALL_DEPTH = ThreadLocal.withInitial(new Supplier<Integer>() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -53,6 +55,14 @@ public class MDCLoggingContext {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setTracerId(String traceId) {
|
||||||
|
if (!StringUtils.isEmpty(traceId)) {
|
||||||
|
MDC.put(TRACE_ID, "t:" + traceId);
|
||||||
|
} else {
|
||||||
|
MDC.remove(TRACE_ID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void setShard(String shard) {
|
public static void setShard(String shard) {
|
||||||
if (shard != null) {
|
if (shard != null) {
|
||||||
MDC.put(SHARD_ID_PROP, "s:" + shard);
|
MDC.put(SHARD_ID_PROP, "s:" + shard);
|
||||||
|
@ -151,6 +161,7 @@ public class MDCLoggingContext {
|
||||||
MDC.remove(REPLICA_PROP);
|
MDC.remove(REPLICA_PROP);
|
||||||
MDC.remove(SHARD_ID_PROP);
|
MDC.remove(SHARD_ID_PROP);
|
||||||
MDC.remove(NODE_NAME_PROP);
|
MDC.remove(NODE_NAME_PROP);
|
||||||
|
MDC.remove(TRACE_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void reset() {
|
public static void reset() {
|
||||||
|
|
|
@ -38,6 +38,7 @@ import java.util.Random;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import io.opentracing.Span;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.http.Header;
|
import org.apache.http.Header;
|
||||||
|
@ -106,6 +107,7 @@ import org.apache.solr.servlet.cache.Method;
|
||||||
import org.apache.solr.update.processor.DistributingUpdateProcessorFactory;
|
import org.apache.solr.update.processor.DistributingUpdateProcessorFactory;
|
||||||
import org.apache.solr.util.RTimerTree;
|
import org.apache.solr.util.RTimerTree;
|
||||||
import org.apache.solr.util.TimeOut;
|
import org.apache.solr.util.TimeOut;
|
||||||
|
import org.apache.solr.util.tracing.GlobalTracer;
|
||||||
import org.apache.zookeeper.KeeperException;
|
import org.apache.zookeeper.KeeperException;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -467,6 +469,11 @@ public class HttpSolrCall {
|
||||||
*/
|
*/
|
||||||
public Action call() throws IOException {
|
public Action call() throws IOException {
|
||||||
MDCLoggingContext.reset();
|
MDCLoggingContext.reset();
|
||||||
|
Span activeSpan = GlobalTracer.getTracer().activeSpan();
|
||||||
|
if (activeSpan != null) {
|
||||||
|
MDCLoggingContext.setTracerId(activeSpan.context().toTraceId());
|
||||||
|
}
|
||||||
|
|
||||||
MDCLoggingContext.setNode(cores);
|
MDCLoggingContext.setNode(cores);
|
||||||
|
|
||||||
if (cores == null) {
|
if (cores == null) {
|
||||||
|
|
|
@ -53,6 +53,11 @@ import com.codahale.metrics.jvm.ClassLoadingGaugeSet;
|
||||||
import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
|
import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
|
||||||
import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
|
import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
|
||||||
import com.codahale.metrics.jvm.ThreadStatesGaugeSet;
|
import com.codahale.metrics.jvm.ThreadStatesGaugeSet;
|
||||||
|
import io.opentracing.Scope;
|
||||||
|
import io.opentracing.Span;
|
||||||
|
import io.opentracing.SpanContext;
|
||||||
|
import io.opentracing.Tracer;
|
||||||
|
import io.opentracing.tag.Tags;
|
||||||
import org.apache.commons.io.FileCleaningTracker;
|
import org.apache.commons.io.FileCleaningTracker;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.http.client.HttpClient;
|
import org.apache.http.client.HttpClient;
|
||||||
|
@ -77,6 +82,7 @@ import org.apache.solr.security.AuthenticationPlugin;
|
||||||
import org.apache.solr.security.PKIAuthenticationPlugin;
|
import org.apache.solr.security.PKIAuthenticationPlugin;
|
||||||
import org.apache.solr.security.PublicKeyHandler;
|
import org.apache.solr.security.PublicKeyHandler;
|
||||||
import org.apache.solr.util.SolrFileCleaningTracker;
|
import org.apache.solr.util.SolrFileCleaningTracker;
|
||||||
|
import org.apache.solr.util.tracing.GlobalTracer;
|
||||||
import org.apache.solr.util.StartupLoggingUtils;
|
import org.apache.solr.util.StartupLoggingUtils;
|
||||||
import org.apache.solr.util.configuration.SSLConfigurationsFactory;
|
import org.apache.solr.util.configuration.SSLConfigurationsFactory;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
@ -335,6 +341,7 @@ public class SolrDispatchFilter extends BaseSolrFilter {
|
||||||
httpClient = null;
|
httpClient = null;
|
||||||
cc.shutdown();
|
cc.shutdown();
|
||||||
}
|
}
|
||||||
|
GlobalTracer.get().close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,7 +354,8 @@ public class SolrDispatchFilter extends BaseSolrFilter {
|
||||||
if (!(_request instanceof HttpServletRequest)) return;
|
if (!(_request instanceof HttpServletRequest)) return;
|
||||||
HttpServletRequest request = closeShield((HttpServletRequest)_request, retry);
|
HttpServletRequest request = closeShield((HttpServletRequest)_request, retry);
|
||||||
HttpServletResponse response = closeShield((HttpServletResponse)_response, retry);
|
HttpServletResponse response = closeShield((HttpServletResponse)_response, retry);
|
||||||
|
Scope scope = null;
|
||||||
|
Span span = null;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (cores == null || cores.isShutDown()) {
|
if (cores == null || cores.isShutDown()) {
|
||||||
|
@ -362,9 +370,9 @@ public class SolrDispatchFilter extends BaseSolrFilter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String requestPath = request.getServletPath();
|
||||||
// No need to even create the HttpSolrCall object if this path is excluded.
|
// No need to even create the HttpSolrCall object if this path is excluded.
|
||||||
if (excludePatterns != null) {
|
if (excludePatterns != null) {
|
||||||
String requestPath = request.getServletPath();
|
|
||||||
String extraPath = request.getPathInfo();
|
String extraPath = request.getPathInfo();
|
||||||
if (extraPath != null) {
|
if (extraPath != null) {
|
||||||
// In embedded mode, servlet path is empty - include all post-context path here for testing
|
// In embedded mode, servlet path is empty - include all post-context path here for testing
|
||||||
|
@ -379,6 +387,24 @@ public class SolrDispatchFilter extends BaseSolrFilter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SpanContext parentSpan = GlobalTracer.get().extract(request);
|
||||||
|
Tracer tracer = GlobalTracer.getTracer();
|
||||||
|
|
||||||
|
Tracer.SpanBuilder spanBuilder = null;
|
||||||
|
String hostAndPort = request.getServerName() + "_" + request.getServerPort();
|
||||||
|
if (parentSpan == null) {
|
||||||
|
spanBuilder = tracer.buildSpan(request.getMethod() + ":" + hostAndPort);
|
||||||
|
} else {
|
||||||
|
spanBuilder = tracer.buildSpan(request.getMethod() + ":" + hostAndPort)
|
||||||
|
.asChildOf(parentSpan);
|
||||||
|
}
|
||||||
|
|
||||||
|
spanBuilder
|
||||||
|
.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER)
|
||||||
|
.withTag(Tags.HTTP_URL.getKey(), request.getRequestURL().toString());
|
||||||
|
span = spanBuilder.start();
|
||||||
|
scope = tracer.scopeManager().activate(span);
|
||||||
|
|
||||||
AtomicReference<HttpServletRequest> wrappedRequest = new AtomicReference<>();
|
AtomicReference<HttpServletRequest> wrappedRequest = new AtomicReference<>();
|
||||||
if (!authenticateRequest(request, response, wrappedRequest)) { // the response and status code have already been sent
|
if (!authenticateRequest(request, response, wrappedRequest)) { // the response and status code have already been sent
|
||||||
return;
|
return;
|
||||||
|
@ -416,6 +442,10 @@ public class SolrDispatchFilter extends BaseSolrFilter {
|
||||||
ExecutorUtil.setServerThreadFlag(null);
|
ExecutorUtil.setServerThreadFlag(null);
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
|
if (span != null) span.finish();
|
||||||
|
if (scope != null) scope.close();
|
||||||
|
|
||||||
|
GlobalTracer.get().clearContext();
|
||||||
consumeInputFully(request);
|
consumeInputFully(request);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,7 @@ import org.apache.solr.request.SolrQueryRequest;
|
||||||
import org.apache.solr.request.SolrQueryRequestBase;
|
import org.apache.solr.request.SolrQueryRequestBase;
|
||||||
import org.apache.solr.util.RTimerTree;
|
import org.apache.solr.util.RTimerTree;
|
||||||
import org.apache.solr.util.SolrFileCleaningTracker;
|
import org.apache.solr.util.SolrFileCleaningTracker;
|
||||||
|
import org.apache.solr.util.tracing.GlobalTracer;
|
||||||
|
|
||||||
import static org.apache.solr.common.params.CommonParams.PATH;
|
import static org.apache.solr.common.params.CommonParams.PATH;
|
||||||
|
|
||||||
|
@ -165,6 +166,9 @@ public class SolrRequestParsers
|
||||||
// Pick the parser from the request...
|
// Pick the parser from the request...
|
||||||
ArrayList<ContentStream> streams = new ArrayList<>(1);
|
ArrayList<ContentStream> streams = new ArrayList<>(1);
|
||||||
SolrParams params = parser.parseParamsAndFillStreams( req, streams );
|
SolrParams params = parser.parseParamsAndFillStreams( req, streams );
|
||||||
|
if (GlobalTracer.get().tracing()) {
|
||||||
|
GlobalTracer.get().getTracer().activeSpan().setTag("params", params.toString());
|
||||||
|
}
|
||||||
SolrQueryRequest sreq = buildRequestFrom(core, params, streams, getRequestTimer(req), req);
|
SolrQueryRequest sreq = buildRequestFrom(core, params, streams, getRequestTimer(req), req);
|
||||||
|
|
||||||
// Handlers and login will want to know the path. If it contains a ':'
|
// Handlers and login will want to know the path. If it contains a ':'
|
||||||
|
|
|
@ -33,6 +33,9 @@ import java.util.concurrent.CompletionService;
|
||||||
import java.util.concurrent.ExecutorCompletionService;
|
import java.util.concurrent.ExecutorCompletionService;
|
||||||
import java.util.concurrent.Future;
|
import java.util.concurrent.Future;
|
||||||
|
|
||||||
|
import io.opentracing.Span;
|
||||||
|
import io.opentracing.Tracer;
|
||||||
|
import io.opentracing.propagation.Format;
|
||||||
import org.apache.http.NoHttpResponseException;
|
import org.apache.http.NoHttpResponseException;
|
||||||
import org.apache.solr.client.solrj.SolrClient;
|
import org.apache.solr.client.solrj.SolrClient;
|
||||||
import org.apache.solr.client.solrj.SolrServerException;
|
import org.apache.solr.client.solrj.SolrServerException;
|
||||||
|
@ -50,6 +53,8 @@ import org.apache.solr.request.SolrRequestInfo;
|
||||||
import org.apache.solr.update.processor.DistributedUpdateProcessor;
|
import org.apache.solr.update.processor.DistributedUpdateProcessor;
|
||||||
import org.apache.solr.update.processor.DistributedUpdateProcessor.LeaderRequestReplicationTracker;
|
import org.apache.solr.update.processor.DistributedUpdateProcessor.LeaderRequestReplicationTracker;
|
||||||
import org.apache.solr.update.processor.DistributedUpdateProcessor.RollupRequestReplicationTracker;
|
import org.apache.solr.update.processor.DistributedUpdateProcessor.RollupRequestReplicationTracker;
|
||||||
|
import org.apache.solr.util.tracing.GlobalTracer;
|
||||||
|
import org.apache.solr.util.tracing.SolrRequestCarrier;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -285,6 +290,13 @@ public class SolrCmdDistributor implements Closeable {
|
||||||
req.uReq.setUserPrincipal(SolrRequestInfo.getRequestInfo().getReq().getUserPrincipal());
|
req.uReq.setUserPrincipal(SolrRequestInfo.getRequestInfo().getReq().getUserPrincipal());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Tracer tracer = GlobalTracer.getTracer();
|
||||||
|
Span parentSpan = tracer.activeSpan();
|
||||||
|
if (parentSpan != null) {
|
||||||
|
tracer.inject(parentSpan.context(), Format.Builtin.HTTP_HEADERS,
|
||||||
|
new SolrRequestCarrier(req.uReq));
|
||||||
|
}
|
||||||
|
|
||||||
if (req.synchronous) {
|
if (req.synchronous) {
|
||||||
blockAndDoRetries();
|
blockAndDoRetries();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,120 @@
|
||||||
|
/*
|
||||||
|
* 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.util.tracing;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
|
import io.opentracing.SpanContext;
|
||||||
|
import io.opentracing.Tracer;
|
||||||
|
import io.opentracing.noop.NoopTracerFactory;
|
||||||
|
import io.opentracing.propagation.Format;
|
||||||
|
|
||||||
|
public class GlobalTracer {
|
||||||
|
private static final Tracer NOOP_TRACER = NoopTracerFactory.create();
|
||||||
|
private static final Random RANDOM;
|
||||||
|
static {
|
||||||
|
// We try to make things reproducible in the context of our tests by initializing the random instance
|
||||||
|
// based on the current seed
|
||||||
|
String seed = System.getProperty("tests.seed");
|
||||||
|
if (seed == null) {
|
||||||
|
RANDOM = new Random();
|
||||||
|
} else {
|
||||||
|
RANDOM = new Random(seed.hashCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static volatile GlobalTracer INS = new GlobalTracer(NOOP_TRACER);
|
||||||
|
|
||||||
|
public synchronized static void setup(Tracer tracer) {
|
||||||
|
if (INS != null) {
|
||||||
|
INS.close();
|
||||||
|
}
|
||||||
|
INS = new GlobalTracer(tracer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static GlobalTracer get() {
|
||||||
|
return INS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Tracer getTracer() {
|
||||||
|
return INS.tracer();
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
final Tracer tracer;
|
||||||
|
private double rate;
|
||||||
|
private final ThreadLocal<Tracer> threadLocal = new ThreadLocal<>();
|
||||||
|
|
||||||
|
public GlobalTracer(Tracer tracer) {
|
||||||
|
this.tracer = tracer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized void setSamplePercentage(double rate) {
|
||||||
|
this.rate = rate / 100.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public double getSampleRate() {
|
||||||
|
return rate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean tracing() {
|
||||||
|
return threadLocal.get() != null
|
||||||
|
&& threadLocal.get() != NOOP_TRACER
|
||||||
|
&& threadLocal.get().activeSpan() != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SpanContext extract(HttpServletRequest request) {
|
||||||
|
SpanContext spanContext = tracer.extract(Format.Builtin.HTTP_HEADERS, new HttpServletCarrier(request));
|
||||||
|
if (spanContext != null) {
|
||||||
|
threadLocal.set(tracer);
|
||||||
|
}
|
||||||
|
return spanContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Tracer tracer() {
|
||||||
|
Tracer tracer = threadLocal.get();
|
||||||
|
if (tracer != null)
|
||||||
|
return tracer;
|
||||||
|
|
||||||
|
if (traced()) {
|
||||||
|
threadLocal.set(this.tracer);
|
||||||
|
} else {
|
||||||
|
threadLocal.set(NOOP_TRACER);
|
||||||
|
}
|
||||||
|
|
||||||
|
return threadLocal.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear tracing context for the current thread
|
||||||
|
*/
|
||||||
|
public void clearContext() {
|
||||||
|
threadLocal.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean traced() {
|
||||||
|
return RANDOM.nextDouble() <= rate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() {
|
||||||
|
tracer.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
* 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.util.tracing;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
|
||||||
|
import io.opentracing.propagation.TextMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A Carrier for extract Span context out of request headers
|
||||||
|
*/
|
||||||
|
public class HttpServletCarrier implements TextMap {
|
||||||
|
private Iterator<Map.Entry<String, String>> it;
|
||||||
|
|
||||||
|
public HttpServletCarrier(HttpServletRequest request) {
|
||||||
|
this.it = new Iterator<>() {
|
||||||
|
|
||||||
|
Enumeration<String> headerNameIt = request.getHeaderNames();
|
||||||
|
String headerName = null;
|
||||||
|
Enumeration<String> headerValue = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
if (headerValue != null && headerValue.hasMoreElements()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return headerNameIt.hasMoreElements();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map.Entry<String, String> next() {
|
||||||
|
if (!hasNext()) {
|
||||||
|
throw new NoSuchElementException();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (headerValue == null || !headerValue.hasMoreElements()) {
|
||||||
|
headerName = headerNameIt.nextElement();
|
||||||
|
headerValue = request.getHeaders(headerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
String key = headerName;
|
||||||
|
String val = headerValue.nextElement();
|
||||||
|
|
||||||
|
return new Map.Entry<>() {
|
||||||
|
@Override
|
||||||
|
public String getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getValue() {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String setValue(String value) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<Map.Entry<String, String>> iterator() {
|
||||||
|
return it;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void put(String key, String value) {
|
||||||
|
throw new UnsupportedOperationException("HttpServletCarrier should only be used with Tracer.extract()");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* 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.util.tracing;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import io.opentracing.propagation.TextMap;
|
||||||
|
import org.apache.solr.client.solrj.SolrRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An OpenTracing Carrier for injecting Span context through SolrRequest
|
||||||
|
*/
|
||||||
|
public class SolrRequestCarrier implements TextMap {
|
||||||
|
|
||||||
|
private final SolrRequest solrRequest;
|
||||||
|
|
||||||
|
public SolrRequestCarrier(SolrRequest solrRequest) {
|
||||||
|
this.solrRequest = solrRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator<Map.Entry<String, String>> iterator() {
|
||||||
|
throw new UnsupportedOperationException("carrier is write-only");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void put(String key, String value) {
|
||||||
|
solrRequest.addHeader(key, value);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tracing related utilities
|
||||||
|
*/
|
||||||
|
package org.apache.solr.util.tracing;
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
<Console name="STDERR" target="SYSTEM_ERR">
|
<Console name="STDERR" target="SYSTEM_ERR">
|
||||||
<PatternLayout>
|
<PatternLayout>
|
||||||
<Pattern>
|
<Pattern>
|
||||||
%maxLen{%-4r %-5p (%t) [%X{node_name} %X{collection} %X{shard} %X{replica} %X{core}] %c{1.} %m%notEmpty{
|
%maxLen{%-4r %-5p (%t) [%X{node_name} %X{collection} %X{shard} %X{replica} %X{core} %X{trace_id}] %c{1.} %m%notEmpty{
|
||||||
=>%ex{short}}}{10240}%n
|
=>%ex{short}}}{10240}%n
|
||||||
</Pattern>
|
</Pattern>
|
||||||
</PatternLayout>
|
</PatternLayout>
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!--
|
||||||
|
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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
All (relative) paths are relative to the installation path
|
||||||
|
-->
|
||||||
|
<solr>
|
||||||
|
|
||||||
|
<str name="shareSchema">${shareSchema:false}</str>
|
||||||
|
<str name="configSetBaseDir">${configSetBaseDir:configsets}</str>
|
||||||
|
<str name="coreRootDirectory">${coreRootDirectory:.}</str>
|
||||||
|
<str name="collectionsHandler">${collectionsHandler:solr.CollectionsHandler}</str>
|
||||||
|
|
||||||
|
<shardHandlerFactory name="shardHandlerFactory" class="HttpShardHandlerFactory">
|
||||||
|
<str name="urlScheme">${urlScheme:}</str>
|
||||||
|
<int name="socketTimeout">${socketTimeout:90000}</int>
|
||||||
|
<int name="connTimeout">${connTimeout:15000}</int>
|
||||||
|
<str name="shardsWhitelist">${solr.tests.shardsWhitelist:}</str>
|
||||||
|
</shardHandlerFactory>
|
||||||
|
|
||||||
|
<tracerConfig name="tracerConfig" class="MockTracerConfigurator">
|
||||||
|
</tracerConfig>
|
||||||
|
|
||||||
|
<solrcloud>
|
||||||
|
<str name="host">127.0.0.1</str>
|
||||||
|
<int name="hostPort">${hostPort:8983}</int>
|
||||||
|
<str name="hostContext">${hostContext:solr}</str>
|
||||||
|
<int name="zkClientTimeout">${solr.zkclienttimeout:30000}</int>
|
||||||
|
<bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
|
||||||
|
<int name="leaderVoteWait">${leaderVoteWait:10000}</int>
|
||||||
|
<int name="distribUpdateConnTimeout">${distribUpdateConnTimeout:45000}</int>
|
||||||
|
<int name="distribUpdateSoTimeout">${distribUpdateSoTimeout:340000}</int>
|
||||||
|
<str name="zkCredentialsProvider">${zkCredentialsProvider:org.apache.solr.common.cloud.DefaultZkCredentialsProvider}</str>
|
||||||
|
<str name="zkACLProvider">${zkACLProvider:org.apache.solr.common.cloud.DefaultZkACLProvider}</str>
|
||||||
|
</solrcloud>
|
||||||
|
<metrics>
|
||||||
|
<reporter name="default" class="org.apache.solr.metrics.reporters.SolrJmxReporter">
|
||||||
|
<str name="rootName">solr_${hostPort:8983}</str>
|
||||||
|
</reporter>
|
||||||
|
</metrics>
|
||||||
|
|
||||||
|
</solr>
|
|
@ -173,23 +173,23 @@ public class JWTAuthPluginIntegrationTest extends SolrCloudAuthTestCase {
|
||||||
assertPkiAuthMetricsMinimums(4, 4, 0, 0, 0, 0);
|
assertPkiAuthMetricsMinimums(4, 4, 0, 0, 0, 0);
|
||||||
Pair<String,Integer> result = post(baseUrl + "/" + COLLECTION + "/update?commit=true", "[{\"id\" : \"1\"}, {\"id\": \"2\"}, {\"id\": \"3\"}]", jwtTestToken);
|
Pair<String,Integer> result = post(baseUrl + "/" + COLLECTION + "/update?commit=true", "[{\"id\" : \"1\"}, {\"id\": \"2\"}, {\"id\": \"3\"}]", jwtTestToken);
|
||||||
assertEquals(Integer.valueOf(200), result.second());
|
assertEquals(Integer.valueOf(200), result.second());
|
||||||
assertAuthMetricsMinimums(3, 3, 0, 0, 0, 0);
|
assertAuthMetricsMinimums(4, 4, 0, 0, 0, 0);
|
||||||
assertPkiAuthMetricsMinimums(5, 5, 0, 0, 0, 0);
|
assertPkiAuthMetricsMinimums(4, 4, 0, 0, 0, 0);
|
||||||
|
|
||||||
// First a non distributed query
|
// First a non distributed query
|
||||||
result = get(baseUrl + "/" + COLLECTION + "/query?q=*:*&distrib=false", jwtTestToken);
|
result = get(baseUrl + "/" + COLLECTION + "/query?q=*:*&distrib=false", jwtTestToken);
|
||||||
assertEquals(Integer.valueOf(200), result.second());
|
assertEquals(Integer.valueOf(200), result.second());
|
||||||
assertAuthMetricsMinimums(4, 4, 0, 0, 0, 0);
|
assertAuthMetricsMinimums(5, 5, 0, 0, 0, 0);
|
||||||
|
|
||||||
// Now do a distributed query, using JWTAuth for inter-node
|
// Now do a distributed query, using JWTAuth for inter-node
|
||||||
result = get(baseUrl + "/" + COLLECTION + "/query?q=*:*", jwtTestToken);
|
result = get(baseUrl + "/" + COLLECTION + "/query?q=*:*", jwtTestToken);
|
||||||
assertEquals(Integer.valueOf(200), result.second());
|
assertEquals(Integer.valueOf(200), result.second());
|
||||||
assertAuthMetricsMinimums(9, 9, 0, 0, 0, 0);
|
assertAuthMetricsMinimums(10, 10, 0, 0, 0, 0);
|
||||||
|
|
||||||
// Delete
|
// Delete
|
||||||
assertEquals(200, get(baseUrl + "/admin/collections?action=DELETE&name=" + COLLECTION, jwtTestToken).second().intValue());
|
assertEquals(200, get(baseUrl + "/admin/collections?action=DELETE&name=" + COLLECTION, jwtTestToken).second().intValue());
|
||||||
assertAuthMetricsMinimums(10, 10, 0, 0, 0, 0);
|
assertAuthMetricsMinimums(11, 11, 0, 0, 0, 0);
|
||||||
assertPkiAuthMetricsMinimums(7, 7, 0, 0, 0, 0);
|
assertPkiAuthMetricsMinimums(6, 6, 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void getAndFail(String url, String token) {
|
private void getAndFail(String url, String token) {
|
||||||
|
|
|
@ -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.util.tracing;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.lang.invoke.MethodHandles;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import io.opentracing.mock.MockSpan;
|
||||||
|
import io.opentracing.mock.MockTracer;
|
||||||
|
import org.apache.solr.client.solrj.SolrQuery;
|
||||||
|
import org.apache.solr.client.solrj.SolrServerException;
|
||||||
|
import org.apache.solr.client.solrj.impl.CloudSolrClient;
|
||||||
|
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
|
||||||
|
import org.apache.solr.cloud.SolrCloudTestCase;
|
||||||
|
import org.apache.solr.common.cloud.ZkStateReader;
|
||||||
|
import org.apache.solr.common.util.TimeSource;
|
||||||
|
import org.apache.solr.util.TimeOut;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
|
||||||
|
public class TestDistributedTracing extends SolrCloudTestCase {
|
||||||
|
private static final String COLLECTION = "collection1";
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void beforeTest() throws Exception {
|
||||||
|
configureCluster(4)
|
||||||
|
.addConfig("config", TEST_PATH().resolve("configsets").resolve("cloud-minimal").resolve("conf"))
|
||||||
|
.withSolrXml(TEST_PATH().resolve("solr-tracing.xml"))
|
||||||
|
.configure();
|
||||||
|
CollectionAdminRequest.setClusterProperty(ZkStateReader.SAMPLE_PERCENTAGE, "100.0")
|
||||||
|
.process(cluster.getSolrClient());
|
||||||
|
waitForSampleRateUpdated(1.0);
|
||||||
|
CollectionAdminRequest
|
||||||
|
.createCollection(COLLECTION, "config", 2, 2)
|
||||||
|
.process(cluster.getSolrClient());
|
||||||
|
cluster.waitForActiveCollection(COLLECTION, 2, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void waitForSampleRateUpdated(double rate) throws TimeoutException, InterruptedException {
|
||||||
|
TimeOut timeOut = new TimeOut(1, TimeUnit.MINUTES, TimeSource.NANO_TIME);
|
||||||
|
timeOut.waitFor("Waiting for sample rate is updated", () ->
|
||||||
|
Math.abs(GlobalTracer.get().getSampleRate() - rate) < 0.001
|
||||||
|
&& GlobalTracer.get().tracer instanceof MockTracer);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<MockSpan> getFinishedSpans() {
|
||||||
|
return ((MockTracer)GlobalTracer.get().tracer).finishedSpans();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() throws IOException, SolrServerException, TimeoutException, InterruptedException {
|
||||||
|
CloudSolrClient cloudClient = cluster.getSolrClient();
|
||||||
|
List<MockSpan> allSpans = getFinishedSpans();
|
||||||
|
|
||||||
|
cloudClient.add(COLLECTION, sdoc("id", "1"));
|
||||||
|
List<MockSpan> finishedSpans = getRecentSpans(allSpans);
|
||||||
|
finishedSpans.removeIf(x ->
|
||||||
|
!x.tags().get("http.url").toString().endsWith("/update"));
|
||||||
|
assertEquals(2, finishedSpans.size());
|
||||||
|
assertOneSpanIsChildOfAnother(finishedSpans);
|
||||||
|
|
||||||
|
cloudClient.add(COLLECTION, sdoc("id", "2"));
|
||||||
|
finishedSpans = getRecentSpans(allSpans);
|
||||||
|
finishedSpans.removeIf(x ->
|
||||||
|
!x.tags().get("http.url").toString().endsWith("/update"));
|
||||||
|
assertEquals(2, finishedSpans.size());
|
||||||
|
assertOneSpanIsChildOfAnother(finishedSpans);
|
||||||
|
|
||||||
|
cloudClient.add(COLLECTION, sdoc("id", "3"));
|
||||||
|
cloudClient.add(COLLECTION, sdoc("id", "4"));
|
||||||
|
cloudClient.commit(COLLECTION);
|
||||||
|
|
||||||
|
getRecentSpans(allSpans);
|
||||||
|
cloudClient.query(COLLECTION, new SolrQuery("*:*"));
|
||||||
|
finishedSpans = getRecentSpans(allSpans);
|
||||||
|
finishedSpans.removeIf(x ->
|
||||||
|
!x.tags().get("http.url").toString().endsWith("/select"));
|
||||||
|
// one from client to server, 2 for execute query, 2 for fetching documents
|
||||||
|
assertEquals(5, finishedSpans.size());
|
||||||
|
assertEquals(1, finishedSpans.stream().filter(s -> s.parentId() == 0).count());
|
||||||
|
long parentId = finishedSpans.stream()
|
||||||
|
.filter(s -> s.parentId() == 0)
|
||||||
|
.collect(Collectors.toList())
|
||||||
|
.get(0).context().spanId();
|
||||||
|
for (MockSpan span: finishedSpans) {
|
||||||
|
if (span.parentId() != 0 && parentId != span.parentId()) {
|
||||||
|
fail("All spans must belong to single span, but:"+finishedSpans);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CollectionAdminRequest.setClusterProperty(ZkStateReader.SAMPLE_PERCENTAGE, "0.0")
|
||||||
|
.process(cluster.getSolrClient());
|
||||||
|
waitForSampleRateUpdated(0);
|
||||||
|
|
||||||
|
getRecentSpans(allSpans);
|
||||||
|
cloudClient.add(COLLECTION, sdoc("id", "5"));
|
||||||
|
finishedSpans = getRecentSpans(allSpans);
|
||||||
|
assertEquals(0, finishedSpans.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertOneSpanIsChildOfAnother(List<MockSpan> finishedSpans) {
|
||||||
|
MockSpan child = finishedSpans.get(0);
|
||||||
|
MockSpan parent = finishedSpans.get(1);
|
||||||
|
if (child.parentId() == 0) {
|
||||||
|
MockSpan temp = parent;
|
||||||
|
parent = child;
|
||||||
|
child = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
assertEquals(child.parentId(), parent.context().spanId());
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<MockSpan> getRecentSpans(List<MockSpan> allSpans) {
|
||||||
|
List<MockSpan> result = new ArrayList<>(getFinishedSpans());
|
||||||
|
result.removeAll(allSpans);
|
||||||
|
allSpans.clear();
|
||||||
|
allSpans.addAll(getFinishedSpans());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* 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.util.tracing;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.google.common.collect.HashMultimap;
|
||||||
|
import com.google.common.collect.Multimap;
|
||||||
|
import org.apache.commons.collections.IteratorUtils;
|
||||||
|
import org.apache.solr.SolrTestCaseJ4;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.mockito.stubbing.Answer;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
public class TestHttpServletCarrier extends SolrTestCaseJ4 {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() {
|
||||||
|
SolrTestCaseJ4.assumeWorkingMockito();
|
||||||
|
HttpServletRequest req = mock(HttpServletRequest.class);
|
||||||
|
Multimap<String, String> headers = HashMultimap.create();
|
||||||
|
headers.put("a", "a");
|
||||||
|
headers.put("a", "b");
|
||||||
|
headers.put("a", "c");
|
||||||
|
headers.put("b", "a");
|
||||||
|
headers.put("b", "b");
|
||||||
|
headers.put("c", "a");
|
||||||
|
|
||||||
|
when(req.getHeaderNames()).thenReturn(IteratorUtils.asEnumeration(headers.keySet().iterator()));
|
||||||
|
when(req.getHeaders(anyString())).thenAnswer((Answer<Enumeration<String>>) inv -> {
|
||||||
|
String key = inv.getArgument(0);
|
||||||
|
return IteratorUtils.asEnumeration(headers.get(key).iterator());
|
||||||
|
});
|
||||||
|
|
||||||
|
HttpServletCarrier servletCarrier = new HttpServletCarrier(req);
|
||||||
|
Iterator<Map.Entry<String, String>> it = servletCarrier.iterator();
|
||||||
|
Multimap<String, String> resultBack = HashMultimap.create();
|
||||||
|
while(it.hasNext()) {
|
||||||
|
Map.Entry<String, String> entry = it.next();
|
||||||
|
resultBack.put(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
assertEquals(headers, resultBack);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
fc934c7619ca7c626a7ce713646d8c43f8dca8bd
|
|
@ -0,0 +1,201 @@
|
||||||
|
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 [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
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.
|
|
@ -0,0 +1 @@
|
||||||
|
dc4066e5b4532121b8e4d69124919376ab123940
|
|
@ -0,0 +1,201 @@
|
||||||
|
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 [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
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.
|
|
@ -0,0 +1 @@
|
||||||
|
300bfbee03c7afa77301fb0946115e400e28ae04
|
|
@ -0,0 +1,201 @@
|
||||||
|
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 [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
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.
|
|
@ -0,0 +1,5 @@
|
||||||
|
Apache Thrift
|
||||||
|
Copyright (C) 2006 - 2019, The Apache Software Foundation
|
||||||
|
|
||||||
|
This product includes software developed at
|
||||||
|
The Apache Software Foundation (http://www.apache.org/).
|
|
@ -0,0 +1 @@
|
||||||
|
67336cfb9d93779c02e1fda4c87801d352720eda
|
|
@ -0,0 +1,201 @@
|
||||||
|
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 [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
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.
|
|
@ -0,0 +1 @@
|
||||||
|
68f907743a5b355a8e975fdd3df0d2e106bbad6c
|
|
@ -0,0 +1,201 @@
|
||||||
|
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 [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
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.
|
|
@ -0,0 +1 @@
|
||||||
|
074b9950a587f53fbdb48c3f1f84f1ece8c10592
|
|
@ -0,0 +1,201 @@
|
||||||
|
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 [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
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.
|
|
@ -0,0 +1 @@
|
||||||
|
132630f17e198a1748f23ce33597efdf4a807fb9
|
|
@ -0,0 +1,201 @@
|
||||||
|
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 [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
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.
|
Binary file not shown.
After Width: | Height: | Size: 280 KiB |
|
@ -265,7 +265,7 @@ Here is an example for configuring the default `log4j2.xml` which ships in Solr.
|
||||||
filePattern="${sys:solr.log.dir}/solr_metrics.log.%i" >
|
filePattern="${sys:solr.log.dir}/solr_metrics.log.%i" >
|
||||||
<PatternLayout>
|
<PatternLayout>
|
||||||
<Pattern>
|
<Pattern>
|
||||||
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p (%t) [%X{node_name} %X{collection} %X{shard} %X{replica} %X{core}] %m%n
|
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p (%t) [%X{node_name} %X{collection} %X{shard} %X{replica} %X{core} %X{trace_id}] %m%n
|
||||||
</Pattern>
|
</Pattern>
|
||||||
</PatternLayout>
|
</PatternLayout>
|
||||||
<Policies>
|
<Policies>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
= Monitoring Solr
|
= Monitoring Solr
|
||||||
:page-children: metrics-reporting, metrics-history, mbean-request-handler, configuring-logging, using-jmx-with-solr, monitoring-solr-with-prometheus-and-grafana, performance-statistics-reference
|
:page-children: metrics-reporting, metrics-history, mbean-request-handler, configuring-logging, using-jmx-with-solr, monitoring-solr-with-prometheus-and-grafana, performance-statistics-reference, solr-tracing
|
||||||
// Licensed to the Apache Software Foundation (ASF) under one
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
// or more contributor license agreements. See the NOTICE file
|
// or more contributor license agreements. See the NOTICE file
|
||||||
// distributed with this work for additional information
|
// distributed with this work for additional information
|
||||||
|
@ -36,4 +36,6 @@ Common administrative tasks include:
|
||||||
|
|
||||||
<<performance-statistics-reference.adoc#performance-statistics-reference,Performance Statistics Reference>>: Additional information on statistics returned from JMX.
|
<<performance-statistics-reference.adoc#performance-statistics-reference,Performance Statistics Reference>>: Additional information on statistics returned from JMX.
|
||||||
|
|
||||||
|
<<solr-tracing.adoc#solr-tracing,Distributed Solr Tracing>>: Describes how to do distributed tracing for Solr requests.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
= Distributed Solr Tracing
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
Solr includes a general tracing framework based on OpenTracing that can be used to trace lifecycle of a request for performance monitoring.
|
||||||
|
Tracing data can be configured and send to arbitrary backend like Jaeger, Zipkin, Datadog, etc. For now only Jaeger is
|
||||||
|
supported out of the box.
|
||||||
|
|
||||||
|
A sampled distributed tracing query request on Jaeger looks like this:
|
||||||
|
|
||||||
|
.Tracing of a solr query
|
||||||
|
image::images/solr-tracing/query-request-tracing.png[image,width=600]
|
||||||
|
|
||||||
|
== Setup Tracer
|
||||||
|
|
||||||
|
`TracerConfigurator` is a class used for provide an instance of `io.opentracing.Tracer` based on configuration in `solr.xml`.
|
||||||
|
Like `JaegerTracerConfigurator` provide JaegerTracer instance to Solr node.
|
||||||
|
|
||||||
|
A setup of a `TracerConfigurator` looks like this
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<solr>
|
||||||
|
<tracerConfig name="tracerConfig" class="org.apache.solr.jaeger.JaegerTracerConfigurator">
|
||||||
|
<str name="agentHost">localhost</str>
|
||||||
|
<int name="agentPort">5775</int>
|
||||||
|
<bool name="logSpans">true</bool>
|
||||||
|
<int name="flushInterval">1000</int>
|
||||||
|
<int name="maxQueueSize">10000</int>
|
||||||
|
</tracerConfig>
|
||||||
|
</solr>
|
||||||
|
```
|
||||||
|
|
||||||
|
If `<tracerConfig>` part is absent, `TracerConfigurator` will try to pick up the `Tracer` instance was registered in
|
||||||
|
in `io.opentracing.util.GlobalTracer`. By doing this some backend like DataDog is supported out of the box since
|
||||||
|
https://docs.datadoghq.com/tracing/setup/java/[datadog-java-agent] use Javaagent to register a `Tracer` in
|
||||||
|
`io.opentracing.util.GlobalTracer`.
|
||||||
|
|
||||||
|
=== Configuring sample rate
|
||||||
|
|
||||||
|
By default only 0.1% of requests are sampled, this ensure that tracing activities does not affect performance of a node.
|
||||||
|
|
||||||
|
The rate can be changed on the fly (without restarting Solr nodes) by setting new sample rate in cluster property. For example,
|
||||||
|
below call set sample rate to 100%
|
||||||
|
```
|
||||||
|
/admin/collections?action=CLUSTERPROP&name=propertyName&samplePercentage=100
|
||||||
|
```
|
||||||
|
|
||||||
|
== Jaeger Tracer Configurator
|
||||||
|
|
||||||
|
Module `contrib/jagertracer-configurator` provides a default implementation for setting up Jaeger Tracer.
|
||||||
|
Note that all library of jaegertracer-configurator must be included in the classpath of all nodes then Jaeger tracer can be setup in `solr.xml` like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
<tracerConfig name="tracerConfig" class="org.apache.solr.jaeger.JaegerTracerConfigurator">
|
||||||
|
<str name="agentHost">localhost</str>
|
||||||
|
<int name="agentPort">5775</int>
|
||||||
|
<bool name="logSpans">true</bool>
|
||||||
|
<int name="flushInterval">1000</int>
|
||||||
|
<int name="maxQueueSize">10000</int>
|
||||||
|
</tracerConfig>
|
||||||
|
```
|
||||||
|
|
||||||
|
List of parameters for JaegerTracerConfigurator include:
|
||||||
|
|===
|
||||||
|
|Parameter|Type|Required|Default|Description
|
||||||
|
|agentHost|string|Yes||The host of Jaeger backend
|
||||||
|
|agentPort|int|Yes||The port of Jaeger port
|
||||||
|
|logsSpans|bool|No|true|Whether the tracer should also log the spans
|
||||||
|
|flushInterval|int|No|5000|The tracer's flush interval (ms)
|
||||||
|
|maxQueueSize|int|No|10000|The tracer's maximum queue size
|
||||||
|
|===
|
||||||
|
|
||||||
|
Other parameters which are not listed above can be configured using System Properties or Environment Variables. The full list are listed at https://github.com/jaegertracing/jaeger-client-java/blob/master/jaeger-core/README.md[Jaeger-README].
|
|
@ -21,7 +21,10 @@ import java.io.Serializable;
|
||||||
import java.security.Principal;
|
import java.security.Principal;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@ -63,6 +66,7 @@ public abstract class SolrRequest<T extends SolrResponse> implements Serializabl
|
||||||
|
|
||||||
private METHOD method = METHOD.GET;
|
private METHOD method = METHOD.GET;
|
||||||
private String path = null;
|
private String path = null;
|
||||||
|
private Map<String,String> headers;
|
||||||
|
|
||||||
private ResponseParser responseParser;
|
private ResponseParser responseParser;
|
||||||
private StreamingResponseCallback callback;
|
private StreamingResponseCallback callback;
|
||||||
|
@ -237,4 +241,16 @@ public abstract class SolrRequest<T extends SolrResponse> implements Serializabl
|
||||||
public String getBasePath() {
|
public String getBasePath() {
|
||||||
return basePath;
|
return basePath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addHeader(String key, String value) {
|
||||||
|
if (headers == null) {
|
||||||
|
headers = new HashMap<>();
|
||||||
|
}
|
||||||
|
headers.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getHeaders() {
|
||||||
|
if (headers == null) return null;
|
||||||
|
return Collections.unmodifiableMap(headers);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@ import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
@ -317,10 +318,9 @@ public class Http2SolrClient extends SolrClient {
|
||||||
.newRequest(basePath + "update"
|
.newRequest(basePath + "update"
|
||||||
+ requestParams.toQueryString())
|
+ requestParams.toQueryString())
|
||||||
.method(HttpMethod.POST)
|
.method(HttpMethod.POST)
|
||||||
.header("User-Agent", HttpSolrClient.AGENT)
|
.header(HttpHeader.CONTENT_TYPE, contentType)
|
||||||
.header("Content-Type", contentType)
|
|
||||||
.content(provider);
|
.content(provider);
|
||||||
setListeners(updateRequest, postRequest);
|
decorateRequest(postRequest, updateRequest);
|
||||||
InputStreamResponseListener responseListener = new InputStreamResponseListener();
|
InputStreamResponseListener responseListener = new InputStreamResponseListener();
|
||||||
postRequest.send(responseListener);
|
postRequest.send(responseListener);
|
||||||
|
|
||||||
|
@ -452,16 +452,16 @@ public class Http2SolrClient extends SolrClient {
|
||||||
private Request makeRequest(SolrRequest solrRequest, String collection)
|
private Request makeRequest(SolrRequest solrRequest, String collection)
|
||||||
throws SolrServerException, IOException {
|
throws SolrServerException, IOException {
|
||||||
Request req = createRequest(solrRequest, collection);
|
Request req = createRequest(solrRequest, collection);
|
||||||
|
decorateRequest(req, solrRequest);
|
||||||
|
return req;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void decorateRequest(Request req, SolrRequest solrRequest) {
|
||||||
req.header(HttpHeader.ACCEPT_ENCODING, null);
|
req.header(HttpHeader.ACCEPT_ENCODING, null);
|
||||||
setListeners(solrRequest, req);
|
|
||||||
if (solrRequest.getUserPrincipal() != null) {
|
if (solrRequest.getUserPrincipal() != null) {
|
||||||
req.attribute(REQ_PRINCIPAL_KEY, solrRequest.getUserPrincipal());
|
req.attribute(REQ_PRINCIPAL_KEY, solrRequest.getUserPrincipal());
|
||||||
}
|
}
|
||||||
|
|
||||||
return req;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setListeners(SolrRequest solrRequest, Request req) {
|
|
||||||
setBasicAuthHeader(solrRequest, req);
|
setBasicAuthHeader(solrRequest, req);
|
||||||
for (HttpListenerFactory factory : listenerFactory) {
|
for (HttpListenerFactory factory : listenerFactory) {
|
||||||
HttpListenerFactory.RequestResponseListener listener = factory.get();
|
HttpListenerFactory.RequestResponseListener listener = factory.get();
|
||||||
|
@ -469,6 +469,13 @@ public class Http2SolrClient extends SolrClient {
|
||||||
req.onRequestBegin(listener);
|
req.onRequestBegin(listener);
|
||||||
req.onComplete(listener);
|
req.onComplete(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Map<String, String> headers = solrRequest.getHeaders();
|
||||||
|
if (headers != null) {
|
||||||
|
for (Map.Entry<String, String> entry : headers.entrySet()) {
|
||||||
|
req.header(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Request createRequest(SolrRequest solrRequest, String collection) throws IOException, SolrServerException {
|
private Request createRequest(SolrRequest solrRequest, String collection) throws IOException, SolrServerException {
|
||||||
|
|
|
@ -32,6 +32,7 @@ import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
@ -252,6 +253,12 @@ public class HttpSolrClient extends BaseHttpSolrClient {
|
||||||
throws SolrServerException, IOException {
|
throws SolrServerException, IOException {
|
||||||
HttpRequestBase method = createMethod(request, collection);
|
HttpRequestBase method = createMethod(request, collection);
|
||||||
setBasicAuthHeader(request, method);
|
setBasicAuthHeader(request, method);
|
||||||
|
if (request.getHeaders() != null) {
|
||||||
|
Map<String, String> headers = request.getHeaders();
|
||||||
|
for (Map.Entry<String, String> entry : headers.entrySet()) {
|
||||||
|
method.setHeader(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
return executeMethod(method, request.getUserPrincipal(), processor, isV2ApiRequest(request));
|
return executeMethod(method, request.getUserPrincipal(), processor, isV2ApiRequest(request));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -133,6 +133,7 @@ public class ZkStateReader implements SolrCloseable {
|
||||||
public final static String CONFIGNAME_PROP="configName";
|
public final static String CONFIGNAME_PROP="configName";
|
||||||
|
|
||||||
public static final String LEGACY_CLOUD = "legacyCloud";
|
public static final String LEGACY_CLOUD = "legacyCloud";
|
||||||
|
public static final String SAMPLE_PERCENTAGE = "samplePercentage";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated use {@link org.apache.solr.common.params.CollectionAdminParams#DEFAULTS} instead.
|
* @deprecated use {@link org.apache.solr.common.params.CollectionAdminParams#DEFAULTS} instead.
|
||||||
|
@ -246,6 +247,7 @@ public class ZkStateReader implements SolrCloseable {
|
||||||
CoreAdminParams.BACKUP_LOCATION,
|
CoreAdminParams.BACKUP_LOCATION,
|
||||||
DEFAULT_SHARD_PREFERENCES,
|
DEFAULT_SHARD_PREFERENCES,
|
||||||
MAX_CORES_PER_NODE,
|
MAX_CORES_PER_NODE,
|
||||||
|
SAMPLE_PERCENTAGE,
|
||||||
CollectionAdminParams.DEFAULTS)));
|
CollectionAdminParams.DEFAULTS)));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
<Console name="STDERR" target="SYSTEM_ERR">
|
<Console name="STDERR" target="SYSTEM_ERR">
|
||||||
<PatternLayout>
|
<PatternLayout>
|
||||||
<Pattern>
|
<Pattern>
|
||||||
%maxLen{%-4r %-5p (%t) [%X{node_name} %X{collection} %X{shard} %X{replica} %X{core}] %c{1.} %m%notEmpty{
|
%maxLen{%-4r %-5p (%t) [%X{node_name} %X{collection} %X{shard} %X{replica} %X{core} %X{trace_id}] %c{1.} %m%notEmpty{
|
||||||
=>%ex{short}}}{10240}%n
|
=>%ex{short}}}{10240}%n
|
||||||
</Pattern>
|
</Pattern>
|
||||||
</PatternLayout>
|
</PatternLayout>
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
<dependency org="org.hamcrest" name="hamcrest-core" rev="${/org.hamcrest/hamcrest-core}" conf="compile;junit4-stdalone" />
|
<dependency org="org.hamcrest" name="hamcrest-core" rev="${/org.hamcrest/hamcrest-core}" conf="compile;junit4-stdalone" />
|
||||||
<dependency org="com.carrotsearch.randomizedtesting" name="junit4-ant" rev="${/com.carrotsearch.randomizedtesting/junit4-ant}" conf="compile;junit4-stdalone" />
|
<dependency org="com.carrotsearch.randomizedtesting" name="junit4-ant" rev="${/com.carrotsearch.randomizedtesting/junit4-ant}" conf="compile;junit4-stdalone" />
|
||||||
<dependency org="com.carrotsearch.randomizedtesting" name="randomizedtesting-runner" rev="${/com.carrotsearch.randomizedtesting/randomizedtesting-runner}" conf="compile;junit4-stdalone" />
|
<dependency org="com.carrotsearch.randomizedtesting" name="randomizedtesting-runner" rev="${/com.carrotsearch.randomizedtesting/randomizedtesting-runner}" conf="compile;junit4-stdalone" />
|
||||||
|
<dependency org="io.opentracing" name="opentracing-mock" rev="${/io.opentracing/opentracing-mock}" conf="compile;junit4-stdalone"/>
|
||||||
|
|
||||||
<exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/>
|
<exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* 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.core;
|
||||||
|
|
||||||
|
import io.opentracing.Tracer;
|
||||||
|
import io.opentracing.mock.MockTracer;
|
||||||
|
import org.apache.solr.common.util.NamedList;
|
||||||
|
|
||||||
|
public class MockTracerConfigurator extends TracerConfigurator {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Tracer getTracer() {
|
||||||
|
return new MockTracer();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(NamedList args) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue