Mark all http status codes 5xx as an error.
This commit is contained in:
parent
b5759bd15c
commit
b5b38ee4b1
|
@ -166,6 +166,46 @@ class JettyServletTest extends AgentTestRunner {
|
||||||
"sync" | "Hello Sync"
|
"sync" | "Hello Sync"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Unroll
|
||||||
|
def "test #path non-throwing-error servlet call"() {
|
||||||
|
setup:
|
||||||
|
def request = new Request.Builder()
|
||||||
|
.url("http://localhost:$PORT/$path?non-throwing-error=true")
|
||||||
|
.get()
|
||||||
|
.build()
|
||||||
|
def response = client.newCall(request).execute()
|
||||||
|
|
||||||
|
expect:
|
||||||
|
response.body().string().trim() != expectedResponse
|
||||||
|
writer.size() == 2 // second (parent) trace is the okhttp call above...
|
||||||
|
def trace = writer.firstTrace()
|
||||||
|
trace.size() == 1
|
||||||
|
def span = trace[0]
|
||||||
|
|
||||||
|
span.context().serviceName == "unnamed-java-app"
|
||||||
|
span.context().operationName == "servlet.request"
|
||||||
|
span.context().resourceName == "GET /$path"
|
||||||
|
span.context().spanType == DDSpanTypes.WEB_SERVLET
|
||||||
|
span.context().getErrorFlag()
|
||||||
|
span.context().parentId != 0 // parent should be the okhttp call.
|
||||||
|
span.context().tags["http.url"] == "http://localhost:$PORT/$path"
|
||||||
|
span.context().tags["http.method"] == "GET"
|
||||||
|
span.context().tags["span.kind"] == "server"
|
||||||
|
span.context().tags["component"] == "java-web-servlet"
|
||||||
|
span.context().tags["http.status_code"] == 500
|
||||||
|
span.context().tags["thread.name"] != null
|
||||||
|
span.context().tags["thread.id"] != null
|
||||||
|
span.context().tags["error"] == true
|
||||||
|
span.context().tags["error.msg"] == null
|
||||||
|
span.context().tags["error.type"] == null
|
||||||
|
span.context().tags["error.stack"] == null
|
||||||
|
span.context().tags.size() == 9
|
||||||
|
|
||||||
|
where:
|
||||||
|
path | expectedResponse
|
||||||
|
"sync" | "Hello Sync"
|
||||||
|
}
|
||||||
|
|
||||||
private static int randomOpenPort() {
|
private static int randomOpenPort() {
|
||||||
new ServerSocket(0).withCloseable {
|
new ServerSocket(0).withCloseable {
|
||||||
it.setReuseAddress(true)
|
it.setReuseAddress(true)
|
||||||
|
|
|
@ -13,6 +13,10 @@ class TestServlet {
|
||||||
if (req.getParameter("error") != null) {
|
if (req.getParameter("error") != null) {
|
||||||
throw new RuntimeException("some sync error")
|
throw new RuntimeException("some sync error")
|
||||||
}
|
}
|
||||||
|
if (req.getParameter("non-throwing-error") != null) {
|
||||||
|
resp.sendError(500, "some sync error")
|
||||||
|
return
|
||||||
|
}
|
||||||
resp.writer.print("Hello Sync")
|
resp.writer.print("Hello Sync")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,6 +166,46 @@ class TomcatServletTest extends AgentTestRunner {
|
||||||
"sync" | "Hello Sync"
|
"sync" | "Hello Sync"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Unroll
|
||||||
|
def "test #path error servlet call for non-throwing error"() {
|
||||||
|
setup:
|
||||||
|
def request = new Request.Builder()
|
||||||
|
.url("http://localhost:$PORT/$path?non-throwing-error=true")
|
||||||
|
.get()
|
||||||
|
.build()
|
||||||
|
def response = client.newCall(request).execute()
|
||||||
|
|
||||||
|
expect:
|
||||||
|
response.body().string().trim() != expectedResponse
|
||||||
|
writer.size() == 2 // second (parent) trace is the okhttp call above...
|
||||||
|
def trace = writer.firstTrace()
|
||||||
|
trace.size() == 1
|
||||||
|
def span = trace[0]
|
||||||
|
|
||||||
|
span.context().serviceName == "unnamed-java-app"
|
||||||
|
span.context().operationName == "servlet.request"
|
||||||
|
span.context().resourceName == "GET /$path"
|
||||||
|
span.context().spanType == DDSpanTypes.WEB_SERVLET
|
||||||
|
span.context().getErrorFlag()
|
||||||
|
span.context().parentId != 0 // parent should be the okhttp call.
|
||||||
|
span.context().tags["http.url"] == "http://localhost:$PORT/$path"
|
||||||
|
span.context().tags["http.method"] == "GET"
|
||||||
|
span.context().tags["span.kind"] == "server"
|
||||||
|
span.context().tags["component"] == "java-web-servlet"
|
||||||
|
span.context().tags["http.status_code"] == 500
|
||||||
|
span.context().tags["thread.name"] != null
|
||||||
|
span.context().tags["thread.id"] != null
|
||||||
|
span.context().tags["error"] == true
|
||||||
|
span.context().tags["error.msg"] == null
|
||||||
|
span.context().tags["error.type"] == null
|
||||||
|
span.context().tags["error.stack"] == null
|
||||||
|
span.context().tags.size() == 9
|
||||||
|
|
||||||
|
where:
|
||||||
|
path | expectedResponse
|
||||||
|
"sync" | "Hello Sync"
|
||||||
|
}
|
||||||
|
|
||||||
private static int randomOpenPort() {
|
private static int randomOpenPort() {
|
||||||
new ServerSocket(0).withCloseable {
|
new ServerSocket(0).withCloseable {
|
||||||
it.setReuseAddress(true)
|
it.setReuseAddress(true)
|
||||||
|
|
|
@ -148,7 +148,6 @@ class SpringBootBasedTest extends AgentTestRunner {
|
||||||
span1.context().operationName == "servlet.request"
|
span1.context().operationName == "servlet.request"
|
||||||
span1.context().resourceName == "GET /error"
|
span1.context().resourceName == "GET /error"
|
||||||
span1.context().spanType == DDSpanTypes.WEB_SERVLET
|
span1.context().spanType == DDSpanTypes.WEB_SERVLET
|
||||||
!span1.context().getErrorFlag()
|
|
||||||
span1.context().parentId == 0
|
span1.context().parentId == 0
|
||||||
span1.context().tags["http.url"] == "http://localhost:$port/error"
|
span1.context().tags["http.url"] == "http://localhost:$port/error"
|
||||||
span1.context().tags["http.method"] == "GET"
|
span1.context().tags["http.method"] == "GET"
|
||||||
|
@ -156,9 +155,10 @@ class SpringBootBasedTest extends AgentTestRunner {
|
||||||
span1.context().tags["span.type"] == "web"
|
span1.context().tags["span.type"] == "web"
|
||||||
span1.context().tags["component"] == "java-web-servlet"
|
span1.context().tags["component"] == "java-web-servlet"
|
||||||
span1.context().tags["http.status_code"] == 500
|
span1.context().tags["http.status_code"] == 500
|
||||||
|
span1.context().getErrorFlag()
|
||||||
span1.context().tags["thread.name"] != null
|
span1.context().tags["thread.name"] != null
|
||||||
span1.context().tags["thread.id"] != null
|
span1.context().tags["thread.id"] != null
|
||||||
span1.context().tags.size() == 8
|
span1.context().tags.size() == 9
|
||||||
}
|
}
|
||||||
|
|
||||||
def "validated form"() {
|
def "validated form"() {
|
||||||
|
|
|
@ -25,6 +25,7 @@ public class DDDecoratorsFactory {
|
||||||
builtin.add(new OperationDecorator());
|
builtin.add(new OperationDecorator());
|
||||||
builtin.add(new Status404Decorator());
|
builtin.add(new Status404Decorator());
|
||||||
builtin.add(new URLAsResourceName());
|
builtin.add(new URLAsResourceName());
|
||||||
|
builtin.add(new Status5XXDecorator());
|
||||||
|
|
||||||
return builtin;
|
return builtin;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
package datadog.opentracing.decorators;
|
||||||
|
|
||||||
|
import datadog.opentracing.DDSpanContext;
|
||||||
|
import io.opentracing.tag.Tags;
|
||||||
|
|
||||||
|
/** Mark all 5xx status codes as an error */
|
||||||
|
public class Status5XXDecorator extends AbstractDecorator {
|
||||||
|
public Status5XXDecorator() {
|
||||||
|
super();
|
||||||
|
this.setMatchingTag(Tags.HTTP_STATUS.getKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean afterSetTag(final DDSpanContext context, final String tag, final Object value) {
|
||||||
|
if (Tags.HTTP_STATUS.getKey().equals(tag)) {
|
||||||
|
final int responseCode = Integer.parseInt(value.toString());
|
||||||
|
if (500 <= responseCode && responseCode < 600) {
|
||||||
|
context.setTag(Tags.ERROR.getKey(), true);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue