Example #1
0
 def test_request_attributes_with_conflicting_nonstandard_port(self):
     self.environ[
         "HTTP_HOST"] += ":8080"  # Note that we do not correct SERVER_PORT
     expected = {
         "http.host": "127.0.0.1:8080",
         "http.url": "http://127.0.0.1:8080/",
         "host.port": 80,
     }
     self.assertGreaterEqual(
         otel_wsgi.collect_request_attributes(self.environ).items(),
         expected.items(),
     )
Example #2
0
 def test_request_attributes_with_full_request_uri(self):
     self.environ["HTTP_HOST"] = "127.0.0.1:8080"
     self.environ["REQUEST_METHOD"] = "CONNECT"
     self.environ[
         "REQUEST_URI"] = "127.0.0.1:8080"  # Might happen in a CONNECT request
     expected = {
         "http.host": "127.0.0.1:8080",
         "http.target": "127.0.0.1:8080",
     }
     self.assertGreaterEqual(
         otel_wsgi.collect_request_attributes(self.environ).items(),
         expected.items(),
     )
Example #3
0
    def test_request_attributes(self):
        self.environ["QUERY_STRING"] = "foo=bar"

        attrs = otel_wsgi.collect_request_attributes(self.environ)
        self.assertDictEqual(
            attrs,
            {
                "component": "http",
                "http.method": "GET",
                "http.host": "127.0.0.1",
                "http.url": "http://127.0.0.1/?foo=bar",
                "host.port": 80,
                "http.scheme": "http",
                "http.server_name": "127.0.0.1",
                "http.flavor": "1.0",
            },
        )
Example #4
0
    def validate_url(self, expected_url, raw=False, has_host=True):
        parts = urlsplit(expected_url)
        expected = {
            "http.scheme": parts.scheme,
            "host.port": parts.port or (80 if parts.scheme == "http" else 443),
            "http.server_name":
            parts.hostname,  # Not true in the general case, but for all tests.
        }
        if raw:
            expected["http.target"] = expected_url.split(parts.netloc, 1)[1]
        else:
            expected["http.url"] = expected_url
        if has_host:
            expected["http.host"] = parts.hostname

        attrs = otel_wsgi.collect_request_attributes(self.environ)
        self.assertGreaterEqual(attrs.items(), expected.items(),
                                expected_url + " expected.")
def _before_traversal(event):
    request = event.request
    environ = request.environ
    span_name = otel_wsgi.get_default_span_name(environ)

    enabled = environ.get(_ENVIRON_ENABLED_KEY)
    if enabled is None:
        _logger.warning(
            "Opentelemetry pyramid tween 'opentelemetry.ext.pyramid.trace_tween_factory'"
            "was not called. Make sure that the tween is included in 'pyramid.tweens' if"
            "the tween list was created manually")
        return

    if not enabled:
        # Tracing not enabled, return
        return

    start_time = environ.get(_ENVIRON_STARTTIME_KEY)

    token = context.attach(
        propagators.extract(otel_wsgi.get_header_from_environ, environ))
    tracer = trace.get_tracer(__name__, __version__)

    attributes = otel_wsgi.collect_request_attributes(environ)

    if request.matched_route:
        span_name = request.matched_route.pattern
        attributes["http.route"] = request.matched_route.pattern
    else:
        span_name = otel_wsgi.get_default_span_name(environ)

    span = tracer.start_span(
        span_name,
        kind=trace.SpanKind.SERVER,
        attributes=attributes,
        start_time=start_time,
    )

    activation = tracer.use_span(span, end_on_exit=True)
    activation.__enter__()
    environ[_ENVIRON_ACTIVATION_KEY] = activation
    environ[_ENVIRON_SPAN_KEY] = span
    environ[_ENVIRON_TOKEN] = token
Example #6
0
def _before_flask_request():
    environ = flask_request.environ
    span_name = flask_request.endpoint or otel_wsgi.get_default_span_name(
        environ)
    parent_span = propagators.extract(otel_wsgi.get_header_from_environ,
                                      environ)

    tracer = trace.tracer_source().get_tracer(__name__, __version__)

    attributes = otel_wsgi.collect_request_attributes(environ)
    if flask_request.url_rule:
        # For 404 that result from no route found, etc, we don't have a url_rule.
        attributes["http.route"] = flask_request.url_rule.rule
    span = tracer.start_span(
        span_name,
        parent_span,
        kind=trace.SpanKind.SERVER,
        attributes=attributes,
        start_time=environ.get(_ENVIRON_STARTTIME_KEY),
    )
    activation = tracer.use_span(span, end_on_exit=True)
    activation.__enter__()
    environ[_ENVIRON_ACTIVATION_KEY] = activation
    environ[_ENVIRON_SPAN_KEY] = span