-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathConnectToUrl.java
More file actions
111 lines (102 loc) · 4.24 KB
/
Copy pathConnectToUrl.java
File metadata and controls
111 lines (102 loc) · 4.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package com.axway.apim.opentelemetry;
import com.vordel.circuit.Message;
import com.vordel.config.Circuit;
import com.vordel.mime.HeaderSet;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.semconv.HttpAttributes;
import org.aspectj.lang.ProceedingJoinPoint;
public class ConnectToUrl {
public Object httpClient(ProceedingJoinPoint pjp, Message message, Circuit circuit, HeaderSet requestHeaders, String httpVerb) throws Throwable {
Tracer tracer = Telemetry.getTracer("io.opentelemetry.axway.apim.http.HttpClient");
TextMapPropagator textMapPropagator = Telemetry.getTextMapPropagator();
if (tracer == null || textMapPropagator == null) {
return pjp.proceed();
}
Span span = null;
Scope scope = null;
try {
String requestUrl = Utils.getRequestURL(message);
span = tracer.spanBuilder(requestUrl).setSpanKind(SpanKind.CLIENT).startSpan();
scope = span.makeCurrent();
span.setAttribute(HttpAttributes.HTTP_REQUEST_METHOD, httpVerb);
span.setAttribute("component", "http");
span.setAttribute("Routing policy", circuit.getName());
String url = (String) message.get("destinationURL");
Utils.addHttpDetails(span, url, requestUrl, message);
Utils.addHttpHeaders(span, "request", (HeaderSet) message.get(Utils.HTTP_HEADERS));
textMapPropagator.inject(Context.current(), requestHeaders, Utils.setter);
} catch (Throwable e) {
closeScope(scope);
endSpan(span, message);
Telemetry.disable("HTTP client span setup", e);
return pjp.proceed();
}
Object pjpReturnObject;
Throwable pjpError = null;
try {
pjpReturnObject = pjp.proceed();
} catch (Throwable e) {
pjpError = e;
recordException(span, message, e);
throw e;
} finally {
closeScope(scope);
if (pjpError != null) {
endSpan(span, message);
}
}
recordResponse(span, message);
endSpan(span, message);
return pjpReturnObject;
}
private void recordResponse(Span span, Message message) {
try {
int httpStatus = (int) message.getOrDefault("http.response.status", 0);
String httpStatusMessage = (String) message.getOrDefault("http.response.info", "");
if (httpStatus > 400 && httpStatus < 500) {
span.setStatus(StatusCode.ERROR, httpStatusMessage);
} else if (httpStatus > 500) {
span.setStatus(StatusCode.ERROR, httpStatusMessage);
span.setAttribute("error.type", httpStatusMessage);
}
} catch (Throwable e) {
Telemetry.recordFailure("HTTP client response recording", e);
}
}
private void recordException(Span span, Message message, Throwable original) {
try {
int httpStatus = (int) message.getOrDefault("http.response.status", 0);
String httpStatusMessage = (String) message.getOrDefault("http.response.info", "");
span.setStatus(StatusCode.ERROR, httpStatus + "-" + httpStatusMessage);
span.recordException(original);
} catch (Throwable e) {
Telemetry.recordFailure("HTTP client exception recording", e);
}
}
private void endSpan(Span span, Message message) {
if (span == null) {
return;
}
try {
Utils.addHttpHeaders(span, "response", (HeaderSet) message.get(Utils.HTTP_HEADERS));
span.end();
} catch (Throwable e) {
Telemetry.recordFailure("HTTP client span close", e);
}
}
private void closeScope(Scope scope) {
if (scope != null) {
try {
scope.close();
} catch (Throwable e) {
Telemetry.recordFailure("HTTP client scope close", e);
}
}
}
}