Skip to content

Commit

Permalink
get the method on startup
Browse files Browse the repository at this point in the history
  • Loading branch information
shashank11p committed Oct 4, 2023
1 parent e37fc3a commit d1c3803
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,21 @@ private InputStreamUtils() {}
private static final Tracer TRACER =
GlobalOpenTelemetry.get().getTracer("org.hypertrace.java.inputstream");

private static Method getAttribute = null;

static {
try {
getAttribute = Class.forName("io.opentelemetry.sdk.trace.SdkSpan").getDeclaredMethod("getAttribute", AttributeKey.class);
} catch (NoSuchMethodException e) {
log.error("getAttribute method not found in SdkSpan class", e);
} catch (ClassNotFoundException e) {
log.error("SdkSpan class not found", e);
}
if (getAttribute != null) {
getAttribute.setAccessible(true);
}
}

/**
* Adds an attribute to span. If the span is ended it adds the attributed to a newly created
* child.
Expand All @@ -60,24 +75,22 @@ public static void addAttribute(Span span, AttributeKey<String> attributeKey, St
.setAttribute(attributeKey, value);

// Also add content type if present
if (span.getClass().getName().equals("io.opentelemetry.sdk.trace.SdkSpan")) {
if (getAttribute != null && span.getClass().getName().equals("io.opentelemetry.sdk.trace.SdkSpan")) {
try {
Method getAttribute =
span.getClass().getDeclaredMethod("getAttribute", AttributeKey.class);
getAttribute.setAccessible(true);
Object reqContentType =
getAttribute.invoke(span, AttributeKey.stringKey("http.request.header.content-type"));
getAttribute.invoke(span, HypertraceSemanticAttributes.HTTP_REQUEST_HEADER_CONTENT_TYPE);
if (reqContentType != null) {
spanBuilder.setAttribute("http.request.header.content-type", (String) reqContentType);
}
Object resContentType =
getAttribute.invoke(
span, AttributeKey.stringKey("http.response.header.content-type"));
span, HypertraceSemanticAttributes.HTTP_RESPONSE_HEADER_CONTENT_TYPE);
if (resContentType != null) {
spanBuilder.setAttribute("http.response.header.content-type", (String) resContentType);
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
} catch (IllegalAccessException | InvocationTargetException e) {
// ignore and continue
log.debug("Could not invoke getAttribute on SdkSpan", e);
}
}
spanBuilder.startSpan().end();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,31 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.hypertrace.agent.core.instrumentation.HypertraceSemanticAttributes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ResponseBodyWrappingHandler implements Handler<Buffer> {

private static final Tracer tracer =
GlobalOpenTelemetry.getTracer("io.opentelemetry.javaagent.vertx-core-3.0");

private static final Logger log = LoggerFactory.getLogger(ResponseBodyWrappingHandler.class);

private static Method getAttribute = null;

static {
try {
getAttribute = Class.forName("io.opentelemetry.sdk.trace.SdkSpan").getDeclaredMethod("getAttribute", AttributeKey.class);
} catch (NoSuchMethodException e) {
log.error("getAttribute method not found in SdkSpan class", e);
} catch (ClassNotFoundException e) {
log.error("SdkSpan class not found", e);
}
if (getAttribute != null) {
getAttribute.setAccessible(true);
}
}

private final Handler<Buffer> wrapped;
private final Span span;

Expand All @@ -54,19 +73,17 @@ public void handle(Buffer event) {
.setAttribute(HypertraceSemanticAttributes.HTTP_RESPONSE_BODY, responseBody);

// Also add content type if present
if (span.getClass().getName().equals("io.opentelemetry.sdk.trace.SdkSpan")) {
if (getAttribute != null && span.getClass().getName().equals("io.opentelemetry.sdk.trace.SdkSpan")) {
try {
Method getAttribute =
span.getClass().getDeclaredMethod("getAttribute", AttributeKey.class);
getAttribute.setAccessible(true);
Object resContentType =
getAttribute.invoke(
span, AttributeKey.stringKey("http.response.header.content-type"));
span, HypertraceSemanticAttributes.HTTP_RESPONSE_HEADER_CONTENT_TYPE);
if (resContentType != null) {
spanBuilder.setAttribute("http.response.header.content-type", (String) resContentType);
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
} catch (IllegalAccessException | InvocationTargetException e) {
// ignore and continue
log.debug("Could not invoke getAttribute on SdkSpan", e);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ public static AttributeKey<String> httpResponseHeader(String header) {
public static final AttributeKey<String> HTTP_REQUEST_SESSION_ID =
AttributeKey.stringKey("http.request.session_id");

public static final AttributeKey<String> HTTP_REQUEST_HEADER_CONTENT_TYPE =
AttributeKey.stringKey("http.request.header.content-type");

public static final AttributeKey<String> HTTP_RESPONSE_HEADER_CONTENT_TYPE =
AttributeKey.stringKey("http.response.header.content-type");

public static final AttributeKey<String> RPC_REQUEST_BODY =
AttributeKey.stringKey("rpc.request.body");
public static final AttributeKey<String> RPC_RESPONSE_BODY =
Expand Down

0 comments on commit d1c3803

Please sign in to comment.