refactor: improve metric creation logic and silence ot warnings (#3207)

refactor(opentelemetry.py): enhance metric creation logic warnings and improved metric handling methods
This commit is contained in:
Gabriel Luiz Freitas Almeida 2024-08-23 09:51:36 -03:00 • committed by GitHub
commit 7e7d5a1a1c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,14 +1,15 @@
import threading
import warnings
from enum import Enum from enum import Enum
from opentelemetry import metrics
from opentelemetry.exporter.prometheus import PrometheusMetricReader
from opentelemetry.metrics import Observation, CallbackOptions
from opentelemetry.metrics._internal.instrument import Counter, Histogram, UpDownCounter
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.resources import Resource
from typing import Any, Dict, Mapping, Tuple, Union from typing import Any, Dict, Mapping, Tuple, Union
from weakref import WeakValueDictionary from weakref import WeakValueDictionary
import threading from opentelemetry import metrics
from opentelemetry.exporter.prometheus import PrometheusMetricReader
from opentelemetry.metrics import CallbackOptions, Observation
from opentelemetry.metrics._internal.instrument import Counter, Histogram, UpDownCounter
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.resources import Resource
# a default OpenTelelmetry meter name # a default OpenTelelmetry meter name
langflow_meter_name = "langflow" langflow_meter_name = "langflow"
@ -141,50 +142,50 @@ class OpenTelemetry(metaclass=ThreadSafeSingletonMetaUsingWeakref):
self._register_metric() self._register_metric()
resource = Resource.create({"service.name": "langflow"}) resource = Resource.create({"service.name": "langflow"})
meter_provider = MeterProvider(resource=resource) metric_readers = []
# configure prometheus exporter # configure prometheus exporter
self.prometheus_enabled = prometheus_enabled self.prometheus_enabled = prometheus_enabled
if prometheus_enabled: if prometheus_enabled:
reader = PrometheusMetricReader() metric_readers.append(PrometheusMetricReader())
meter_provider = MeterProvider(resource=resource, metric_readers=[reader])
meter_provider = MeterProvider(resource=resource, metric_readers=metric_readers)
metrics.set_meter_provider(meter_provider) metrics.set_meter_provider(meter_provider)
self.meter = meter_provider.get_meter(langflow_meter_name) self.meter = meter_provider.get_meter(langflow_meter_name)
for name, metric in self._metrics_registry.items(): for name, metric in self._metrics_registry.items():
# enforce the key in the mapping and metric's name are the same
# this error can get caught at unit test
if name != metric.name: if name != metric.name:
raise ValueError(f"Key '{name}' does not match metric name '{metric.name}'") raise ValueError(f"Key '{name}' does not match metric name '{metric.name}'")
with warnings.catch_warnings():
warnings.simplefilter("ignore")
self._metrics[metric.name] = self._create_metric(metric)
def _create_metric(self, metric):
if metric.type == MetricType.COUNTER: if metric.type == MetricType.COUNTER:
counter = self.meter.create_counter( return self.meter.create_counter(
name=metric.name, name=metric.name,
unit=metric.unit, unit=metric.unit,
description=metric.description, description=metric.description,
) )
self._metrics[metric.name] = counter
elif metric.type == MetricType.OBSERVABLE_GAUGE: elif metric.type == MetricType.OBSERVABLE_GAUGE:
gauge = ObservableGaugeWrapper( return ObservableGaugeWrapper(
name=metric.name, name=metric.name,
description=metric.description, description=metric.description,
unit=metric.unit, unit=metric.unit,
) )
self._metrics[metric.name] = gauge
elif metric.type == MetricType.UP_DOWN_COUNTER: elif metric.type == MetricType.UP_DOWN_COUNTER:
up_down_counter = self.meter.create_up_down_counter( return self.meter.create_up_down_counter(
name=metric.name, name=metric.name,
unit=metric.unit, unit=metric.unit,
description=metric.description, description=metric.description,
) )
self._metrics[metric.name] = up_down_counter
elif metric.type == MetricType.HISTOGRAM: elif metric.type == MetricType.HISTOGRAM:
histogram = self.meter.create_histogram( return self.meter.create_histogram(
name=metric.name, name=metric.name,
unit=metric.unit, unit=metric.unit,
description=metric.description, description=metric.description,
) )
self._metrics[metric.name] = histogram
else: else:
raise ValueError(f"Unknown metric type: {metric.type}") raise ValueError(f"Unknown metric type: {metric.type}")