mirror of
https://github.com/open-telemetry/opentelemetry-python-contrib.git
synced 2025-07-30 21:56:07 +08:00
75 lines
2.0 KiB
Python
75 lines
2.0 KiB
Python
import itertools
|
|
|
|
|
|
from ... import _worker
|
|
from ..logger import get_logger
|
|
from .constants import (
|
|
DEFAULT_RUNTIME_METRICS,
|
|
DEFAULT_RUNTIME_TAGS,
|
|
)
|
|
from .metric_collectors import (
|
|
GCRuntimeMetricCollector,
|
|
PSUtilRuntimeMetricCollector,
|
|
)
|
|
from .tag_collectors import (
|
|
PlatformTagCollector,
|
|
TracerTagCollector,
|
|
)
|
|
|
|
log = get_logger(__name__)
|
|
|
|
|
|
class RuntimeCollectorsIterable(object):
|
|
def __init__(self, enabled=None):
|
|
self._enabled = enabled or self.ENABLED
|
|
# Initialize the collectors.
|
|
self._collectors = [c() for c in self.COLLECTORS]
|
|
|
|
def __iter__(self):
|
|
collected = (collector.collect(self._enabled) for collector in self._collectors)
|
|
return itertools.chain.from_iterable(collected)
|
|
|
|
def __repr__(self):
|
|
return "{}(enabled={})".format(self.__class__.__name__, self._enabled,)
|
|
|
|
|
|
class RuntimeTags(RuntimeCollectorsIterable):
|
|
ENABLED = DEFAULT_RUNTIME_TAGS
|
|
COLLECTORS = [
|
|
PlatformTagCollector,
|
|
TracerTagCollector,
|
|
]
|
|
|
|
|
|
class RuntimeMetrics(RuntimeCollectorsIterable):
|
|
ENABLED = DEFAULT_RUNTIME_METRICS
|
|
COLLECTORS = [
|
|
GCRuntimeMetricCollector,
|
|
PSUtilRuntimeMetricCollector,
|
|
]
|
|
|
|
|
|
class RuntimeWorker(_worker.PeriodicWorkerThread):
|
|
""" Worker thread for collecting and writing runtime metrics to a DogStatsd
|
|
client.
|
|
"""
|
|
|
|
FLUSH_INTERVAL = 10
|
|
|
|
def __init__(self, statsd_client, flush_interval=FLUSH_INTERVAL):
|
|
super(RuntimeWorker, self).__init__(interval=flush_interval, name=self.__class__.__name__)
|
|
self._statsd_client = statsd_client
|
|
self._runtime_metrics = RuntimeMetrics()
|
|
|
|
def flush(self):
|
|
with self._statsd_client:
|
|
for key, value in self._runtime_metrics:
|
|
log.debug("Writing metric %s:%s", key, value)
|
|
self._statsd_client.gauge(key, value)
|
|
|
|
run_periodic = flush
|
|
on_shutdown = flush
|
|
|
|
def __repr__(self):
|
|
return "{}(runtime_metrics={})".format(self.__class__.__name__, self._runtime_metrics,)
|