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.TargetAdviceObject;
27 import org.apache.shardingsphere.agent.plugin.tracing.core.advice.TracingJDBCExecutorCallbackAdvice;
28 import org.apache.shardingsphere.agent.plugin.tracing.core.constant.AttributeConstants;
29 import org.apache.shardingsphere.agent.plugin.tracing.opentelemetry.constant.OpenTelemetryConstants;
30 import org.apache.shardingsphere.infra.database.core.connector.ConnectionProperties;
31 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
32 import org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
33
34 import java.lang.reflect.Method;
35
36
37
38
39 public final class OpenTelemetryJDBCExecutorCallbackAdvice extends TracingJDBCExecutorCallbackAdvice<Span> {
40
41 @Override
42 protected void recordExecuteInfo(final Span parentSpan, final TargetAdviceObject target, final JDBCExecutionUnit executionUnit, final boolean isTrunkThread,
43 final ConnectionProperties connectionProps, final DatabaseType databaseType) {
44 Tracer tracer = GlobalOpenTelemetry.getTracer(OpenTelemetryConstants.TRACER_NAME);
45 SpanBuilder spanBuilder = tracer.spanBuilder(OPERATION_NAME);
46 spanBuilder.setParent(Context.current().with(parentSpan));
47 spanBuilder.setAttribute(AttributeConstants.COMPONENT, AttributeConstants.COMPONENT_NAME);
48 spanBuilder.setAttribute(AttributeConstants.DB_TYPE, databaseType.getType());
49 spanBuilder.setAttribute(AttributeConstants.DB_INSTANCE, executionUnit.getExecutionUnit().getDataSourceName())
50 .setAttribute(AttributeConstants.PEER_HOSTNAME, connectionProps.getHostname())
51 .setAttribute(AttributeConstants.PEER_PORT, String.valueOf(connectionProps.getPort()))
52 .setAttribute(AttributeConstants.DB_STATEMENT, executionUnit.getExecutionUnit().getSqlUnit().getSql())
53 .setAttribute(AttributeConstants.DB_BIND_VARIABLES, executionUnit.getExecutionUnit().getSqlUnit().getParameters().toString())
54 .setAttribute(AttributeConstants.SPAN_KIND, AttributeConstants.SPAN_KIND_CLIENT);
55 target.setAttachment(spanBuilder.startSpan());
56 }
57
58 @Override
59 public void afterMethod(final TargetAdviceObject target, final Method method, final Object[] args, final Object result, final String pluginType) {
60 Span span = (Span) target.getAttachment();
61 span.setStatus(StatusCode.OK);
62 span.end();
63 }
64
65 @Override
66 public void onThrowing(final TargetAdviceObject target, final Method method, final Object[] args, final Throwable throwable, final String pluginType) {
67 Span span = (Span) target.getAttachment();
68 span.setStatus(StatusCode.ERROR).recordException(throwable);
69 span.end();
70 }
71 }