Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial sketch of logging API usage docs. #1488

Closed
wants to merge 19 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,13 @@
search-index
search-document

.. toctree::
:maxdepth: 0
:hidden:
:caption: Cloud Logging

logging-usage

.. toctree::
:maxdepth: 0
:hidden:
Expand Down
307 changes: 307 additions & 0 deletions docs/logging-usage.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,307 @@
Using the API
=============


Authentication and Configuration
--------------------------------

- For an overview of authentication in ``gcloud-python``,
see :doc:`gcloud-auth`.

- In addition to any authentication configuration, you should also set the
:envvar:`GCLOUD_PROJECT` environment variable for the project you'd like
to interact with. If you are Google App Engine or Google Compute Engine
this will be detected automatically.

- After configuring your environment, create a
:class:`Client <gcloud.logging.client.Client>`

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()

or pass in ``credentials`` and ``project`` explicitly

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client(project='my-project', credentials=creds)


Writing log entries

This comment was marked as spam.

This comment was marked as spam.

-------------------

Write a simple text entry to a logger.

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> logger = client.logger('log_name')
>>> logger.log_text("A simple entry") # API call

This comment was marked as spam.

This comment was marked as spam.


Write a dictionary entry to a logger.

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> logger = client.logger('log_name')
>>> logger.log_struct(
... message="My second entry",
... weather="partly cloudy") # API call

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.



Retrieving log entries
----------------------

Fetch entries for the default project.

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> entries, token = client.list_entries() # API call

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

>>> for entry in entries:
... timestamp = entry.timestamp.isoformat()
... print('%sZ: %s | %s' %
... (timestamp, entry.text_payload, entry.struct_payload))
2016-02-17T20:35:49.031864072Z: A simple entry | None
2016-02-17T20:38:15.944418531Z: None | {'message': 'My second entry', 'weather': 'partly cloudy'}

Fetch entries across multiple projects.

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> entries, token = client.list_entries(
... project_ids=['one-project', 'another-project']) # API call

Filter entries retrieved using the `Advanced Logs Filters`_ syntax

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

.. _Advanced Logs Filters: https://cloud.google.com/logging/docs/view/advanced_filters

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> FILTER = "log:log_name AND textPayload:simple"

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

>>> entries, token = client.list_entries(filter=FILTER) # API call

Sort entries in descending timestamp order.

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> entries, token = client.list_entries(order_by=logging.DESCENDING) # API call

Retrieve entities in batches of 10, iterating until done.

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> retrieved = []
>>> token = None
>>> while True:
... entries, token = client.list_entries(page_size=10, page_token=token) # API call
... retrieved.extend(entries)
... if token is None:
... break


Delete all entries for a logger
-------------------------------

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> logger = client.logger('log_name')
>>> logger.delete_entries() # API call


Manage log metrics
------------------

Metrics are counters of entries which match a given filter. They can be
used within Cloud Monitoring to create charts and alerts.

Create a metric:

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> metric = client.metric(
... "robots", "Robots all up in your server",
... filter='log:apache-access AND textPayload:robot')

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

>>> metric.exists() # API call
False
>>> metric.create() # API call
>>> metric.exists() # API call
True

List all metrics for a project:

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> metrics, token = client.list_metrics()
>>> len(metrics)
1
>>> metric = metrics[0]

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

>>> metric.name
"robots"

Refresh local information about a metric:

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> metric = client.metric("robots")
>>> metric.reload() # API call
>>> metric.description
"Robots all up in your server"
>>> metric.filter
"log:apache-access AND textPayload:robot"

Update a metric:

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> metric = client.metric("robots")
>>> metric.exists() # API call
True
>>> metric.reload() # API call
>>> metric.description = "Danger, Will Robinson!"
>>> metric.update() # API call

Delete a metric:

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> metric = client.metric("robots")
>>> metric.exists() # API call
True
>>> metric.delete() # API call
>>> metric.exists() # API call
False


Export log entries using sinks
------------------------------

Sinks allow exporting entries which match a given filter to Cloud Storage
buckets, BigQuery datasets, or Cloud Pub/Sub topics.

Create a Cloud Storage sink:

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> sink = client.sink(
... "robots-storage",
... filter='log:apache-access AND textPayload:robot')

This comment was marked as spam.

>>> sink.storage_bucket = "my-bucket-name"
>>> sink.exists() # API call
False
>>> sink.create() # API call
>>> sink.exists() # API call
True

Create a BigQuery sink:

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> sink = client.sink(
... "robots-bq",
... filter='log:apache-access AND textPayload:robot')

This comment was marked as spam.

>>> sink.bigquery_dataset = "projects/my-project/datasets/my-dataset"

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

>>> sink.exists() # API call
False
>>> sink.create() # API call
>>> sink.exists() # API call
True

Create a Cloud Pub/Sub sink:

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> sink = client.sink(
... "robots-pubsub",
... filter='log:apache-access AND textPayload:robot')
>>> sink.pubsub_topic = 'projects/my-project/topics/my-topic'

This comment was marked as spam.

This comment was marked as spam.

>>> sink.exists() # API call
False
>>> sink.create() # API call
>>> sink.exists() # API call
True

List all sinks for a project:

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> sinks, token = client.list_sinks()
>>> for sink in sinks:
... print('%s: %s' % (sink.name, sink.destination))
robots-storage: storage.googleapis.com/my-bucket-name

This comment was marked as spam.

This comment was marked as spam.

robots-bq: bigquery.googleapis.com/projects/my-project/datasets/my-dataset
robots-pubsub: pubsub.googleapis.com/projects/my-project/topics/my-topic

Refresh local information about a sink:

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> sink = client.sink('robots-storage')
>>> sink.filter is None
True
>>> sink.reload() # API call
>>> sink.filter
'log:apache-access AND textPayload:robot'
>>> sink.destination
'storage.googleapis.com/my-bucket-name'

Update a sink:

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> sink = client.sink("robots")
>>> sink.reload() # API call
>>> sink.filter = "log:apache-access"
>>> sink.update() # API call

Delete a sink:

.. doctest::

>>> from gcloud import logging
>>> client = logging.Client()
>>> sink = client.sink(
... "robots",
... filter='log:apache-access AND textPayload:robot')

This comment was marked as spam.

This comment was marked as spam.

>>> sink.exists() # API call
True
>>> sink.delete() # API call
>>> sink.exists() # API call
False