Chromium Code Reviews| Index: infra_libs/ts_mon/common/monitors.py |
| diff --git a/infra_libs/ts_mon/common/monitors.py b/infra_libs/ts_mon/common/monitors.py |
| index 110508a6edf83340b69b66fedfb53af31792590c..9e70617462dfd1bb4ff8e41c9f6f5abf9fe19587 100644 |
| --- a/infra_libs/ts_mon/common/monitors.py |
| +++ b/infra_libs/ts_mon/common/monitors.py |
| @@ -6,6 +6,7 @@ |
| import base64 |
| +import httplib2 |
| import json |
| import logging |
| import socket |
| @@ -13,15 +14,13 @@ import traceback |
| from googleapiclient import discovery |
| from googleapiclient import errors |
| -from oauth2client import gce |
| -from oauth2client.client import GoogleCredentials |
| -from oauth2client.file import Storage |
| -import httplib2 |
| - |
| from infra_libs import httplib2_utils |
| from infra_libs.ts_mon.common import http_metrics |
| +from infra_libs.ts_mon.common import pb_to_popo |
| from infra_libs.ts_mon.protos import metrics_pb2 |
| - |
| +from oauth2client import gce |
| +from oauth2client.client import GoogleCredentials |
| +from oauth2client.file import Storage |
| # Special string that can be passed through as the credentials path to use the |
| # default Appengine or GCE service account. |
| @@ -38,6 +37,9 @@ class Monitor(object): |
| Metrics may be initialized before the underlying Monitor. If it does not exist |
| at the time that a Metric is sent, an exception will be raised. |
| """ |
| + |
| + _SCOPES = [] |
| + |
| @staticmethod |
| def _wrap_proto(data): |
| """Normalize MetricsData, list(MetricsData), and MetricsCollection. |
| @@ -56,19 +58,6 @@ class Monitor(object): |
| ret = metrics_pb2.MetricsCollection(data=[data]) |
| return ret |
| - def send(self, metric_pb): |
| - raise NotImplementedError() |
| - |
| - |
| -class PubSubMonitor(Monitor): |
| - """Class which publishes metrics to a Cloud Pub/Sub topic.""" |
| - |
| - _SCOPES = [ |
| - 'https://www.googleapis.com/auth/pubsub', |
| - ] |
| - |
| - TIMEOUT = 10 # seconds |
| - |
| def _load_credentials(self, credentials_file_path): |
| if credentials_file_path == GCE_CREDENTIALS: |
| return gce.AppAssertionCredentials(self._SCOPES) |
| @@ -88,6 +77,51 @@ class PubSubMonitor(Monitor): |
| return credentials |
| return Storage(credentials_file_path).get() |
| + def send(self, metric_pb): |
| + raise NotImplementedError() |
| + |
| +class HttpsMonitor(Monitor): |
| + |
| + _SCOPES = [ |
| + 'https://www.googleapis.com/auth/prodxmon' |
| + ] |
| + |
| + def __init__(self, endpoint, credentials_file_path, http=None): |
| + self._endpoint = endpoint |
| + credentials = self._load_credentials(credentials_file_path) |
| + if http is None: |
| + http = httplib2_utils.RetriableHttp( |
| + httplib2_utils.InstrumentedHttp('acq-mon-api')) |
|
Sergey Berezin
2016/07/06 22:35:49
nit: 4 spaces from the start of the previous line.
tnn
2016/07/06 22:44:36
Done.
|
| + self._http = credentials.authorize(http) |
| + |
| + def encodeToJson(self, metric_pb): |
| + return json.dumps({ 'resource': pb_to_popo.convert(metric_pb) }) |
| + |
| + def send(self, metric_pb): |
| + body = self.encodeToJson(self._wrap_proto(metric_pb)) |
| + |
| + try: |
| + resp, content = self._http.request(self._endpoint, method='POST', |
| + body=body) |
| + if resp.status != 200: |
| + logging.warning('HttpsMonitor.send received status %d: %s', resp, |
| + content) |
| + except (ValueError, errors.Error, |
| + socket.timeout, socket.error, socket.herror, socket.gaierror, |
| + httplib2.HttpLib2Error): |
| + logging.warning('HttpsMonitor.send failed: %s\n', |
| + traceback.format_exc()) |
| + |
| + |
| +class PubSubMonitor(Monitor): |
| + """Class which publishes metrics to a Cloud Pub/Sub topic.""" |
| + |
| + _SCOPES = [ |
| + 'https://www.googleapis.com/auth/pubsub', |
| + ] |
| + |
| + TIMEOUT = 10 # seconds |
| + |
| def _initialize(self): |
| creds = self._load_credentials(self._credsfile) |
| creds.authorize(self._http) |