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(), )
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(), )
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", }, )
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
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