def __init__(self, stub_factory, options): """Constructor. Args: stub_factory: [callable that creates stub for stackdriver] This is passed as a callable to defer initialization because we create the handlers before we process commandline args. """ self.logger = logging.getLogger(__name__) options_copy = normalize_options(options) self.__service_options = options_copy[self.SERVICE_KEY] self.__stub_factory = stub_factory self.__stub = None self.__project = (self.__service_options.get('project') or str(determine_local_project())) logging.info('Using stackdriver project %r', self.__project) spectator_options = options_copy.get('spectator', {}) stackdriver_overrides = self.__service_options.get('spectator', {}) spectator_options.update(stackdriver_overrides) if self.__service_options.get('generic_task_resources'): spectator_options['decorate_service_name'] = False options_copy['spectator'] = spectator_options if 'transform_values' in self.__service_options: spectator_options['transform_values'] = ( self.__service_options['transform_values']) self.__spectator_helper = spectator_client.SpectatorClientHelper( options_copy) self.__monitored_resource = {}
def make_datadog_service(options, spectator_helper=None): arguments = DatadogArgumentsGenerator(options).generate_arguments() spectator_helper = (spectator_helper or spectator_client.SpectatorClientHelper(options)) return DatadogMetricsService(options, spectator_helper, **arguments)
def __init__(self, options): if not PROMETHEUS_AVAILABLE: raise ImportError( 'You must "pip install prometheus-client" to get' ' the prometheus client library.') self.__catalog = spectator_client.get_source_catalog(options) self.__spectator = spectator_client.SpectatorClient(options) self.__spectator_helper = spectator_client.SpectatorClientHelper(options) prometheus_options = options.get('prometheus', {}) # '_' is preferred but ':' was used in earlier releases. self.__hierarchy_separator = ( '_' if prometheus_options.get('use_standard_notation') == True else ':' ) add_metalabels = options.get( 'prometheus_add_source_metalabels', prometheus_options.get('add_source_metalabels', True)) self.__metalabels = {'job', 'instance'} if add_metalabels else {} self.__push_gateway = options.get('prometheus', {}).get('push_gateway') if self.__push_gateway: self.publish_metrics = self.__publish_to_gateway self.__last_collect_time = 0 self.__last_collect_metric_map = {} REGISTRY.register(self) # Register this so it will call our collect()
def test_normalize_name_and_tags_tagless_default(self): options = {} helper = spectator_client.SpectatorClientHelper(options) name, tags = helper.normalize_name_and_tags( 'myService', 'myMetric', self.TAGLESS_VALUE_DATA, self.METRIC_METADATA) self.assertEquals('myService/myMetric', name) self.assertEquals([], tags)
def test_normalize_name_and_tags_statistic_default(self): options = {} helper = spectator_client.SpectatorClientHelper(options) name, tags = helper.normalize_name_and_tags( 'myService', 'myMetric', self.TIMER_TIME_VALUE_DATA, self.METRIC_METADATA) self.assertEquals('myService/myMetric__totalTime', name) self.assertEquals([{'key': 'myTag', 'value': 'myTagValue'}], tags)
def test_normalize_name_and_tags_simple_with_service_tag_and_decoration( self): options = { 'spectator': { 'inject_service_tag': True, 'decorate_metric_name': True } } helper = spectator_client.SpectatorClientHelper(options) name, tags = helper.normalize_name_and_tags('myService-ro', 'myMetric', self.SIMPLE_VALUE_DATA, self.METRIC_METADATA) self.assertEquals('myService-ro/myMetric', name) self.assertEquals( sorted([{ 'key': 'myTag', 'value': 'myTagValue' }, { 'key': 'spin_service', 'value': 'myService' }, { 'key': 'spin_variant', 'value': 'ro' }], key=lambda d: d['key']), sorted(tags, key=lambda d: d['key']))
def __init__(self, stub_factory, options): """Constructor. Args: stub_factory: [callable that creates stub for stackdriver] This is passed as a callable to defer initialization because we create the handlers before we process commandline args. """ self.logger = logging.getLogger(__name__) options_copy = normalize_options(options) self.__stackdriver_options = options_copy['stackdriver'] self.__stub_factory = stub_factory self.__stub = None self.__project = self.__stackdriver_options.get('project') logging.info('Using stackdriver project %r', self.__project) spectator_options = options_copy.get('spectator', {}) stackdriver_overrides = self.__stackdriver_options.get('spectator', {}) spectator_options.update(stackdriver_overrides) if self.__stackdriver_options.get('generic_task_resources'): spectator_options['inject_service_tag'] = False spectator_options['decorate_service_name'] = False options_copy['spectator'] = spectator_options self.__spectator_helper = spectator_client.SpectatorClientHelper( options_copy) if not self.__project: # Set default to our instance if we are on GCE. # Otherwise ignore since we might not actually need the project. try: self.__project = get_google_metadata('project/project-id') except IOError: pass manager = stackdriver_descriptors.MetricDescriptorManager( self, spectator_client.ResponseProcessor(options_copy)) self.__descriptor_manager = manager # The janitor prepares metric descriptors before first write. self.__janitor_func = lambda: self.__auto_audit_metric_descriptors( options_copy) self.__next_janitor_time = time.time() self.__good_janitor_count = 0 self.__fix_stackdriver_labels_unsafe = self.__stackdriver_options.get( 'fix_labels_unsafe', False) self.__monitored_resource = {} self.__add_source_tag = False
def __init__(self, stub_factory, options): """Constructor. Args: stub_factory: [callable that creates stub for stackdriver] This is passed as a callable to defer initialization because we create the handlers before we process commandline args. """ self.logger = logging.getLogger(__name__) self.__stackdriver_options = dict(options.get('stackdriver', {})) for key in ['project', 'zone', 'instance_id', 'credentials_path']: if options.get(key): self.__stackdriver_options[key] = options[ key] # commandline override # Override options in "stackdriver" stanza if any were present. self.__stackdriver_options.update(options.get('stackdriver', {})) self.__stub_factory = stub_factory self.__stub = None self.__project = options.get('project', self.__stackdriver_options.get('project')) options_copy = dict(options) spectator_options = options_copy.get('spectator', {}) if self.__stackdriver_options.get('generic_task_resources'): spectator_options['inject_service_tag'] = False spectator_options['decorate_service_name'] = False options_copy['spectator'] = spectator_options self.__spectator_helper = spectator_client.SpectatorClientHelper( options_copy) if not self.__project: # Set default to our instance if we are on GCE. # Otherwise ignore since we might not actually need the project. try: self.__project = get_google_metadata('project/project-id') except IOError: pass self.__fix_stackdriver_labels_unsafe = options.get( 'fix_stackdriver_labels_unsafe', True) self.__monitored_resource = {} self.__add_source_tag = False undecorated_metric_names = ( options.get('stackdriver_generic_task_resources') or options.get('inject_service_tag'))
def make_new_relic_service(options, spectator_helper=None): spectator_helper = spectator_helper or spectator_client.SpectatorClientHelper( options) if 'newrelic' in options and 'insert_key' in options['newrelic']: insert_key = options['newrelic']['insert_key'] elif 'NEWRELIC_INSERT_KEY' in os.environ: insert_key = os.environ['NEWRELIC_INSERT_KEY'] else: raise Exception( "New Relic is enabled but the config file has no New Relic Insights Insert Key option \n" "See https://docs.newrelic.com/docs/insights/insights-data-sources/custom-data/send-custom-events-event-api for details on insert keys" ) if 'NEWRELIC_HOST' in os.environ: host = os.environ['NEWRELIC_HOST'] elif 'newrelic' in options and 'host' in options['newrelic']: host = options['newrelic']['host'] else: host = 'metric-api.newrelic.com' tags = extract_tags(options) metric_client = MetricClient(insert_key, host=host) return NewRelicMetricsService(spectator_helper, metric_client, tags, options)