Skip to content

Commit

Permalink
[pinpoint-apm#7654] Async support SDK
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangyinhao1234 authored and emeroad committed Mar 26, 2021
1 parent b8279cb commit 0ce2885
Show file tree
Hide file tree
Showing 33 changed files with 1,289 additions and 17 deletions.
36 changes: 36 additions & 0 deletions agent-sdk/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>

<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>pinpoint</artifactId>
<groupId>com.navercorp.pinpoint</groupId>
<version>2.3.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>pinpoint-agent-sdk</artifactId>
<name>pinpoint-agent-sdk</name>

<!-- FIXME change it to the project's website -->
<!--<url>http://www.example.com</url>-->

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>

</dependencies>

<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright 2021 NAVER Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.navercorp.pinpoint.sdk.v1.concurrent;

import java.util.Objects;
import java.util.concurrent.Callable;

/**
* {@link Callable} for TraceContext propagation
* @param <V> return type
*/
public class TraceCallable<V> implements Callable<V> {

public static <V> Callable<V> wrap(Callable<V> delegate) {
return new TraceCallable<>(delegate);
}

public static <V> Callable<V> wrapAndExecute(Callable<V> delegate) {
return new TraceCallable<>(delegate);
}

protected final Callable<V> delegate;

public TraceCallable(Callable<V> delegate) {
this.delegate = Objects.requireNonNull(delegate, "delegate");
}

@Override
public V call() throws Exception {
return delegate.call();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright 2021 NAVER Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.navercorp.pinpoint.sdk.v1.concurrent;

import com.navercorp.pinpoint.sdk.v1.concurrent.wrapper.CommandWrapper;

import java.util.Objects;
import java.util.concurrent.Executor;

/**
* Executor for TraceContext propagation.
*/
public class TraceExecutor implements Executor {

protected final Executor delegate;
protected final CommandWrapper wrapper;

public TraceExecutor(Executor delegate, CommandWrapper wrapper) {
this.delegate = Objects.requireNonNull(delegate, "delegate");
this.wrapper = Objects.requireNonNull(wrapper, "wrapper");
}


@Override
public void execute(Runnable command) {
command = wrapper.wrap(command);
delegate.execute(command);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
/*
* Copyright 2021 NAVER Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.navercorp.pinpoint.sdk.v1.concurrent;

import com.navercorp.pinpoint.sdk.v1.concurrent.wrapper.CommandWrapper;

import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
* {@link ExecutorService} for TraceContext propagation.
*/
public class TraceExecutorService implements ExecutorService {
protected final ExecutorService delegate;
protected final CommandWrapper wrapper;

public TraceExecutorService(ExecutorService delegate, CommandWrapper wrapper) {
this.delegate = Objects.requireNonNull(delegate, "delegate");
this.wrapper = Objects.requireNonNull(wrapper, "wrapper");
}

@Override
public void shutdown() {
delegate.shutdown();
}

@Override
public List<Runnable> shutdownNow() {
return delegate.shutdownNow();
}

@Override
public boolean isShutdown() {
return delegate.isShutdown();
}

@Override
public boolean isTerminated() {
return delegate.isTerminated();
}

@Override
public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
return delegate.awaitTermination(timeout, unit);
}

@Override
public <T> Future<T> submit(Callable<T> task) {
task = wrapper.wrap(task);
return delegate.submit(task);
}

@Override
public <T> Future<T> submit(Runnable task, T result) {
task = wrapper.wrap(task);
return delegate.submit(task, result);
}

@Override
public Future<?> submit(Runnable task) {
task = wrapper.wrap(task);
return delegate.submit(task);
}

@Override
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException {
tasks = wrapper.wrap(tasks);
return delegate.invokeAll(tasks);
}

@Override
public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException {
tasks = wrapper.wrap(tasks);
return delegate.invokeAll(tasks, timeout, unit);
}

@Override
public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException {
tasks = wrapper.wrap(tasks);
return delegate.invokeAny(tasks);
}

@Override
public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
tasks = wrapper.wrap(tasks);
return delegate.invokeAny(tasks, timeout, unit);
}

@Override
public void execute(Runnable command) {
command = wrapper.wrap(command);
delegate.execute(command);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* Copyright 2021 NAVER Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.navercorp.pinpoint.sdk.v1.concurrent;

import com.navercorp.pinpoint.sdk.v1.concurrent.wrapper.DefaultCommandWrapper;
import com.navercorp.pinpoint.sdk.v1.concurrent.wrapper.DisableCommandWrapper;
import com.navercorp.pinpoint.sdk.v1.concurrent.wrapper.CommandWrapper;

import java.util.Objects;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;

/**
* Utility class for Executor
*/
public class TraceExecutors {

public static Executor wrapExecutor(Executor executor) {
return wrapExecutor(executor, false);
}

public static Executor wrapExecutor(Executor executor, boolean threadContextPropagation) {
Objects.requireNonNull(executor, "executor");

CommandWrapper wrapper = newCommandWrapper(threadContextPropagation);
return new TraceExecutor(executor, wrapper);
}

public static ExecutorService wrapExecutorService(ExecutorService executorService) {
return wrapExecutorService(executorService, false);
}

public static ExecutorService wrapExecutorService(ExecutorService executorService, boolean threadContextPropagation) {
Objects.requireNonNull(executorService, "executorService");

CommandWrapper wrapper = newCommandWrapper(threadContextPropagation);
return new TraceExecutorService(executorService, wrapper);
}

public static ScheduledExecutorService wrapScheduledExecutorService(ScheduledExecutorService executorService) {
return wrapScheduledExecutorService(executorService, false);
}

public static ScheduledExecutorService wrapScheduledExecutorService(ScheduledExecutorService executorService, boolean threadContextPropagation) {
Objects.requireNonNull(executorService, "executorService");

CommandWrapper wrapper = newCommandWrapper(threadContextPropagation);
return new TraceScheduledExecutorService(executorService, wrapper);
}

private static CommandWrapper newCommandWrapper(boolean threadContextPropagation) {
if (threadContextPropagation) {
return new DefaultCommandWrapper();
}
return new DisableCommandWrapper();
}

}
Loading

0 comments on commit 0ce2885

Please sign in to comment.