Implement HttpServerResponseCustomizer support for Armeria (#8274)
This commit is contained in:
parent
e17feb4ea6
commit
300267fe11
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.armeria.v1_3;
|
||||
|
||||
import com.linecorp.armeria.common.ResponseHeadersBuilder;
|
||||
import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseMutator;
|
||||
|
||||
enum ArmeriaHttpResponseMutator implements HttpServerResponseMutator<ResponseHeadersBuilder> {
|
||||
INSTANCE;
|
||||
|
||||
@Override
|
||||
public void appendHeader(ResponseHeadersBuilder response, String name, String value) {
|
||||
response.add(name, value);
|
||||
}
|
||||
}
|
||||
|
|
@ -35,7 +35,10 @@ public final class ArmeriaSingletons {
|
|||
.build();
|
||||
|
||||
CLIENT_DECORATOR = telemetry.newClientDecorator();
|
||||
SERVER_DECORATOR = telemetry.newServiceDecorator();
|
||||
SERVER_DECORATOR =
|
||||
telemetry
|
||||
.newServiceDecorator()
|
||||
.compose(service -> new ResponseCustomizingDecorator(service));
|
||||
}
|
||||
|
||||
private ArmeriaSingletons() {}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.javaagent.instrumentation.armeria.v1_3;
|
||||
|
||||
import com.linecorp.armeria.common.FilteredHttpResponse;
|
||||
import com.linecorp.armeria.common.HttpObject;
|
||||
import com.linecorp.armeria.common.HttpRequest;
|
||||
import com.linecorp.armeria.common.HttpResponse;
|
||||
import com.linecorp.armeria.common.ResponseHeaders;
|
||||
import com.linecorp.armeria.common.ResponseHeadersBuilder;
|
||||
import com.linecorp.armeria.server.HttpService;
|
||||
import com.linecorp.armeria.server.ServiceRequestContext;
|
||||
import com.linecorp.armeria.server.SimpleDecoratingHttpService;
|
||||
import io.opentelemetry.context.Context;
|
||||
import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizerHolder;
|
||||
|
||||
class ResponseCustomizingDecorator extends SimpleDecoratingHttpService {
|
||||
|
||||
ResponseCustomizingDecorator(HttpService delegate) {
|
||||
super(delegate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpResponse serve(ServiceRequestContext ctx, HttpRequest req) throws Exception {
|
||||
HttpResponse response = unwrap().serve(ctx, req);
|
||||
Context context = Context.current();
|
||||
return new FilteredHttpResponse(response) {
|
||||
@Override
|
||||
public HttpObject filter(HttpObject obj) {
|
||||
// Ignore other objects like HttpData.
|
||||
if (!(obj instanceof ResponseHeaders)) {
|
||||
return obj;
|
||||
}
|
||||
|
||||
ResponseHeaders headers = (ResponseHeaders) obj;
|
||||
ResponseHeadersBuilder headersBuilder = headers.toBuilder();
|
||||
HttpServerResponseCustomizerHolder.getCustomizer()
|
||||
.customize(context, headersBuilder, ArmeriaHttpResponseMutator.INSTANCE);
|
||||
|
||||
return headersBuilder.build();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
@ -9,6 +9,8 @@ import com.linecorp.armeria.server.ServerBuilder;
|
|||
import io.opentelemetry.instrumentation.armeria.v1_3.AbstractArmeriaHttpServerTest;
|
||||
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
||||
import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension;
|
||||
import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions;
|
||||
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
|
||||
import org.junit.jupiter.api.extension.RegisterExtension;
|
||||
|
||||
class ArmeriaHttpServerTest extends AbstractArmeriaHttpServerTest {
|
||||
|
|
@ -20,4 +22,11 @@ class ArmeriaHttpServerTest extends AbstractArmeriaHttpServerTest {
|
|||
protected ServerBuilder configureServer(ServerBuilder sb) {
|
||||
return sb;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void configure(HttpServerTestOptions options) {
|
||||
super.configure(options);
|
||||
options.setHasResponseCustomizer(
|
||||
endpoint -> ServerEndpoint.NOT_FOUND != endpoint && ServerEndpoint.EXCEPTION != endpoint);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ public abstract class AbstractArmeriaHttpServerTest extends AbstractHttpServerTe
|
|||
}
|
||||
|
||||
@Override
|
||||
protected final void configure(HttpServerTestOptions options) {
|
||||
protected void configure(HttpServerTestOptions options) {
|
||||
options.setExpectedHttpRoute(
|
||||
endpoint -> {
|
||||
if (endpoint == ServerEndpoint.NOT_FOUND) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue