spectator/config.py (26 lines of code) (raw):

from os import environ from typing import Dict, Optional from spectator.common_tags import tags_from_env_vars, validate_tags from spectator.writer.new_writer import is_valid_output_location class Config: """Create a new configuration with the provided location and extra common tags. All fields are optional. The extra common tags are added to every metric, on top of the common tags provided by spectatord. Possible values for `location` are: * `none` - Configure a no-op writer that does nothing. Can be used to disable metrics collection. * `memory` - Write metrics to memory. Useful for testing. * `stderr` - Write metrics to standard error. * `stdout` - Write metrics to standard output. * `udp` - Write metrics to the default spectatord UDP port. This is the default value. * `unix` - Write metrics to the default spectatord Unix Domain Socket. Useful for high-volume scenarios. * `file:///path/to/file` - Write metrics to a file or a Unix Domain Socket. * `udp://host:port` - Write metrics to a UDP socket. The output location can be overridden by configuring an environment variable SPECTATOR_OUTPUT_LOCATION with one of the values listed above. Overriding the output location may be useful for integration testing. """ def __init__(self, location: str = "udp", extra_common_tags: Optional[Dict[str, str]] = None) -> None: if extra_common_tags is None: extra_common_tags = {} self.extra_common_tags = self.calculate_extra_common_tags(extra_common_tags) self.location = self.calculate_location(location) @staticmethod def calculate_extra_common_tags(common_tags: Dict[str, str]) -> Dict[str, str]: merged_tags = validate_tags(common_tags) # merge common tags with env var tags; env vars take precedence for k, v in tags_from_env_vars().items(): merged_tags[k] = v return merged_tags @staticmethod def calculate_location(location: str) -> str: if not is_valid_output_location(location): raise ValueError(f"spectatord output location is invalid: {location}") override = environ.get("SPECTATOR_OUTPUT_LOCATION") if override is not None: if not is_valid_output_location(override): raise ValueError(f"SPECTATOR_OUTPUT_LOCATION is invalid: {override}") location = override return location