Skip to content

[java] Add make_distant_call for vertx #4835

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 7 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions manifests/java.yml
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ tests/:
vertx4: bug (APPSEC-56871)
Test_Schema_Request_Path_Parameters:
'*': v1.36.0
akka-http: missing_feature (path parameters not suported & APPSEC-56888)
akka-http: missing_feature (path parameters not supported & APPSEC-56888)
jersey-grizzly2: bug (APPSEC-56846)
play: bug (APPSEC-56869)
resteasy-netty3: bug (APPSEC-56846)
Expand Down Expand Up @@ -1375,7 +1375,7 @@ tests/:
vertx4: v1.7.0
Test_Blocking_request_path_params:
'*': v1.15.0
akka-http: missing_feature (path parameters not suported)
akka-http: missing_feature (path parameters not supported)
play: v1.22.0
spring-boot-3-native: missing_feature (GraalVM. Tracing support only)
spring-boot-payara: bug (APPSEC-52335)
Expand Down Expand Up @@ -1967,8 +1967,8 @@ tests/:
TestDynamicConfigV1_ServiceTargets: v1.31.0
TestDynamicConfigV2: v1.31.0
test_headers_baggage.py:
Test_Headers_Baggage: missing_feature
Test_Headers_Baggage_Span_Tags: missing_feature
Test_Headers_Baggage: irrelevant (uses weblog tests)
Test_Headers_Baggage_Span_Tags: irrelevant (uses weblog tests)
test_otel_api_interoperability.py: missing_feature
test_otel_env_vars.py:
Test_Otel_Env_Vars: v1.35.2
Expand All @@ -1978,7 +1978,7 @@ tests/:
Test_Parametric_DDSpan_Add_Link: incomplete_test_app (add_link endpoint is not implemented)
Test_Parametric_DDTrace_Baggage: incomplete_test_app (baggage endpoints are not implemented)
Test_Parametric_DDTrace_Crash: bug (APMAPI-778) # The crash endpoint does not kill the application
Test_Parametric_DDTrace_Current_Span: bug (APMAPI-778) # Fails to retreive the current span after a span has finished
Test_Parametric_DDTrace_Current_Span: bug (APMAPI-778) # Fails to retrieve the current span after a span has finished
Test_Parametric_Otel_Baggage: missing_feature (otel baggage is not supported)
Test_Parametric_Otel_Current_Span: bug (APMAPI-778) # Current span endpoint does not return DataDog spans created by the otel api
test_process_discovery.py: missing_feature
Expand Down Expand Up @@ -2127,15 +2127,23 @@ tests/:
Test_ExtractBehavior_Default:
'*': incomplete_test_app (weblog endpoint not implemented)
spring-boot: v1.48.0
vertx3: v1.48.0
vertx4: v1.48.0
Test_ExtractBehavior_Ignore:
'*': incomplete_test_app (weblog endpoint not implemented)
spring-boot: bug (APMAPI-1443)
vertx3: bug (APMAPI-1443)
vertx4: bug (APMAPI-1443)
Test_ExtractBehavior_Restart:
'*': incomplete_test_app (weblog endpoint not implemented)
spring-boot: v1.48.0
vertx3: v1.48.0
vertx4: v1.48.0
Test_ExtractBehavior_Restart_With_Extract_First:
'*': incomplete_test_app (weblog endpoint not implemented)
spring-boot: v1.48.0
vertx3: v1.48.0
vertx4: v1.48.0
Test_HeaderTags:
'*': v1.35.0
spring-boot-3-native: missing_feature (GraalVM. Tracing support only)
Expand Down
54 changes: 27 additions & 27 deletions tests/test_library_conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -350,9 +350,9 @@ def test_single_tracecontext(self):
data = json.loads(self.r.text)
assert data is not None

assert data["request_headers"]["x-datadog-trace-id"] == "1"
assert "_dd.p.tid=1111111111111111" in data["request_headers"]["x-datadog-tags"]
assert "key1=value1" in data["request_headers"]["baggage"]
assert data["request_headers"].get("x-datadog-trace-id") == "1", data["request_headers"]
assert "_dd.p.tid=1111111111111111" in data["request_headers"].get("x-datadog-tags"), data["request_headers"]
assert "key1=value1" in data["request_headers"].get("baggage"), data["request_headers"]

def setup_multiple_tracecontexts(self):
self.r = weblog.get(
Expand Down Expand Up @@ -398,9 +398,9 @@ def test_multiple_tracecontexts(self):
data = json.loads(self.r.text)
assert data is not None

assert data["request_headers"]["x-datadog-trace-id"] == "2"
assert "_dd.p.tid=1111111111111111" in data["request_headers"]["x-datadog-tags"]
assert "key1=value1" in data["request_headers"]["baggage"]
assert data["request_headers"].get("x-datadog-trace-id") == "2", data["request_headers"]
assert "_dd.p.tid=1111111111111111" in data["request_headers"].get("x-datadog-tags"), data["request_headers"]
assert "key1=value1" in data["request_headers"].get("baggage"), data["request_headers"]


@scenarios.tracing_config_nondefault
Expand Down Expand Up @@ -453,9 +453,9 @@ def test_single_tracecontext(self):
data = json.loads(self.r.text)
assert data is not None

assert data["request_headers"]["x-datadog-trace-id"] != "1"
assert "_dd.p.tid=1111111111111111" not in data["request_headers"]["x-datadog-tags"]
assert "key1=value1" in data["request_headers"]["baggage"]
assert data["request_headers"].get("x-datadog-trace-id") != "1", data["request_headers"]
assert "_dd.p.tid=1111111111111111" not in data["request_headers"].get("x-datadog-tags"), data["request_headers"]
assert "key1=value1" in data["request_headers"].get("baggage"), data["request_headers"]

def setup_multiple_tracecontexts(self):
self.r = weblog.get(
Expand Down Expand Up @@ -508,9 +508,9 @@ def test_multiple_tracecontexts(self):
data = json.loads(self.r.text)
assert data is not None

assert data["request_headers"]["x-datadog-trace-id"] != "1"
assert "_dd.p.tid=1111111111111111" not in data["request_headers"]["x-datadog-tags"]
assert "key1=value1" in data["request_headers"]["baggage"]
assert data["request_headers"].get("x-datadog-trace-id") != "1", data["request_headers"]
assert "_dd.p.tid=1111111111111111" not in data["request_headers"].get("x-datadog-tags"), data["request_headers"]
assert "key1=value1" in data["request_headers"].get("baggage"), data["request_headers"]

def setup_multiple_tracecontexts_with_overrides(self):
self.r = weblog.get(
Expand Down Expand Up @@ -562,9 +562,9 @@ def test_multiple_tracecontexts_with_overrides(self):
data = json.loads(self.r.text)
assert data is not None

assert data["request_headers"]["x-datadog-trace-id"] != "1"
assert "_dd.p.tid=1111111111111111" not in data["request_headers"]["x-datadog-tags"]
assert "key1=value1" in data["request_headers"]["baggage"]
assert data["request_headers"].get("x-datadog-trace-id") != "1", data["request_headers"]
assert "_dd.p.tid=1111111111111111" not in data["request_headers"].get("x-datadog-tags"), data["request_headers"]
assert "key1=value1" in data["request_headers"].get("baggage"), data["request_headers"]


@scenarios.tracing_config_nondefault_2
Expand Down Expand Up @@ -605,9 +605,9 @@ def test_single_tracecontext(self):
data = json.loads(self.r.text)
assert data is not None

assert data["request_headers"]["x-datadog-trace-id"] != "1"
assert "_dd.p.tid=1111111111111111" not in data["request_headers"]["x-datadog-tags"]
assert "baggage" not in data["request_headers"]
assert data["request_headers"].get("x-datadog-trace-id") != "1", data["request_headers"]
assert "_dd.p.tid=1111111111111111" not in data["request_headers"].get("x-datadog-tags"), data["request_headers"]
assert "baggage" not in data["request_headers"], data["request_headers"]

def setup_multiple_tracecontexts(self):
self.r = weblog.get(
Expand Down Expand Up @@ -648,9 +648,9 @@ def test_multiple_tracecontexts(self):
data = json.loads(self.r.text)
assert data is not None

assert data["request_headers"]["x-datadog-trace-id"] != "2"
assert "_dd.p.tid=1111111111111111" not in data["request_headers"]["x-datadog-tags"]
assert "baggage" not in data["request_headers"]
assert data["request_headers"].get("x-datadog-trace-id") != "2", data["request_headers"]
assert "_dd.p.tid=1111111111111111" not in data["request_headers"].get("x-datadog-tags"), data["request_headers"]
assert "baggage" not in data["request_headers"], data["request_headers"]


@scenarios.tracing_config_nondefault_3
Expand Down Expand Up @@ -703,9 +703,9 @@ def test_single_tracecontext(self):
data = json.loads(self.r.text)
assert data is not None

assert data["request_headers"]["x-datadog-trace-id"] != "1"
assert "_dd.p.tid=1111111111111111" not in data["request_headers"]["x-datadog-tags"]
assert "key1=value1" in data["request_headers"]["baggage"]
assert data["request_headers"].get("x-datadog-trace-id") != "1", data["request_headers"]
assert "_dd.p.tid=1111111111111111" not in data["request_headers"].get("x-datadog-tags"), data["request_headers"]
assert "key1=value1" in data["request_headers"].get("baggage"), data["request_headers"]

def setup_multiple_tracecontexts(self):
self.r = weblog.get(
Expand Down Expand Up @@ -757,6 +757,6 @@ def test_multiple_tracecontexts(self):
data = json.loads(self.r.text)
assert data is not None

assert data["request_headers"]["x-datadog-trace-id"] != "1"
assert "_dd.p.tid=1111111111111111" not in data["request_headers"]["x-datadog-tags"]
assert "key1=value1" in data["request_headers"]["baggage"]
assert data["request_headers"].get("x-datadog-trace-id") != "1", data["request_headers"]
assert "_dd.p.tid=1111111111111111" not in data["request_headers"].get("x-datadog-tags"), data["request_headers"]
assert "key1=value1" in data["request_headers"].get("baggage"), data["request_headers"]
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import datadog.trace.api.interceptor.MutableSpan;
import io.opentracing.Span;
import io.opentracing.util.GlobalTracer;
import io.vertx.core.MultiMap;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpServer;
import io.vertx.ext.web.Router;
Expand All @@ -23,6 +24,7 @@
import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.core.json.JsonObject;

import java.util.List;
import javax.naming.directory.InitialDirContext;
import javax.sql.DataSource;
import java.io.IOException;
Expand Down Expand Up @@ -339,6 +341,41 @@ public void onResponse(Call call, Response response) throws IOException {
setRootSpanTag("service", serviceName);
ctx.response().end("ok");
});
router.get("/make_distant_call")
.handler(ctx -> {
String url = ctx.request().getParam("url");

Request request = new Request.Builder()
.url(url)
.build();

client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
ctx.response().setStatusCode(500).end(e.getMessage());
}

@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
ctx.response().setStatusCode(500).end(response.message());
} else {
Map<String, String> requestHeaders = call.request().headers().toMultimap().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> String.join(", ", entry.getValue())));
Map<String, String> responseHeaders = response.headers().toMultimap().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> String.join(", ", entry.getValue())));

JsonObject responseJson = new JsonObject();
responseJson.put("status_code", response.code());
responseJson.put("request_headers", requestHeaders);
responseJson.put("response_headers", responseHeaders);
responseJson.put("url", url);

ctx.response().setStatusCode(200).end(responseJson.encode());
}
}
});
});
Router sessionRouter = Router.router(vertx);
sessionRouter.get().handler(CookieHandler.create());
sessionRouter.get().handler(SessionHandler.create(LocalSessionStore.create(vertx)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,41 @@ public void onResponse(Call call, Response response) throws IOException {
setRootSpanTag("service", serviceName);
ctx.response().end("ok");
});
router.get("/make_distant_call")
.handler(ctx -> {
String url = ctx.request().getParam("url");

Request request = new Request.Builder()
.url(url)
.build();

client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
ctx.response().setStatusCode(500).end(e.getMessage());
}

@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
ctx.response().setStatusCode(500).end(response.message());
} else {
Map<String, String> requestHeaders = call.request().headers().toMultimap().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> String.join(", ", entry.getValue())));
Map<String, String> responseHeaders = response.headers().toMultimap().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> String.join(", ", entry.getValue())));

JsonObject responseJson = new JsonObject();
responseJson.put("status_code", response.code());
responseJson.put("request_headers", requestHeaders);
responseJson.put("response_headers", responseHeaders);
responseJson.put("url", url);

ctx.response().setStatusCode(200).end(responseJson.encode());
}
}
});
});

Router sessionRouter = Router.router(vertx);
sessionRouter.get().handler(SessionHandler.create(LocalSessionStore.create(vertx)));
Expand Down
Loading