1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.agent.plugin.tracing.opentelemetry.advice;
19
20 import io.opentelemetry.api.GlobalOpenTelemetry;
21 import io.opentelemetry.api.trace.Span;
22 import io.opentelemetry.api.trace.SpanBuilder;
23 import io.opentelemetry.api.trace.StatusCode;
24 import io.opentelemetry.api.trace.Tracer;
25 import io.opentelemetry.context.Context;
26 import org.apache.shardingsphere.agent.api.advice.TargetAdviceMethod;
27 import org.apache.shardingsphere.agent.api.advice.TargetAdviceObject;
28 import org.apache.shardingsphere.agent.plugin.tracing.core.advice.TracingJDBCExecutorCallbackAdvice;
29 import org.apache.shardingsphere.agent.plugin.tracing.core.constant.AttributeConstants;
30 import org.apache.shardingsphere.agent.plugin.tracing.opentelemetry.constant.OpenTelemetryConstants;
31 import org.apache.shardingsphere.infra.database.core.connector.ConnectionProperties;
32 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
33 import org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
34
35
36
37
38 public final class OpenTelemetryJDBCExecutorCallbackAdvice extends TracingJDBCExecutorCallbackAdvice<Span> {
39
40 @Override
41 protected void recordExecuteInfo(final Span parentSpan, final TargetAdviceObject target, final JDBCExecutionUnit executionUnit, final boolean isTrunkThread,
42 final ConnectionProperties connectionProps, final DatabaseType databaseType) {
43 Tracer tracer = GlobalOpenTelemetry.getTracer(OpenTelemetryConstants.TRACER_NAME);
44 SpanBuilder spanBuilder = tracer.spanBuilder(OPERATION_NAME);
45 spanBuilder.setParent(Context.current().with(parentSpan));
46 spanBuilder.setAttribute(AttributeConstants.COMPONENT, AttributeConstants.COMPONENT_NAME);
47 spanBuilder.setAttribute(AttributeConstants.DB_TYPE, databaseType.getType());
48 spanBuilder.setAttribute(AttributeConstants.DB_INSTANCE, executionUnit.getExecutionUnit().getDataSourceName())
49 .setAttribute(AttributeConstants.PEER_HOSTNAME, connectionProps.getHostname())
50 .setAttribute(AttributeConstants.PEER_PORT, String.valueOf(connectionProps.getPort()))
51 .setAttribute(AttributeConstants.DB_STATEMENT, executionUnit.getExecutionUnit().getSqlUnit().getSql())
52 .setAttribute(AttributeConstants.DB_BIND_VARIABLES, executionUnit.getExecutionUnit().getSqlUnit().getParameters().toString())
53 .setAttribute(AttributeConstants.SPAN_KIND, AttributeConstants.SPAN_KIND_CLIENT);
54 target.setAttachment(spanBuilder.startSpan());
55 }
56
57 @Override
58 public void afterMethod(final TargetAdviceObject target, final TargetAdviceMethod method, final Object[] args, final Object result, final String pluginType) {
59 Span span = (Span) target.getAttachment();
60 span.setStatus(StatusCode.OK);
61 span.end();
62 }
63
64 @Override
65 public void onThrowing(final TargetAdviceObject target, final TargetAdviceMethod method, final Object[] args, final Throwable throwable, final String pluginType) {
66 Span span = (Span) target.getAttachment();
67 span.setStatus(StatusCode.ERROR).recordException(throwable);
68 span.end();
69 }
70 }