未验证 提交 0f9c27d4 编写于 作者: wu-sheng's avatar wu-sheng 提交者: GitHub

Revert SolrJ plugin. (#2871)

* Revert SolrJ plugin.

* Remove an unexpected test case.

* Revert "Remove an unexpected test case."

This reverts commit 359990e18b0c0ae1a6e1005ff985bf237ec05619.

* Clear context.

* Fix a leak.
上级 5b6a8905
......@@ -122,8 +122,6 @@ public class ComponentsDefine {
public static final OfficialComponent RESTEASY = new OfficialComponent(62, "RESTEasy");
public static final OfficialComponent SOLRJ = new OfficialComponent(63, "solrj");
private static ComponentsDefine INSTANCE = new ComponentsDefine();
private String[] components;
......@@ -181,7 +179,6 @@ public class ComponentsDefine {
addComponent(VERTX);
addComponent(SPRING_CLOUD_GATEWAY);
addComponent(RESTEASY);
addComponent(SOLRJ);
}
private void addComponent(OfficialComponent component) {
......
......@@ -193,17 +193,5 @@ public class Config {
*/
public static boolean USE_QUALIFIED_NAME_AS_OPERATION_NAME = false;
}
public static class SolrJ {
/**
* If true, trace all the query parameters(include deleteByIds and deleteByQuery) in Solr query request, default is false.
*/
public static boolean TRACE_STATEMENT = false;
/**
* If true, trace all the operation parameters in Solr request, default is false.
*/
public static boolean TRACE_OPS_PARAMS = false;
}
}
}
......@@ -72,6 +72,7 @@ public class TraceSegmentServiceClient implements BootService, IConsumer<TraceSe
@Override
public void shutdown() throws Throwable {
TracingContext.ListenerManager.remove(this);
carrier.shutdownConsumers();
}
......
......@@ -39,28 +39,34 @@ public class TracingContextTest {
@Test
public void testSpanLimit() {
final boolean[] dataReceived = {false};
TracingContext.ListenerManager.add(new TracingContextListener() {
TracingContextListener listener = new TracingContextListener() {
@Override public void afterFinished(TraceSegment traceSegment) {
dataReceived[0] = true;
}
});
TracingContext tracingContext = new TracingContext();
AbstractSpan span = tracingContext.createEntrySpan("/url");
};
TracingContext.ListenerManager.add(listener);
try {
TracingContext tracingContext = new TracingContext();
AbstractSpan span = tracingContext.createEntrySpan("/url");
for (int i = 0; i < 10; i++) {
AbstractSpan localSpan = tracingContext.createLocalSpan("/java-bean");
for (int i = 0; i < 10; i++) {
AbstractSpan localSpan = tracingContext.createLocalSpan("/java-bean");
for (int j = 0; j < 100; j++) {
AbstractSpan exitSpan = tracingContext.createExitSpan("/redis","localhost");
tracingContext.stopSpan(exitSpan);
for (int j = 0; j < 100; j++) {
AbstractSpan exitSpan = tracingContext.createExitSpan("/redis", "localhost");
tracingContext.stopSpan(exitSpan);
}
tracingContext.stopSpan(localSpan);
}
tracingContext.stopSpan(localSpan);
}
tracingContext.stopSpan(span);
tracingContext.stopSpan(span);
Assert.assertTrue(dataReceived[0]);
} finally {
TracingContext.ListenerManager.remove(listener);
}
}
Assert.assertTrue(dataReceived[0]);
}
}
......@@ -73,7 +73,6 @@
<module>dubbo-2.7.x-conflict-patch</module>
<module>vertx-plugins</module>
<module>resteasy-plugin</module>
<module>solrj-7.x-plugin</module>
</modules>
<packaging>pom</packaging>
......@@ -183,4 +182,4 @@
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
</project>
<?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.
~
-->
<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">
<parent>
<artifactId>apm-sdk-plugin</artifactId>
<groupId>org.apache.skywalking</groupId>
<version>6.2.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>apm-solrj-7.x-plugin</artifactId>
<packaging>jar</packaging>
<name>solrj-7.x-plugin</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<solr-solrj.version>7.7.1</solr-solrj.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>${solr-solrj.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
\ No newline at end of file
/*
* 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.skywalking.apm.plugin.solrj;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.skywalking.apm.agent.core.context.CarrierItem;
import org.apache.skywalking.apm.agent.core.context.ContextCarrier;
import org.apache.skywalking.apm.agent.core.context.ContextManager;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult;
import java.lang.reflect.Method;
public class SolrConnectorInterceptor implements InstanceMethodsAroundInterceptor {
@Override
public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
MethodInterceptResult result) throws Throwable {
HttpUriRequest request = (HttpUriRequest) allArguments[0];
ContextCarrier carrier = new ContextCarrier();
ContextManager.inject(carrier);
CarrierItem items = carrier.items();
while (items.hasNext()) {
items = items.next();
request.setHeader(items.getHeadKey(), items.getHeadValue());
}
}
@Override
public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
Object ret) throws Throwable {
return ret;
}
@Override
public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes, Throwable t) {
if (ContextManager.isActive()) {
ContextManager.activeSpan().errorOccurred().log(t);
}
}
}
/*
* 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.skywalking.apm.plugin.solrj.commons;
public class SolrjInstance {
private String collection = "Unknown";
private String remotePeer = "Unknown";
public String getCollection() {
return collection;
}
public void setCollection(String collection) {
this.collection = collection;
}
public String getRemotePeer() {
return remotePeer;
}
public void setRemotePeer(String remotePeer) {
this.remotePeer = remotePeer;
}
}
/*
* 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.skywalking.apm.plugin.solrj.commons;
import org.apache.skywalking.apm.agent.core.context.tag.StringTag;
public class SolrjTags {
public static StringTag TAG_QT = new StringTag("qt");
public static StringTag TAG_COLLECTION = new StringTag("collection");
public static StringTag TAG_Q_TIME = new StringTag("QTime");
public static StringTag TAG_STATUS = new StringTag("status");
public static StringTag TAG_START = new StringTag("start");
public static StringTag TAG_SORT_BY = new StringTag("sort");
public static StringTag TAG_NUM_FOUND = new StringTag("numFound");
public static StringTag TAG_SOFT_COMMIT = new StringTag("softCommit");
public static StringTag TAG_COMMIT_WITHIN = new StringTag("commitWithin");
public static StringTag TAG_MAX_OPTIMIZE_SEGMENTS = new StringTag("maxOptimizeSegs");
public static StringTag TAG_DOCS_SIZE = new StringTag("docsSize");
public static StringTag TAG_DELETE_VALUE = new StringTag("delete.by");
}
/*
* 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.skywalking.apm.plugin.solrj.define;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.matcher.ElementMatcher;
import net.bytebuddy.matcher.ElementMatchers;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
public class HttpClientInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
private static String ENHANCE_CLASS = "org.apache.http.impl.client.CloseableHttpClient";
@Override
protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
return new ConstructorInterceptPoint[]{};
}
@Override
protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
return new InstanceMethodsInterceptPoint[]{
new InstanceMethodsInterceptPoint() {
@Override
public boolean isOverrideArgs() {
return false;
}
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return ElementMatchers.named("execute").and(ElementMatchers.takesArgument(0, HttpUriRequest.class));
}
@Override
public String getMethodsInterceptor() {
return "org.apache.skywalking.apm.plugin.solrj.SolrConnectorInterceptor";
}
}
};
}
@Override
protected ClassMatch enhanceClass() {
return NameMatch.byName(ENHANCE_CLASS);
}
}
\ No newline at end of file
/*
* 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.skywalking.apm.plugin.solrj.define;
import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.matcher.ElementMatcher;
import net.bytebuddy.matcher.ElementMatchers;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch;
import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
public class SolrClientInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
@Override
protected ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
return new ConstructorInterceptPoint[]{
new ConstructorInterceptPoint() {
@Override
public String getConstructorInterceptor() {
return "org.apache.skywalking.apm.plugin.solrj.SolrClientInterceptor";
}
@Override
public ElementMatcher<MethodDescription> getConstructorMatcher() {
return ElementMatchers.any();
}
}
};
}
@Override
protected InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
return new InstanceMethodsInterceptPoint[]{
new InstanceMethodsInterceptPoint() {
@Override
public boolean isOverrideArgs() {
return false;
}
@Override
public ElementMatcher<MethodDescription> getMethodsMatcher() {
return ElementMatchers.named("request").and(ElementMatchers.takesArguments(3));
}
@Override
public String getMethodsInterceptor() {
return "org.apache.skywalking.apm.plugin.solrj.SolrClientInterceptor";
}
}
};
}
@Override
protected ClassMatch enhanceClass() {
return NameMatch.byName("org.apache.solr.client.solrj.impl.HttpSolrClient");
}
}
\ No newline at end of file
# 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.
solrj-7.x=org.apache.skywalking.apm.plugin.solrj.define.SolrClientInstrumentation
solrj-7.x=org.apache.skywalking.apm.plugin.solrj.define.HttpClientInstrumentation
\ No newline at end of file
/*
* 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.skywalking.apm.plugin.solrj;
import com.google.common.collect.Lists;
import org.apache.skywalking.apm.agent.core.conf.Config;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer;
import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance;
import org.apache.skywalking.apm.agent.test.helper.SegmentHelper;
import org.apache.skywalking.apm.agent.test.tools.*;
import org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
import org.apache.skywalking.apm.plugin.solrj.commons.SolrjInstance;
import org.apache.solr.client.solrj.ResponseParser;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
import org.apache.solr.client.solrj.request.QueryRequest;
import org.apache.solr.client.solrj.request.UpdateRequest;
import org.apache.solr.common.*;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.util.NamedList;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;
import java.lang.reflect.Method;
import java.util.List;
import static org.mockito.Mockito.when;
@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(TracingSegmentRunner.class)
public class SolrClientInterceptorTest {
SolrClientInterceptor interceptor = new SolrClientInterceptor();
@SegmentStoragePoint
private SegmentStorage segmentStorage;
@Rule
public AgentServiceRule serviceRule = new AgentServiceRule();
@Mock
private HttpSolrClient client;
@Mock
private Method method;
@Mock
private EnhancedInstance enhancedInstance;
private Object[] arguments = null;
private Class[] argumentType = new Class[] {
SolrRequest.class,
ResponseParser.class,
String.class
};
private String collection = null;
private HttpSolrClient.Builder builder;
@Mock
private SolrjInstance instance;
private NamedList<Object> header;
@Before
public void setup() throws Exception {
builder = new HttpSolrClient.Builder().withBaseSolrUrl("http://solr-server:8983/solr/collection");
enhancedInstance = new EnhanceHttpSolrClient(builder);
when(instance.getCollection()).thenReturn("collection");
when(instance.getRemotePeer()).thenReturn("solr-server:8983");
enhancedInstance.setSkyWalkingDynamicField(instance);
header = new NamedList<Object>();
header.add("status", 0);
header.add("QTime", 5);
// Config.Plugin.SolrJ.TRACE_STATEMENT = true;
// Config.Plugin.SolrJ.TRACE_OPS_PARAMS = true;
}
@Test
public void testConstructor() throws Throwable {
arguments = new Object[] {builder};
interceptor.onConstruct(enhancedInstance, arguments);
SolrjInstance instance = (SolrjInstance) enhancedInstance.getSkyWalkingDynamicField();
Assert.assertEquals(instance.getRemotePeer(), "solr-server:8983");
Assert.assertEquals(instance.getCollection(), "collection");
}
@Test
public void testUpdateWithAdd() throws Throwable {
UpdateRequest request = new UpdateRequest();
List<SolrInputDocument> docs = Lists.newArrayList();
for (int start = 0; start < 100; start++) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", start);
docs.add(doc);
}
arguments = new Object[] {
request.add(docs),
null,
collection
};
interceptor.beforeMethod(enhancedInstance, method, arguments, argumentType, null);
interceptor.afterMethod(enhancedInstance, method, arguments, argumentType, getResponse());
List<TraceSegment> segments = segmentStorage.getTraceSegments();
Assert.assertEquals(segments.size(), 1);
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segments.get(0));
Assert.assertEquals(spans.size(), 1);
AbstractTracingSpan span = spans.get(0);
int pox = 0;
if (Config.Plugin.SolrJ.TRACE_STATEMENT) {
SpanAssert.assertTag(span, ++pox, "100");
}
if (Config.Plugin.SolrJ.TRACE_OPS_PARAMS) {
SpanAssert.assertTag(span, ++pox, "-1");
}
spanCommonAssert(span, pox,"solrJ/collection/update/ADD");
}
@Test
public void testUpdateWithCommit() throws Throwable {
final boolean softCommit = false;
AbstractUpdateRequest request = (new UpdateRequest()).setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true, false);
arguments = new Object[]{
request,
null,
collection
};
interceptor.beforeMethod(enhancedInstance, method, arguments, argumentType, null);
interceptor.afterMethod(enhancedInstance, method, arguments, argumentType, getResponse());
List<TraceSegment> segments = segmentStorage.getTraceSegments();
Assert.assertEquals(segments.size(), 1);
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segments.get(0));
Assert.assertEquals(spans.size(), 1);
int start = 0;
AbstractTracingSpan span = spans.get(0);
if (Config.Plugin.SolrJ.TRACE_OPS_PARAMS) {
SpanAssert.assertTag(span, ++start, String.valueOf(softCommit));
}
spanCommonAssert(span, start, "solrJ/collection/update/COMMIT");
}
@Test
public void testUpdateWithOptimize() throws Throwable {
final int maxSegments = 1;
AbstractUpdateRequest request = (new UpdateRequest()).setAction(AbstractUpdateRequest.ACTION.OPTIMIZE, false, true, maxSegments);
arguments = new Object[]{
request,
null,
collection
};
interceptor.beforeMethod(enhancedInstance, method, arguments, argumentType, null);
interceptor.afterMethod(enhancedInstance, method, arguments, argumentType, getResponse());
List<TraceSegment> segments = segmentStorage.getTraceSegments();
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segments.get(0));
Assert.assertEquals(segments.size(), 1);
Assert.assertEquals(spans.size(), 1);
AbstractTracingSpan span = spans.get(0);
int start = 0;
if (Config.Plugin.SolrJ.TRACE_OPS_PARAMS) {
SpanAssert.assertTag(span, ++start, String.valueOf(maxSegments));
}
spanCommonAssert(span, start, "solrJ/collection/update/OPTIMIZE");
}
@Test
public void testQuery() throws Throwable {
QueryRequest request = new QueryRequest();
arguments = new Object[] {
request,
null,
collection
};
interceptor.beforeMethod(enhancedInstance, method, arguments, argumentType, null);
interceptor.afterMethod(enhancedInstance, method, arguments, argumentType, getQueryResponse());
List<TraceSegment> segments = segmentStorage.getTraceSegments();
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segments.get(0));
Assert.assertEquals(segments.size(), 1);
Assert.assertEquals(spans.size(), 1);
AbstractTracingSpan span = spans.get(0);
querySpanAssert(span, "/select", 100, "solrJ/collection/select");
}
@Test
public void testGet() throws Throwable {
ModifiableSolrParams reqParams = new ModifiableSolrParams();
if (StringUtils.isEmpty(reqParams.get("qt"))) {
reqParams.set("qt", new String[]{"/get"});
}
reqParams.set("ids", new String[] {"99", "98"});
QueryRequest request = new QueryRequest(reqParams);
arguments = new Object[] {
request,
null,
collection
};
interceptor.beforeMethod(enhancedInstance, method, arguments, argumentType, null);
interceptor.afterMethod(enhancedInstance, method, arguments, argumentType, getGetResponse());
List<TraceSegment> segments = segmentStorage.getTraceSegments();
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segments.get(0));
Assert.assertEquals(segments.size(), 1);
Assert.assertEquals(spans.size(), 1);
AbstractTracingSpan span = spans.get(0);
querySpanAssert(span, "/get", 1, "solrJ/collection/get");
}
@Test
public void testDeleteById() throws Throwable {
UpdateRequest request = new UpdateRequest();
arguments = new Object[] {
request.deleteById("12"),
null,
collection
};
interceptor.beforeMethod(enhancedInstance, method, arguments, argumentType, null);
interceptor.afterMethod(enhancedInstance, method, arguments, argumentType, getResponse());
List<TraceSegment> segments = segmentStorage.getTraceSegments();
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segments.get(0));
Assert.assertEquals(segments.size(), 1);
Assert.assertEquals(spans.size(), 1);
AbstractTracingSpan span = spans.get(0);
spanDeleteAssert(span, "solrJ/collection/update/DELETE_BY_IDS", "[12]");
}
@Test
public void testDeleteByQuery() throws Throwable {
UpdateRequest request = new UpdateRequest();
arguments = new Object[] {
request.deleteByQuery("id:[2 TO 5]"),
null,
collection
};
interceptor.beforeMethod(enhancedInstance, method, arguments, argumentType, null);
interceptor.afterMethod(enhancedInstance, method, arguments, argumentType, getResponse());
List<TraceSegment> segments = segmentStorage.getTraceSegments();
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segments.get(0));
Assert.assertEquals(segments.size(), 1);
Assert.assertEquals(spans.size(), 1);
AbstractTracingSpan span = spans.get(0);
spanDeleteAssert(span, "solrJ/collection/update/DELETE_BY_QUERY", "[id:[2 TO 5]]");
}
@Test
public void testException() throws Throwable {
QueryRequest request = new QueryRequest();
arguments = new Object[] {
request,
null,
collection
};
NamedList<Object> response = new NamedList<Object>();
NamedList<Object> header = new NamedList<Object>();
header.add("status", 500);
header.add("QTime", 5);
response.add("responseHeader", header);
interceptor.beforeMethod(enhancedInstance, method, arguments, argumentType, null);
interceptor.handleMethodException(enhancedInstance, method, arguments, argumentType,
new SolrException(SolrException.ErrorCode.SERVER_ERROR, "for test", new Exception()));
interceptor.afterMethod(enhancedInstance, method, arguments, argumentType, response);
List<TraceSegment> segments = segmentStorage.getTraceSegments();
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segments.get(0));
Assert.assertEquals(segments.size(), 1);
Assert.assertEquals(spans.size(), 1);
AbstractTracingSpan span = spans.get(0);
SpanAssert.assertOccurException(span, true);
}
private void querySpanAssert(AbstractSpan span, String qt, int numFound, String operationName) {
Assert.assertEquals(span.getOperationName(), operationName);
SpanAssert.assertTag(span, 0, "Solr");
SpanAssert.assertTag(span, 1, "0");
SpanAssert.assertTag(span, 2, qt);
int start = 3;
if (Config.Plugin.SolrJ.TRACE_STATEMENT) {
start++;
}
SpanAssert.assertTag(span, start++, "5");
SpanAssert.assertTag(span, start++, String.valueOf(numFound));
}
private void spanCommonAssert(AbstractSpan span, int start, String operationName) {
SpanAssert.assertComponent(span, ComponentsDefine.SOLRJ);
SpanAssert.assertOccurException(span, false);
SpanAssert.assertLogSize(span, 0);
SpanAssert.assertLayer(span, SpanLayer.DB);
SpanAssert.assertTag(span, 0, "Solr");
SpanAssert.assertTag(span, start + 1, "5");
Assert.assertEquals(span.getOperationName(), operationName);
}
private void spanDeleteAssert(AbstractSpan span, String operationName, String statement) {
Assert.assertEquals(span.getOperationName(), operationName);
SpanAssert.assertComponent(span, ComponentsDefine.SOLRJ);
SpanAssert.assertOccurException(span, false);
SpanAssert.assertLogSize(span, 0);
SpanAssert.assertLayer(span, SpanLayer.DB);
SpanAssert.assertTag(span, 0, "Solr");
int start = 0;
if (Config.Plugin.SolrJ.TRACE_STATEMENT) {
SpanAssert.assertTag(span, ++start, statement);
}
if (Config.Plugin.SolrJ.TRACE_OPS_PARAMS) {
SpanAssert.assertTag(span, ++start, "-1");
}
SpanAssert.assertTag(span, start + 1, "5");
}
private NamedList<Object> getResponse() {
NamedList<Object> response = new NamedList<Object>();
response.add("responseHeader", header);
return response;
}
private NamedList<Object> getQueryResponse() {
NamedList<Object> response = new NamedList<Object>();
response.add("responseHeader", header);
SolrDocumentList list = new SolrDocumentList();
list.setStart(0);
list.setNumFound(100);
list.setMaxScore(.0f);
for (int start = 0; start < 10; start++) {
SolrDocument doc = new SolrDocument();
doc.addField("id", start);
doc.addField("_version", 1634676349644832768L);
list.add(doc);
}
response.add("response", list);
return response;
}
private NamedList<Object> getGetResponse() {
NamedList<Object> response = new NamedList<Object>();
response.add("responseHeader", header);
SolrDocumentList list = new SolrDocumentList();
list.setStart(0);
list.setNumFound(1);
list.setMaxScore(.0f);
SolrDocument doc = new SolrDocument();
doc.addField("id", 1);
doc.addField("_version", 1634676349644832768L);
list.add(doc);
response.add("response", list);
return response;
}
class EnhanceHttpSolrClient extends HttpSolrClient implements EnhancedInstance {
Object value = null;
protected EnhanceHttpSolrClient(Builder builder) {
super(builder);
}
@Override
public Object getSkyWalkingDynamicField() {
return value;
}
@Override
public void setSkyWalkingDynamicField(Object value) {
this.value = value;
}
}
}
\ No newline at end of file
......@@ -82,8 +82,6 @@ property key | Description | Default |
`plugin.elasticsearch.trace_dsl`|If true, trace all the DSL(Domain Specific Language) in ElasticSearch access, default is false.|`false`|
`plugin.springmvc.use_qualified_name_as_endpoint_name`|If true, the fully qualified method name will be used as the endpoint name instead of the request URL, default is false.|`false`|
`plugin.toolit.use_qualified_name_as_operation_name`|If true, the fully qualified method name will be used as the operation name instead of the given operation name, default is false.|`false`|
`plugin.solrj.trace_statement`|If true, trace all the query parameters(include deleteByIds and deleteByQuery) in Solr query request, default is false.|`false`|
`plugin.solrj.trace_ops_params`|If true, trace all the operation parameters in Solr request, default is false.|`false`|
## Optional Plugins
Java agent plugins are all pluggable. Optional plugins could be provided in `optional-plugins` folder under agent or 3rd party repositores.
......
......@@ -53,7 +53,6 @@
* [Xmemcached](https://github.com/killme2008/xmemcached) 2.x
* [Elasticsearch](https://github.com/elastic/elasticsearch)
* [transport-client](https://github.com/elastic/elasticsearch/tree/master/client/transport) 5.2.x-5.6.x
* [SolrJ](https://lucene.apache.org/solr) 7.0.0-7.7.1
* Service Discovery
* [Netflix Eureka](https://github.com/Netflix/eureka)
* Distributed Coordination
......
......@@ -198,12 +198,6 @@ spring-cloud-gateway:
RESTEasy:
id: 62
languages: Java
SolrJ:
id: 63
languages: Java
Solr:
id: 64
languages: Java
# .NET/.NET Core components
# [3000, 4000) for C#/.NET only
......@@ -301,4 +295,3 @@ Component-Server-Mappings:
Pomelo.EntityFrameworkCore.MySql: Mysql
Npgsql.EntityFrameworkCore.PostgreSQL: PostgreSQL
transport-client: Elasticsearch
SolrJ: Solr
......@@ -216,12 +216,6 @@ spring-cloud-gateway:
RESTEasy:
id: 62
languages: Java
SolrJ:
id: 63
languages: Java
Solr:
id: 64
languages: Java
# .NET/.NET Core components
# [3000, 4000) for C#/.NET only
......@@ -321,4 +315,3 @@ Component-Server-Mappings:
Pomelo.EntityFrameworkCore.MySql: Mysql
Npgsql.EntityFrameworkCore.PostgreSQL: PostgreSQL
transport-client: Elasticsearch
SolrJ: Solr
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册