# Copyright 2016 Google Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Create / interact with gcloud logging connections.""" from gcloud import connection as base_connection class Connection(base_connection.JSONConnection): """A connection to Google Cloud Logging via the JSON REST API. :type credentials: :class:`oauth2client.client.OAuth2Credentials` :param credentials: (Optional) The OAuth2 Credentials to use for this connection. :type http: :class:`httplib2.Http` or class that defines ``request()``. :param http: (Optional) HTTP object to make requests. :type api_base_url: string :param api_base_url: The base of the API call URL. Defaults to the value :attr:`Connection.API_BASE_URL`. """ API_BASE_URL = 'https://logging.googleapis.com' """The base of the API call URL.""" API_VERSION = 'v2beta1' """The version of the API, used in building the API call's URL.""" API_URL_TEMPLATE = '{api_base_url}/{api_version}{path}' """A template for the URL of a particular API call.""" SCOPE = ('https://www.googleapis.com/auth/logging.read', 'https://www.googleapis.com/auth/logging.write', 'https://www.googleapis.com/auth/logging.admin', 'https://www.googleapis.com/auth/cloud-platform') """The scopes required for authenticating as a Cloud Logging consumer.""" class _LoggingAPI(object): """Helper mapping logging-related APIs. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/entries https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.logs :type connection: :class:`gcloud.logging.connection.Connection` :param connection: the connection used to make API requests. """ def __init__(self, connection): self._connection = connection def list_entries(self, projects, filter_=None, order_by=None, page_size=None, page_token=None): """Return a page of log entry resources. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/entries/list :type projects: list of strings :param projects: project IDs to include. If not passed, defaults to the project bound to the client. :type filter_: str :param filter_: a filter expression. See: https://cloud.google.com/logging/docs/view/advanced_filters :type order_by: str :param order_by: One of :data:`gcloud.logging.ASCENDING` or :data:`gcloud.logging.DESCENDING`. :type page_size: int :param page_size: maximum number of entries to return, If not passed, defaults to a value set by the API. :type page_token: str :param page_token: opaque marker for the next "page" of entries. If not passed, the API will return the first page of entries. :rtype: tuple, (list, str) :returns: list of mappings, plus a "next page token" string: if not None, indicates that more entries can be retrieved with another call (pass that value as ``page_token``). """ params = {'projectIds': projects} if filter_ is not None: params['filter'] = filter_ if order_by is not None: params['orderBy'] = order_by if page_size is not None: params['pageSize'] = page_size if page_token is not None: params['pageToken'] = page_token resp = self._connection.api_request( method='POST', path='/entries:list', data=params) return resp.get('entries', ()), resp.get('nextPageToken') def write_entries(self, entries, logger_name=None, resource=None, labels=None): """API call: log an entry resource via a POST request See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/entries/write :type entries: sequence of mapping :param entries: the log entry resources to log. :type logger_name: string :param logger_name: name of default logger to which to log the entries; individual entries may override. :type resource: mapping :param resource: default resource to associate with entries; individual entries may override. :type labels: mapping :param labels: default labels to associate with entries; individual entries may override. """ data = {'entries': list(entries)} if logger_name is not None: data['logName'] = logger_name if resource is not None: data['resource'] = resource if labels is not None: data['labels'] = labels self._connection.api_request(method='POST', path='/entries:write', data=data) def logger_delete(self, project, logger_name): """API call: delete all entries in a logger via a DELETE request See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.logs/delete :type project: string :param project: ID of project containing the log entries to delete :type logger_name: string :param logger_name: name of logger containing the log entries to delete """ path = '/projects/%s/logs/%s' % (project, logger_name) self._connection.api_request(method='DELETE', path=path) class _SinksAPI(object): """Helper mapping sink-related APIs. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.sinks :type connection: :class:`gcloud.logging.connection.Connection` :param connection: the connection used to make API requests. """ def __init__(self, connection): self._connection = connection def list_sinks(self, project, page_size=None, page_token=None): """List sinks for the project associated with this client. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.sinks/list :type project: string :param project: ID of the project whose sinks are to be listed. :type page_size: int :param page_size: maximum number of sinks to return, If not passed, defaults to a value set by the API. :type page_token: str :param page_token: opaque marker for the next "page" of sinks. If not passed, the API will return the first page of sinks. :rtype: tuple, (list, str) :returns: list of mappings, plus a "next page token" string: if not None, indicates that more sinks can be retrieved with another call (pass that value as ``page_token``). """ params = {} if page_size is not None: params['pageSize'] = page_size if page_token is not None: params['pageToken'] = page_token path = '/projects/%s/sinks' % (project,) resp = self._connection.api_request( method='GET', path=path, query_params=params) sinks = resp.get('sinks', ()) return sinks, resp.get('nextPageToken') def sink_create(self, project, sink_name, filter_, destination): """API call: create a sink resource. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.sinks/create :type project: string :param project: ID of the project in which to create the sink. :type sink_name: string :param sink_name: the name of the sink :type filter_: string :param filter_: the advanced logs filter expression defining the entries exported by the sink. :type destination: string :param destination: destination URI for the entries exported by the sink. """ target = '/projects/%s/sinks' % (project,) data = { 'name': sink_name, 'filter': filter_, 'destination': destination, } self._connection.api_request(method='POST', path=target, data=data) def sink_get(self, project, sink_name): """API call: retrieve a sink resource. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.sinks/get :type project: string :param project: ID of the project containing the sink. :type sink_name: string :param sink_name: the name of the sink """ target = '/projects/%s/sinks/%s' % (project, sink_name) return self._connection.api_request(method='GET', path=target) def sink_update(self, project, sink_name, filter_, destination): """API call: update a sink resource. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.sinks/update :type project: string :param project: ID of the project containing the sink. :type sink_name: string :param sink_name: the name of the sink :type filter_: string :param filter_: the advanced logs filter expression defining the entries exported by the sink. :type destination: string :param destination: destination URI for the entries exported by the sink. """ target = '/projects/%s/sinks/%s' % (project, sink_name) data = { 'name': sink_name, 'filter': filter_, 'destination': destination, } self._connection.api_request(method='PUT', path=target, data=data) def sink_delete(self, project, sink_name): """API call: delete a sink resource. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.sinks/delete :type project: string :param project: ID of the project containing the sink. :type sink_name: string :param sink_name: the name of the sink """ target = '/projects/%s/sinks/%s' % (project, sink_name) self._connection.api_request(method='DELETE', path=target) class _MetricsAPI(object): """Helper mapping sink-related APIs. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.metrics :type connection: :class:`gcloud.logging.connection.Connection` :param connection: the connection used to make API requests. """ def __init__(self, connection): self._connection = connection def list_metrics(self, project, page_size=None, page_token=None): """List metrics for the project associated with this client. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.metrics/list :type project: string :param project: ID of the project whose metrics are to be listed. :type page_size: int :param page_size: maximum number of metrics to return, If not passed, defaults to a value set by the API. :type page_token: str :param page_token: opaque marker for the next "page" of metrics. If not passed, the API will return the first page of metrics. :rtype: tuple, (list, str) :returns: list of mappings, plus a "next page token" string: if not None, indicates that more metrics can be retrieved with another call (pass that value as ``page_token``). """ params = {} if page_size is not None: params['pageSize'] = page_size if page_token is not None: params['pageToken'] = page_token path = '/projects/%s/metrics' % (project,) resp = self._connection.api_request( method='GET', path=path, query_params=params) metrics = resp.get('metrics', ()) return metrics, resp.get('nextPageToken') def metric_create(self, project, metric_name, filter_, description=None): """API call: create a metric resource. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.metrics/create :type project: string :param project: ID of the project in which to create the metric. :type metric_name: string :param metric_name: the name of the metric :type filter_: string :param filter_: the advanced logs filter expression defining the entries exported by the metric. :type description: string :param description: description of the metric. """ target = '/projects/%s/metrics' % (project,) data = { 'name': metric_name, 'filter': filter_, 'description': description, } self._connection.api_request(method='POST', path=target, data=data) def metric_get(self, project, metric_name): """API call: retrieve a metric resource. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.metrics/get :type project: string :param project: ID of the project containing the metric. :type metric_name: string :param metric_name: the name of the metric """ target = '/projects/%s/metrics/%s' % (project, metric_name) return self._connection.api_request(method='GET', path=target) def metric_update(self, project, metric_name, filter_, description): """API call: update a metric resource. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.metrics/update :type project: string :param project: ID of the project containing the metric. :type metric_name: string :param metric_name: the name of the metric :type filter_: string :param filter_: the advanced logs filter expression defining the entries exported by the metric. :type description: string :param description: description of the metric. """ target = '/projects/%s/metrics/%s' % (project, metric_name) data = { 'name': metric_name, 'filter': filter_, 'description': description, } self._connection.api_request(method='PUT', path=target, data=data) def metric_delete(self, project, metric_name): """API call: delete a metric resource. See: https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/projects.metrics/delete :type project: string :param project: ID of the project containing the metric. :type metric_name: string :param metric_name: the name of the metric """ target = '/projects/%s/metrics/%s' % (project, metric_name) self._connection.api_request(method='DELETE', path=target)