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
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']))
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
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.')
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
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)
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)
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))
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)
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
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)