spectator/protocol_parser.py (37 lines of code) (raw):
from typing import Tuple, Type
from spectator.meter import Meter
from spectator.meter.age_gauge import AgeGauge
from spectator.meter.counter import Counter
from spectator.meter.dist_summary import DistributionSummary
from spectator.meter.gauge import Gauge
from spectator.meter.max_gauge import MaxGauge
from spectator.meter.meter_id import MeterId
from spectator.meter.monotonic_counter import MonotonicCounter
from spectator.meter.monotonic_counter_uint import MonotonicCounterUint
from spectator.meter.percentile_dist_summary import PercentileDistributionSummary
from spectator.meter.percentile_timer import PercentileTimer
from spectator.meter.timer import Timer
# https://netflix.github.io/atlas-docs/spectator/agent/usage/#metric-types
_METER_CLASSES = {
'A': AgeGauge,
'c': Counter,
'd': DistributionSummary,
'g': Gauge,
'm': MaxGauge,
'C': MonotonicCounter,
'U': MonotonicCounterUint,
'D': PercentileDistributionSummary,
'T': PercentileTimer,
't': Timer,
}
def get_meter_class(symbol: str) -> Type[Meter]:
return _METER_CLASSES.get(symbol)
def parse_protocol_line(line: str) -> Tuple[str, MeterId, str]:
"""Parse a SpectatorD protocol line into component parts. Utility exposed for testing."""
symbol, id, value = line.split(":")
# remove optional parts, such as gauge ttls
symbol = symbol.split(",")[0]
id = id.split(",")
name = id[0]
tags = {}
for tag in id[1:]:
k, v = tag.split("=")
tags[k] = v
return symbol, MeterId(name, tags), value