add sandbox observability contracts
This commit is contained in:
parent
e9ef178b15
commit
a86e1ee8c7
6 changed files with 131 additions and 0 deletions
|
|
@ -20,6 +20,14 @@ class NoopMetrics:
|
|||
) -> None:
|
||||
return None
|
||||
|
||||
def set(
|
||||
self,
|
||||
name: str,
|
||||
value: int | float,
|
||||
attrs: Attrs | None = None,
|
||||
) -> None:
|
||||
return None
|
||||
|
||||
|
||||
class NoopSpan:
|
||||
def set_attribute(self, name: str, value: AttrValue) -> None:
|
||||
|
|
|
|||
|
|
@ -5,12 +5,21 @@ from opentelemetry.metrics import Counter, Histogram, Meter
|
|||
from usecase.interface import Attrs
|
||||
|
||||
|
||||
class _GaugeAdapter:
|
||||
def __init__(self, gauge: object) -> None:
|
||||
self._gauge = gauge
|
||||
|
||||
def set(self, value: int | float, attributes: object = None) -> None:
|
||||
getattr(self._gauge, 'set')(value, attributes=attributes)
|
||||
|
||||
|
||||
class OtelMetrics:
|
||||
def __init__(self, meter: Meter) -> None:
|
||||
self._meter = meter
|
||||
self._lock = Lock()
|
||||
self._counters: dict[str, Counter] = {}
|
||||
self._histograms: dict[str, Histogram] = {}
|
||||
self._gauges: dict[str, _GaugeAdapter] = {}
|
||||
|
||||
def increment(
|
||||
self,
|
||||
|
|
@ -34,6 +43,17 @@ class OtelMetrics:
|
|||
attributes=None if attrs is None else dict(attrs),
|
||||
)
|
||||
|
||||
def set(
|
||||
self,
|
||||
name: str,
|
||||
value: int | float,
|
||||
attrs: Attrs | None = None,
|
||||
) -> None:
|
||||
self._gauge(name).set(
|
||||
value,
|
||||
attributes=None if attrs is None else dict(attrs),
|
||||
)
|
||||
|
||||
def _counter(self, name: str) -> Counter:
|
||||
counter = self._counters.get(name)
|
||||
if counter is not None:
|
||||
|
|
@ -57,3 +77,15 @@ class OtelMetrics:
|
|||
histogram = self._meter.create_histogram(name)
|
||||
self._histograms[name] = histogram
|
||||
return histogram
|
||||
|
||||
def _gauge(self, name: str) -> _GaugeAdapter:
|
||||
gauge = self._gauges.get(name)
|
||||
if gauge is not None:
|
||||
return gauge
|
||||
|
||||
with self._lock:
|
||||
gauge = self._gauges.get(name)
|
||||
if gauge is None:
|
||||
gauge = _GaugeAdapter(self._meter.create_gauge(name))
|
||||
self._gauges[name] = gauge
|
||||
return gauge
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue