Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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"
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
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"
Ejemplo n.º 6
0
    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"
Ejemplo n.º 7
0
    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")
Ejemplo n.º 8
0
    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"
Ejemplo n.º 9
0
    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"
Ejemplo n.º 10
0
    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"
Ejemplo n.º 11
0
    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"
Ejemplo n.º 12
0
    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
Ejemplo n.º 13
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))
Ejemplo n.º 14
0
    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"
Ejemplo n.º 15
0
    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
Ejemplo n.º 16
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
Ejemplo n.º 17
0
    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")
Ejemplo n.º 18
0
    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
Ejemplo n.º 19
0
    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/üŋïĉóđē"