Skip to content

Commit ecb5dd9

Browse files
authored
Add typing to Histogram/Summary/Gauge (#759)
* Add typing to Histogram * Add typing to Gauge/Summary * Ditch default value * Fix review comments Signed-off-by: Yury Pliner <yury.pliner@gmail.com>
1 parent a234283 commit ecb5dd9

File tree

2 files changed

+38
-37
lines changed

2 files changed

+38
-37
lines changed

mypy.ini

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
[mypy]
22
exclude = prometheus_client/decorator.py|prometheus_client/twisted|tests/test_twisted.py
33
implicit_reexport = False
4+
disallow_incomplete_defs = True
45

56
[mypy-prometheus_client.decorator]
67
follow_imports = skip

prometheus_client/metrics.py

+37-37
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import time
33
import types
44
from typing import (
5-
Any, Callable, Dict, Iterable, Optional, Sequence, Type, TypeVar,
5+
Any, Callable, Dict, Iterable, Optional, Sequence, Type, TypeVar, Union,
66
)
77

88
from . import values # retain this import style for testability
@@ -337,15 +337,15 @@ def f():
337337
_MULTIPROC_MODES = frozenset(('min', 'max', 'livesum', 'liveall', 'all'))
338338

339339
def __init__(self,
340-
name,
341-
documentation,
342-
labelnames=(),
343-
namespace='',
344-
subsystem='',
345-
unit='',
346-
registry=REGISTRY,
347-
_labelvalues=None,
348-
multiprocess_mode='all',
340+
name: str,
341+
documentation: str,
342+
labelnames: Iterable[str] = (),
343+
namespace: str = '',
344+
subsystem: str = '',
345+
unit: str = '',
346+
registry: Optional[CollectorRegistry] = REGISTRY,
347+
_labelvalues: Optional[Sequence[str]] = None,
348+
multiprocess_mode: str = 'all',
349349
):
350350
self._multiprocess_mode = multiprocess_mode
351351
if multiprocess_mode not in self._MULTIPROC_MODES:
@@ -362,32 +362,32 @@ def __init__(self,
362362
)
363363
self._kwargs['multiprocess_mode'] = self._multiprocess_mode
364364

365-
def _metric_init(self):
365+
def _metric_init(self) -> None:
366366
self._value = values.ValueClass(
367367
self._type, self._name, self._name, self._labelnames, self._labelvalues,
368368
multiprocess_mode=self._multiprocess_mode
369369
)
370370

371-
def inc(self, amount=1):
371+
def inc(self, amount: float = 1) -> None:
372372
"""Increment gauge by the given amount."""
373373
self._raise_if_not_observable()
374374
self._value.inc(amount)
375375

376-
def dec(self, amount=1):
376+
def dec(self, amount: float = 1) -> None:
377377
"""Decrement gauge by the given amount."""
378378
self._raise_if_not_observable()
379379
self._value.inc(-amount)
380380

381-
def set(self, value):
381+
def set(self, value: float) -> None:
382382
"""Set gauge to the given value."""
383383
self._raise_if_not_observable()
384384
self._value.set(float(value))
385385

386-
def set_to_current_time(self):
386+
def set_to_current_time(self) -> None:
387387
"""Set gauge to the current unixtime."""
388388
self.set(time.time())
389389

390-
def track_inprogress(self):
390+
def track_inprogress(self) -> InprogressTracker:
391391
"""Track inprogress blocks of code or functions.
392392
393393
Can be used as a function decorator or context manager.
@@ -397,14 +397,14 @@ def track_inprogress(self):
397397
self._raise_if_not_observable()
398398
return InprogressTracker(self)
399399

400-
def time(self):
400+
def time(self) -> Timer:
401401
"""Time a block of code or function, and set the duration in seconds.
402402
403403
Can be used as a function decorator or context manager.
404404
"""
405405
return Timer(self, 'set')
406406

407-
def set_function(self, f):
407+
def set_function(self, f: Callable[[], float]) -> None:
408408
"""Call the provided function to return the Gauge value.
409409
410410
The function must return a float, and may be called from
@@ -413,10 +413,10 @@ def set_function(self, f):
413413

414414
self._raise_if_not_observable()
415415

416-
def samples(self) -> Iterable[Sample]:
416+
def samples(_: Gauge) -> Iterable[Sample]:
417417
return (Sample('', {}, float(f()), None, None),)
418418

419-
self._child_samples = types.MethodType(samples, self)
419+
self._child_samples = types.MethodType(samples, self) # type: ignore
420420

421421
def _child_samples(self) -> Iterable[Sample]:
422422
return (Sample('', {}, self._value.get(), None, None),)
@@ -455,13 +455,13 @@ def create_response(request):
455455
_type = 'summary'
456456
_reserved_labelnames = ['quantile']
457457

458-
def _metric_init(self):
458+
def _metric_init(self) -> None:
459459
self._count = values.ValueClass(self._type, self._name, self._name + '_count', self._labelnames,
460460
self._labelvalues)
461461
self._sum = values.ValueClass(self._type, self._name, self._name + '_sum', self._labelnames, self._labelvalues)
462462
self._created = time.time()
463463

464-
def observe(self, amount):
464+
def observe(self, amount: float) -> None:
465465
"""Observe the given amount.
466466
467467
The amount is usually positive or zero. Negative values are
@@ -475,7 +475,7 @@ def observe(self, amount):
475475
self._count.inc(1)
476476
self._sum.inc(amount)
477477

478-
def time(self):
478+
def time(self) -> Timer:
479479
"""Time a block of code or function, and observe the duration in seconds.
480480
481481
Can be used as a function decorator or context manager.
@@ -530,15 +530,15 @@ def create_response(request):
530530
DEFAULT_BUCKETS = (.005, .01, .025, .05, .075, .1, .25, .5, .75, 1.0, 2.5, 5.0, 7.5, 10.0, INF)
531531

532532
def __init__(self,
533-
name,
534-
documentation,
535-
labelnames=(),
536-
namespace='',
537-
subsystem='',
538-
unit='',
539-
registry=REGISTRY,
540-
_labelvalues=None,
541-
buckets=DEFAULT_BUCKETS,
533+
name: str,
534+
documentation: str,
535+
labelnames: Iterable[str] = (),
536+
namespace: str = '',
537+
subsystem: str = '',
538+
unit: str = '',
539+
registry: Optional[CollectorRegistry] = REGISTRY,
540+
_labelvalues: Optional[Sequence[str]] = None,
541+
buckets: Sequence[Union[float, int, str]] = DEFAULT_BUCKETS,
542542
):
543543
self._prepare_buckets(buckets)
544544
super().__init__(
@@ -553,8 +553,8 @@ def __init__(self,
553553
)
554554
self._kwargs['buckets'] = buckets
555555

556-
def _prepare_buckets(self, buckets):
557-
buckets = [float(b) for b in buckets]
556+
def _prepare_buckets(self, source_buckets: Sequence[Union[float, int, str]]) -> None:
557+
buckets = [float(b) for b in source_buckets]
558558
if buckets != sorted(buckets):
559559
# This is probably an error on the part of the user,
560560
# so raise rather than sorting for them.
@@ -565,7 +565,7 @@ def _prepare_buckets(self, buckets):
565565
raise ValueError('Must have at least two buckets')
566566
self._upper_bounds = buckets
567567

568-
def _metric_init(self):
568+
def _metric_init(self) -> None:
569569
self._buckets = []
570570
self._created = time.time()
571571
bucket_labelnames = self._labelnames + ('le',)
@@ -579,7 +579,7 @@ def _metric_init(self):
579579
self._labelvalues + (floatToGoString(b),))
580580
)
581581

582-
def observe(self, amount, exemplar=None):
582+
def observe(self, amount: float, exemplar: Optional[Dict[str, str]] = None) -> None:
583583
"""Observe the given amount.
584584
585585
The amount is usually positive or zero. Negative values are
@@ -599,7 +599,7 @@ def observe(self, amount, exemplar=None):
599599
self._buckets[i].set_exemplar(Exemplar(exemplar, amount, time.time()))
600600
break
601601

602-
def time(self):
602+
def time(self) -> Timer:
603603
"""Time a block of code or function, and observe the duration in seconds.
604604
605605
Can be used as a function decorator or context manager.

0 commit comments

Comments
 (0)