Skip to content

Commit

Permalink
[pinpoint-apm#10651] Changed transform api for plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
youngjin.kim2 committed Jan 30, 2024
1 parent 1d01257 commit 6c5bb1d
Show file tree
Hide file tree
Showing 13 changed files with 385 additions and 20 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
/*
* Copyright 2024 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 implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.navercorp.pinpoint.bootstrap.instrument.transformer;

import com.navercorp.pinpoint.common.trace.ServiceType;

/**
* @author youngjin.kim2
*/
public class TransformCallbackParameter {

private final Object value;
private final ParameterType type;

public TransformCallbackParameter(Boolean value) {
this.value = value;
this.type = ParameterType.BOOLEAN;
}

public TransformCallbackParameter(boolean value) {
this.value = value;
this.type = ParameterType.PRIMITIVE_BOOLEAN;
}

public TransformCallbackParameter(ServiceType value) {
this.value = value;
this.type = ParameterType.SERVICE_TYPE;
}

public TransformCallbackParameter(Long value) {
this.value = value;
this.type = ParameterType.LONG;
}

public TransformCallbackParameter(Double value) {
this.value = value;
this.type = ParameterType.DOUBLE;
}

public TransformCallbackParameter(String value) {
this.value = value;
this.type = ParameterType.STRING;
}

public TransformCallbackParameter(String[] value) {
this.value = value;
this.type = ParameterType.STRING_ARRAY;
}

public TransformCallbackParameter(String[][] value) {
this.value = value;
this.type = ParameterType.STRING_ARRAY_ARRAY;
}

Object getValue() {
return value;
}

ParameterType getType() {
return type;
}

public enum ParameterType {
BOOLEAN,
PRIMITIVE_BOOLEAN,
SERVICE_TYPE,
LONG,
DOUBLE,
STRING,
STRING_ARRAY,
STRING_ARRAY_ARRAY;

static Class<?> getJavaClass(ParameterType type) {
switch (type) {
case BOOLEAN:
return Boolean.class;
case PRIMITIVE_BOOLEAN:
return boolean.class;
case SERVICE_TYPE:
return ServiceType.class;
case LONG:
return Long.class;
case DOUBLE:
return Double.class;
case STRING:
return String.class;
case STRING_ARRAY:
return String[].class;
case STRING_ARRAY_ARRAY:
return String[][].class;
default:
throw new IllegalArgumentException("Unknown type: " + type);
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Copyright 2024 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 implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.navercorp.pinpoint.bootstrap.instrument.transformer;

import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformCallbackParameter.ParameterType;

import java.util.Collections;
import java.util.List;

/**
* @author youngjin.kim2
*/
public class TransformCallbackParameters {

private final List<TransformCallbackParameter> params;

TransformCallbackParameters(List<TransformCallbackParameter> params) {
this.params = Collections.unmodifiableList(params);
}

public List<TransformCallbackParameter> getParams() {
return params;
}

public Object[] getParamValues() {
Object[] values = new Object[params.size()];
for (int i = 0; i < params.size(); i++) {
values[i] = params.get(i).getValue();
}
return values;
}

public Class<?>[] getParamTypes() {
Class<?>[] types = new Class<?>[params.size()];
for (int i = 0; i < params.size(); i++) {
types[i] = ParameterType.getJavaClass(params.get(i).getType());
}
return types;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
* Copyright 2024 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 implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.navercorp.pinpoint.bootstrap.instrument.transformer;

import com.navercorp.pinpoint.common.trace.ServiceType;

import java.util.ArrayList;
import java.util.List;

/**
* @author youngjin.kim2
*/
public class TransformCallbackParametersBuilder {

private final List<TransformCallbackParameter> params = new ArrayList<>();

private TransformCallbackParametersBuilder() {
}

public static TransformCallbackParametersBuilder newBuilder() {
return new TransformCallbackParametersBuilder();
}

private TransformCallbackParametersBuilder addParameter(TransformCallbackParameter param) {
this.params.add(param);
return this;
}

public TransformCallbackParametersBuilder addBoolean(Boolean param) {
return this.addParameter(new TransformCallbackParameter(param));
}

public TransformCallbackParametersBuilder addServiceType(ServiceType param) {
return this.addParameter(new TransformCallbackParameter(param));
}

public TransformCallbackParametersBuilder addLong(Long param) {
return this.addParameter(new TransformCallbackParameter(param));
}

public TransformCallbackParametersBuilder addDouble(Double param) {
return this.addParameter(new TransformCallbackParameter(param));
}

public TransformCallbackParametersBuilder addString(String param) {
return this.addParameter(new TransformCallbackParameter(param));
}

public TransformCallbackParametersBuilder addStringArray(String[] param) {
return this.addParameter(new TransformCallbackParameter(param));
}

public TransformCallbackParametersBuilder addStringArrayArray(String[][] param) {
return this.addParameter(new TransformCallbackParameter(param));
}

public TransformCallbackParameters toParameters() {
return new TransformCallbackParameters(new ArrayList<>(this.params));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ public interface TransformOperations {

// void transform(String className, Class<? extends TransformCallback> transformCallbackClass, Object[] parameters);

@Deprecated
void transform(String className, Class<? extends TransformCallback> transformCallbackClass, Object[] parameters, Class<?>[] parameterTypes);

void transform(String className, Class<? extends TransformCallback> transformCallbackClass, TransformCallbackParameters params);

}
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,11 @@ public void transform(String className, Class<? extends TransformCallback> trans
final String transformCallbackName = transformCallbackClass.getName();
this.instrumentContext.addClassFileTransformer(matcher, transformCallbackName, parameters, parameterTypes);
}

@Override
public void transform(String className, Class<? extends TransformCallback> transformCallbackClass, TransformCallbackParameters params) {
Object[] parameters = params.getParamValues();
Class<?>[] parameterTypes = params.getParamTypes();
this.transform(className, transformCallbackClass, parameters, parameterTypes);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/*
* Copyright 2024 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 implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.navercorp.pinpoint.bootstrap.instrument.transformer;

import com.navercorp.pinpoint.common.trace.ServiceType;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

/**
* @author youngjin.kim2
*/
public class TransformCallbackParameterTest {

@Test
public void testParametersSerde() {
TransformCallbackParameters parameters = TransformCallbackParametersBuilder.newBuilder()
.addBoolean(Boolean.TRUE)
.addServiceType(ServiceType.STAND_ALONE)
.addLong(1L)
.addDouble(1.0D)
.addString("test")
.addStringArray(new String[]{"test1", "test2"})
.addStringArrayArray(new String[][]{{"test1", "test2"}, {"test3", "test4"}})
.toParameters();

Object[] values = parameters.getParamValues();
Class<?>[] types = parameters.getParamTypes();

assertThat(values).hasSize(7);
assertThat(values[0]).isInstanceOf(Boolean.class).isEqualTo(Boolean.TRUE);
assertThat(values[1]).isInstanceOf(ServiceType.class).isEqualTo(ServiceType.STAND_ALONE);
assertThat(values[2]).isInstanceOf(Long.class).isEqualTo(1L);
assertThat(values[3]).isInstanceOf(Double.class).isEqualTo(1.0D);
assertThat(values[4]).isInstanceOf(String.class).isEqualTo("test");
assertThat(values[5]).isInstanceOf(String[].class).isEqualTo(new String[]{"test1", "test2"});
assertThat(values[6]).isInstanceOf(String[][].class).isEqualTo(new String[][]{{"test1", "test2"}, {"test3", "test4"}});

assertThat(types).hasSize(7);
assertThat(types[0]).isEqualTo(Boolean.class);
assertThat(types[1]).isEqualTo(ServiceType.class);
assertThat(types[2]).isEqualTo(Long.class);
assertThat(types[3]).isEqualTo(Double.class);
assertThat(types[4]).isEqualTo(String.class);
assertThat(types[5]).isEqualTo(String[].class);
assertThat(types[6]).isEqualTo(String[][].class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import com.navercorp.pinpoint.bootstrap.instrument.Instrumentor;
import com.navercorp.pinpoint.bootstrap.instrument.MethodFilters;
import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformCallback;
import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformCallbackParameters;
import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformCallbackParametersBuilder;
import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformTemplate;
import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformTemplateAware;
import com.navercorp.pinpoint.bootstrap.logging.PLogger;
Expand Down Expand Up @@ -184,13 +186,16 @@ private void addRedisCommands(final LettucePluginConfig config) {
}

private void addAbstractRedisCommands(final String className, Class<? extends TransformCallback> transformCallback, boolean getter) {
transformTemplate.transform(className, transformCallback, new Object[]{getter}, new Class[]{boolean.class});
TransformCallbackParameters parameters = TransformCallbackParametersBuilder.newBuilder()
.addBoolean(getter)
.toParameters();
transformTemplate.transform(className, transformCallback, parameters);
}

public static class AbstractRedisCommandsTransform implements TransformCallback {
private final boolean getter;

public AbstractRedisCommandsTransform(boolean getter) {
public AbstractRedisCommandsTransform(Boolean getter) {
this.getter = getter;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import com.navercorp.pinpoint.bootstrap.instrument.Instrumentor;
import com.navercorp.pinpoint.bootstrap.instrument.MethodFilters;
import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformCallback;
import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformCallbackParameters;
import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformCallbackParametersBuilder;
import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformTemplate;
import com.navercorp.pinpoint.bootstrap.instrument.transformer.TransformTemplateAware;
import com.navercorp.pinpoint.bootstrap.interceptor.BasicMethodInterceptor;
Expand Down Expand Up @@ -111,7 +113,10 @@ private void addObservableTransformers() {
}

private void transform(String className, Class<? extends TransformCallback> transformCallbackClass, String... constructorParameter) {
transformTemplate.transform(className, transformCallbackClass, new Object[]{constructorParameter}, new Class[]{String[].class});
TransformCallbackParameters parameters = TransformCallbackParametersBuilder.newBuilder()
.addStringArray(constructorParameter)
.toParameters();
transformTemplate.transform(className, transformCallbackClass, parameters);
}

// Single
Expand Down Expand Up @@ -238,7 +243,10 @@ private void addSchedulerWorkerTransformers() {
}

private void transform(String className, Class<? extends TransformCallback> transformCallbackClass, ServiceType serviceType) {
transformTemplate.transform(className, transformCallbackClass, new Object[]{serviceType}, new Class[]{ServiceType.class});
TransformCallbackParameters parameters = TransformCallbackParametersBuilder.newBuilder()
.addServiceType(serviceType)
.toParameters();
transformTemplate.transform(className, transformCallbackClass, parameters);
}

public static class EventLoopsScheduler implements TransformCallback {
Expand Down
Loading

0 comments on commit 6c5bb1d

Please sign in to comment.