Skip to content

Commit 0b04b87

Browse files
authored
Make clickhouse instrumentation indy compatible (#12181)
1 parent e8c5c06 commit 0b04b87

File tree

2 files changed

+49
-32
lines changed

2 files changed

+49
-32
lines changed

instrumentation/clickhouse-client-0.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientInstrumentation.java

+10-32
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import static io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge.currentContext;
99
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
10-
import static io.opentelemetry.javaagent.instrumentation.clickhouse.ClickHouseSingletons.instrumenter;
1110
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
1211
import static net.bytebuddy.matcher.ElementMatchers.named;
1312
import static net.bytebuddy.matcher.ElementMatchers.namedOneOf;
@@ -17,7 +16,6 @@
1716
import com.clickhouse.client.ClickHouseRequest;
1817
import com.clickhouse.client.config.ClickHouseDefaults;
1918
import io.opentelemetry.context.Context;
20-
import io.opentelemetry.context.Scope;
2119
import io.opentelemetry.javaagent.bootstrap.CallDepth;
2220
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
2321
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
@@ -43,19 +41,12 @@ public void transform(TypeTransformer transformer) {
4341
@SuppressWarnings("unused")
4442
public static class ClickHouseExecuteAndWaitAdvice {
4543
@Advice.OnMethodEnter(suppress = Throwable.class)
46-
public static void onEnter(
47-
@Advice.Argument(0) ClickHouseRequest<?> clickHouseRequest,
48-
@Advice.Local("otelContext") Context context,
49-
@Advice.Local("otelScope") Scope scope,
50-
@Advice.Local("otelCallDepth") CallDepth callDepth) {
44+
public static ClickHouseScope onEnter(
45+
@Advice.Argument(0) ClickHouseRequest<?> clickHouseRequest) {
5146

52-
callDepth = CallDepth.forClass(ClickHouseClient.class);
53-
if (callDepth.getAndIncrement() > 0) {
54-
return;
55-
}
56-
57-
if (clickHouseRequest == null) {
58-
return;
47+
CallDepth callDepth = CallDepth.forClass(ClickHouseClient.class);
48+
if (callDepth.getAndIncrement() > 0 || clickHouseRequest == null) {
49+
return null;
5950
}
6051

6152
Context parentContext = currentContext();
@@ -70,32 +61,19 @@ public static void onEnter(
7061
.orElse(ClickHouseDefaults.DATABASE.getDefaultValue().toString()),
7162
clickHouseRequest.getPreparedQuery().getOriginalQuery());
7263

73-
if (!instrumenter().shouldStart(parentContext, request)) {
74-
return;
75-
}
76-
77-
context = instrumenter().start(parentContext, request);
78-
scope = context.makeCurrent();
64+
return ClickHouseScope.start(parentContext, request);
7965
}
8066

8167
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
8268
public static void onExit(
83-
@Advice.Thrown Throwable throwable,
84-
@Advice.Local("otelRequest") ClickHouseDbRequest clickHouseRequest,
85-
@Advice.Local("otelContext") Context context,
86-
@Advice.Local("otelScope") Scope scope,
87-
@Advice.Local("otelCallDepth") CallDepth callDepth) {
88-
89-
if (callDepth.decrementAndGet() > 0) {
90-
return;
91-
}
69+
@Advice.Thrown Throwable throwable, @Advice.Enter ClickHouseScope scope) {
9270

93-
if (scope == null) {
71+
CallDepth callDepth = CallDepth.forClass(ClickHouseClient.class);
72+
if (callDepth.decrementAndGet() > 0 || scope == null) {
9473
return;
9574
}
9675

97-
scope.close();
98-
instrumenter().end(context, clickHouseRequest, null, throwable);
76+
scope.end(throwable);
9977
}
10078
}
10179
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.clickhouse;
7+
8+
import static io.opentelemetry.javaagent.instrumentation.clickhouse.ClickHouseSingletons.instrumenter;
9+
10+
import io.opentelemetry.context.Context;
11+
import io.opentelemetry.context.Scope;
12+
13+
/** Container used to carry state between enter and exit advices */
14+
public final class ClickHouseScope {
15+
private final ClickHouseDbRequest clickHouseDbRequest;
16+
private final Context context;
17+
private final Scope scope;
18+
19+
private ClickHouseScope(ClickHouseDbRequest clickHouseDbRequest, Context context, Scope scope) {
20+
this.clickHouseDbRequest = clickHouseDbRequest;
21+
this.context = context;
22+
this.scope = scope;
23+
}
24+
25+
public static ClickHouseScope start(
26+
Context parentContext, ClickHouseDbRequest clickHouseDbRequest) {
27+
if (!instrumenter().shouldStart(parentContext, clickHouseDbRequest)) {
28+
return null;
29+
}
30+
31+
Context context = instrumenter().start(parentContext, clickHouseDbRequest);
32+
return new ClickHouseScope(clickHouseDbRequest, context, context.makeCurrent());
33+
}
34+
35+
public void end(Throwable throwable) {
36+
scope.close();
37+
instrumenter().end(context, clickHouseDbRequest, null, throwable);
38+
}
39+
}

0 commit comments

Comments
 (0)