Skip to content
This repository was archived by the owner on Jul 11, 2022. It is now read-only.

Commit ac8e752

Browse files
kasiumyurishkuro
andauthored
Add types for span, metrics, throttler (#336)
* Add types for span, metrics, throttler Signed-off-by: Kai Mueller <[email protected]> * Fix tags types Signed-off-by: Kai Mueller <[email protected]> * Fix reference list type Signed-off-by: Kai Mueller <[email protected]> * Fix finish_time type Signed-off-by: Kai Mueller <[email protected]> * Fix parent_id type Signed-off-by: Kai Mueller <[email protected]> * Fix flags type Signed-off-by: Kai Mueller <[email protected]> * Update jaeger_client/tracer.py Co-authored-by: Yuri Shkuro <[email protected]> Signed-off-by: Kai Mueller <[email protected]> * Add span_context types Signed-off-by: Kai Mueller <[email protected]> * Add types for methods Signed-off-by: Kai Mueller <[email protected]> * Update jaeger_client/span_context.py Co-authored-by: Yuri Shkuro <[email protected]> Signed-off-by: Kai Mueller <[email protected]> * Update jaeger_client/span_context.py Co-authored-by: Yuri Shkuro <[email protected]> Signed-off-by: Kai Mueller <[email protected]> * Update jaeger_client/span_context.py Co-authored-by: Yuri Shkuro <[email protected]> Signed-off-by: Kai Mueller <[email protected]> * Update jaeger_client/span.py Co-authored-by: Yuri Shkuro <[email protected]> Signed-off-by: Kai Mueller <[email protected]> * Update jaeger_client/span_context.py Co-authored-by: Yuri Shkuro <[email protected]> Signed-off-by: Kai Mueller <[email protected]> * Update jaeger_client/span_context.py Co-authored-by: Yuri Shkuro <[email protected]> Signed-off-by: Kai Mueller <[email protected]> * Update jaeger_client/span.py Co-authored-by: Yuri Shkuro <[email protected]> Signed-off-by: Kai Mueller <[email protected]> * Update jaeger_client/span.py Co-authored-by: Yuri Shkuro <[email protected]> Signed-off-by: Kai Mueller <[email protected]> * Fix imports Signed-off-by: Kai Mueller <[email protected]> * Add types for timer Signed-off-by: Kai Mueller <[email protected]> * Update jaeger_client/span.py Co-authored-by: Yuri Shkuro <[email protected]> Signed-off-by: Kai Mueller <[email protected]> * Fix import Signed-off-by: Kai Mueller <[email protected]> * Update jaeger_client/span.py Co-authored-by: Yuri Shkuro <[email protected]> Signed-off-by: Kai Mueller <[email protected]> Co-authored-by: Yuri Shkuro <[email protected]>
1 parent 4ee7dcc commit ac8e752

File tree

6 files changed

+91
-47
lines changed

6 files changed

+91
-47
lines changed

jaeger_client/metrics/metrics.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,18 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
from typing import Any, Optional, Callable, Dict
16+
17+
1518
class MetricsFactory(object):
1619
"""Generates new metrics."""
1720

1821
def _noop(self, *args):
1922
pass
2023

21-
def create_counter(self, name, tags=None):
24+
def create_counter(
25+
self, name: str, tags: Optional[Dict[str, str]] = None
26+
) -> Callable[[int], None]:
2227
"""
2328
Generates a new counter from the given name and tags and returns
2429
a callable function used to increment the counter.
@@ -29,7 +34,9 @@ def create_counter(self, name, tags=None):
2934
"""
3035
return self._noop
3136

32-
def create_timer(self, name, tags=None):
37+
def create_timer(
38+
self, name: str, tags: Optional[Dict[str, str]] = None
39+
) -> Callable[[float], None]:
3340
"""
3441
Generates a new timer from the given name and tags and returns
3542
a callable function used to record a float duration in microseconds.
@@ -40,7 +47,9 @@ def create_timer(self, name, tags=None):
4047
"""
4148
return self._noop
4249

43-
def create_gauge(self, name, tags=None):
50+
def create_gauge(
51+
self, name: str, tags: Optional[Dict[str, str]] = None
52+
) -> Callable[[float], None]:
4453
"""
4554
Generates a new gauge from the given name and tags and returns
4655
a callable function used to update the gauge.
@@ -55,25 +64,31 @@ def create_gauge(self, name, tags=None):
5564
class LegacyMetricsFactory(MetricsFactory):
5665
"""A MetricsFactory adapter for legacy Metrics class."""
5766

58-
def __init__(self, metrics):
67+
def __init__(self, metrics: 'Metrics') -> None:
5968
self._metrics = metrics
6069

61-
def create_counter(self, name, tags=None):
70+
def create_counter(
71+
self, name: str, tags: Optional[Dict[str, str]] = None
72+
) -> Callable[[int], None]:
6273
key = self._get_key(name, tags)
6374

64-
def increment(value):
75+
def increment(value: int) -> Optional[Any]:
6576
return self._metrics.count(key, value)
6677
return increment
6778

68-
def create_timer(self, name, tags=None):
79+
def create_timer(
80+
self, name: str, tags: Optional[Dict[str, str]] = None
81+
) -> Callable[[float], None]:
6982
key = self._get_key(name, tags)
7083

7184
def record(value):
7285
# Convert microseconds to milliseconds for legacy
7386
return self._metrics.timing(key, value / 1000.0)
7487
return record
7588

76-
def create_gauge(self, name, tags=None):
89+
def create_gauge(
90+
self, name: str, tags: Optional[Dict[str, str]] = None
91+
) -> Callable[[float], None]:
7792
key = self._get_key(name, tags)
7893

7994
def update(value):

jaeger_client/metrics/prometheus.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@
1515
from jaeger_client.metrics import MetricsFactory
1616
from collections import defaultdict
1717
from prometheus_client import Counter, Gauge
18+
from typing import Any, Optional, Dict, Callable, DefaultDict
1819

1920

2021
class PrometheusMetricsFactory(MetricsFactory):
2122
"""
2223
Provides metrics backed by Prometheus
2324
"""
24-
def __init__(self, namespace='', service_name_label=None):
25-
self._cache = defaultdict(object)
25+
def __init__(self, namespace: str = '', service_name_label: Optional[str] = None) -> None:
26+
self._cache: DefaultDict = defaultdict(object)
2627
self._namespace = namespace
2728
self._service_name_label = service_name_label
2829

@@ -55,14 +56,18 @@ def _get_metric(self, metricType, name, tags):
5556

5657
return metric
5758

58-
def create_counter(self, name, tags=None):
59+
def create_counter(
60+
self, name: str, tags: Optional[Dict[str, Any]] = None
61+
) -> Callable[[int], None]:
5962
counter = self._get_metric(Counter, name, tags)
6063

6164
def increment(value):
6265
counter.inc(value)
6366
return increment
6467

65-
def create_gauge(self, name, tags=None):
68+
def create_gauge(
69+
self, name: str, tags: Optional[Dict[str, Any]] = None
70+
) -> Callable[[float], None]:
6671
gauge = self._get_metric(Gauge, name, tags)
6772

6873
def update(value):

jaeger_client/span.py

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,18 @@
1616
import threading
1717
import time
1818
import logging
19+
from typing import TYPE_CHECKING, Any, Dict, Optional, List
1920

2021
import opentracing
2122
from opentracing.ext import tags as ext_tags
23+
from .tracer import Reference
2224
from . import codecs, thrift
2325
from .constants import SAMPLED_FLAG, DEBUG_FLAG
26+
from .span_context import SpanContext
27+
import jaeger_client.thrift_gen.jaeger.ttypes as ttypes
28+
29+
if TYPE_CHECKING:
30+
from .tracer import Tracer
2431

2532
logger = logging.getLogger('jaeger_tracing')
2633

@@ -32,23 +39,30 @@ class Span(opentracing.Span):
3239
'operation_name', 'start_time', 'end_time',
3340
'logs', 'tags', 'finished', 'update_lock']
3441

35-
def __init__(self, context, tracer, operation_name,
36-
tags=None, start_time=None, references=None):
42+
def __init__(
43+
self,
44+
context: SpanContext,
45+
tracer: 'Tracer',
46+
operation_name: str,
47+
tags: Optional[Dict[str, Any]] = None,
48+
start_time: Optional[float] = None,
49+
references: Optional[List[Reference]] = None
50+
) -> None:
3751
super(Span, self).__init__(context=context, tracer=tracer)
3852
self.operation_name = operation_name
3953
self.start_time = start_time or time.time()
40-
self.end_time = None
54+
self.end_time: Optional[float] = None
4155
self.finished = False
4256
self.update_lock = threading.Lock()
4357
self.references = references
4458
# we store tags and logs as Thrift objects to avoid extra allocations
45-
self.tags = []
46-
self.logs = []
59+
self.tags: List[ttypes.Tag] = []
60+
self.logs: List[ttypes.Log] = []
4761
if tags:
4862
for k, v in tags.items():
4963
self.set_tag(k, v)
5064

51-
def set_operation_name(self, operation_name):
65+
def set_operation_name(self, operation_name: str) -> 'Span':
5266
"""
5367
Set or change the operation name.
5468
@@ -59,7 +73,7 @@ def set_operation_name(self, operation_name):
5973
self.operation_name = operation_name
6074
return self
6175

62-
def finish(self, finish_time=None):
76+
def finish(self, finish_time: Optional[float] = None) -> None:
6377
"""Indicate that the work represented by this span has been completed
6478
or terminated, and is ready to be sent to the Reporter.
6579
@@ -81,7 +95,7 @@ def finish(self, finish_time=None):
8195

8296
self.tracer.report_span(self)
8397

84-
def set_tag(self, key, value):
98+
def set_tag(self, key: str, value: Any) -> 'Span':
8599
"""
86100
:param key:
87101
:param value:
@@ -120,7 +134,7 @@ def _set_sampling_priority(self, value):
120134
return True
121135
return False
122136

123-
def log_kv(self, key_values, timestamp=None):
137+
def log_kv(self, key_values: Dict[str, Any], timestamp: Optional[float] = None) -> 'Span':
124138
if self.is_sampled():
125139
timestamp = timestamp if timestamp else time.time()
126140
# TODO handle exception logging, 'python.exception.type' etc.
@@ -134,7 +148,7 @@ def log_kv(self, key_values, timestamp=None):
134148
self.logs.append(log)
135149
return self
136150

137-
def set_baggage_item(self, key, value):
151+
def set_baggage_item(self, key: str, value: Optional[str]) -> 'Span':
138152
prev_value = self.get_baggage_item(key=key)
139153
new_context = self.context.with_baggage_item(key=key, value=value)
140154
with self.update_lock:
@@ -151,45 +165,45 @@ def set_baggage_item(self, key, value):
151165
self.log_kv(key_values=logs)
152166
return self
153167

154-
def get_baggage_item(self, key):
168+
def get_baggage_item(self, key: str) -> Optional[str]:
155169
return self.context.baggage.get(key)
156170

157-
def is_sampled(self):
171+
def is_sampled(self) -> bool:
158172
return self.context.flags & SAMPLED_FLAG == SAMPLED_FLAG
159173

160-
def is_debug(self):
174+
def is_debug(self) -> bool:
161175
return self.context.flags & DEBUG_FLAG == DEBUG_FLAG
162176

163-
def is_rpc(self):
177+
def is_rpc(self) -> bool:
164178
for tag in self.tags:
165179
if tag.key == ext_tags.SPAN_KIND:
166180
return tag.vStr == ext_tags.SPAN_KIND_RPC_CLIENT or \
167181
tag.vStr == ext_tags.SPAN_KIND_RPC_SERVER
168182
return False
169183

170-
def is_rpc_client(self):
184+
def is_rpc_client(self) -> bool:
171185
for tag in self.tags:
172186
if tag.key == ext_tags.SPAN_KIND:
173187
return tag.vStr == ext_tags.SPAN_KIND_RPC_CLIENT
174188
return False
175189

176190
@property
177-
def trace_id(self):
191+
def trace_id(self) -> int:
178192
return self.context.trace_id
179193

180194
@property
181-
def span_id(self):
195+
def span_id(self) -> int:
182196
return self.context.span_id
183197

184198
@property
185-
def parent_id(self):
199+
def parent_id(self) -> Optional[int]:
186200
return self.context.parent_id
187201

188202
@property
189-
def flags(self):
203+
def flags(self) -> int:
190204
return self.context.flags
191205

192-
def __repr__(self):
206+
def __repr__(self) -> str:
193207
c = codecs.span_context_to_string(
194208
trace_id=self.context.trace_id, span_id=self.context.span_id,
195209
parent_id=self.context.parent_id, flags=self.context.flags)

jaeger_client/span_context.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,23 @@
1414

1515

1616
import opentracing
17+
from typing import Dict, Optional
1718

1819

1920
class SpanContext(opentracing.SpanContext):
2021
__slots__ = ['trace_id', 'span_id', 'parent_id', 'flags',
2122
'_baggage', '_debug_id']
2223

2324
"""Implements opentracing.SpanContext"""
24-
def __init__(self, trace_id, span_id, parent_id, flags, baggage=None, debug_id=None):
25+
def __init__(
26+
self,
27+
trace_id: int,
28+
span_id: int,
29+
parent_id: Optional[int],
30+
flags: int,
31+
baggage: Optional[Dict[str, str]] = None,
32+
debug_id: Optional[str] = None
33+
) -> None:
2534
self.trace_id = trace_id
2635
self.span_id = span_id
2736
self.parent_id = parent_id or None
@@ -30,10 +39,10 @@ def __init__(self, trace_id, span_id, parent_id, flags, baggage=None, debug_id=N
3039
self._debug_id = debug_id
3140

3241
@property
33-
def baggage(self):
42+
def baggage(self) -> Dict[str, str]:
3443
return self._baggage or opentracing.SpanContext.EMPTY_BAGGAGE
3544

36-
def with_baggage_item(self, key, value):
45+
def with_baggage_item(self, key: str, value: Optional[str]) -> 'SpanContext':
3746
baggage = dict(self._baggage)
3847
if value is not None:
3948
baggage[key] = value
@@ -48,16 +57,16 @@ def with_baggage_item(self, key, value):
4857
)
4958

5059
@property
51-
def has_trace(self):
52-
return self.trace_id and self.span_id and self.flags is not None
60+
def has_trace(self) -> bool:
61+
return bool(self.trace_id and self.span_id and self.flags is not None)
5362

5463
@property
55-
def is_debug_id_container_only(self):
64+
def is_debug_id_container_only(self) -> bool:
5665
"""Deprecated, not used by Jaeger."""
5766
return not self.trace_id and self._debug_id is not None
5867

5968
@property
60-
def debug_id(self):
69+
def debug_id(self) -> Optional[str]:
6170
return self._debug_id
6271

6372
@staticmethod

jaeger_client/throttler.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import logging
1717
import random
1818
from threading import Lock
19+
from typing import Any, Optional
1920

2021
from tornado.ioloop import PeriodicCallback
2122

@@ -56,17 +57,17 @@ class RemoteThrottler(Throttler):
5657
- error_reporter: ErrorReporter instance
5758
"""
5859

59-
def __init__(self, channel, service_name, **kwargs):
60+
def __init__(self, channel: Any, service_name: str, **kwargs: Any) -> None:
6061
self.channel = channel
6162
self.service_name = service_name
62-
self.client_id = None
63+
self.client_id: Optional[int] = None
6364
self.refresh_interval = \
6465
kwargs.get('refresh_interval', DEFAULT_THROTTLER_REFRESH_INTERVAL)
6566
self.logger = kwargs.get('logger', default_logger)
6667
metrics_factory = kwargs.get('metrics_factory', MetricsFactory())
6768
self.metrics = ThrottlerMetrics(metrics_factory)
6869
self.error_reporter = kwargs.get('error_reporter', ErrorReporter(Metrics()))
69-
self.credits = {}
70+
self.credits: dict = {}
7071
self.lock = Lock()
7172
self.running = True
7273
self.periodic = None
@@ -77,7 +78,7 @@ def __init__(self, channel, service_name, **kwargs):
7778
else:
7879
self.channel.io_loop.add_callback(self._init_polling)
7980

80-
def is_allowed(self, operation):
81+
def is_allowed(self, operation: str) -> bool:
8182
with self.lock:
8283
if operation not in self.credits:
8384
self.credits[operation] = 0.0
@@ -91,7 +92,7 @@ def is_allowed(self, operation):
9192
self.credits[operation] = value - MINIMUM_CREDITS
9293
return True
9394

94-
def set_client_id(self, client_id):
95+
def set_client_id(self, client_id: int) -> None:
9596
with self.lock:
9697
if self.client_id is None:
9798
self.client_id = client_id
@@ -184,7 +185,7 @@ def _update_credits(self, response):
184185
self.credits[op] += balance
185186
self.logger.debug('credits = %s', self.credits)
186187

187-
def close(self):
188+
def close(self) -> None:
188189
with self.lock:
189190
self.running = False
190191
if self.periodic:
@@ -196,7 +197,7 @@ class ThrottlerMetrics(object):
196197
Metrics specific to throttler.
197198
"""
198199

199-
def __init__(self, metrics_factory):
200+
def __init__(self, metrics_factory: MetricsFactory) -> None:
200201
self.throttled_debug_spans = \
201202
metrics_factory.create_counter(name='jaeger:throttled_debug_spans')
202203
self.throttler_update_success = \

jaeger_client/tracer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ def start_span(self,
217217
parent_id=parent_id, flags=flags,
218218
baggage=baggage)
219219
span = Span(context=span_ctx, tracer=self,
220-
operation_name=operation_name,
220+
operation_name=operation_name or '',
221221
tags=tags, start_time=start_time, references=valid_references)
222222

223223
self._emit_span_metrics(span=span, join=rpc_server)

0 commit comments

Comments
 (0)