def _get_service_name(pin, request): # type: (Pin, httpx.Request) -> typing.Text if config.httpx.split_by_domain: if hasattr(request.url, "netloc"): return ensure_text(request.url.netloc, errors="backslashreplace") else: service = ensure_binary(request.url.host) if request.url.port: service += b":" + ensure_binary(str(request.url.port)) return ensure_text(service, errors="backslashreplace") return ext_service(pin, config.httpx)
async def _wrapped_async_send( wrapped, # type: BoundFunctionWrapper instance, # type: httpx.AsyncClient args, # type: typing.Tuple[httpx.Request], kwargs, # type: typing.Dict[typing.Str, typing.Any] ): # type: (...) -> typing.Coroutine[None, None, httpx.Response] req = get_argument_value(args, kwargs, 0, "request") pin = Pin.get_from(instance) if not pin or not pin.enabled(): return await wrapped(*args, **kwargs) with pin.tracer.trace("http.request", service=ext_service(pin, config.httpx), span_type=SpanTypes.HTTP) as span: _init_span(span, req) resp = None try: resp = await wrapped(*args, **kwargs) return resp finally: _set_span_meta(span, req, resp)
def test_ext_service(config, pin, config_val, default, expected): if config_val: config.myint.service = config_val assert trace_utils.ext_service(config.myint, pin, default) == expected
def _perform_request(func, instance, args, kwargs): pin = Pin.get_from(instance) if not pin or not pin.enabled(): return func(*args, **kwargs) with pin.tracer.trace("elasticsearch.query", service=ext_service(pin, config.elasticsearch), span_type=SpanTypes.ELASTICSEARCH) as span: span.set_tag(SPAN_MEASURED_KEY) # Don't instrument if the trace is not sampled if not span.sampled: return func(*args, **kwargs) method, url = args params = kwargs.get("params") or {} encoded_params = urlencode(params) body = kwargs.get("body") span.set_tag(metadata.METHOD, method) span.set_tag(metadata.URL, url) span.set_tag(metadata.PARAMS, encoded_params) if config.elasticsearch.trace_query_string: span.set_tag(http.QUERY_STRING, encoded_params) if method in ["GET", "POST"]: span.set_tag(metadata.BODY, instance.serializer.dumps(body)) status = None # set analytics sample rate span.set_tag(ANALYTICS_SAMPLE_RATE_KEY, config.elasticsearch.get_analytics_sample_rate()) span = quantize(span) try: result = func(*args, **kwargs) except elasticsearch.exceptions.TransportError as e: span.set_tag(http.STATUS_CODE, getattr(e, "status_code", 500)) span.error = 1 raise try: # Optional metadata extraction with soft fail. if isinstance(result, tuple) and len(result) == 2: # elasticsearch<2.4; it returns both the status and the body status, data = result else: # elasticsearch>=2.4; internal change for ``Transport.perform_request`` # that just returns the body data = result took = data.get("took") if took: span.set_metric(metadata.TOOK, int(took)) except Exception: pass if status: span.set_tag(http.STATUS_CODE, status) return result