Exemplo n.º 1
0
 def __get_descriptor_list(self, options):
   stackdriver = stackdriver_service.make_service(options)
   project = options.get('project', None)
   type_map = stackdriver.fetch_all_custom_descriptors(project)
   descriptor_list = type_map.values()
   descriptor_list.sort(self.compare_types)
   return descriptor_list
 def __get_descriptor_list(self, options):
     stackdriver = stackdriver_service.make_service(options)
     project = stackdriver.project
     type_map = stackdriver.fetch_all_custom_descriptors(project)
     descriptor_list = type_map.values()
     descriptor_list.sort(self.compare_types)
     return descriptor_list
Exemplo n.º 3
0
  def process_commandline_request(self, options):
    """Implements CommandHandler."""
    path = options.get('dashboard', None)
    if not path:
      raise ValueError('No dashboard provided.')
    with open(path, 'r') as infile:
      specification = json.JSONDecoder().decode(infile.read())

    stackdriver = stackdriver_service.make_service(options)
    dashboards = stackdriver.stub.projects().dashboards()

    parent = 'projects/{0}'.format(stackdriver.project)
    if options.get('update', False):
      display_name = specification['displayName']
      found = lookup_dashboard(stackdriver, display_name)
      if found is None:
        raise ValueError('"{0}" not found.'.format(display_name))
      response = dashboards.update(
          name=found['name'], body=specification).execute()
      action = 'Updated'
    else:
      response = dashboards.create(parent=parent, body=specification).execute()
      action = 'Created'

    self.output(options, '{action} "{title}" with name {name}'.format(
        action=action, title=response['displayName'], name=response['name']))
Exemplo n.º 4
0
def get_descriptor_list(options):
  """Return a list of all the stackdriver custom metric descriptors."""
  stackdriver = stackdriver_service.make_service(options)
  project = stackdriver.project
  type_map = stackdriver.fetch_all_custom_descriptors(project)
  descriptor_list = type_map.values()
  descriptor_list.sort(compare_descriptor_types)
  return descriptor_list
Exemplo n.º 5
0
 def make_metric_service(self, options):
     """Create the metric service we'll use to publish metrics to a backend.
 """
     if options['stackdriver']:
         return stackdriver_service.make_service(options)
     if options['datadog']:
         return datadog_service.make_datadog_service(options)
     raise ValueError('No metric service specified.')
Exemplo n.º 6
0
 def make_metric_service(self, options):
   """Create the metric service we'll use to publish metrics to a backend.
   """
   if options['stackdriver']:
     return stackdriver_service.make_service(options)
   if options['datadog']:
     return datadog_service.make_datadog_service(options)
   raise ValueError('No metric service specified.')
Exemplo n.º 7
0
  def process_commandline_request(self, options, upsert_descriptors=None):
    """Implements CommandHandler."""
    if upsert_descriptors is None:
      upsert_descriptors = self.load_descriptors(options)

    stackdriver = stackdriver_service.make_service(options)
    project = stackdriver.project
    processor = UpsertCustomDescriptorsProcessor(project, stackdriver)
    type_map = stackdriver.fetch_all_custom_descriptors(project)

    processor.upsert_descriptors(
        project, upsert_descriptors, type_map, self.output)
 def __do_clear(self, options):
     """Deletes exsiting custom metric descriptors."""
     stackdriver = stackdriver_service.make_service(options)
     audit_results = stackdriver_descriptors.AuditResults(stackdriver)
     descriptor_list = audit_results.descriptor_map.values()
     audit_results.unused_descriptors = {
         item['type']: item
         for item in descriptor_list
     }
     stackdriver.descriptor_manager.delete_descriptors(
         descriptor_list, audit_results)
     return audit_results
Exemplo n.º 9
0
  def process_commandline_request(self, options):
    """Implements CommandHandler."""
    display_name = options.get('name', None)
    if not display_name:
      raise ValueError('No name provided.')

    stackdriver = stackdriver_service.make_service(options)
    found = lookup_dashboard(stackdriver, display_name)

    if found is None:
      raise ValueError('"{0}" not found.'.format(display_name))
    json_text = json.JSONEncoder(indent=2).encode(found)
    self.output(options, json_text)
Exemplo n.º 10
0
  def process_commandline_request(self, options, upsert_descriptors=None):
    """Implements CommandHandler."""
    if upsert_descriptors is None:
      upsert_descriptors = self.load_descriptors(options)

    stackdriver = stackdriver_service.make_service(options)
    processor = UpsertCustomDescriptorsProcessor(
        options['project'], stackdriver)
    project = options.get('project', None)
    type_map = stackdriver.fetch_all_custom_descriptors(project)

    processor.upsert_descriptors(
        project, upsert_descriptors, type_map, self.output)
Exemplo n.º 11
0
  def process_commandline_request(self, options):
    """Implements CommandHandler."""
    stackdriver = stackdriver_service.make_service(options)

    parent = 'projects/{0}'.format(stackdriver.project)
    dashboards = stackdriver.stub.projects().dashboards()
    request = dashboards.list(parent=parent)
    all_dashboards = []
    while  request:
      response = request.execute()
      all_dashboards.extend(response.get('dashboards', []))
      request = dashboards.list_next(request, response)

    found = {elem['name']: elem['displayName'] for elem in all_dashboards}
    self.output(options, str(found))
Exemplo n.º 12
0
  def clear_descriptors(options, descriptor_list):
    stackdriver = stackdriver_service.make_service(options)
    project = stackdriver.project
    delete_method = (stackdriver.stub.projects().metricDescriptors().delete)
    def delete_invocation(descriptor):
      name = descriptor['name']
      logging.info('batch DELETE %s', name)
      return delete_method(name=name)
    get_descriptor_name = lambda descriptor: descriptor['name']

    processor = BatchProcessor(
        project, stackdriver,
        descriptor_list, delete_invocation, get_descriptor_name)
    processor.process()
    return processor
    def process_commandline_request(self, options):
        """Implements CommandHandler."""
        options = google_service.normalize_options(options)
        if not options.get('manage_stackdriver_descriptors'):
            options['manage_stackdriver_descriptors'] = 'create'
        stackdriver = stackdriver_service.make_service(options)
        manager = stackdriver_descriptors.MetricDescriptorManager(
            stackdriver, ResponseProcessor(options))
        audit_results = manager.audit_descriptors(
            options, service_list=self.SERVICE_LIST)

        message = audit_results_to_output(
            audit_results, 'Metric_filters are not configured, or are empty.')
        self.output(options, message)

        if audit_results.errors:
            raise ValueError('Encountered %d errors' % audit_results.errors)
Exemplo n.º 14
0
  def __do_clear(self, options):
    """Deletes exsiting custom metric descriptors."""
    project = options.get('project', None)
    stackdriver = stackdriver_service.make_service(options)

    type_map = stackdriver.fetch_all_custom_descriptors(project)
    delete_method = (stackdriver.stub.projects().metricDescriptors().delete)
    def delete_invocation(descriptor):
      name = descriptor['name']
      logging.info('batch DELETE %s', name)
      return delete_method(name=name)
    get_descriptor_name = lambda descriptor: descriptor['name']

    processor = BatchProcessor(
        project, stackdriver,
        type_map.values(), delete_invocation, get_descriptor_name)
    processor.process()
    return type_map, processor
Exemplo n.º 15
0
  def __do_clear(self, options):
    """Deletes exsiting custom metric descriptors."""
    project = options.get('project', None)
    stackdriver = stackdriver_service.make_service(options)

    type_map = stackdriver.fetch_all_custom_descriptors(project)
    delete_method = (stackdriver.stub.projects().metricDescriptors().delete)
    def delete_invocation(descriptor):
      name = descriptor['name']
      logging.info('batch DELETE %s', name)
      return delete_method(name=name)
    get_descriptor_name = lambda descriptor: descriptor['name']

    processor = BatchProcessor(
        project, stackdriver,
        type_map.values(), delete_invocation, get_descriptor_name)
    processor.process()
    return type_map, processor
Exemplo n.º 16
0
    def make_metric_services(self, options):
        """Create the metric services we'll use to publish metrics to a backend.
    """
        service_list = []
        if options['stackdriver']:
            service_list.append(stackdriver_service.make_service(options))
        if options['datadog']:
            service_list.append(datadog_service.make_datadog_service(options))
        if options['prometheus']:
            service_list.append(prometheus_service.make_service(options))
            # This endpoint will be conditionally added only when prometheus is
            # configured. It doesnt have to be like this, but might as well to
            # avoid exposing it if it isnt needed.
            self.command_handlers.append(prometheus_service.ScrapeHandler())

        if service_list:
            return service_list

        raise ValueError('No metric service specified.')
    def process_web_request(self, request, path, params, fragment):
        """Implements CommandHandler."""
        options = dict(get_global_options())
        options.update(params)

        if str(params.get('clear_all')).lower() != 'true':
            stackdriver = stackdriver_service.make_service(options)
            audit_results = stackdriver_descriptors.AuditResults(stackdriver)
            descriptor_list = audit_results.descriptor_map.values()
            descriptor_html = '\n<li> '.join(item['type']
                                             for item in descriptor_list)
            html = textwrap.dedent("""\
          Clearing descriptors requires query parameter
          <code>clear_all=true</code>.
          <p/>
          Here are the {count} custom descriptors:
          <ul>
          <li>{descriptors}
          </ul>
          <p/>
          <a href="{path}?clear_all=true">Yes, delete everything!</a>
      """.format(count=len(descriptor_list),
                 descriptors=descriptor_html,
                 path=path))

            html_doc = http_server.build_html_document(
                html, title='Missing Parameters')
            request.respond(400, {'ContentType': 'text/html'}, html_doc)
            return

        audit_results = self.__do_clear(options)
        response_code = (httplib.OK if audit_results.obsoleted_count == 0 else
                         httplib.INTERNAL_SERVER_ERROR)
        headers = {'Content-Type': 'text/plain'}
        body = audit_results_to_output(audit_results,
                                       "No custom descriptors to delete.")
        request.respond(response_code, headers, body)
    def process_web_request(self, request, path, params, fragment):
        """Implements CommandHandler."""
        options = dict(get_global_options())
        stackdriver_options = options['stackdriver']
        mode = params.get('mode', 'none').lower()
        stackdriver_options['manage_descriptors'] = mode
        stackdriver = stackdriver_service.make_service(options)
        manager = stackdriver.descriptor_manager
        audit_results = manager.audit_descriptors(options)

        create_html = ''
        delete_html = ''
        full_html = ''
        if audit_results.num_unresolved_issues > 0:
            if audit_results.missing_count or audit_results.outdated_count:
                create_html = (
                    '<a href="{path}?mode=create">Create/Update ONLY</a>'.
                    format(path=path))

            if audit_results.obsoleted_count:
                delete_html = (
                    '<a href="{path}?mode=delete">Delete ONLY</a>'.format(
                        path=path))

            if create_html and delete_html:
                full_html = (
                    '<a href="{path}?mode=full">Create/Update AND Delete</a>'.
                    format(path=path))
        if not create_html:
            create_html = '<i>No Create/Update Needed</i>'
        if not delete_html:
            delete_html = '<i>No Extra Descriptors</i>'

        text = audit_results_to_output(audit_results,
                                       'Metric Filters not configured.')

        stackdriver_metric_prefix = stackdriver_descriptors.determine_metric_prefix(
            stackdriver_options)
        unchanged_names = audit_results.unchanged_descriptor_names
        if unchanged_names:
            unchanged = '{count} Unchanged Descriptors:\n  - {list}'.format(
                count=len(unchanged_names),
                list='\n  - '.join([
                    name[name.find(stackdriver_metric_prefix):]
                    for name in unchanged_names
                ]))
        else:
            unchanged = ''

        body = textwrap.dedent("""
          <b>Actions</b>
          <p/>
          {create}<br/>{delete}<br/>{full}
          <p/>
          <hr/>
          <b>Audit Results</b>
          <p/>
          <pre>{unchanged}
          {text}
          </pre>
      """.format(unchanged=unchanged,
                 text=text,
                 create=create_html,
                 delete=delete_html,
                 full=full_html))

        response_code = (httplib.OK if audit_results.errors == 0 else
                         httplib.INTERNAL_SERVER_ERROR)
        headers = {'Content-Type': 'text/html'}
        request.respond(response_code, headers, body)
def get_descriptor_list(options):
    stackdriver = stackdriver_service.make_service(options)
    return stackdriver_descriptors.get_descriptor_list(stackdriver)