Spaces:
Sleeping
Sleeping
| from abc import ABC, abstractmethod | |
| from typing import Optional, Sequence | |
| class MetricType: | |
| """ | |
| MetricType is a class for defining the type of a metric. | |
| """ | |
| COUNTER = "counter" | |
| UPDOWNCOUNTER = "updowncounter" | |
| GAUGE = "gauge" | |
| HISTOGRAM = "histogram" | |
| class MetricProvider(ABC): | |
| """ | |
| MeterProvider is the entry point of the API. | |
| """ | |
| def __init__(self): | |
| # list of exporters | |
| self._exporters = [] | |
| def shutdown(self): | |
| """ | |
| shutdown the metric provider. | |
| """ | |
| def add_exporter(self, exporter): | |
| """ | |
| Add an exporter to the list of exporters. | |
| """ | |
| self._exporters.append(exporter) | |
| def create_counter(self, name: str, description: str, unit: str, | |
| label_names: Optional[Sequence[str]] = None) -> "Counter": | |
| """ | |
| Create a counter. | |
| Args: | |
| name: The name of the instrument to be created | |
| description: A description for this instrument and what it measures. | |
| unit: The unit for observations this instrument reports. For | |
| example, ``By`` for bytes. UCUM units are recommended. | |
| """ | |
| def create_un_down_counter(self, name: str, description: str, unit: str, | |
| label_names: Optional[Sequence[str]] = None) -> "UnDownCounter": | |
| """ | |
| Create a un-down counter. | |
| Args: | |
| name: The name of the instrument to be created | |
| description: A description for this instrument and what it measures. | |
| unit: The unit for observations this instrument reports. For | |
| example, ``By`` for bytes. UCUM units are recommended. | |
| """ | |
| def create_gauge(self, name: str, description: str, unit: str, | |
| label_names: Optional[Sequence[str]] = None) -> "Gauge": | |
| """ | |
| Create a gauge. | |
| Args: | |
| name: The name of the instrument to be created | |
| description: A description for this instrument and what it measures. | |
| unit: The unit for observations this instrument reports. For | |
| example, ``By`` for bytes. UCUM units are recommended. | |
| """ | |
| def create_histogram(self, | |
| name: str, | |
| description: str, | |
| unit: str, | |
| buckets: Optional[Sequence[float]] = None, | |
| label_names: Optional[Sequence[str]] = None) -> "Histogram": | |
| """ | |
| Create a histogram. | |
| Args: | |
| name: The name of the instrument to be created | |
| description: A description for this instrument and what it measures. | |
| unit: The unit for observations this instrument reports. For | |
| example, ``By`` for bytes. UCUM units are recommended. | |
| """ | |
| class BaseMetric(ABC): | |
| """ | |
| Metric is the base class for all metrics. | |
| Args: | |
| name: The name of the metric. | |
| description: The description of the metric. | |
| unit: The unit of the metric. | |
| provider: The provider of the metric. | |
| """ | |
| def __init__(self, | |
| name: str, | |
| description: str, | |
| unit: str, | |
| provider: MetricProvider, | |
| label_names: Optional[Sequence[str]] = None): | |
| self._name = name | |
| self._description = description | |
| self._unit = unit | |
| self._provider = provider | |
| self._label_names = label_names | |
| self._type = None | |
| class Counter(BaseMetric): | |
| """ | |
| Counter is a subclass of BaseMetric, representing a counter metric. | |
| A counter is a cumulative metric that represents a single numerical value that only ever goes up. | |
| """ | |
| def __init__(self, | |
| name: str, | |
| description: str, | |
| unit: str, | |
| provider: MetricProvider, | |
| label_names: Optional[Sequence[str]] = None): | |
| """ | |
| Initialize the Counter. | |
| Args: | |
| name: The name of the metric. | |
| description: The description of the metric. | |
| unit: The unit of the metric. | |
| provider: The provider of the metric. | |
| """ | |
| super().__init__(name, description, unit, provider, label_names) | |
| self._type = MetricType.COUNTER | |
| def add(self, value: int, labels: dict = None) -> None: | |
| """ | |
| Add a value to the counter. | |
| Args: | |
| value: The value to add to the counter. | |
| labels: The labels to associate with the value. | |
| """ | |
| class UpDownCounter(BaseMetric): | |
| """ | |
| UpDownCounter is a subclass of BaseMetric, representing an un-down counter metric. | |
| An un-down counter is a cumulative metric that represents a single numerical value that only ever goes up. | |
| """ | |
| def __init__(self, | |
| name: str, | |
| description: str, | |
| unit: str, | |
| provider: MetricProvider, | |
| label_names: Optional[Sequence[str]] = None): | |
| """ | |
| Initialize the UnDownCounter. | |
| Args: | |
| name: The name of the metric. | |
| description: The description of the metric. | |
| unit: The unit of the metric. | |
| provider: The provider of the metric. | |
| """ | |
| super().__init__(name, description, unit, provider, label_names) | |
| self._type = MetricType.UPDOWNCOUNTER | |
| def inc(self, value: int, labels: dict = None) -> None: | |
| """ | |
| Add a value to the gauge. | |
| Args: | |
| value: The value to add to the gauge. | |
| labels: The labels to associate with the value. | |
| """ | |
| def dec(self, value: int, labels: dict = None) -> None: | |
| """ | |
| Subtract a value from the gauge. | |
| Args: | |
| value: The value to subtract from the gauge. | |
| labels: The labels to associate with the value. | |
| """ | |
| class Gauge(BaseMetric): | |
| """ | |
| Gauge is a subclass of BaseMetric, representing a gauge metric. | |
| A gauge is a metric that represents a single numerical value that can arbitrarily go up and down. | |
| """ | |
| def __init__(self, | |
| name: str, | |
| description: str, | |
| unit: str, | |
| provider: MetricProvider, | |
| label_names: Optional[Sequence[str]] = None): | |
| """ | |
| Initialize the Gauge. | |
| Args: | |
| name: The name of the metric. | |
| description: The description of the metric. | |
| unit: The unit of the metric. | |
| provider: The provider of the metric. | |
| """ | |
| super().__init__(name, description, unit, provider, label_names) | |
| self._type = MetricType.GAUGE | |
| def set(self, value: int, labels: dict = None) -> None: | |
| """ | |
| Set the value of the gauge. | |
| Args: | |
| value: The value to set the gauge to. | |
| labels: The labels to associate with the value. | |
| """ | |
| class Histogram(BaseMetric): | |
| """ | |
| Histogram is a subclass of BaseMetric, representing a histogram metric. | |
| A histogram is a metric that represents the distribution of a set of values. | |
| """ | |
| def __init__(self, | |
| name: str, | |
| description: str, | |
| unit: str, | |
| provider: MetricProvider, | |
| buckets: Sequence[float] = None, | |
| label_names: Optional[Sequence[str]] = None): | |
| """ | |
| Initialize the Histogram. | |
| Args: | |
| name: The name of the metric. | |
| description: The description of the metric. | |
| unit: The unit of the metric. | |
| provider: The provider of the metric. | |
| buckets: The buckets of the histogram. | |
| """ | |
| super().__init__(name, description, unit, provider, label_names) | |
| self._type = MetricType.HISTOGRAM | |
| self._buckets = buckets | |
| def record(self, value: int, labels: dict = None) -> None: | |
| """ | |
| Record a value in the histogram. | |
| Args: | |
| value: The value to record in the histogram. | |
| labels: The labels to associate with the value. | |
| """ | |
| class MetricExporter(ABC): | |
| """ | |
| MetricExporter is the base class for all metric exporters. | |
| """ | |
| def shutdown(self): | |
| """ | |
| Export the metrics. | |
| """ | |
| _GLOBAL_METRIC_PROVIDER: Optional[MetricProvider] = None | |
| def set_metric_provider(provider): | |
| """ | |
| Set the global metric provider. | |
| """ | |
| global _GLOBAL_METRIC_PROVIDER | |
| _GLOBAL_METRIC_PROVIDER = provider | |
| def get_metric_provider(): | |
| """ | |
| Get the global metric provider. | |
| """ | |
| global _GLOBAL_METRIC_PROVIDER | |
| if _GLOBAL_METRIC_PROVIDER is None: | |
| raise ValueError("No metric provider has been set.") | |
| return _GLOBAL_METRIC_PROVIDER | |