-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathdecorator.py
More file actions
69 lines (50 loc) · 2.19 KB
/
decorator.py
File metadata and controls
69 lines (50 loc) · 2.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from contextvars import ContextVar
from functools import wraps
from threading import get_ident
from typing import Callable
from src.observability.measure.prometheus import PrometheusMeasurer
from src.observability.trace.jaeger import JaegerTracer
default_tracer = JaegerTracer()
default_measurer = PrometheusMeasurer()
ctx = ContextVar('parent-trace', default=str(get_ident()))
def trace(name: str = ""):
def block(fn: Callable):
@wraps(fn)
def wrapper(*args, **kwargs):
ctx.set(str(get_ident()))
operation = name if name.strip() else fn.__name__
with default_tracer.for_context(ctx) as t:
with t.operation_name(operation) as tracer:
return tracer.trace(operation, fn, *args, **kwargs)
return wrapper
return block
def _measuring(name: str, description: str, measure: Callable):
def block(fn: Callable):
@wraps(fn)
def wrapper(*args, **kwargs):
operation = name if name.strip() else fn.__name__
with default_measurer.track_call(operation, description) as delegate:
measure(delegate)
return fn(*args, **kwargs)
return wrapper
return block
def _collecting(name: str, description: str, collect: Callable):
def block(fn: Callable):
@wraps(fn)
def wrapper(*args, **kwargs):
operation = name if name.strip() else fn.__name__
with default_measurer.track_call(operation, description) as delegate:
with collect(delegate):
return fn(*args, **kwargs)
return wrapper
return block
def count(name: str = "", description: str = ""):
return _measuring(name, description, lambda d: d.count())
def inc(name: str = "", description: str = ""):
return _measuring(name, description, lambda d: d.inc())
def dec(name: str = "", description: str = ""):
return _measuring(name, description, lambda d: d.dec())
def observe(name: str = "", description: str = ""):
return _collecting(name, description, lambda d: d.observe())
def observe_bucket(name: str = "", description: str = ""):
return _collecting(name, description, lambda d: d.observe_bucket())