コード例 #1
0
    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 = {}
コード例 #2
0
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)
コード例 #3
0
  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()
コード例 #4
0
 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)
コード例 #5
0
 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)
コード例 #6
0
 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']))
コード例 #7
0
    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
コード例 #8
0
    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'))
コード例 #9
0
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)