From 48f0c38c2456efbb6c32053f57cb027ff772359a Mon Sep 17 00:00:00 2001 From: Kai Mueller <15907922+kasium@users.noreply.github.com> Date: Tue, 7 Sep 2021 18:56:36 +0000 Subject: [PATCH 1/6] Add typing to trace.py This change was done by using pyannotate and running the test_tracer tests. When in doubt, the type is now Any. Signed-off-by: Kai Mueller <15907922+kasium@users.noreply.github.com> --- jaeger_client/tracer.py | 91 +++++++++++++++++++++++------------------ 1 file changed, 51 insertions(+), 40 deletions(-) diff --git a/jaeger_client/tracer.py b/jaeger_client/tracer.py index e4e8e007..64caffd7 100644 --- a/jaeger_client/tracer.py +++ b/jaeger_client/tracer.py @@ -22,16 +22,22 @@ import sys import time import opentracing +from typing import Any, Optional, List, Union + from opentracing import Format, UnsupportedFormatException from opentracing.ext import tags as ext_tags -from opentracing.scope_managers import ThreadLocalScopeManager +from opentracing.scope_managers import ThreadLocalScopeManager, ScopeManager +from opentracing.tracer import Reference + +from tornado.concurrent import Future from . import constants from .codecs import TextCodec, ZipkinCodec, ZipkinSpanFormat, BinaryCodec from .span import Span, SAMPLED_FLAG, DEBUG_FLAG from .span_context import SpanContext -from .metrics import Metrics, LegacyMetricsFactory +from .metrics import Metrics, LegacyMetricsFactory, MetricsFactory from .utils import local_ip +from .sampler import Sampler logger = logging.getLogger('jaeger_tracing') @@ -41,19 +47,24 @@ class Tracer(opentracing.Tracer): N.B. metrics has been deprecated, use metrics_factory instead. """ def __init__( - self, service_name, reporter, sampler, metrics=None, - metrics_factory=None, - trace_id_header=constants.TRACE_ID_HEADER, - generate_128bit_trace_id=False, - baggage_header_prefix=constants.BAGGAGE_HEADER_PREFIX, - debug_id_header=constants.DEBUG_ID_HEADER_KEY, - one_span_per_rpc=False, extra_codecs=None, - tags=None, - max_tag_value_length=constants.MAX_TAG_VALUE_LENGTH, - max_traceback_length=constants.MAX_TRACEBACK_LENGTH, - throttler=None, - scope_manager=None, - ): + self, + service_name: str, + reporter: Any, + sampler: Sampler, + metrics: Optional[Any] = None, + metrics_factory: Optional[MetricsFactory] = None, + trace_id_header: str = constants.TRACE_ID_HEADER, + generate_128bit_trace_id: bool = False, + baggage_header_prefix: str = constants.BAGGAGE_HEADER_PREFIX, + debug_id_header: str = constants.DEBUG_ID_HEADER_KEY, + one_span_per_rpc: bool = False, + extra_codecs: Optional[dict] = None, + tags: Optional[dict] = None, + max_tag_value_length: int = constants.MAX_TAG_VALUE_LENGTH, + max_traceback_length: int = constants.MAX_TRACEBACK_LENGTH, + throttler: Optional[Any] = None, + scope_manager: Optional[ScopeManager] = None, + ) -> None: self.service_name = service_name self.reporter = reporter self.sampler = sampler @@ -84,7 +95,7 @@ def __init__( } if extra_codecs: self.codecs.update(extra_codecs) - self.tags = { + self.tags: dict = { constants.JAEGER_VERSION_TAG_KEY: constants.JAEGER_CLIENT_VERSION, } if tags: @@ -117,13 +128,13 @@ def __init__( ) def start_span(self, - operation_name=None, - child_of=None, - references=None, - tags=None, - start_time=None, - ignore_active_span=False, - ): + operation_name: Optional[str] = None, + child_of: Union[None, Span, SpanContext] = None, + references: Union[List[Reference], None, Reference] = None, + tags: Union[dict, None] = None, + start_time: Optional[float] = None, + ignore_active_span: bool = False, + ) -> Span: """ Start and return a new Span representing a unit of work. @@ -209,18 +220,18 @@ def start_span(self, operation_name=operation_name, tags=tags, start_time=start_time, references=valid_references) - self._emit_span_metrics(span=span, join=rpc_server) + self._emit_span_metrics(span=span, join=bool(rpc_server)) return span def start_active_span(self, - operation_name=None, - child_of=None, - references=None, - tags=None, - start_time=None, - ignore_active_span=False, - finish_on_close=True, + operation_name: Optional[str] = None, + child_of: Union[None, Span, SpanContext] = None, + references: Union[None, Reference, List[Reference]] = None, + tags: Optional[dict] = None, + start_time: Optional[float] = None, + ignore_active_span: bool = False, + finish_on_close: bool = True, ): """ Returns a newly started and activated :class:`Scope` @@ -253,7 +264,7 @@ def start_active_span(self, ) return self.scope_manager.activate(span, finish_on_close) - def inject(self, span_context, format, carrier): + def inject(self, span_context: Union[Span, SpanContext], format: str, carrier: dict) -> None: codec = self.codecs.get(format, None) if codec is None: raise UnsupportedFormatException(format) @@ -265,13 +276,13 @@ def inject(self, span_context, format, carrier): 'Expecting Jaeger SpanContext, not %s', type(span_context)) codec.inject(span_context=span_context, carrier=carrier) - def extract(self, format, carrier): + def extract(self, format: str, carrier: dict) -> SpanContext: codec = self.codecs.get(format, None) if codec is None: raise UnsupportedFormatException(format) return codec.extract(carrier) - def close(self): + def close(self) -> Future: """ Perform a clean shutdown of the tracer, flushing any traces that may be buffered in memory. @@ -282,7 +293,7 @@ def close(self): self.sampler.close() return self.reporter.close() - def _emit_span_metrics(self, span, join=False): + def _emit_span_metrics(self, span: Span, join: Optional[bool] = False) -> Span: if span.is_sampled(): self.metrics.spans_started_sampled(1) else: @@ -300,20 +311,20 @@ def _emit_span_metrics(self, span, join=False): self.metrics.traces_started_not_sampled(1) return span - def report_span(self, span): + def report_span(self, span: Span) -> None: self.reporter.report_span(span) self.metrics.spans_finished(1) - def random_id(self): + def random_id(self) -> int: """ DEPRECATED: use _random_id() instead """ return self.random.getrandbits(constants.MAX_ID_BITS) - def _random_id(self, bitsize): + def _random_id(self, bitsize: int) -> int: return self.random.getrandbits(bitsize) - def is_debug_allowed(self, *args, **kwargs): + def is_debug_allowed(self, *args: Any, **kwargs: Any) -> bool: if not self.throttler: return True return self.throttler.is_allowed(*args, **kwargs) @@ -322,7 +333,7 @@ def is_debug_allowed(self, *args, **kwargs): class TracerMetrics(object): """Tracer specific metrics.""" - def __init__(self, metrics_factory): + def __init__(self, metrics_factory: MetricsFactory) -> None: self.traces_started_sampled = \ metrics_factory.create_counter(name='jaeger:traces', tags={'state': 'started', 'sampled': 'y'}) From 889098fa628ae30a7e800dd4f835e2b10b7299de Mon Sep 17 00:00:00 2001 From: kasium <15907922+kasium@users.noreply.github.com> Date: Tue, 7 Sep 2021 21:39:55 +0200 Subject: [PATCH 2/6] Update jaeger_client/tracer.py Co-authored-by: Yuri Shkuro Signed-off-by: Kai Mueller <15907922+kasium@users.noreply.github.com> --- jaeger_client/tracer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jaeger_client/tracer.py b/jaeger_client/tracer.py index 64caffd7..4f1544da 100644 --- a/jaeger_client/tracer.py +++ b/jaeger_client/tracer.py @@ -51,7 +51,7 @@ def __init__( service_name: str, reporter: Any, sampler: Sampler, - metrics: Optional[Any] = None, + metrics: Optional[Metrics] = None, metrics_factory: Optional[MetricsFactory] = None, trace_id_header: str = constants.TRACE_ID_HEADER, generate_128bit_trace_id: bool = False, From 14407949ab2c2e208be37da3a02d3b7862f43e20 Mon Sep 17 00:00:00 2001 From: Kai Mueller <15907922+kasium@users.noreply.github.com> Date: Tue, 7 Sep 2021 19:42:27 +0000 Subject: [PATCH 3/6] Better types Signed-off-by: Kai Mueller <15907922+kasium@users.noreply.github.com> --- jaeger_client/tracer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jaeger_client/tracer.py b/jaeger_client/tracer.py index 4f1544da..00018532 100644 --- a/jaeger_client/tracer.py +++ b/jaeger_client/tracer.py @@ -22,7 +22,7 @@ import sys import time import opentracing -from typing import Any, Optional, List, Union +from typing import Any, Dict, Optional, List, Union from opentracing import Format, UnsupportedFormatException from opentracing.ext import tags as ext_tags @@ -32,7 +32,7 @@ from tornado.concurrent import Future from . import constants -from .codecs import TextCodec, ZipkinCodec, ZipkinSpanFormat, BinaryCodec +from .codecs import TextCodec, ZipkinCodec, ZipkinSpanFormat, BinaryCodec, Codec from .span import Span, SAMPLED_FLAG, DEBUG_FLAG from .span_context import SpanContext from .metrics import Metrics, LegacyMetricsFactory, MetricsFactory @@ -58,8 +58,8 @@ def __init__( baggage_header_prefix: str = constants.BAGGAGE_HEADER_PREFIX, debug_id_header: str = constants.DEBUG_ID_HEADER_KEY, one_span_per_rpc: bool = False, - extra_codecs: Optional[dict] = None, - tags: Optional[dict] = None, + extra_codecs: Optional[Dict[str, Codec]] = None, + tags: Optional[Dict[str, Any]] = None, max_tag_value_length: int = constants.MAX_TAG_VALUE_LENGTH, max_traceback_length: int = constants.MAX_TRACEBACK_LENGTH, throttler: Optional[Any] = None, From c4b3389c67de69f94fb018f3de6ef3484e299d42 Mon Sep 17 00:00:00 2001 From: Kai Mueller <15907922+kasium@users.noreply.github.com> Date: Tue, 7 Sep 2021 19:47:03 +0000 Subject: [PATCH 4/6] fix Signed-off-by: Kai Mueller <15907922+kasium@users.noreply.github.com> --- jaeger_client/tracer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jaeger_client/tracer.py b/jaeger_client/tracer.py index 00018532..4ea50a97 100644 --- a/jaeger_client/tracer.py +++ b/jaeger_client/tracer.py @@ -38,6 +38,7 @@ from .metrics import Metrics, LegacyMetricsFactory, MetricsFactory from .utils import local_ip from .sampler import Sampler +from .reporter import BaseReporter logger = logging.getLogger('jaeger_tracing') @@ -49,7 +50,7 @@ class Tracer(opentracing.Tracer): def __init__( self, service_name: str, - reporter: Any, + reporter: BaseReporter, sampler: Sampler, metrics: Optional[Metrics] = None, metrics_factory: Optional[MetricsFactory] = None, From cc14b3fc9feafd4fce1452b7a323715747f9f8fb Mon Sep 17 00:00:00 2001 From: Kai Mueller <15907922+kasium@users.noreply.github.com> Date: Tue, 7 Sep 2021 20:08:02 +0000 Subject: [PATCH 5/6] fix Signed-off-by: Kai Mueller <15907922+kasium@users.noreply.github.com> --- jaeger_client/tracer.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/jaeger_client/tracer.py b/jaeger_client/tracer.py index 4ea50a97..1610844c 100644 --- a/jaeger_client/tracer.py +++ b/jaeger_client/tracer.py @@ -22,7 +22,7 @@ import sys import time import opentracing -from typing import Any, Dict, Optional, List, Union +from typing import Any, Dict, Optional, List, Union, cast from opentracing import Format, UnsupportedFormatException from opentracing.ext import tags as ext_tags @@ -179,8 +179,9 @@ def start_span(self, if valid_references and (parent is None or not parent.has_trace): parent = valid_references[0].referenced_context - rpc_server = tags and \ - tags.get(ext_tags.SPAN_KIND) == ext_tags.SPAN_KIND_RPC_SERVER + rpc_server = cast( + bool, tags and tags.get(ext_tags.SPAN_KIND) == ext_tags.SPAN_KIND_RPC_SERVER + ) if parent is None or not parent.has_trace: trace_id = self._random_id(self.max_trace_id_bits) @@ -221,7 +222,7 @@ def start_span(self, operation_name=operation_name, tags=tags, start_time=start_time, references=valid_references) - self._emit_span_metrics(span=span, join=bool(rpc_server)) + self._emit_span_metrics(span=span, join=rpc_server) return span From b75eac17b892f0674581690b266e8604c1e8c193 Mon Sep 17 00:00:00 2001 From: Kai Mueller <15907922+kasium@users.noreply.github.com> Date: Tue, 7 Sep 2021 20:56:14 +0000 Subject: [PATCH 6/6] Simplfy boolean Signed-off-by: Kai Mueller <15907922+kasium@users.noreply.github.com> --- jaeger_client/tracer.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/jaeger_client/tracer.py b/jaeger_client/tracer.py index 1610844c..eaffb207 100644 --- a/jaeger_client/tracer.py +++ b/jaeger_client/tracer.py @@ -22,7 +22,7 @@ import sys import time import opentracing -from typing import Any, Dict, Optional, List, Union, cast +from typing import Any, Dict, Optional, List, Union from opentracing import Format, UnsupportedFormatException from opentracing.ext import tags as ext_tags @@ -179,9 +179,7 @@ def start_span(self, if valid_references and (parent is None or not parent.has_trace): parent = valid_references[0].referenced_context - rpc_server = cast( - bool, tags and tags.get(ext_tags.SPAN_KIND) == ext_tags.SPAN_KIND_RPC_SERVER - ) + rpc_server = bool(tags and tags.get(ext_tags.SPAN_KIND) == ext_tags.SPAN_KIND_RPC_SERVER) if parent is None or not parent.has_trace: trace_id = self._random_id(self.max_trace_id_bits)