Skip to content

Commit 7bb0c58

Browse files
authored
Merge pull request #8 from sekikatsu36/feature/update-apache-httpclinet-to-handle-error
update apache-httpclinet module to handle error
2 parents f288643 + 040c1bd commit 7bb0c58

File tree

6 files changed

+56
-11
lines changed

6 files changed

+56
-11
lines changed

.idea/gradle.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
## Release notes - 1.0.4 (2020-08-07)
88

9-
## Added
9+
### Added
1010

1111
- OkHttp integration
1212

jvm/apache-httpclient/README.md

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,31 @@
33
## How to setup
44

55
Add `M3TracingHttpInterceptor` as request/response interceptor of HttpClient.
6+
In addition, to close a span whenever failed to send a request, set M3TracingHttpRequestRetryHandler as HttpRequestRetryHandler.
67

78
### httpclient 4.2-
89

9-
```java:
10+
```java
11+
private static final M3TracingHttpRequestRetryHandler retryHander = new M3TracingHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler());
12+
```
13+
14+
```java
1015
// CAUTION: Must setup as BOTH interceptor otherwise it may cause memory leak.
1116
httpclient.addRequestInterceptor(M3TracingHttpInterceptor.INSTANCE);
1217
httpclient.addResponseInterceptor(M3TracingHttpInterceptor.INSTANCE);
18+
httpclient.setHttpRequestRetryHandler(retryHander);
1319
```
1420

1521
### httpclient 4.3+
1622

23+
```java
24+
private static final M3TracingHttpRequestRetryHandler retryHander = new M3TracingHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler());
25+
```
26+
1727
```java
1828
CloseableHttpClient httpClient = HttpClientBuilder.create()
1929
.addInterceptorFirst((HttpRequestInterceptor) M3TracingHttpInterceptor.INSTANCE)
2030
.addInterceptorLast((HttpResponseInterceptor) M3TracingHttpInterceptor.INSTANCE)
31+
.setRetryHandler(retryHander)
2132
.build();
2233
```
23-
}

jvm/apache-httpclient/src/main/kotlin/com/m3/tracing/apache/httpclient/M3TracingHttpInterceptor.kt

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,21 @@ open class M3TracingHttpInterceptor(
2828

2929
constructor() : this(M3TracerFactory.get())
3030

31+
internal fun closeSpan(callback: (span: TraceSpan) -> Unit) {
32+
val span = currentSpan.get()
33+
if(span == null) {
34+
logger.debug("Current span is not found. Unable to close and send span.")
35+
return
36+
}
37+
38+
doQuietly {
39+
callback(span)
40+
}
41+
span.close()
42+
currentSpan.set(null) // Prevent ClassLoader leak
43+
}
44+
45+
3146
override fun process(request: HttpRequest, context: HttpContext) {
3247
val requestInfo = ApacheHttpRequestInfo(request, context)
3348
val span = tracer.processOutgoingHttpRequest(requestInfo)
@@ -41,14 +56,9 @@ open class M3TracingHttpInterceptor(
4156
}
4257

4358
override fun process(response: HttpResponse, context: HttpContext) {
44-
val span = currentSpan.get() ?: return
45-
currentSpan.set(null) // Prevent ClassLoader leak
46-
47-
// Must continue to span.close() statement to prevent memory leak
48-
doQuietly {
49-
span["status"] = response.statusLine.statusCode
59+
closeSpan {
60+
it["status"] = response.statusLine.statusCode
5061
}
51-
span.close()
5262
}
5363

5464
/**
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.m3.tracing.apache.httpclient
2+
3+
import org.apache.http.client.HttpRequestRetryHandler
4+
import org.apache.http.protocol.HttpContext
5+
import org.slf4j.LoggerFactory
6+
import java.io.IOException
7+
8+
open class M3TracingHttpRequestRetryHandler(private val baseHandler: HttpRequestRetryHandler) : HttpRequestRetryHandler {
9+
companion object {
10+
private val logger = LoggerFactory.getLogger(M3TracingHttpRequestRetryHandler::class.java)
11+
}
12+
13+
override fun retryRequest(exception: IOException?, executionCount: Int, context: HttpContext?): Boolean {
14+
val result = baseHandler.retryRequest(exception, executionCount, context)
15+
16+
// When not retrying, try to close current span
17+
if(!result) {
18+
M3TracingHttpInterceptor.INSTANCE.closeSpan {
19+
it["error"] = exception?.message
20+
}
21+
}
22+
return result
23+
}
24+
}

jvm/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ plugins {
1212

1313
allprojects {
1414
group = "com.m3.tracing"
15-
version = "1.0.4"
15+
version = "1.0.5-SNAPSHOT"
1616

1717
repositories {
1818
jcenter()

0 commit comments

Comments
 (0)