Skip to content

Commit

Permalink
Support Spring Web 6 in library instrumentation (#7551)
Browse files Browse the repository at this point in the history
Part of
#7312
  • Loading branch information
Mateusz Rzeszutek authored Jan 13, 2023
1 parent daf46a9 commit ca85a0d
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,16 @@ dependencies {
compileOnly("org.springframework:spring-web:3.1.0.RELEASE")

testLibrary("org.springframework:spring-web:3.1.0.RELEASE")
latestDepTestLibrary("org.springframework:spring-web:5.+")

testImplementation(project(":testing-common"))
testImplementation("io.opentelemetry:opentelemetry-sdk-testing")
}

val latestDepTest = findProperty("testLatestDeps") as Boolean

// spring 6 requires java 17
if (latestDepTest) {
otelJava {
minJavaVersionSupported.set(JavaVersion.VERSION_17)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@
import static java.util.Collections.emptyList;

import io.opentelemetry.instrumentation.api.instrumenter.http.HttpClientAttributesGetter;
import java.io.IOException;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.List;
import javax.annotation.Nullable;
import org.springframework.http.HttpRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.client.ClientHttpResponse;

enum SpringWebHttpAttributesGetter
Expand Down Expand Up @@ -41,13 +42,58 @@ public String flavor(HttpRequest httpRequest, @Nullable ClientHttpResponse clien
return null;
}

@Nullable private static final MethodHandle GET_STATUS_CODE;

@Nullable private static final MethodHandle STATUS_CODE_VALUE;

static {
MethodHandle getStatusCode = null;
MethodHandle statusCodeValue = null;
Class<?> httpStatusCodeClass = null;

MethodHandles.Lookup lookup = MethodHandles.publicLookup();

try {
httpStatusCodeClass = Class.forName("org.springframework.http.HttpStatusCode");
} catch (ClassNotFoundException e) {
try {
httpStatusCodeClass = Class.forName("org.springframework.http.HttpStatus");
} catch (ClassNotFoundException ignored) {
// ignored
}
}

if (httpStatusCodeClass != null) {
try {
getStatusCode =
lookup.findVirtual(
ClientHttpResponse.class,
"getStatusCode",
MethodType.methodType(httpStatusCodeClass));
statusCodeValue =
lookup.findVirtual(httpStatusCodeClass, "value", MethodType.methodType(int.class));
} catch (NoSuchMethodException | IllegalAccessException ignored) {
// ignored
}
}

GET_STATUS_CODE = getStatusCode;
STATUS_CODE_VALUE = statusCodeValue;
}

@Override
public Integer statusCode(
HttpRequest httpRequest, ClientHttpResponse clientHttpResponse, @Nullable Throwable error) {

if (GET_STATUS_CODE == null || STATUS_CODE_VALUE == null) {
return null;
}

try {
return clientHttpResponse.getStatusCode().value();
} catch (IOException e) {
return HttpStatus.INTERNAL_SERVER_ERROR.value();
Object statusCode = GET_STATUS_CODE.invoke(clientHttpResponse);
return (int) STATUS_CODE_VALUE.invoke(statusCode);
} catch (Throwable e) {
return null;
}
}

Expand Down

0 comments on commit ca85a0d

Please sign in to comment.