monitoring/snippets/v3/cloud-client/snippets.py (275 lines of code) (raw):

# Copyright 2017 Google LLC # # 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. import argparse import os import pprint import time import uuid from google.api import metric_pb2 # type: ignore from google.api import monitored_resource_pb2 # type: ignore from google.cloud.monitoring_v3.services.metric_service import pagers PROJECT_ID = os.environ["GOOGLE_CLOUD_PROJECT"] def create_metric_descriptor(project_id: str) -> metric_pb2.MetricDescriptor: """Creates a new metric description Args: project_id: Google Cloud project id Returns: A new instance of metric description. """ # [START monitoring_create_metric] from google.api import label_pb2 as ga_label from google.api import metric_pb2 as ga_metric from google.cloud import monitoring_v3 client = monitoring_v3.MetricServiceClient() project_name = f"projects/{project_id}" descriptor = ga_metric.MetricDescriptor() descriptor.type = "custom.googleapis.com/my_metric" + str(uuid.uuid4()) descriptor.metric_kind = ga_metric.MetricDescriptor.MetricKind.GAUGE descriptor.value_type = ga_metric.MetricDescriptor.ValueType.DOUBLE descriptor.description = "This is a simple example of a custom metric." labels = ga_label.LabelDescriptor() labels.key = "TestLabel" labels.value_type = ga_label.LabelDescriptor.ValueType.STRING labels.description = "This is a test label" descriptor.labels.append(labels) descriptor = client.create_metric_descriptor( name=project_name, metric_descriptor=descriptor ) print("Created {}.".format(descriptor.name)) # [END monitoring_create_metric] return descriptor def delete_metric_descriptor(descriptor_name: str) -> None: """Deletes metric description Args: descriptor_name: Fully qualified descriptor name """ # [START monitoring_delete_metric] from google.cloud import monitoring_v3 client = monitoring_v3.MetricServiceClient() client.delete_metric_descriptor(name=descriptor_name) print("Deleted metric descriptor {}.".format(descriptor_name)) # [END monitoring_delete_metric] def write_time_series(project_id: str) -> None: """Writes a custom metric time series Args: project_id: Google Cloud project id """ # [START monitoring_write_timeseries] from google.cloud import monitoring_v3 client = monitoring_v3.MetricServiceClient() project_name = f"projects/{project_id}" series = monitoring_v3.TimeSeries() series.metric.type = "custom.googleapis.com/my_metric" + str(uuid.uuid4()) series.resource.type = "gce_instance" series.resource.labels["instance_id"] = "1234567890123456789" series.resource.labels["zone"] = "us-central1-c" series.metric.labels["TestLabel"] = "My Label Data" now = time.time() seconds = int(now) nanos = int((now - seconds) * 10**9) interval = monitoring_v3.TimeInterval( {"end_time": {"seconds": seconds, "nanos": nanos}} ) point = monitoring_v3.Point({"interval": interval, "value": {"double_value": 3.14}}) series.points = [point] client.create_time_series(name=project_name, time_series=[series]) # [END monitoring_write_timeseries] def list_time_series(project_id: str) -> pagers.ListTimeSeriesPager: """Prints CPU utilization metric collected during last 20 minutes Args: project_id: Google Cloud project id Returns: Collection of time series. Iterating over this object will yield results and resolve additional pages automatically. """ # [START monitoring_read_timeseries_simple] from google.cloud import monitoring_v3 client = monitoring_v3.MetricServiceClient() project_name = f"projects/{project_id}" now = time.time() seconds = int(now) nanos = int((now - seconds) * 10**9) interval = monitoring_v3.TimeInterval( { "end_time": {"seconds": seconds, "nanos": nanos}, "start_time": {"seconds": (seconds - 1200), "nanos": nanos}, } ) results = client.list_time_series( request={ "name": project_name, "filter": 'metric.type = "compute.googleapis.com/instance/cpu/utilization"', "interval": interval, "view": monitoring_v3.ListTimeSeriesRequest.TimeSeriesView.FULL, } ) for result in results: print(result) # [END monitoring_read_timeseries_simple] return results def list_time_series_header(project_id: str) -> pagers.ListTimeSeriesPager: """Prints CPU utilization metric's headers collected during last 20 minutes Args: project_id: Google Cloud project id Returns: Collection of time series. Iterating over this object will yield results and resolve additional pages automatically. """ # [START monitoring_read_timeseries_fields] from google.cloud import monitoring_v3 client = monitoring_v3.MetricServiceClient() project_name = f"projects/{project_id}" now = time.time() seconds = int(now) nanos = int((now - seconds) * 10**9) interval = monitoring_v3.TimeInterval( { "end_time": {"seconds": seconds, "nanos": nanos}, "start_time": {"seconds": (seconds - 1200), "nanos": nanos}, } ) results = client.list_time_series( request={ "name": project_name, "filter": 'metric.type = "compute.googleapis.com/instance/cpu/utilization"', "interval": interval, "view": monitoring_v3.ListTimeSeriesRequest.TimeSeriesView.HEADERS, } ) for result in results: print(result) # [END monitoring_read_timeseries_fields] return results def list_time_series_aggregate(project_id: str) -> pagers.ListTimeSeriesPager: """Prints aggregated CPU utilization metric for last hour Args: project_id: Google Cloud project id Returns: Collection of time series. Iterating over this object will yield results and resolve additional pages automatically. """ # [START monitoring_read_timeseries_align] from google.cloud import monitoring_v3 client = monitoring_v3.MetricServiceClient() project_name = f"projects/{project_id}" now = time.time() seconds = int(now) nanos = int((now - seconds) * 10**9) interval = monitoring_v3.TimeInterval( { "end_time": {"seconds": seconds, "nanos": nanos}, "start_time": {"seconds": (seconds - 3600), "nanos": nanos}, } ) aggregation = monitoring_v3.Aggregation( { "alignment_period": {"seconds": 1200}, # 20 minutes "per_series_aligner": monitoring_v3.Aggregation.Aligner.ALIGN_MEAN, } ) results = client.list_time_series( request={ "name": project_name, "filter": 'metric.type = "compute.googleapis.com/instance/cpu/utilization"', "interval": interval, "view": monitoring_v3.ListTimeSeriesRequest.TimeSeriesView.FULL, "aggregation": aggregation, } ) for result in results: print(result) # [END monitoring_read_timeseries_align] return results def list_time_series_reduce(project_id: str) -> pagers.ListTimeSeriesPager: """Prints CPU utilization for last hour using reducer Args: project_id: Google Cloud project id Returns: Collection of time series. Iterating over this object will yield results and resolve additional pages automatically. """ # [START monitoring_read_timeseries_reduce] from google.cloud import monitoring_v3 client = monitoring_v3.MetricServiceClient() project_name = f"projects/{project_id}" now = time.time() seconds = int(now) nanos = int((now - seconds) * 10**9) interval = monitoring_v3.TimeInterval( { "end_time": {"seconds": seconds, "nanos": nanos}, "start_time": {"seconds": (seconds - 3600), "nanos": nanos}, } ) aggregation = monitoring_v3.Aggregation( { "alignment_period": {"seconds": 1200}, # 20 minutes "per_series_aligner": monitoring_v3.Aggregation.Aligner.ALIGN_MEAN, "cross_series_reducer": monitoring_v3.Aggregation.Reducer.REDUCE_MEAN, "group_by_fields": ["resource.zone"], } ) results = client.list_time_series( request={ "name": project_name, "filter": 'metric.type = "compute.googleapis.com/instance/cpu/utilization"', "interval": interval, "view": monitoring_v3.ListTimeSeriesRequest.TimeSeriesView.FULL, "aggregation": aggregation, } ) for result in results: print(result) # [END monitoring_read_timeseries_reduce] return results def list_metric_descriptors(project_id: str) -> pagers.ListMetricDescriptorsPager: """Gets a list of metric descriptions Args: project_id: Google Cloud project id Returns: Collection of metric descriptors in the project. Iterating over this object will yield results and resolve additional pages automatically. """ # [START monitoring_list_descriptors] from google.cloud import monitoring_v3 client = monitoring_v3.MetricServiceClient() project_name = f"projects/{project_id}" descriptors = client.list_metric_descriptors(name=project_name) for descriptor in descriptors: print(descriptor.type) # [END monitoring_list_descriptors] return descriptors def list_monitored_resources( project_id: str, ) -> pagers.ListMonitoredResourceDescriptorsPager: """Gets a list of monitored resource descriptors Args: project_id: Google Cloud project id Returns: Collection of monitored resource descriptors. Iterating over this object will yield results and resolve additional pages automatically. """ # [START monitoring_list_resources] from google.cloud import monitoring_v3 client = monitoring_v3.MetricServiceClient() project_name = f"projects/{project_id}" resource_descriptors = client.list_monitored_resource_descriptors(name=project_name) for descriptor in resource_descriptors: print(descriptor.type) # [END monitoring_list_resources] return resource_descriptors def get_monitored_resource_descriptor( project_id: str, resource_type_name: str ) -> monitored_resource_pb2.MonitoredResourceDescriptor: """Prints monitored resource description by type Args: project_id: Google Cloud project id resource_type_name: a monitored resource type Returns: An object that describes the monitored resource """ # [START monitoring_get_resource] from google.cloud import monitoring_v3 client = monitoring_v3.MetricServiceClient() resource_path = ( f"projects/{project_id}/monitoredResourceDescriptors/{resource_type_name}" ) descriptor = client.get_monitored_resource_descriptor(name=resource_path) pprint.pprint(descriptor) # [END monitoring_get_resource] return descriptor def get_metric_descriptor(metric_name: str) -> metric_pb2.MetricDescriptor: """Gets metric descriptor by type Args: metric_name: fully qualified descriptor name Returns: An object that describes the monitored metric """ # [START monitoring_get_descriptor] from google.cloud import monitoring_v3 client = monitoring_v3.MetricServiceClient() descriptor = client.get_metric_descriptor(name=metric_name) pprint.pprint(descriptor) # [END monitoring_get_descriptor] return descriptor if __name__ == "__main__": parser = argparse.ArgumentParser( description="Demonstrates Monitoring API operations." ) subparsers = parser.add_subparsers(dest="command") create_metric_descriptor_parser = subparsers.add_parser( "create-metric-descriptor", help=create_metric_descriptor.__doc__ ) list_metric_descriptor_parser = subparsers.add_parser( "list-metric-descriptors", help=list_metric_descriptors.__doc__ ) get_metric_descriptor_parser = subparsers.add_parser( "get-metric-descriptor", help=get_metric_descriptor.__doc__ ) get_metric_descriptor_parser.add_argument( "--metric-type-name", help="The metric type of the metric descriptor to see details about.", required=True, ) delete_metric_descriptor_parser = subparsers.add_parser( "delete-metric-descriptor", help=list_metric_descriptors.__doc__ ) delete_metric_descriptor_parser.add_argument( "--metric-descriptor-name", help="Metric descriptor to delete", required=True ) list_resources_parser = subparsers.add_parser( "list-resources", help=list_monitored_resources.__doc__ ) get_resource_parser = subparsers.add_parser( "get-resource", help=get_monitored_resource_descriptor.__doc__ ) get_resource_parser.add_argument( "--resource-type-name", help="Monitored resource to view more information about.", required=True, ) write_time_series_parser = subparsers.add_parser( "write-time-series", help=write_time_series.__doc__ ) list_time_series_parser = subparsers.add_parser( "list-time-series", help=list_time_series.__doc__ ) list_time_series_header_parser = subparsers.add_parser( "list-time-series-header", help=list_time_series_header.__doc__ ) read_time_series_reduce = subparsers.add_parser( "list-time-series-reduce", help=list_time_series_reduce.__doc__ ) read_time_series_aggregate = subparsers.add_parser( "list-time-series-aggregate", help=list_time_series_aggregate.__doc__ ) args = parser.parse_args() if args.command == "create-metric-descriptor": create_metric_descriptor(PROJECT_ID) if args.command == "list-metric-descriptors": list_metric_descriptors(PROJECT_ID) if args.command == "get-metric-descriptor": get_metric_descriptor(args.metric_type_name) if args.command == "delete-metric-descriptor": delete_metric_descriptor(args.metric_descriptor_name) if args.command == "list-resources": list_monitored_resources(PROJECT_ID) if args.command == "get-resource": get_monitored_resource_descriptor(PROJECT_ID, args.resource_type_name) if args.command == "write-time-series": write_time_series(PROJECT_ID) if args.command == "list-time-series": list_time_series(PROJECT_ID) if args.command == "list-time-series-header": list_time_series_header(PROJECT_ID) if args.command == "list-time-series-reduce": list_time_series_reduce(PROJECT_ID) if args.command == "list-time-series-aggregate": list_time_series_aggregate(PROJECT_ID)