Skip to content

Commit 3372ba6

Browse files
mznetjaydelucalaurit
authored
ClickHouse client v0.8 instrumentation (#14501)
Co-authored-by: Jay DeLuca <[email protected]> Co-authored-by: Lauri Tulmin <[email protected]>
1 parent 8884788 commit 3372ba6

File tree

23 files changed

+732
-117
lines changed

23 files changed

+732
-117
lines changed

.fossa.yml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,6 @@ targets:
9191
- type: gradle
9292
path: ./
9393
target: ':instrumentation:camel-2.20:javaagent'
94-
- type: gradle
95-
path: ./
96-
target: ':instrumentation:clickhouse-client-0.5:javaagent'
9794
- type: gradle
9895
path: ./
9996
target: ':instrumentation:executors:bootstrap'
@@ -394,6 +391,15 @@ targets:
394391
- type: gradle
395392
path: ./
396393
target: ':instrumentation:cassandra:cassandra-4.4:library'
394+
- type: gradle
395+
path: ./
396+
target: ':instrumentation:clickhouse:clickhouse-client-common:javaagent'
397+
- type: gradle
398+
path: ./
399+
target: ':instrumentation:clickhouse:clickhouse-client-v1-0.5:javaagent'
400+
- type: gradle
401+
path: ./
402+
target: ':instrumentation:clickhouse:clickhouse-client-v2-0.8:javaagent'
397403
- type: gradle
398404
path: ./
399405
target: ':instrumentation:couchbase:couchbase-2-common:javaagent'

docs/supported-libraries.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ These are the supported libraries and frameworks:
5151
| [AWS SDK](https://aws.amazon.com/sdk-for-java/) | 1.11 - 1.12.583,<br>2.2+ | [opentelemetry-aws-sdk-1.11](../instrumentation/aws-sdk/aws-sdk-1.11/library),<br>[opentelemetry-aws-sdk-1.11-autoconfigure](../instrumentation/aws-sdk/aws-sdk-1.11/library-autoconfigure),<br>[opentelemetry-aws-sdk-2.2](../instrumentation/aws-sdk/aws-sdk-2.2/library),<br>[opentelemetry-aws-sdk-2.2-autoconfigure](../instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure) | [Messaging Spans], [Database Client Spans], [Database Client Metrics]&nbsp;[6], [HTTP Client Spans], [GenAI Client Spans], [GenAI Client Metrics] |
5252
| [Azure Core](https://docs.microsoft.com/en-us/java/api/overview/azure/core-readme) | 1.14+ | N/A | Context propagation |
5353
| [Cassandra Driver](https://github.com/datastax/java-driver) | 3.0+ | [opentelemetry-cassandra-4.4](../instrumentation/cassandra/cassandra-4.4/library) | [Database Client Spans], [Database Client Metrics]&nbsp;[6] |
54-
| [Clickhouse Client](https://github.com/ClickHouse/clickhouse-java) | 0.5+ | N/A | [Database Client Spans], [Database Client Metrics]&nbsp;[6] |
54+
| [Clickhouse Client V1](https://github.com/ClickHouse/clickhouse-java) | 0.5+ | N/A | [Database Client Spans], [Database Client Metrics]&nbsp;[6] |
55+
| [Clickhouse Client V2](https://github.com/ClickHouse/clickhouse-java) | 0.8+ | N/A | [Database Client Spans], [Database Client Metrics]&nbsp;[6] |
5556
| [Couchbase Client](https://github.com/couchbase/couchbase-java-client) | 2.0 - 2.7.x | N/A | [Database Client Spans], [Database Client Metrics]&nbsp;[6] |
5657
| [Couchbase Client](https://github.com/couchbase/couchbase-java-client) | 3.1+ | N/A | [Database Client Spans] |
5758
| [c3p0](https://github.com/swaldman/c3p0) | 0.9.2+ | [opentelemetry-c3p0-0.9](../instrumentation/c3p0-0.9/library) | [Database Pool Metrics] |

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

Lines changed: 0 additions & 39 deletions
This file was deleted.

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

Lines changed: 0 additions & 40 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
plugins {
2+
id("otel.javaagent-instrumentation")
3+
}
4+
5+
dependencies {
6+
compileOnly("com.google.auto.value:auto-value-annotations")
7+
annotationProcessor("com.google.auto.value:auto-value")
8+
}
Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,22 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.instrumentation.clickhouse;
6+
package io.opentelemetry.javaagent.instrumentation.clickhouse.common;
77

8-
import com.clickhouse.client.ClickHouseException;
98
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesGetter;
109
import io.opentelemetry.semconv.incubating.DbIncubatingAttributes;
10+
import java.util.function.Function;
1111
import javax.annotation.Nullable;
1212

1313
final class ClickHouseAttributesGetter
1414
implements DbClientAttributesGetter<ClickHouseDbRequest, Void> {
1515

16+
private final Function<Throwable, String> errorCodeExtractor;
17+
18+
ClickHouseAttributesGetter(Function<Throwable, String> errorCodeExtractor) {
19+
this.errorCodeExtractor = errorCodeExtractor;
20+
}
21+
1622
@Nullable
1723
@Override
1824
public String getDbQueryText(ClickHouseDbRequest request) {
@@ -64,9 +70,6 @@ public String getConnectionString(ClickHouseDbRequest request) {
6470
@Nullable
6571
@Override
6672
public String getResponseStatus(@Nullable Void response, @Nullable Throwable error) {
67-
if (error instanceof ClickHouseException) {
68-
return Integer.toString(((ClickHouseException) error).getErrorCode());
69-
}
70-
return null;
73+
return errorCodeExtractor.apply(error);
7174
}
7275
}
Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,32 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.instrumentation.clickhouse;
6+
package io.opentelemetry.javaagent.instrumentation.clickhouse.common;
77

88
import com.google.auto.value.AutoValue;
99
import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlStatementInfo;
1010
import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlStatementSanitizer;
1111
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
12+
import javax.annotation.Nullable;
1213

1314
@AutoValue
1415
public abstract class ClickHouseDbRequest {
1516

1617
private static final SqlStatementSanitizer sanitizer =
1718
SqlStatementSanitizer.create(AgentCommonConfig.get().isStatementSanitizationEnabled());
1819

19-
public static ClickHouseDbRequest create(String host, int port, String dbName, String sql) {
20+
public static ClickHouseDbRequest create(
21+
@Nullable String host, @Nullable Integer port, @Nullable String dbName, String sql) {
2022
return new AutoValue_ClickHouseDbRequest(host, port, dbName, sanitizer.sanitize(sql));
2123
}
2224

25+
@Nullable
2326
public abstract String getHost();
2427

25-
public abstract int getPort();
28+
@Nullable
29+
public abstract Integer getPort();
2630

31+
@Nullable
2732
public abstract String getDbName();
2833

2934
public abstract SqlStatementInfo getSqlStatementInfo();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.clickhouse.common;
7+
8+
import io.opentelemetry.api.GlobalOpenTelemetry;
9+
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientAttributesExtractor;
10+
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics;
11+
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor;
12+
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
13+
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
14+
import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor;
15+
import java.util.function.Function;
16+
17+
public final class ClickHouseInstrumenterFactory {
18+
19+
public static Instrumenter<ClickHouseDbRequest, Void> createInstrumenter(
20+
String instrumenterName, Function<Throwable, String> errorCodeExtractor) {
21+
ClickHouseAttributesGetter dbAttributesGetter =
22+
new ClickHouseAttributesGetter(errorCodeExtractor);
23+
24+
return Instrumenter.<ClickHouseDbRequest, Void>builder(
25+
GlobalOpenTelemetry.get(),
26+
instrumenterName,
27+
DbClientSpanNameExtractor.create(dbAttributesGetter))
28+
.addAttributesExtractor(DbClientAttributesExtractor.create(dbAttributesGetter))
29+
.addAttributesExtractor(
30+
ServerAttributesExtractor.create(new ClickHouseNetworkAttributesGetter()))
31+
.addOperationMetrics(DbClientMetrics.get())
32+
.buildInstrumenter(SpanKindExtractor.alwaysClient());
33+
}
34+
35+
private ClickHouseInstrumenterFactory() {}
36+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
package io.opentelemetry.javaagent.instrumentation.clickhouse;
6+
package io.opentelemetry.javaagent.instrumentation.clickhouse.common;
77

88
import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesGetter;
99

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

0 commit comments

Comments
 (0)