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

Unified Diff: third_party/google-endpoints/google/api/control/metric_descriptor.py

Issue 2666783008: Add google-endpoints to third_party/. (Closed)
Patch Set: Created 3 years, 11 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: third_party/google-endpoints/google/api/control/metric_descriptor.py
diff --git a/third_party/google-endpoints/google/api/control/metric_descriptor.py b/third_party/google-endpoints/google/api/control/metric_descriptor.py
new file mode 100644
index 0000000000000000000000000000000000000000..4f8b05454f420b42303bcfa0daad6fa01464a154
--- /dev/null
+++ b/third_party/google-endpoints/google/api/control/metric_descriptor.py
@@ -0,0 +1,271 @@
+# 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.
+
+"""metric_descriptor provides funcs for working with `MetricDescriptor` instances.
+
+:class:`KnownMetrics` is an :class:`enum.Enum` that defines the list of known
+`MetricDescriptor` instances. It is a complex enumeration that includes various
+attributes including
+
+- the full metric name
+- the kind of the metric
+- the value type of the metric
+- a func for updating :class:`Operation`s from a `ReportRequestInfo`
+
+"""
+
+from __future__ import absolute_import
+
+
+from enum import Enum
+from . import distribution, metric_value, messages, MetricKind, ValueType
+
+
+def _add_metric_value(name, value, an_op):
+ an_op.metricValueSets.append(
+ messages.MetricValueSet(metricName=name, metricValues=[value]))
+
+
+def _add_int64_metric_value(name, value, an_op):
+ _add_metric_value(
+ name, metric_value.create(int64Value=value), an_op)
+
+
+def _set_int64_metric_to_constant_1(name, dummy_info, op):
+ _add_int64_metric_value(name, 1, op)
+
+
+def _set_int64_metric_to_constant_1_if_http_error(name, info, op):
+ if info.response_code >= 400:
+ _add_int64_metric_value(name, 1, op)
+
+
+def _add_distribution_metric_value(name, value, an_op, distribution_args):
+ d = distribution.create_exponential(*distribution_args)
+ distribution.add_sample(value, d)
+ _add_metric_value(
+ name, metric_value.create(distributionValue=d), an_op)
+
+
+_SIZE_DISTRIBUTION_ARGS = (8, 10.0, 1.0)
+
+
+def _set_distribution_metric_to_request_size(name, info, an_op):
+ if info.request_size >= 0:
+ _add_distribution_metric_value(name, info.request_size, an_op,
+ _SIZE_DISTRIBUTION_ARGS)
+
+
+def _set_distribution_metric_to_response_size(name, info, an_op):
+ if info.response_size >= 0:
+ _add_distribution_metric_value(name, info.response_size, an_op,
+ _SIZE_DISTRIBUTION_ARGS)
+
+
+_TIME_DISTRIBUTION_ARGS = (8, 10.0, 1e-6)
+
+
+def _set_distribution_metric_to_request_time(name, info, an_op):
+ if info.request_time:
+ _add_distribution_metric_value(name, info.request_time.total_seconds(),
+ an_op, _TIME_DISTRIBUTION_ARGS)
+
+
+def _set_distribution_metric_to_backend_time(name, info, an_op):
+ if info.backend_time:
+ _add_distribution_metric_value(name, info.backend_time.total_seconds(),
+ an_op, _TIME_DISTRIBUTION_ARGS)
+
+
+def _set_distribution_metric_to_overhead_time(name, info, an_op):
+ if info.overhead_time:
+ _add_distribution_metric_value(name, info.overhead_time.total_seconds(),
+ an_op, _TIME_DISTRIBUTION_ARGS)
+
+
+class Mark(Enum):
+ """Enumerates the types of metric."""
+ PRODUCER = 1
+ CONSUMER = 2
+
+
+class KnownMetrics(Enum):
+ """Enumerates the known metrics."""
+
+ CONSUMER_REQUEST_COUNT = (
+ 'serviceruntime.googleapis.com/api/consumer/request_count',
+ MetricKind.DELTA,
+ ValueType.INT64,
+ _set_int64_metric_to_constant_1,
+ Mark.CONSUMER,
+ )
+ PRODUCER_REQUEST_COUNT = (
+ 'serviceruntime.googleapis.com/api/producer/request_count',
+ MetricKind.DELTA,
+ ValueType.INT64,
+ _set_int64_metric_to_constant_1,
+ )
+ CONSUMER_REQUEST_SIZES = (
+ 'serviceruntime.googleapis.com/api/consumer/request_sizes',
+ MetricKind.DELTA,
+ ValueType.DISTRIBUTION,
+ _set_distribution_metric_to_request_size,
+ Mark.CONSUMER,
+ )
+ PRODUCER_REQUEST_SIZES = (
+ 'serviceruntime.googleapis.com/api/producer/request_sizes',
+ MetricKind.DELTA,
+ ValueType.DISTRIBUTION,
+ _set_distribution_metric_to_request_size,
+ )
+ CONSUMER_RESPONSE_SIZES = (
+ 'serviceruntime.googleapis.com/api/consumer/response_sizes',
+ MetricKind.DELTA,
+ ValueType.DISTRIBUTION,
+ _set_distribution_metric_to_response_size,
+ Mark.CONSUMER,
+ )
+ PRODUCER_RESPONSE_SIZES = (
+ 'serviceruntime.googleapis.com/api/producer/response_sizes',
+ MetricKind.DELTA,
+ ValueType.DISTRIBUTION,
+ _set_distribution_metric_to_response_size,
+ )
+ CONSUMER_ERROR_COUNT = (
+ 'serviceruntime.googleapis.com/api/consumer/error_count',
+ MetricKind.DELTA,
+ ValueType.INT64,
+ _set_int64_metric_to_constant_1_if_http_error,
+ Mark.CONSUMER,
+ )
+ PRODUCER_ERROR_COUNT = (
+ 'serviceruntime.googleapis.com/api/producer/error_count',
+ MetricKind.DELTA,
+ ValueType.INT64,
+ _set_int64_metric_to_constant_1_if_http_error,
+ )
+ CONSUMER_TOTAL_LATENCIES = (
+ 'serviceruntime.googleapis.com/api/consumer/total_latencies',
+ MetricKind.DELTA,
+ ValueType.DISTRIBUTION,
+ _set_distribution_metric_to_request_time,
+ Mark.CONSUMER,
+ )
+ PRODUCER_TOTAL_LATENCIES = (
+ 'serviceruntime.googleapis.com/api/producer/total_latencies',
+ MetricKind.DELTA,
+ ValueType.DISTRIBUTION,
+ _set_distribution_metric_to_request_time,
+ )
+ CONSUMER_BACKEND_LATENCIES = (
+ 'serviceruntime.googleapis.com/api/consumer/backend_latencies',
+ MetricKind.DELTA,
+ ValueType.DISTRIBUTION,
+ _set_distribution_metric_to_backend_time,
+ Mark.CONSUMER,
+ )
+ PRODUCER_BACKEND_LATENCIES = (
+ 'serviceruntime.googleapis.com/api/producer/backend_latencies',
+ MetricKind.DELTA,
+ ValueType.DISTRIBUTION,
+ _set_distribution_metric_to_backend_time,
+ )
+ CONSUMER_REQUEST_OVERHEAD_LATENCIES = (
+ 'serviceruntime.googleapis.com/api/consumer/request_overhead_latencies',
+ MetricKind.DELTA,
+ ValueType.DISTRIBUTION,
+ _set_distribution_metric_to_overhead_time,
+ Mark.CONSUMER,
+ )
+ PRODUCER_REQUEST_OVERHEAD_LATENCIES = (
+ 'serviceruntime.googleapis.com/api/producer/request_overhead_latencies',
+ MetricKind.DELTA,
+ ValueType.DISTRIBUTION,
+ _set_distribution_metric_to_overhead_time,
+ )
+
+ def __init__(self, metric_name, kind, value_type, update_op_func,
+ mark=Mark.PRODUCER):
+ """Constructor.
+
+ update_op_func is used to when updating an `Operation` from a
+ `ReportRequestInfo`.
+
+ Args:
+ metric_name (str): the name of the metric descriptor
+ kind (:class:`MetricKind`): the ``kind`` of the described metric
+ value_type (:class:`ValueType`): the `value type` of the described metric
+ update_op_func (function): the func to update an operation
+
+ """
+ self.kind = kind
+ self.metric_name = metric_name
+ self.update_op_func = (self._consumer_metric(update_op_func)
+ if mark is Mark.CONSUMER else update_op_func)
+ self.value_type = value_type
+ self.mark = mark
+
+ def matches(self, desc):
+ """Determines if a given metric descriptor matches this enum instance
+
+ Args:
+ desc (:class:`google.api.gen.servicecontrol_v1_messages.MetricDescriptor`): the
+ instance to test
+
+ Return:
+ `True` if desc is supported, otherwise `False`
+
+ """
+ return (self.metric_name == desc.name and
+ self.kind == desc.metricKind and
+ self.value_type == desc.valueType)
+
+ def do_operation_update(self, info, an_op):
+ """Updates an operation using the assigned update_op_func
+
+ Args:
+ info: (:class:`google.api.control.report_request.Info`): the
+ info instance to update
+ an_op: (:class:`google.api.control.report_request.Info`):
+ the info instance to update
+
+ Return:
+ `True` if desc is supported, otherwise `False`
+
+ """
+ self.update_op_func(self.metric_name, info, an_op)
+
+ def _consumer_metric(self, update_op_func):
+ def resulting_updater(metric_name, info, an_op):
+ if info.api_key_valid:
+ update_op_func(metric_name, info, an_op)
+
+ return resulting_updater
+
+ @classmethod
+ def is_supported(cls, desc):
+ """Determines if the given metric descriptor is supported.
+
+ Args:
+ desc (:class:`google.api.gen.servicecontrol_v1_messages.MetricDescriptor`): the
+ metric descriptor to test
+
+ Return:
+ `True` if desc is supported, otherwise `False`
+
+ """
+ for m in cls:
+ if m.matches(desc):
+ return True
+ return False

Powered by Google App Engine
This is Rietveld 408576698