Add an agent plugin for ShardingSphere 5.0.0-beta (#7171)
This commit is contained in:
parent
dcefc69edf
commit
0975809e43
|
|
@ -60,6 +60,7 @@ jobs:
|
|||
- shardingsphere-4.x-RC3-scenario
|
||||
- shardingsphere-4.0.x-scenario
|
||||
- shardingsphere-4.x-scenario
|
||||
- shardingsphere-5.0.0-beta-scenario
|
||||
- sofarpc-scenario
|
||||
- solrj-7.x-scenario
|
||||
- spring-3.0.x-scenario
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ Release Notes.
|
|||
* Add `Neo4j-4.x` plugin.
|
||||
* Correct `profile.duration` to `profile.max_duration` in the default `agent.config` file.
|
||||
* Fix the response time of gRPC.
|
||||
* Add `ShardingSphere-5.0.0-beta` plugin.
|
||||
|
||||
#### OAP-Backend
|
||||
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@
|
|||
<module>sharding-sphere-4.x-RC3-plugin</module>
|
||||
<module>sharding-sphere-4.0.x-plugin</module>
|
||||
<module>sharding-sphere-4.1.0-plugin</module>
|
||||
<module>shardingsphere-5.0.0-beta-plugin</module>
|
||||
<module>xmemcached-2.x-plugin</module>
|
||||
<module>grpc-1.x-plugin</module>
|
||||
<module>mysql-5.x-plugin</module>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,73 @@
|
|||
<?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>8.7.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>apm-shardingsphere-5.0.0-beta-plugin</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>shardingsphere-5.0.0-beta-plugin</name>
|
||||
<url>http://maven.apache.org</url>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<shardingsphere.version>5.0.0-beta</shardingsphere.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>[2.0.14,6.0.6]</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.shardingsphere</groupId>
|
||||
<artifactId>shardingsphere-infra-executor</artifactId>
|
||||
<version>${shardingsphere.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.shardingsphere</groupId>
|
||||
<artifactId>shardingsphere-jdbc-core</artifactId>
|
||||
<version>${shardingsphere.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.shardingsphere</groupId>
|
||||
<artifactId>shardingsphere-sql-parser-engine</artifactId>
|
||||
<version>${shardingsphere.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-deploy-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta;
|
||||
|
||||
public final class Constant {
|
||||
|
||||
public static final String CONTEXT_SNAPSHOT = "CONTEXT_SNAPSHOT";
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta;
|
||||
|
||||
import org.apache.shardingsphere.infra.executor.kernel.model.ExecutorDataMap;
|
||||
import org.apache.skywalking.apm.agent.core.context.ContextManager;
|
||||
import org.apache.skywalking.apm.agent.core.context.ContextSnapshot;
|
||||
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 org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Map;
|
||||
|
||||
public class ExecuteInterceptor implements InstanceMethodsAroundInterceptor {
|
||||
|
||||
@Override
|
||||
public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
|
||||
MethodInterceptResult result) {
|
||||
ContextManager.createLocalSpan("/ShardingSphere/executeSQL/").setComponent(ComponentsDefine.SHARDING_SPHERE);
|
||||
ContextSnapshot contextSnapshot = (ContextSnapshot) ExecutorDataMap.getValue().get(Constant.CONTEXT_SNAPSHOT);
|
||||
if (null == contextSnapshot) {
|
||||
contextSnapshot = (ContextSnapshot) ((Map) allArguments[2]).get(Constant.CONTEXT_SNAPSHOT);
|
||||
}
|
||||
if (null != contextSnapshot) {
|
||||
ContextManager.continued(contextSnapshot);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
|
||||
Object ret) {
|
||||
ContextManager.stopSpan();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
|
||||
Class<?>[] argumentsTypes, Throwable t) {
|
||||
ContextManager.activeSpan().log(t);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta;
|
||||
|
||||
import org.apache.shardingsphere.infra.executor.kernel.model.ExecutorDataMap;
|
||||
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 org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class JDBCRootInvokeInterceptor implements InstanceMethodsAroundInterceptor {
|
||||
|
||||
@Override
|
||||
public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
|
||||
MethodInterceptResult result) {
|
||||
ContextManager.createLocalSpan("/ShardingSphere/JDBCRootInvoke/")
|
||||
.setComponent(ComponentsDefine.SHARDING_SPHERE);
|
||||
ExecutorDataMap.getValue().put(Constant.CONTEXT_SNAPSHOT, ContextManager.capture());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
|
||||
Object ret) {
|
||||
ContextManager.stopSpan();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
|
||||
Class<?>[] argumentsTypes, Throwable t) {
|
||||
ContextManager.activeSpan().log(t);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta;
|
||||
|
||||
import org.apache.skywalking.apm.agent.core.context.ContextManager;
|
||||
import org.apache.skywalking.apm.agent.core.context.tag.Tags;
|
||||
import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan;
|
||||
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 org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class ParseInterceptor implements InstanceMethodsAroundInterceptor {
|
||||
|
||||
@Override
|
||||
public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
|
||||
MethodInterceptResult result) {
|
||||
AbstractSpan span = ContextManager.createLocalSpan("/ShardingSphere/parseSQL/")
|
||||
.setComponent(ComponentsDefine.SHARDING_SPHERE);
|
||||
Tags.DB_STATEMENT.set(span, (String) allArguments[0]);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
|
||||
Object ret) {
|
||||
ContextManager.stopSpan();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
|
||||
Class<?>[] argumentsTypes, Throwable t) {
|
||||
ContextManager.activeSpan().log(t);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta;
|
||||
|
||||
import org.apache.shardingsphere.infra.executor.kernel.model.ExecutorDataMap;
|
||||
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 org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class ProxyRootInvokeInterceptor implements InstanceMethodsAroundInterceptor {
|
||||
|
||||
@Override
|
||||
public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
|
||||
MethodInterceptResult result) {
|
||||
ContextManager.createLocalSpan("/ShardingSphere/ProxyRootInvoke/")
|
||||
.setComponent(ComponentsDefine.SHARDING_SPHERE);
|
||||
ExecutorDataMap.getValue().put(Constant.CONTEXT_SNAPSHOT, ContextManager.capture());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
|
||||
Object ret) {
|
||||
ContextManager.stopSpan();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
|
||||
Class<?>[] argumentsTypes, Throwable t) {
|
||||
ContextManager.activeSpan().log(t);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta;
|
||||
|
||||
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 org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class RewriteInterceptor implements InstanceMethodsAroundInterceptor {
|
||||
|
||||
@Override
|
||||
public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
|
||||
MethodInterceptResult result) {
|
||||
ContextManager.createLocalSpan("/ShardingSphere/rewriteSQL/")
|
||||
.setComponent(ComponentsDefine.SHARDING_SPHERE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
|
||||
Object ret) {
|
||||
ContextManager.stopSpan();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
|
||||
Class<?>[] argumentsTypes, Throwable t) {
|
||||
ContextManager.activeSpan().log(t);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta;
|
||||
|
||||
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 org.apache.skywalking.apm.network.trace.component.ComponentsDefine;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class RouteInterceptor implements InstanceMethodsAroundInterceptor {
|
||||
|
||||
@Override
|
||||
public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
|
||||
MethodInterceptResult result) {
|
||||
ContextManager.createLocalSpan("/ShardingSphere/routeSQL/")
|
||||
.setComponent(ComponentsDefine.SHARDING_SPHERE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class<?>[] argumentsTypes,
|
||||
Object ret) {
|
||||
ContextManager.stopSpan();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments,
|
||||
Class<?>[] argumentsTypes, Throwable t) {
|
||||
ContextManager.activeSpan().log(t);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta.define;
|
||||
|
||||
import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine;
|
||||
|
||||
public abstract class AbstractShardingSphereV500BetaInstrumentation extends ClassInstanceMethodsEnhancePluginDefine {
|
||||
|
||||
@Override
|
||||
protected final String[] witnessClasses() {
|
||||
return new String[]{"org.apache.shardingsphere.infra.context.kernel.KernelProcessor"};
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta.define;
|
||||
|
||||
import net.bytebuddy.description.method.MethodDescription;
|
||||
import net.bytebuddy.matcher.ElementMatcher;
|
||||
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.match.ClassMatch;
|
||||
import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
|
||||
import org.apache.skywalking.apm.plugin.shardingsphere.v500beta.ExecuteInterceptor;
|
||||
|
||||
import static net.bytebuddy.matcher.ElementMatchers.isPrivate;
|
||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||
|
||||
/**
|
||||
* {@link ExecuteInstrumentation} presents that skywalking intercepts {@link
|
||||
* org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback}.
|
||||
*/
|
||||
public class ExecuteInstrumentation extends AbstractShardingSphereV500BetaInstrumentation {
|
||||
|
||||
private static final String ENHANCE_CLASS = "org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback";
|
||||
|
||||
@Override
|
||||
public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
|
||||
return new InstanceMethodsInterceptPoint[] {
|
||||
new InstanceMethodsInterceptPoint() {
|
||||
@Override
|
||||
public ElementMatcher<MethodDescription> getMethodsMatcher() {
|
||||
return named("execute").and(isPrivate());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMethodsInterceptor() {
|
||||
return ExecuteInterceptor.class.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOverrideArgs() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
|
||||
return new ConstructorInterceptPoint[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ClassMatch enhanceClass() {
|
||||
return NameMatch.byName(ENHANCE_CLASS);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta.define;
|
||||
|
||||
import net.bytebuddy.description.method.MethodDescription;
|
||||
import net.bytebuddy.matcher.ElementMatcher;
|
||||
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.match.ClassMatch;
|
||||
import org.apache.skywalking.apm.plugin.shardingsphere.v500beta.JDBCRootInvokeInterceptor;
|
||||
|
||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||
import static net.bytebuddy.matcher.ElementMatchers.takesNoArguments;
|
||||
import static org.apache.skywalking.apm.agent.core.plugin.match.MultiClassNameMatch.byMultiClassMatch;
|
||||
|
||||
/**
|
||||
* {@link JDBCRootInvokeInstrumentation} presents that skywalking intercepts
|
||||
* <ul>
|
||||
* <li>{@link org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement#executeQuery}</li>
|
||||
* <li>{@link org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement#executeUpdate}</li>
|
||||
* <li>{@link org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement#execute0}</li>
|
||||
* <li>{@link org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement#executeQuery}</li>
|
||||
* <li>{@link org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement#executeUpdate}</li>
|
||||
* <li>{@link org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement#execute}</li>
|
||||
* <li>{@link org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement#executeBatch}</li>
|
||||
* </ul>
|
||||
*/
|
||||
public class JDBCRootInvokeInstrumentation extends AbstractShardingSphereV500BetaInstrumentation {
|
||||
|
||||
private static final String[] ENHANCE_CLASSES = {
|
||||
"org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSphereStatement",
|
||||
"org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement"
|
||||
};
|
||||
|
||||
@Override
|
||||
public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
|
||||
return new InstanceMethodsInterceptPoint[]{
|
||||
new InstanceMethodsInterceptPoint() {
|
||||
|
||||
@Override
|
||||
public ElementMatcher<MethodDescription> getMethodsMatcher() {
|
||||
return named("executeQuery")
|
||||
.or(named("executeUpdate"))
|
||||
.or(named("execute0"))
|
||||
.or(named("execute").and(takesNoArguments()))
|
||||
.or(named("executeBatch"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMethodsInterceptor() {
|
||||
return JDBCRootInvokeInterceptor.class.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOverrideArgs() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
|
||||
return new ConstructorInterceptPoint[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ClassMatch enhanceClass() {
|
||||
return byMultiClassMatch(ENHANCE_CLASSES);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta.define;
|
||||
|
||||
import net.bytebuddy.description.method.MethodDescription;
|
||||
import net.bytebuddy.matcher.ElementMatcher;
|
||||
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.match.ClassMatch;
|
||||
import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
|
||||
import org.apache.skywalking.apm.plugin.shardingsphere.v500beta.ParseInterceptor;
|
||||
|
||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||
|
||||
/**
|
||||
* {@link ParseInstrumentation} presents that skywalking intercepts {@link org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine}.
|
||||
*/
|
||||
public class ParseInstrumentation extends AbstractShardingSphereV500BetaInstrumentation {
|
||||
|
||||
private static final String ENHANCE_CLASS = "org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine";
|
||||
|
||||
@Override
|
||||
public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
|
||||
return new InstanceMethodsInterceptPoint[] {
|
||||
new InstanceMethodsInterceptPoint() {
|
||||
@Override
|
||||
public ElementMatcher<MethodDescription> getMethodsMatcher() {
|
||||
return named("parse0");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMethodsInterceptor() {
|
||||
return ParseInterceptor.class.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOverrideArgs() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
|
||||
return new ConstructorInterceptPoint[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ClassMatch enhanceClass() {
|
||||
return NameMatch.byName(ENHANCE_CLASS);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta.define;
|
||||
|
||||
import net.bytebuddy.description.method.MethodDescription;
|
||||
import net.bytebuddy.matcher.ElementMatcher;
|
||||
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.match.ClassMatch;
|
||||
import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
|
||||
import org.apache.skywalking.apm.plugin.shardingsphere.v500beta.ProxyRootInvokeInterceptor;
|
||||
|
||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||
|
||||
/**
|
||||
* ProxyRootInvokeInstrumentation presents that skywalking intercepts org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask.
|
||||
*/
|
||||
public class ProxyRootInvokeInstrumentation extends AbstractShardingSphereV500BetaInstrumentation {
|
||||
|
||||
private static final String ENHANCE_CLASS = "org.apache.shardingsphere.proxy.frontend.command.CommandExecutorTask";
|
||||
|
||||
@Override
|
||||
public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
|
||||
return new InstanceMethodsInterceptPoint[] {
|
||||
new InstanceMethodsInterceptPoint() {
|
||||
@Override
|
||||
public ElementMatcher<MethodDescription> getMethodsMatcher() {
|
||||
return named("run");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMethodsInterceptor() {
|
||||
return ProxyRootInvokeInterceptor.class.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOverrideArgs() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
|
||||
return new ConstructorInterceptPoint[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ClassMatch enhanceClass() {
|
||||
return NameMatch.byName(ENHANCE_CLASS);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta.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.match.ClassMatch;
|
||||
import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
|
||||
import org.apache.skywalking.apm.plugin.shardingsphere.v500beta.RewriteInterceptor;
|
||||
|
||||
/**
|
||||
* {@link RewriteInstrumentation} presents that skywalking intercepts {@link org.apache.shardingsphere.infra.rewrite.SQLRewriteEntry}.
|
||||
*/
|
||||
public class RewriteInstrumentation extends AbstractShardingSphereV500BetaInstrumentation {
|
||||
|
||||
private static final String ENHANCE_CLASS = "org.apache.shardingsphere.infra.rewrite.SQLRewriteEntry";
|
||||
|
||||
@Override
|
||||
public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
|
||||
return new InstanceMethodsInterceptPoint[]{
|
||||
new InstanceMethodsInterceptPoint() {
|
||||
|
||||
@Override
|
||||
public ElementMatcher<MethodDescription> getMethodsMatcher() {
|
||||
return ElementMatchers.named("rewrite");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMethodsInterceptor() {
|
||||
return RewriteInterceptor.class.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOverrideArgs() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
|
||||
return new ConstructorInterceptPoint[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ClassMatch enhanceClass() {
|
||||
return NameMatch.byName(ENHANCE_CLASS);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta.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.match.ClassMatch;
|
||||
import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch;
|
||||
import org.apache.skywalking.apm.plugin.shardingsphere.v500beta.RouteInterceptor;
|
||||
|
||||
/**
|
||||
* {@link RouteInstrumentation} presents that skywalking intercepts {@link org.apache.shardingsphere.infra.route.engine.SQLRouteEngine}.
|
||||
*/
|
||||
public class RouteInstrumentation extends AbstractShardingSphereV500BetaInstrumentation {
|
||||
|
||||
private static final String ENHANCE_CLASS = "org.apache.shardingsphere.infra.route.engine.SQLRouteEngine";
|
||||
|
||||
@Override
|
||||
public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() {
|
||||
return new InstanceMethodsInterceptPoint[]{
|
||||
new InstanceMethodsInterceptPoint() {
|
||||
|
||||
@Override
|
||||
public ElementMatcher<MethodDescription> getMethodsMatcher() {
|
||||
return ElementMatchers.named("route");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMethodsInterceptor() {
|
||||
return RouteInterceptor.class.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOverrideArgs() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConstructorInterceptPoint[] getConstructorsInterceptPoints() {
|
||||
return new ConstructorInterceptPoint[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ClassMatch enhanceClass() {
|
||||
return NameMatch.byName(ENHANCE_CLASS);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
# 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.
|
||||
shardingsphere-5.0.0-beta=org.apache.skywalking.apm.plugin.shardingsphere.v500beta.define.ProxyRootInvokeInstrumentation
|
||||
shardingsphere-5.0.0-beta=org.apache.skywalking.apm.plugin.shardingsphere.v500beta.define.JDBCRootInvokeInstrumentation
|
||||
shardingsphere-5.0.0-beta=org.apache.skywalking.apm.plugin.shardingsphere.v500beta.define.ParseInstrumentation
|
||||
shardingsphere-5.0.0-beta=org.apache.skywalking.apm.plugin.shardingsphere.v500beta.define.RouteInstrumentation
|
||||
shardingsphere-5.0.0-beta=org.apache.skywalking.apm.plugin.shardingsphere.v500beta.define.RewriteInstrumentation
|
||||
shardingsphere-5.0.0-beta=org.apache.skywalking.apm.plugin.shardingsphere.v500beta.define.ExecuteInstrumentation
|
||||
|
|
@ -0,0 +1,168 @@
|
|||
/*
|
||||
* 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.shardingsphere.v500beta;
|
||||
|
||||
import org.apache.shardingsphere.infra.binder.LogicSQL;
|
||||
import org.apache.skywalking.apm.agent.core.context.trace.AbstractTracingSpan;
|
||||
import org.apache.skywalking.apm.agent.core.context.trace.TraceSegment;
|
||||
import org.apache.skywalking.apm.agent.test.helper.SegmentHelper;
|
||||
import org.apache.skywalking.apm.agent.test.tools.AgentServiceRule;
|
||||
import org.apache.skywalking.apm.agent.test.tools.SegmentStorage;
|
||||
import org.apache.skywalking.apm.agent.test.tools.SegmentStoragePoint;
|
||||
import org.apache.skywalking.apm.agent.test.tools.SpanAssert;
|
||||
import org.apache.skywalking.apm.agent.test.tools.TracingSegmentRunner;
|
||||
import org.junit.Before;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.powermock.modules.junit4.PowerMockRunner;
|
||||
import org.powermock.modules.junit4.PowerMockRunnerDelegate;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
import static org.hamcrest.core.Is.is;
|
||||
import static org.junit.Assert.assertNotNull;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
@RunWith(PowerMockRunner.class)
|
||||
@PowerMockRunnerDelegate(TracingSegmentRunner.class)
|
||||
public class InterceptorTest {
|
||||
|
||||
@SegmentStoragePoint
|
||||
private SegmentStorage segmentStorage;
|
||||
|
||||
@Rule
|
||||
public AgentServiceRule serviceRule = new AgentServiceRule();
|
||||
|
||||
private ProxyRootInvokeInterceptor proxyRootInvokeInterceptor;
|
||||
|
||||
private JDBCRootInvokeInterceptor jdbcRootInvokeInterceptor;
|
||||
|
||||
private ParseInterceptor parseInterceptor;
|
||||
|
||||
private RouteInterceptor routeInterceptor;
|
||||
|
||||
private RewriteInterceptor rewriteInterceptor;
|
||||
|
||||
private ExecuteInterceptor executeInterceptor;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
proxyRootInvokeInterceptor = new ProxyRootInvokeInterceptor();
|
||||
jdbcRootInvokeInterceptor = new JDBCRootInvokeInterceptor();
|
||||
parseInterceptor = new ParseInterceptor();
|
||||
routeInterceptor = new RouteInterceptor();
|
||||
rewriteInterceptor = new RewriteInterceptor();
|
||||
executeInterceptor = new ExecuteInterceptor();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void assertProxyRootInvoke() {
|
||||
proxyRootInvokeInterceptor.beforeMethod(null, null, null, null, null);
|
||||
proxyRootInvokeInterceptor.afterMethod(null, null, null, null, null);
|
||||
assertThat(segmentStorage.getTraceSegments().size(), is(1));
|
||||
TraceSegment segment = segmentStorage.getTraceSegments().get(0);
|
||||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segment);
|
||||
assertNotNull(spans);
|
||||
assertThat(spans.size(), is(1));
|
||||
assertThat(spans.get(0).getOperationName(), is("/ShardingSphere/ProxyRootInvoke/"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void assertJDBCRootInvoke() {
|
||||
jdbcRootInvokeInterceptor.beforeMethod(null, null, null, null, null);
|
||||
jdbcRootInvokeInterceptor.afterMethod(null, null, null, null, null);
|
||||
assertThat(segmentStorage.getTraceSegments().size(), is(1));
|
||||
TraceSegment segment = segmentStorage.getTraceSegments().get(0);
|
||||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segment);
|
||||
assertNotNull(spans);
|
||||
assertThat(spans.size(), is(1));
|
||||
assertThat(spans.get(0).getOperationName(), is("/ShardingSphere/JDBCRootInvoke/"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void assertParse() {
|
||||
Object[] allArguments = new Object[] {
|
||||
"SELECT * FROM t_order",
|
||||
false
|
||||
};
|
||||
parseInterceptor.beforeMethod(null, null, allArguments, null, null);
|
||||
parseInterceptor.afterMethod(null, null, allArguments, null, null);
|
||||
assertThat(segmentStorage.getTraceSegments().size(), is(1));
|
||||
TraceSegment segment = segmentStorage.getTraceSegments().get(0);
|
||||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segment);
|
||||
assertNotNull(spans);
|
||||
assertThat(spans.size(), is(1));
|
||||
assertThat(spans.get(0).getOperationName(), is("/ShardingSphere/parseSQL/"));
|
||||
SpanAssert.assertTag(spans.get(0), 0, "SELECT * FROM t_order");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void assertRoute() {
|
||||
Object[] allArguments = new Object[]{
|
||||
new LogicSQL(null, "SELECT * FROM t_order", Collections.emptyList()),
|
||||
null
|
||||
};
|
||||
routeInterceptor.beforeMethod(null, null, allArguments, null, null);
|
||||
routeInterceptor.afterMethod(null, null, allArguments, null, null);
|
||||
assertThat(segmentStorage.getTraceSegments().size(), is(1));
|
||||
TraceSegment segment = segmentStorage.getTraceSegments().get(0);
|
||||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segment);
|
||||
assertNotNull(spans);
|
||||
assertThat(spans.size(), is(1));
|
||||
assertThat(spans.get(0).getOperationName(), is("/ShardingSphere/routeSQL/"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void assertRewrite() {
|
||||
Object[] allArguments = new Object[]{
|
||||
"SELECT * FROM t_order",
|
||||
Collections.emptyList(),
|
||||
null,
|
||||
null
|
||||
};
|
||||
rewriteInterceptor.beforeMethod(null, null, allArguments, null, null);
|
||||
rewriteInterceptor.afterMethod(null, null, allArguments, null, null);
|
||||
assertThat(segmentStorage.getTraceSegments().size(), is(1));
|
||||
TraceSegment segment = segmentStorage.getTraceSegments().get(0);
|
||||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segment);
|
||||
assertNotNull(spans);
|
||||
assertThat(spans.size(), is(1));
|
||||
assertThat(spans.get(0).getOperationName(), is("/ShardingSphere/rewriteSQL/"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void assertExecute() {
|
||||
Object[] allArguments = new Object[]{
|
||||
null,
|
||||
null,
|
||||
new HashMap<>()
|
||||
};
|
||||
executeInterceptor.beforeMethod(null, null, allArguments, null, null);
|
||||
executeInterceptor.afterMethod(null, null, allArguments, null, null);
|
||||
assertThat(segmentStorage.getTraceSegments().size(), is(1));
|
||||
TraceSegment segment = segmentStorage.getTraceSegments().get(0);
|
||||
List<AbstractTracingSpan> spans = SegmentHelper.getSpans(segment);
|
||||
assertNotNull(spans);
|
||||
assertThat(spans.size(), is(1));
|
||||
assertThat(spans.get(0).getOperationName(), is("/ShardingSphere/executeSQL/"));
|
||||
}
|
||||
}
|
||||
|
|
@ -73,6 +73,7 @@
|
|||
- sharding-sphere-4.1.0
|
||||
- sharding-sphere-4.x
|
||||
- sharding-sphere-4.x-rc3
|
||||
- shardingsphere-5.0.0-beta
|
||||
- sofarpc
|
||||
- solrj-7.x
|
||||
- spring-annotation
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ metrics based on the tracing data.
|
|||
* Oracle Driver (Optional¹)
|
||||
* H2 Driver 1.3.x -> 1.4.x
|
||||
* [Sharding-JDBC](https://github.com/shardingjdbc/sharding-jdbc) 1.5.x
|
||||
* [ShardingSphere](https://github.com/apache/shardingsphere) 3.0.0, 4.0.0-RC1, 4.0.0, 4.0.1, 4.1.0, 4.1.1
|
||||
* [ShardingSphere](https://github.com/apache/shardingsphere) 3.0.0, 4.0.0-RC1, 4.0.0, 4.0.1, 4.1.0, 4.1.1, 5.0.0-beta
|
||||
* PostgreSQL Driver 8.x, 9.x, 42.x
|
||||
* Mariadb Driver 2.x, 1.8
|
||||
* [InfluxDB](https://github.com/influxdata/influxdb-java) 2.5 -> 2.17
|
||||
|
|
|
|||
|
|
@ -0,0 +1,21 @@
|
|||
#!/bin/bash
|
||||
#
|
||||
# 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.
|
||||
|
||||
home="$(cd "$(dirname $0)"; pwd)"
|
||||
|
||||
java -jar ${agent_opts} ${home}/../libs/shardingsphere-5.0.0-beta-scenario.jar &
|
||||
|
|
@ -0,0 +1,231 @@
|
|||
# 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.
|
||||
segmentItems:
|
||||
- serviceName: shardingsphere-5.0.0-beta-scenario
|
||||
segmentSize: gt 0
|
||||
segments:
|
||||
- segmentId: not null
|
||||
spans:
|
||||
- operationName: H2/JDBI/PreparedStatement/executeQuery
|
||||
operationId: 0
|
||||
parentSpanId: 0
|
||||
spanId: 1
|
||||
spanLayer: Database
|
||||
startTime: not null
|
||||
endTime: not null
|
||||
componentId: 32
|
||||
isError: false
|
||||
spanType: Exit
|
||||
peer: localhost:-1
|
||||
skipAnalysis: false
|
||||
tags:
|
||||
- {key: db.type, value: sql}
|
||||
- {key: db.instance, value: demo_ds_1}
|
||||
- {key: db.statement, value: SELECT * FROM t_order_0}
|
||||
- operationName: /ShardingSphere/executeSQL/
|
||||
operationId: 0
|
||||
parentSpanId: -1
|
||||
spanId: 0
|
||||
spanLayer: Unknown
|
||||
startTime: not null
|
||||
endTime: not null
|
||||
componentId: 60
|
||||
isError: false
|
||||
spanType: Local
|
||||
peer: ''
|
||||
skipAnalysis: false
|
||||
refs:
|
||||
- parentEndpoint: /shardingsphere-5.0.0-beta-scenario/case/execute
|
||||
networkAddress: ''
|
||||
refType: CrossThread
|
||||
parentSpanId: 2
|
||||
parentTraceSegmentId: not null
|
||||
parentServiceInstance: not null
|
||||
parentService: shardingsphere-5.0.0-beta-scenario
|
||||
traceId: not null
|
||||
- segmentId: not null
|
||||
spans:
|
||||
- operationName: H2/JDBI/PreparedStatement/executeQuery
|
||||
operationId: 0
|
||||
parentSpanId: 0
|
||||
spanId: 1
|
||||
spanLayer: Database
|
||||
startTime: not null
|
||||
endTime: not null
|
||||
componentId: 32
|
||||
isError: false
|
||||
spanType: Exit
|
||||
peer: localhost:-1
|
||||
skipAnalysis: false
|
||||
tags:
|
||||
- {key: db.type, value: sql}
|
||||
- {key: db.instance, value: demo_ds_0}
|
||||
- {key: db.statement, value: SELECT * FROM t_order_1}
|
||||
- operationName: /ShardingSphere/executeSQL/
|
||||
operationId: 0
|
||||
parentSpanId: -1
|
||||
spanId: 0
|
||||
spanLayer: Unknown
|
||||
startTime: not null
|
||||
endTime: not null
|
||||
componentId: 60
|
||||
isError: false
|
||||
spanType: Local
|
||||
peer: ''
|
||||
skipAnalysis: false
|
||||
refs:
|
||||
- parentEndpoint: /shardingsphere-5.0.0-beta-scenario/case/execute
|
||||
networkAddress: ''
|
||||
refType: CrossThread
|
||||
parentSpanId: 2
|
||||
parentTraceSegmentId: not null
|
||||
parentServiceInstance: not null
|
||||
parentService: shardingsphere-5.0.0-beta-scenario
|
||||
traceId: not null
|
||||
- segmentId: not null
|
||||
spans:
|
||||
- operationName: H2/JDBI/PreparedStatement/executeQuery
|
||||
operationId: 0
|
||||
parentSpanId: 0
|
||||
spanId: 1
|
||||
spanLayer: Database
|
||||
startTime: not null
|
||||
endTime: not null
|
||||
componentId: 32
|
||||
isError: false
|
||||
spanType: Exit
|
||||
peer: localhost:-1
|
||||
skipAnalysis: false
|
||||
tags:
|
||||
- {key: db.type, value: sql}
|
||||
- {key: db.instance, value: demo_ds_1}
|
||||
- {key: db.statement, value: SELECT * FROM t_order_1}
|
||||
- operationName: /ShardingSphere/executeSQL/
|
||||
operationId: 0
|
||||
parentSpanId: -1
|
||||
spanId: 0
|
||||
spanLayer: Unknown
|
||||
startTime: not null
|
||||
endTime: not null
|
||||
componentId: 60
|
||||
isError: false
|
||||
spanType: Local
|
||||
peer: ''
|
||||
skipAnalysis: false
|
||||
refs:
|
||||
- parentEndpoint: /shardingsphere-5.0.0-beta-scenario/case/execute
|
||||
networkAddress: ''
|
||||
refType: CrossThread
|
||||
parentSpanId: 2
|
||||
parentTraceSegmentId: not null
|
||||
parentServiceInstance: not null
|
||||
parentService: shardingsphere-5.0.0-beta-scenario
|
||||
traceId: not null
|
||||
- segmentId: not null
|
||||
spans:
|
||||
- operationName: /ShardingSphere/parseSQL/
|
||||
operationId: 0
|
||||
parentSpanId: 0
|
||||
spanId: 1
|
||||
spanLayer: Unknown
|
||||
startTime: not null
|
||||
endTime: not null
|
||||
componentId: 60
|
||||
isError: false
|
||||
spanType: Local
|
||||
peer: ''
|
||||
skipAnalysis: false
|
||||
tags:
|
||||
- {key: db.statement, value: SELECT * FROM t_order}
|
||||
- operationName: /ShardingSphere/routeSQL/
|
||||
operationId: 0
|
||||
parentSpanId: 2
|
||||
spanId: 3
|
||||
spanLayer: Unknown
|
||||
startTime: not null
|
||||
endTime: not null
|
||||
componentId: 60
|
||||
isError: false
|
||||
spanType: Local
|
||||
peer: ''
|
||||
skipAnalysis: false
|
||||
- operationName: /ShardingSphere/rewriteSQL/
|
||||
operationId: 0
|
||||
parentSpanId: 2
|
||||
spanId: 4
|
||||
spanLayer: Unknown
|
||||
startTime: not null
|
||||
endTime: not null
|
||||
componentId: 60
|
||||
isError: false
|
||||
spanType: Local
|
||||
peer: ''
|
||||
skipAnalysis: false
|
||||
- operationName: H2/JDBI/PreparedStatement/executeQuery
|
||||
operationId: 0
|
||||
parentSpanId: 5
|
||||
spanId: 6
|
||||
spanLayer: Database
|
||||
startTime: not null
|
||||
endTime: not null
|
||||
componentId: 32
|
||||
isError: false
|
||||
spanType: Exit
|
||||
peer: localhost:-1
|
||||
skipAnalysis: false
|
||||
tags:
|
||||
- {key: db.type, value: sql}
|
||||
- {key: db.instance, value: demo_ds_0}
|
||||
- {key: db.statement, value: SELECT * FROM t_order_0}
|
||||
- operationName: /ShardingSphere/executeSQL/
|
||||
operationId: 0
|
||||
parentSpanId: 2
|
||||
spanId: 5
|
||||
spanLayer: Unknown
|
||||
startTime: not null
|
||||
endTime: not null
|
||||
componentId: 60
|
||||
isError: false
|
||||
spanType: Local
|
||||
peer: ''
|
||||
skipAnalysis: false
|
||||
- operationName: /ShardingSphere/JDBCRootInvoke/
|
||||
operationId: 0
|
||||
parentSpanId: 0
|
||||
spanId: 2
|
||||
spanLayer: Unknown
|
||||
startTime: not null
|
||||
endTime: not null
|
||||
componentId: 60
|
||||
isError: false
|
||||
spanType: Local
|
||||
peer: ''
|
||||
skipAnalysis: false
|
||||
- operationName: /shardingsphere-5.0.0-beta-scenario/case/execute
|
||||
operationId: 0
|
||||
parentSpanId: -1
|
||||
spanId: 0
|
||||
spanLayer: Http
|
||||
startTime: not null
|
||||
endTime: not null
|
||||
componentId: 1
|
||||
isError: false
|
||||
spanType: Entry
|
||||
peer: ''
|
||||
skipAnalysis: false
|
||||
tags:
|
||||
- {key: url, value: 'http://localhost:8080/shardingsphere-5.0.0-beta-scenario/case/execute'}
|
||||
- {key: http.method, value: GET}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
# 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.
|
||||
|
||||
type: jvm
|
||||
entryService: http://localhost:8080/shardingsphere-5.0.0-beta-scenario/case/execute
|
||||
healthCheck: http://localhost:8080/shardingsphere-5.0.0-beta-scenario/case/healthCheck
|
||||
startScript: ./bin/startup.sh
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
<?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">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.example</groupId>
|
||||
<artifactId>shardingsphere-5.0.0-beta-scenario</artifactId>
|
||||
<version>5.0.0-beta</version>
|
||||
|
||||
<name>skywalking-shardingsphere-5.0.0-beta-scenario</name>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
|
||||
<test.framework.version>5.0.0-beta</test.framework.version>
|
||||
|
||||
<spring.version>4.3.8.RELEASE</spring.version>
|
||||
<spring-boot-version>1.5.2.RELEASE</spring-boot-version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.shardingsphere</groupId>
|
||||
<artifactId>shardingsphere-infra-executor</artifactId>
|
||||
<version>${test.framework.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.shardingsphere</groupId>
|
||||
<artifactId>shardingsphere-jdbc-core</artifactId>
|
||||
<version>${test.framework.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-tomcat</artifactId>
|
||||
<version>${spring-boot-version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<version>${spring-boot-version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
<artifactId>h2</artifactId>
|
||||
<version>1.4.196</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<build>
|
||||
<finalName>shardingsphere-5.0.0-beta-scenario</finalName>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.6.0</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
<encoding>${project.build.sourceEncoding}</encoding>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<version>1.5.9.RELEASE</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>assemble</id>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>single</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<descriptors>
|
||||
<descriptor>src/main/assembly/assembly.xml</descriptor>
|
||||
</descriptors>
|
||||
<outputDirectory>./target/</outputDirectory>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<pluginRepositories>
|
||||
<pluginRepository>
|
||||
<id>spring-snapshots</id>
|
||||
<url>https://repo.spring.io/snapshot</url>
|
||||
</pluginRepository>
|
||||
<pluginRepository>
|
||||
<id>spring-milestones</id>
|
||||
<url>https://repo.spring.io/milestone</url>
|
||||
</pluginRepository>
|
||||
</pluginRepositories>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
<?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.
|
||||
~
|
||||
-->
|
||||
<assembly
|
||||
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
|
||||
<formats>
|
||||
<format>zip</format>
|
||||
</formats>
|
||||
|
||||
<fileSets>
|
||||
<fileSet>
|
||||
<directory>./bin</directory>
|
||||
<fileMode>0775</fileMode>
|
||||
</fileSet>
|
||||
</fileSets>
|
||||
|
||||
<files>
|
||||
<file>
|
||||
<source>${project.build.directory}/shardingsphere-5.0.0-beta-scenario.jar</source>
|
||||
<outputDirectory>./libs</outputDirectory>
|
||||
<fileMode>0775</fileMode>
|
||||
</file>
|
||||
</files>
|
||||
</assembly>
|
||||
|
|
@ -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.skywalking.apm.testcase.shardingsphere;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.web.support.SpringBootServletInitializer;
|
||||
|
||||
@SpringBootApplication
|
||||
public class Application extends SpringBootServletInitializer {
|
||||
|
||||
public static void main(String[] args) {
|
||||
try {
|
||||
SpringApplication.run(Application.class, args);
|
||||
} catch (Exception e) {
|
||||
// Never do this
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* 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.testcase.shardingsphere.controller;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.service.CommonService;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.config.ShardingDatabasesAndTablesConfigurationPrecise;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.repository.jdbc.JDBCOrderItemRepositoryImpl;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.repository.jdbc.JDBCOrderRepositoryImpl;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.repository.service.RawPojoService;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.utility.config.DataSourceUtil;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.sql.SQLException;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/case")
|
||||
public class CaseController {
|
||||
|
||||
private CommonService commonService = null;
|
||||
|
||||
@RequestMapping("/healthCheck")
|
||||
@ResponseBody
|
||||
public String healthCheck() throws SQLException {
|
||||
DataSourceUtil.createDataSource("");
|
||||
DataSourceUtil.createSchema("demo_ds_0");
|
||||
DataSourceUtil.createSchema("demo_ds_1");
|
||||
DataSourceUtil.createDataSource("demo_ds_0");
|
||||
DataSourceUtil.createDataSource("demo_ds_1");
|
||||
DataSource dataSource = new ShardingDatabasesAndTablesConfigurationPrecise().createDataSource();
|
||||
commonService = new RawPojoService(new JDBCOrderRepositoryImpl(dataSource), new JDBCOrderItemRepositoryImpl(dataSource));
|
||||
commonService.initEnvironment();
|
||||
return "Success";
|
||||
}
|
||||
|
||||
@RequestMapping("/execute")
|
||||
@ResponseBody
|
||||
public String execute() {
|
||||
commonService.processSuccess(false);
|
||||
return "Success";
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* 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.testcase.shardingsphere.service.api.entity;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class Order implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 661434701950670670L;
|
||||
|
||||
private long orderId;
|
||||
|
||||
private int userId;
|
||||
|
||||
private String status;
|
||||
|
||||
public long getOrderId() {
|
||||
return orderId;
|
||||
}
|
||||
|
||||
public void setOrderId(final long orderId) {
|
||||
this.orderId = orderId;
|
||||
}
|
||||
|
||||
public int getUserId() {
|
||||
return userId;
|
||||
}
|
||||
|
||||
public void setUserId(final int userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(final String status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("order_id: %s, user_id: %s, status: %s", orderId, userId, status);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
* 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.testcase.shardingsphere.service.api.entity;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
public class OrderItem implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 263434701950670170L;
|
||||
|
||||
private long orderItemId;
|
||||
|
||||
private long orderId;
|
||||
|
||||
private int userId;
|
||||
|
||||
private String status;
|
||||
|
||||
public long getOrderItemId() {
|
||||
return orderItemId;
|
||||
}
|
||||
|
||||
public void setOrderItemId(final long orderItemId) {
|
||||
this.orderItemId = orderItemId;
|
||||
}
|
||||
|
||||
public long getOrderId() {
|
||||
return orderId;
|
||||
}
|
||||
|
||||
public void setOrderId(final long orderId) {
|
||||
this.orderId = orderId;
|
||||
}
|
||||
|
||||
public int getUserId() {
|
||||
return userId;
|
||||
}
|
||||
|
||||
public void setUserId(final int userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(final String status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("order_item_id:%s, order_id: %s, user_id: %s, status: %s", orderItemId, orderId, userId, status);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* 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.testcase.shardingsphere.service.api.repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface CommonRepository<T> {
|
||||
|
||||
void createTableIfNotExists();
|
||||
|
||||
void dropTable();
|
||||
|
||||
void truncateTable();
|
||||
|
||||
Long insert(T entity);
|
||||
|
||||
void delete(Long id);
|
||||
|
||||
List<T> selectAll();
|
||||
|
||||
List<T> selectRange();
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* 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.testcase.shardingsphere.service.api.repository;
|
||||
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.OrderItem;
|
||||
|
||||
public interface OrderItemRepository extends CommonRepository<OrderItem> {
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* 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.testcase.shardingsphere.service.api.repository;
|
||||
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.Order;
|
||||
|
||||
public interface OrderRepository extends CommonRepository<Order> {
|
||||
}
|
||||
|
|
@ -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.
|
||||
*
|
||||
*/
|
||||
|
||||
package org.apache.skywalking.apm.testcase.shardingsphere.service.api.service;
|
||||
|
||||
public interface CommonService {
|
||||
|
||||
void initEnvironment();
|
||||
|
||||
void cleanEnvironment();
|
||||
|
||||
void processSuccess(boolean isRangeSharding);
|
||||
|
||||
void processFailure();
|
||||
|
||||
void printData(boolean isRangeSharding);
|
||||
}
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
/*
|
||||
* 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.testcase.shardingsphere.service.api.service;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.Order;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.OrderItem;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.repository.OrderItemRepository;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.repository.OrderRepository;
|
||||
|
||||
public abstract class CommonServiceImpl implements CommonService {
|
||||
|
||||
@Override
|
||||
public void initEnvironment() {
|
||||
getOrderRepository().createTableIfNotExists();
|
||||
getOrderItemRepository().createTableIfNotExists();
|
||||
getOrderRepository().truncateTable();
|
||||
getOrderItemRepository().truncateTable();
|
||||
insertData();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cleanEnvironment() {
|
||||
getOrderRepository().dropTable();
|
||||
getOrderItemRepository().dropTable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processSuccess(final boolean isRangeSharding) {
|
||||
printData(isRangeSharding);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processFailure() {
|
||||
insertData();
|
||||
throw new RuntimeException("Exception occur for transaction test.");
|
||||
}
|
||||
|
||||
private List<Long> insertData() {
|
||||
List<Long> result = new ArrayList<>(10);
|
||||
for (int i = 1; i <= 10; i++) {
|
||||
Order order = newOrder();
|
||||
order.setUserId(i);
|
||||
order.setStatus("INSERT_TEST");
|
||||
getOrderRepository().insert(order);
|
||||
OrderItem item = newOrderItem();
|
||||
item.setOrderId(order.getOrderId());
|
||||
item.setUserId(i);
|
||||
item.setStatus("INSERT_TEST");
|
||||
getOrderItemRepository().insert(item);
|
||||
result.add(order.getOrderId());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private void deleteData(final List<Long> orderIds) {
|
||||
for (Long each : orderIds) {
|
||||
getOrderRepository().delete(each);
|
||||
getOrderItemRepository().delete(each);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void printData(final boolean isRangeSharding) {
|
||||
if (isRangeSharding) {
|
||||
printDataRange();
|
||||
} else {
|
||||
printDataAll();
|
||||
}
|
||||
}
|
||||
|
||||
private void printDataRange() {
|
||||
for (Object each : getOrderRepository().selectRange()) {
|
||||
}
|
||||
for (Object each : getOrderItemRepository().selectRange()) {
|
||||
}
|
||||
}
|
||||
|
||||
private void printDataAll() {
|
||||
for (Object each : getOrderRepository().selectAll()) {
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract OrderRepository getOrderRepository();
|
||||
|
||||
protected abstract OrderItemRepository getOrderItemRepository();
|
||||
|
||||
protected abstract Order newOrder();
|
||||
|
||||
protected abstract OrderItem newOrderItem();
|
||||
}
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* 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.testcase.shardingsphere.service.config;
|
||||
|
||||
import org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory;
|
||||
import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
|
||||
import org.apache.shardingsphere.infra.config.properties.ConfigurationPropertyKey;
|
||||
import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
|
||||
import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
|
||||
import org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration;
|
||||
import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.utility.config.DataSourceUtil;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.utility.config.ExampleConfiguration;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
public final class ShardingDatabasesAndTablesConfigurationPrecise implements ExampleConfiguration {
|
||||
|
||||
private static DataSource DATA_SOURCE;
|
||||
|
||||
@Override
|
||||
public synchronized DataSource createDataSource() throws SQLException {
|
||||
if (null == DATA_SOURCE) {
|
||||
initDataSource();
|
||||
}
|
||||
return DATA_SOURCE;
|
||||
}
|
||||
|
||||
private void initDataSource() throws SQLException {
|
||||
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
|
||||
shardingRuleConfig.getTables().add(getOrderTableRuleConfiguration());
|
||||
shardingRuleConfig.getTables().add(getOrderItemTableRuleConfiguration());
|
||||
shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item");
|
||||
shardingRuleConfig.getShardingAlgorithms().put("demo_ds_inline", createDbShardingAlgorithmConfiguration());
|
||||
shardingRuleConfig.setDefaultDatabaseShardingStrategy(new StandardShardingStrategyConfiguration("user_id", "demo_ds_inline"));
|
||||
Properties tableOrderInlineProperties = new Properties();
|
||||
tableOrderInlineProperties.setProperty("algorithm-expression", "t_order_${order_id % 2}");
|
||||
shardingRuleConfig.getShardingAlgorithms().put("t_order_inline", new ShardingSphereAlgorithmConfiguration("INLINE", tableOrderInlineProperties));
|
||||
Properties tableOrderItemInlineProperties = new Properties();
|
||||
tableOrderItemInlineProperties.setProperty("algorithm-expression", "t_order_item_${order_id % 2}");
|
||||
shardingRuleConfig.getShardingAlgorithms().put("t_order_item_inline", new ShardingSphereAlgorithmConfiguration("INLINE", tableOrderItemInlineProperties));
|
||||
Properties properties = new Properties();
|
||||
properties.setProperty(ConfigurationPropertyKey.MAX_CONNECTIONS_SIZE_PER_QUERY.getKey(), "16");
|
||||
properties.setProperty(ConfigurationPropertyKey.SQL_SHOW.getKey(), "true");
|
||||
DATA_SOURCE = ShardingSphereDataSourceFactory.createDataSource(createDataSourceMap(), Collections.singletonList(shardingRuleConfig), properties);
|
||||
}
|
||||
|
||||
private static ShardingTableRuleConfiguration getOrderTableRuleConfiguration() {
|
||||
ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("t_order", "demo_ds_${0..1}.t_order_${[0, 1]}");
|
||||
result.setKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("order_id", "SNOWFLAKE"));
|
||||
result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("order_id", "t_order_inline"));
|
||||
return result;
|
||||
}
|
||||
|
||||
private static ShardingTableRuleConfiguration getOrderItemTableRuleConfiguration() {
|
||||
ShardingTableRuleConfiguration result = new ShardingTableRuleConfiguration("t_order_item", "demo_ds_${0..1}.t_order_item_${[0, 1]}");
|
||||
result.setTableShardingStrategy(new StandardShardingStrategyConfiguration("order_id", "t_order_item_inline"));
|
||||
return result;
|
||||
}
|
||||
|
||||
private ShardingSphereAlgorithmConfiguration createDbShardingAlgorithmConfiguration() {
|
||||
Properties dbShardingAlgorithmrProps = new Properties();
|
||||
dbShardingAlgorithmrProps.setProperty("algorithm-expression", "demo_ds_${user_id % 2}");
|
||||
return new ShardingSphereAlgorithmConfiguration("INLINE", dbShardingAlgorithmrProps);
|
||||
}
|
||||
|
||||
private static Map<String, DataSource> createDataSourceMap() {
|
||||
Map<String, DataSource> result = new HashMap<>();
|
||||
result.put("demo_ds_0", DataSourceUtil.getDataSource("demo_ds_0"));
|
||||
result.put("demo_ds_1", DataSourceUtil.getDataSource("demo_ds_1"));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
* 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.testcase.shardingsphere.service.repository.jdbc;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import javax.sql.DataSource;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.OrderItem;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.repository.OrderItemRepository;
|
||||
|
||||
public final class JDBCOrderItemRepositoryImpl implements OrderItemRepository {
|
||||
|
||||
private final DataSource dataSource;
|
||||
|
||||
private final Connection connection;
|
||||
|
||||
public JDBCOrderItemRepositoryImpl(final DataSource dataSource) throws SQLException {
|
||||
this.dataSource = dataSource;
|
||||
this.connection = dataSource.getConnection();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createTableIfNotExists() {
|
||||
String sql = "CREATE TABLE IF NOT EXISTS t_order_item " + "(order_item_id BIGINT NOT NULL AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_item_id))";
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
statement.executeUpdate(sql);
|
||||
} catch (final SQLException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dropTable() {
|
||||
String sql = "DROP TABLE t_order_item";
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
statement.executeUpdate(sql);
|
||||
} catch (final SQLException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void truncateTable() {
|
||||
String sql = "TRUNCATE TABLE t_order_item";
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
statement.executeUpdate(sql);
|
||||
} catch (final SQLException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long insert(final OrderItem orderItem) {
|
||||
String sql = "INSERT INTO t_order_item (order_id, user_id, status) VALUES (?, ?, ?)";
|
||||
try (PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
|
||||
preparedStatement.setLong(1, orderItem.getOrderId());
|
||||
preparedStatement.setInt(2, orderItem.getUserId());
|
||||
preparedStatement.setString(3, orderItem.getStatus());
|
||||
preparedStatement.executeUpdate();
|
||||
try (ResultSet resultSet = preparedStatement.getGeneratedKeys()) {
|
||||
if (resultSet.next()) {
|
||||
orderItem.setOrderItemId(resultSet.getLong(1));
|
||||
}
|
||||
}
|
||||
} catch (final SQLException ignored) {
|
||||
}
|
||||
return orderItem.getOrderItemId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(final Long orderItemId) {
|
||||
String sql = "DELETE FROM t_order_item WHERE order_item_id=?";
|
||||
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
|
||||
preparedStatement.setLong(1, orderItemId);
|
||||
preparedStatement.executeUpdate(sql);
|
||||
} catch (final SQLException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OrderItem> selectAll() {
|
||||
String sql = "SELECT i.* FROM t_order o, t_order_item i WHERE o.order_id = i.order_id";
|
||||
return getOrderItems(sql);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<OrderItem> selectRange() {
|
||||
String sql = "SELECT i.* FROM t_order o, t_order_item i WHERE o.order_id = i.order_id AND o.user_id BETWEEN 1 AND 5";
|
||||
return getOrderItems(sql);
|
||||
}
|
||||
|
||||
private List<OrderItem> getOrderItems(final String sql) {
|
||||
List<OrderItem> result = new LinkedList<>();
|
||||
try (PreparedStatement preparedStatement = connection.prepareStatement(sql); ResultSet resultSet = preparedStatement
|
||||
.executeQuery()) {
|
||||
while (resultSet.next()) {
|
||||
OrderItem orderItem = new OrderItem();
|
||||
orderItem.setOrderItemId(resultSet.getLong(1));
|
||||
orderItem.setOrderId(resultSet.getLong(2));
|
||||
orderItem.setUserId(resultSet.getInt(3));
|
||||
orderItem.setStatus(resultSet.getString(4));
|
||||
result.add(orderItem);
|
||||
}
|
||||
} catch (final SQLException ignored) {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
@ -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.skywalking.apm.testcase.shardingsphere.service.repository.jdbc;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import javax.sql.DataSource;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.Order;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.repository.OrderRepository;
|
||||
|
||||
public final class JDBCOrderRepositoryImpl implements OrderRepository {
|
||||
|
||||
private final DataSource dataSource;
|
||||
|
||||
private final Connection connection;
|
||||
|
||||
public JDBCOrderRepositoryImpl(final DataSource dataSource) throws SQLException {
|
||||
this.dataSource = dataSource;
|
||||
this.connection = dataSource.getConnection();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createTableIfNotExists() {
|
||||
String sql = "CREATE TABLE IF NOT EXISTS t_order (order_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (order_id))";
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
statement.executeUpdate(sql);
|
||||
} catch (final SQLException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dropTable() {
|
||||
String sql = "DROP TABLE t_order";
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
statement.executeUpdate(sql);
|
||||
} catch (final SQLException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void truncateTable() {
|
||||
String sql = "TRUNCATE TABLE t_order";
|
||||
try (Statement statement = connection.createStatement()) {
|
||||
statement.executeUpdate(sql);
|
||||
} catch (final SQLException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long insert(final Order order) {
|
||||
String sql = "INSERT INTO t_order (user_id, status) VALUES (?, ?)";
|
||||
try (PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
|
||||
preparedStatement.setInt(1, order.getUserId());
|
||||
preparedStatement.setString(2, order.getStatus());
|
||||
preparedStatement.executeUpdate();
|
||||
try (ResultSet resultSet = preparedStatement.getGeneratedKeys()) {
|
||||
if (resultSet.next()) {
|
||||
order.setOrderId(resultSet.getLong(1));
|
||||
}
|
||||
}
|
||||
} catch (final SQLException ignored) {
|
||||
}
|
||||
return order.getOrderId();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(final Long orderId) {
|
||||
String sql = "DELETE FROM t_order WHERE order_id=?";
|
||||
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
|
||||
preparedStatement.setLong(1, orderId);
|
||||
preparedStatement.executeUpdate();
|
||||
} catch (final SQLException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Order> selectAll() {
|
||||
String sql = "SELECT * FROM t_order";
|
||||
return getOrders(sql);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Order> selectRange() {
|
||||
String sql = "SELECT * FROM t_order WHERE order_id BETWEEN 200000000000000000 AND 400000000000000000";
|
||||
return getOrders(sql);
|
||||
}
|
||||
|
||||
private List<Order> getOrders(final String sql) {
|
||||
List<Order> result = new LinkedList<>();
|
||||
try (PreparedStatement preparedStatement = connection.prepareStatement(sql); ResultSet resultSet = preparedStatement
|
||||
.executeQuery()) {
|
||||
while (resultSet.next()) {
|
||||
Order order = new Order();
|
||||
order.setOrderId(resultSet.getLong(1));
|
||||
order.setUserId(resultSet.getInt(2));
|
||||
order.setStatus(resultSet.getString(3));
|
||||
result.add(order);
|
||||
}
|
||||
} catch (final SQLException ignored) {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* 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.testcase.shardingsphere.service.repository.service;
|
||||
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.Order;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.entity.OrderItem;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.repository.OrderItemRepository;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.repository.OrderRepository;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.api.service.CommonServiceImpl;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.repository.jdbc.JDBCOrderItemRepositoryImpl;
|
||||
import org.apache.skywalking.apm.testcase.shardingsphere.service.repository.jdbc.JDBCOrderRepositoryImpl;
|
||||
|
||||
public class RawPojoService extends CommonServiceImpl {
|
||||
|
||||
private final OrderRepository orderRepository;
|
||||
|
||||
private final OrderItemRepository orderItemRepository;
|
||||
|
||||
public RawPojoService(final JDBCOrderRepositoryImpl orderRepository,
|
||||
final JDBCOrderItemRepositoryImpl orderItemRepository) {
|
||||
this.orderRepository = orderRepository;
|
||||
this.orderItemRepository = orderItemRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected OrderRepository getOrderRepository() {
|
||||
return orderRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected OrderItemRepository getOrderItemRepository() {
|
||||
return orderItemRepository;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Order newOrder() {
|
||||
return new Order();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected OrderItem newOrderItem() {
|
||||
return new OrderItem();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* 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.testcase.shardingsphere.service.utility.config;
|
||||
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import javax.sql.DataSource;
|
||||
import org.h2.jdbcx.JdbcDataSource;
|
||||
|
||||
public class DataSourceUtil {
|
||||
|
||||
private static final String DEFAULT_SCHEMA = "";
|
||||
|
||||
private static final Map<String, DataSource> DATA_SOURCE_MAP = new HashMap<>();
|
||||
|
||||
public static void createDataSource(final String dataSourceName) {
|
||||
JdbcDataSource result = new JdbcDataSource();
|
||||
result.setUrl("jdbc:h2:mem:" + dataSourceName + ";DB_CLOSE_DELAY=-1");
|
||||
result.setUser("sa");
|
||||
result.setPassword("");
|
||||
DATA_SOURCE_MAP.put(dataSourceName, result);
|
||||
}
|
||||
|
||||
public static DataSource getDataSource(final String dataSourceName) {
|
||||
return DATA_SOURCE_MAP.get(dataSourceName);
|
||||
}
|
||||
|
||||
public static void createSchema(final String dataSourceName) {
|
||||
String sql = "CREATE SCHEMA " + dataSourceName;
|
||||
try (Connection connection = getDataSource(DEFAULT_SCHEMA).getConnection(); Statement statement = connection.createStatement()) {
|
||||
statement.execute(sql);
|
||||
} catch (final SQLException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
* 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.testcase.shardingsphere.service.utility.config;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import javax.sql.DataSource;
|
||||
|
||||
public interface ExampleConfiguration {
|
||||
|
||||
DataSource createDataSource() throws SQLException;
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
# 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.
|
||||
server.port=8080
|
||||
server.contextPath=/shardingsphere-5.0.0-beta-scenario
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
# 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.
|
||||
|
||||
5.0.0-beta
|
||||
Loading…
Reference in New Issue