def test_mw_exc_success(self): """Ensure exceptions can be properly handled by other middleware. No error should be reported in the span. """ from .app.middleware import ExceptionMiddleware from .app.middleware import ExceptionToSuccessMiddleware wsgiapp = ExceptionMiddleware(self._wsgiapp) wsgiapp = ExceptionToSuccessMiddleware(wsgiapp) app = PylonsTraceMiddleware(wsgiapp, self.tracer, service="web") app = fixture.TestApp(app) app.get(url_for(controller="root", action="index")) spans = self.pop_spans() assert spans, spans assert len(spans) == 1 span = spans[0] assert_is_measured(span) assert span.service == "web" assert span.resource == "None.None" assert span.error == 0 assert span.get_tag(http.URL) == "http://localhost:80/" assert_span_http_status_code(span, 200) assert span.get_tag(errors.ERROR_MSG) is None assert span.get_tag(errors.ERROR_TYPE) is None assert span.get_tag(errors.ERROR_STACK) is None
def test_middleware_exception(self): """Ensure exceptions raised in middleware are properly handled. Uncaught exceptions should result in error tagged spans. """ from .app.middleware import ExceptionMiddleware wsgiapp = ExceptionMiddleware(self._wsgiapp) app = PylonsTraceMiddleware(wsgiapp, self.tracer, service="web") app = fixture.TestApp(app) with pytest.raises(Exception): app.get(url_for(controller="root", action="index")) spans = self.pop_spans() assert spans, spans assert len(spans) == 1 span = spans[0] assert_is_measured(span) assert span.service == "web" assert span.resource == "None.None" assert span.error == 1 assert span.get_tag(http.URL) == "http://localhost:80/" assert_span_http_status_code(span, 500) assert span.get_tag(errors.ERROR_MSG) == "Middleware exception" assert span.get_tag(errors.ERROR_TYPE) == "exceptions.Exception" assert span.get_tag(errors.ERROR_STACK)
def test_controller_exception(self): """Ensure exceptions thrown in controllers can be handled. No error tags should be set in the span. """ from .app.middleware import ExceptionToSuccessMiddleware wsgiapp = ExceptionToSuccessMiddleware(self._wsgiapp) app = PylonsTraceMiddleware(wsgiapp, self.tracer, service="web") app = fixture.TestApp(app) app.get(url_for(controller="root", action="raise_exception")) spans = self.pop_spans() assert spans, spans assert len(spans) == 1 span = spans[0] assert_is_measured(span) assert span.service == "web" assert span.resource == "root.raise_exception" assert span.error == 0 assert span.get_tag(http.URL) == "http://localhost:80/raise_exception" assert_span_http_status_code(span, 200) assert http.QUERY_STRING not in span.meta assert span.get_tag(errors.ERROR_MSG) is None assert span.get_tag(errors.ERROR_TYPE) is None assert span.get_tag(errors.ERROR_STACK) is None assert span.span_type == "web"
def test_success_200_ot(self): """OpenTracing version of test_success_200.""" ot_tracer = init_tracer("pylons_svc", self.tracer) with ot_tracer.start_active_span("pylons_get"): res = self.app.get(url_for(controller="root", action="index")) assert res.status == 200 spans = self.pop_spans() assert spans, spans assert len(spans) == 2 ot_span, dd_span = spans # confirm the parenting assert ot_span.parent_id is None assert dd_span.parent_id == ot_span.span_id assert ot_span.name == "pylons_get" assert ot_span.service == "pylons_svc" assert dd_span.service == "web" assert dd_span.resource == "root.index" assert_span_http_status_code(dd_span, 200) assert dd_span.meta.get(http.URL) == "http://localhost:80/" assert dd_span.error == 0
def test_error(self): self.getPage("/error") time.sleep(0.1) self.assertErrorPage(500) # ensure the request was traced. assert not self.tracer.current_span() spans = self.pop_spans() assert len(spans) == 1 s = spans[0] assert s.service == "test.cherrypy.service" assert s.resource == "GET /error" assert_span_http_status_code(s, 500) assert s.error == 1 assert s.meta.get(http.METHOD) == "GET"
def test_handleme(self): self.getPage("/handleme") time.sleep(0.1) self.assertErrorPage(418, message="handled") # ensure trace worked assert not self.tracer.current_span(), self.tracer.current_span( ).pprint() spans = self.pop_spans() assert len(spans) == 1 s = spans[0] assert s.service == "test.cherrypy.service" assert s.resource == "GET /handleme" assert s.error == 0 assert_span_http_status_code(s, 418) assert s.meta.get(http.METHOD) == "GET"
def test_failure_500(self): with pytest.raises(Exception): self.app.get(url_for(controller="root", action="raise_exception")) spans = self.pop_spans() assert spans, spans assert len(spans) == 1 span = spans[0] assert span.service == "web" assert span.resource == "root.raise_exception" assert span.error == 1 assert_span_http_status_code(span, 500) assert span.get_tag("error.msg") == "Ouch!" assert span.get_tag(http.URL) == "http://localhost:80/raise_exception" assert "Exception: Ouch!" in span.get_tag("error.stack")
def test_404(self): self.getPage(u"/404/test") time.sleep(0.1) self.assertStatus("404 Not Found") # ensure trace worked assert not self.tracer.current_span(), self.tracer.current_span( ).pprint() spans = self.pop_spans() assert len(spans) == 1 s = spans[0] assert s.service == "test.cherrypy.service" assert s.resource == u"GET /404/test" assert s.error == 0 assert_span_http_status_code(s, 404) assert s.meta.get(http.METHOD) == "GET" assert s.meta.get(http.URL) == u"http://127.0.0.1:54583/404/test"
def test_custom_span(self): self.getPage(u"/custom_span") time.sleep(0.1) self.assertStatus("200 OK") self.assertBody("hiya") # ensure trace worked assert not self.tracer.current_span(), self.tracer.current_span( ).pprint() spans = self.pop_spans() assert len(spans) == 1 s = spans[0] assert s.service == "test.cherrypy.service" assert s.resource == "overridden" assert s.error == 0 assert_span_http_status_code(s, 200) assert s.meta.get(http.METHOD) == "GET"
def test_alias(self): self.getPage("/aliases") time.sleep(0.1) self.assertStatus("200 OK") self.assertHeader("Content-Type", "text/html;charset=utf-8") self.assertBody("alias") assert not self.tracer.current_span(), self.tracer.current_span( ).pprint() spans = self.pop_spans() assert len(spans) == 1 s = spans[0] assert s.service == "test.cherrypy.service" assert s.resource == "GET /aliases" assert s.error == 0 assert_span_http_status_code(s, 200) assert s.meta.get(http.METHOD) == "GET"
def test_post(self): self.getPage("/", method="POST") time.sleep(0.1) self.assertStatus("200 OK") self.assertHeader("Content-Type", "text/html;charset=utf-8") self.assertBody("Hello world!") # ensure trace worked assert not self.tracer.current_span(), self.tracer.current_span( ).pprint() spans = self.pop_spans() assert len(spans) == 1 s = spans[0] assert s.service == "test.cherrypy.service" assert s.resource == "POST /" assert s.error == 0 assert_span_http_status_code(s, 200) assert s.meta.get(http.METHOD) == "POST"
def test_template_render(self): res = self.app.get(url_for(controller="root", action="render")) assert res.status == 200 spans = self.pop_spans() assert spans, spans assert len(spans) == 2 request = spans[0] template = spans[1] assert request.service == "web" assert request.resource == "root.render" assert_span_http_status_code(request, 200) assert request.error == 0 assert template.service == "web" assert template.resource == "pylons.render" assert template.meta.get("template.name") == "/template.mako" assert template.error == 0
def test_fatal(self): self.getPage("/fatal") time.sleep(0.1) self.assertErrorPage(500) assert not self.tracer.current_span() spans = self.pop_spans() assert len(spans) == 1 s = spans[0] assert s.service == "test.cherrypy.service" assert s.resource == "GET /fatal" assert_span_http_status_code(s, 500) assert s.error == 1 assert s.meta.get(http.METHOD) == "GET" assert "ZeroDivisionError" in s.meta.get(errors.ERROR_TYPE), s.meta assert "by zero" in s.meta.get(errors.ERROR_MSG) assert re.search( 'File ".*/contrib/cherrypy/web.py", line [0-9]+, in fatal', s.meta.get(errors.ERROR_STACK))
def test_variable_resource(self): self.getPage("/dispatch/abc123/") time.sleep(0.1) self.assertStatus("200 OK") self.assertHeader("Content-Type", "text/html;charset=utf-8") self.assertBody("dispatch with abc123") # ensure trace worked assert not self.tracer.current_span(), self.tracer.current_span( ).pprint() spans = self.pop_spans() assert len(spans) == 1 s = spans[0] assert s.service == "test.cherrypy.service" # Once CherryPy returns sensible results for virtual path components, this # can be: "GET /dispatch/{{test_value}}/" assert s.resource == "GET /dispatch/abc123/" assert s.error == 0 assert_span_http_status_code(s, 200) assert s.meta.get(http.METHOD) == "GET"
def test_success_200(self, query_string=""): if query_string: fqs = "?" + query_string else: fqs = "" res = self.app.get(url_for(controller="root", action="index") + fqs) assert res.status == 200 spans = self.pop_spans() assert spans, spans assert len(spans) == 1 span = spans[0] assert_is_measured(span) assert span.service == "web" assert span.resource == "root.index" assert_span_http_status_code(span, 200) if config.pylons.trace_query_string: assert span.meta.get(http.QUERY_STRING) == query_string else: assert http.QUERY_STRING not in span.meta assert span.error == 0
def test_service_configuration_middleware(self): previous_service = cherrypy.tools.tracer.service cherrypy.tools.tracer.service = "my_cherrypy_service2" self.getPage("/") time.sleep(0.1) self.assertStatus("200 OK") self.assertHeader("Content-Type", "text/html;charset=utf-8") self.assertBody("Hello world!") # ensure trace worked assert not self.tracer.current_span(), self.tracer.current_span( ).pprint() spans = self.pop_spans() assert len(spans) == 1 s = spans[0] assert s.service == "my_cherrypy_service2" assert s.resource == "GET /" assert s.error == 0 assert_span_http_status_code(s, 200) assert s.meta.get(http.METHOD) == "GET" cherrypy.tools.tracer.service = previous_service
def test_template_render_exception(self): with pytest.raises(Exception): self.app.get(url_for(controller="root", action="render_exception")) spans = self.pop_spans() assert spans, spans assert len(spans) == 2 request = spans[0] template = spans[1] assert request.service == "web" assert request.resource == "root.render_exception" assert_span_http_status_code(request, 500) assert request.error == 1 assert template.service == "web" assert template.resource == "pylons.render" assert template.meta.get("template.name") == "/exception.mako" assert template.error == 1 assert template.get_tag( "error.msg") == "integer division or modulo by zero" assert "ZeroDivisionError: integer division or modulo by zero" in template.get_tag( "error.stack")
def test_exc_success(self): from .app.middleware import ExceptionToSuccessMiddleware wsgiapp = ExceptionToSuccessMiddleware(self._wsgiapp) app = PylonsTraceMiddleware(wsgiapp, self.tracer, service="web") app = fixture.TestApp(app) app.get(url_for(controller="root", action="raise_exception")) spans = self.pop_spans() assert spans, spans assert len(spans) == 1 span = spans[0] assert_is_measured(span) assert span.service == "web" assert span.resource == "root.raise_exception" assert span.error == 0 assert span.get_tag(http.URL) == "http://localhost:80/raise_exception" assert_span_http_status_code(span, 200) assert span.get_tag(errors.ERROR_MSG) is None assert span.get_tag(errors.ERROR_TYPE) is None assert span.get_tag(errors.ERROR_STACK) is None
def test_unicode(self): # Encoded utf8 query strings MUST be parsed correctly. # Here, the URL is encoded in utf8 and then %HEX # See https://docs.cherrypy.org/en/latest/_modules/cherrypy/test/test_encoding.html for more self.getPage(url_quote(u"/üŋïĉóđē".encode("utf-8"))) time.sleep(0.1) self.assertStatus("200 OK") self.assertHeader("Content-Type", "text/html;charset=utf-8") self.assertBody( b"\xc3\xbc\xc5\x8b\xc3\xaf\xc4\x89\xc3\xb3\xc4\x91\xc4\x93") # ensure trace worked assert not self.tracer.current_span(), self.tracer.current_span( ).pprint() spans = self.pop_spans() assert len(spans) == 1 s = spans[0] assert s.service == "test.cherrypy.service" assert s.resource == u"GET /üŋïĉóđē" assert s.error == 0 assert_span_http_status_code(s, 200) assert s.meta.get(http.METHOD) == "GET" assert s.meta.get(http.URL) == u"http://127.0.0.1:54583/üŋïĉóđē"