Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(233)

Unified Diff: infra_libs/ts_mon/config.py

Issue 2213143002: Add infra_libs as a bootstrap dependency. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Removed the ugly import hack Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: infra_libs/ts_mon/config.py
diff --git a/infra_libs/ts_mon/config.py b/infra_libs/ts_mon/config.py
deleted file mode 100644
index b13e21d0fd56b5106b2d2d68835d30b65231c4e4..0000000000000000000000000000000000000000
--- a/infra_libs/ts_mon/config.py
+++ /dev/null
@@ -1,252 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import json
-import logging
-import os
-import socket
-import sys
-import urlparse
-import re
-
-import requests
-
-from infra_libs.ts_mon.common import interface
-from infra_libs.ts_mon.common import metric_store
-from infra_libs.ts_mon.common import monitors
-from infra_libs.ts_mon.common import standard_metrics
-from infra_libs.ts_mon.common import targets
-
-
-def load_machine_config(filename):
- if not os.path.exists(filename):
- logging.info('Configuration file does not exist, ignoring: %s', filename)
- return {}
-
- try:
- with open(filename) as fh:
- return json.load(fh)
- except Exception:
- logging.error('Configuration file couldn\'t be read: %s', filename)
- raise
-
-
-def _default_region(fqdn):
- # Check if we're running in a GCE instance.
- try:
- r = requests.get(
- 'http://metadata.google.internal/computeMetadata/v1/instance/zone',
- headers={'Metadata-Flavor': 'Google'},
- timeout=1.0)
- except requests.exceptions.RequestException:
- pass
- else:
- if r.status_code == requests.codes.ok:
- # The zone is the last slash-separated component.
- return r.text.split('/')[-1]
-
- try:
- return fqdn.split('.')[1] # [chrome|golo]
- except IndexError:
- return ''
-
-
-def _default_network(host):
- try:
- # Regular expression that matches the vast majority of our host names.
- # Matches everything of the form 'masterN', 'masterNa', and 'foo-xN'.
- return re.match(r'^([\w-]*?-[acm]|master)(\d+)a?$', host).group(2) # N
- except AttributeError:
- return ''
-
-
-def add_argparse_options(parser):
- """Add monitoring related flags to a process' argument parser.
-
- Args:
- parser (argparse.ArgumentParser): the parser for the main process.
- """
- if sys.platform == 'win32': # pragma: no cover
- default_config_file = 'C:\\chrome-infra\\ts-mon.json'
- else: # pragma: no cover
- default_config_file = '/etc/chrome-infra/ts-mon.json'
-
- parser = parser.add_argument_group('Timeseries Monitoring Options')
- parser.add_argument(
- '--ts-mon-config-file',
- default=default_config_file,
- help='path to a JSON config file that contains suitable values for '
- '"endpoint" and "credentials" for this machine. This config file is '
- 'intended to be shared by all processes on the machine, as the '
- 'values depend on the machine\'s position in the network, IP '
- 'whitelisting and deployment of credentials. (default: %(default)s)')
- parser.add_argument(
- '--ts-mon-endpoint',
- help='url (including file://, pubsub://project/topic, https://) to post '
- 'monitoring metrics to. If set, overrides the value in '
- '--ts-mon-config-file')
- parser.add_argument(
- '--ts-mon-credentials',
- help='path to a pkcs8 json credential file. If set, overrides the value '
- 'in --ts-mon-config-file')
- parser.add_argument(
- '--ts-mon-flush',
- choices=('manual', 'auto'), default='auto',
- help=('metric push behavior: manual (only send when flush() is called), '
- 'or auto (send automatically every --ts-mon-flush-interval-secs '
- 'seconds). (default: %(default)s)'))
- parser.add_argument(
- '--ts-mon-flush-interval-secs',
- type=int,
- default=60,
- help=('automatically push metrics on this interval if '
- '--ts-mon-flush=auto.'))
- parser.add_argument(
- '--ts-mon-autogen-hostname',
- action="store_true",
- help=('Indicate that the hostname is autogenerated. '
- 'This option must be set on autoscaled GCE VMs, Kubernetes pods, '
- 'or any other hosts with dynamically generated names.'))
-
- parser.add_argument(
- '--ts-mon-target-type',
- choices=('device', 'task'),
- default='device',
- help='the type of target that is being monitored ("device" or "task").'
- ' (default: %(default)s)')
-
- fqdn = socket.getfqdn().lower() # foo-[a|m]N.[chrome|golo].chromium.org
- host = fqdn.split('.')[0] # foo-[a|m]N
- region = _default_region(fqdn)
- network = _default_network(host)
-
- parser.add_argument(
- '--ts-mon-device-hostname',
- default=host,
- help='name of this device, (default: %(default)s)')
- parser.add_argument(
- '--ts-mon-device-region',
- default=region,
- help='name of the region this devices lives in. (default: %(default)s)')
- parser.add_argument(
- '--ts-mon-device-role',
- default='default',
- help='Role of the device. (default: %(default)s)')
- parser.add_argument(
- '--ts-mon-device-network',
- default=network,
- help='name of the network this device is connected to. '
- '(default: %(default)s)')
-
- parser.add_argument(
- '--ts-mon-task-service-name',
- help='name of the service being monitored')
- parser.add_argument(
- '--ts-mon-task-job-name',
- help='name of this job instance of the task')
- parser.add_argument(
- '--ts-mon-task-region',
- default=region,
- help='name of the region in which this task is running '
- '(default: %(default)s)')
- parser.add_argument(
- '--ts-mon-task-hostname',
- default=host,
- help='name of the host on which this task is running '
- '(default: %(default)s)')
- parser.add_argument(
- '--ts-mon-task-number', type=int, default=0,
- help='number (e.g. for replication) of this instance of this task '
- '(default: %(default)s)')
-
- parser.add_argument(
- '--ts-mon-metric-name-prefix',
- default='/chrome/infra/',
- help='metric name prefix for all metrics (default: %(default)s)')
-
-def process_argparse_options(args):
- """Process command line arguments to initialize the global monitor.
-
- Also initializes the default target.
-
- Starts a background thread to automatically flush monitoring metrics if not
- disabled by command line arguments.
-
- Args:
- args (argparse.Namespace): the result of parsing the command line arguments
- """
- # Parse the config file if it exists.
- config = load_machine_config(args.ts_mon_config_file)
- endpoint = config.get('endpoint', '')
- credentials = config.get('credentials', '')
- autogen_hostname = config.get('autogen_hostname', False)
-
- # Command-line args override the values in the config file.
- if args.ts_mon_endpoint is not None:
- endpoint = args.ts_mon_endpoint
- if args.ts_mon_credentials is not None:
- credentials = args.ts_mon_credentials
-
- if args.ts_mon_target_type == 'device':
- hostname = args.ts_mon_device_hostname
- if args.ts_mon_autogen_hostname or autogen_hostname:
- hostname = 'autogen:' + hostname
- interface.state.target = targets.DeviceTarget(
- args.ts_mon_device_region,
- args.ts_mon_device_role,
- args.ts_mon_device_network,
- hostname)
- if args.ts_mon_target_type == 'task':
- # Reimplement ArgumentParser.error, since we don't have access to the parser
- if not args.ts_mon_task_service_name:
- print >> sys.stderr, ('Argument --ts-mon-task-service-name must be '
- 'provided when the target type is "task".')
- sys.exit(2)
- if not args.ts_mon_task_job_name:
- print >> sys.stderr, ('Argument --ts-mon-task-job-name must be provided '
- 'when the target type is "task".')
- sys.exit(2)
- hostname = args.ts_mon_task_hostname
- if args.ts_mon_autogen_hostname or autogen_hostname:
- hostname = 'autogen:' + hostname
- interface.state.target = targets.TaskTarget(
- args.ts_mon_task_service_name,
- args.ts_mon_task_job_name,
- args.ts_mon_task_region,
- hostname,
- args.ts_mon_task_number)
-
- interface.state.metric_name_prefix = args.ts_mon_metric_name_prefix
- interface.state.global_monitor = monitors.NullMonitor()
-
- if endpoint.startswith('file://'):
- interface.state.global_monitor = monitors.DebugMonitor(
- endpoint[len('file://'):])
- elif endpoint.startswith('pubsub://'):
- if credentials:
- url = urlparse.urlparse(endpoint)
- project = url.netloc
- topic = url.path.strip('/')
- interface.state.global_monitor = monitors.PubSubMonitor(
- credentials, project, topic, use_instrumented_http=True)
- else:
- logging.error('ts_mon monitoring is disabled because credentials are not '
- 'available')
- elif endpoint.startswith('https://'):
- interface.state.global_monitor = monitors.HttpsMonitor(endpoint,
- credentials)
- elif endpoint.lower() == 'none':
- logging.info('ts_mon monitoring has been explicitly disabled')
- else:
- logging.error('ts_mon monitoring is disabled because the endpoint provided'
- ' is invalid or not supported: %s', endpoint)
-
- interface.state.flush_mode = args.ts_mon_flush
-
- if args.ts_mon_flush == 'auto':
- interface.state.flush_thread = interface._FlushThread(
- args.ts_mon_flush_interval_secs)
- interface.state.flush_thread.start()
-
- standard_metrics.init()

Powered by Google App Engine
This is Rietveld 408576698