<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="servicecontrol_v1.html">Service Control API</a> . <a href="servicecontrol_v1.services.html">services</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#allocateQuota">allocateQuota(serviceName, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Attempts to allocate quota for the specified consumer. It should be called</p>
<p class="toc_element">
  <code><a href="#check">check(serviceName, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Checks whether an operation on a service should be allowed to proceed</p>
<p class="toc_element">
  <code><a href="#report">report(serviceName, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Reports operation results to Google Service Control, such as logs and</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="allocateQuota">allocateQuota(serviceName, body=None, x__xgafv=None)</code>
  <pre>Attempts to allocate quota for the specified consumer. It should be called
before the operation is executed.

This method requires the `servicemanagement.services.quota`
permission on the specified service. For more information, see
[Cloud IAM](https://cloud.google.com/iam).

**NOTE:** The client **must** fail-open on server errors `INTERNAL`,
`UNKNOWN`, `DEADLINE_EXCEEDED`, and `UNAVAILABLE`. To ensure system
reliability, the server may inject these errors to prohibit any hard
dependency on the quota functionality.

Args:
  serviceName: string, Name of the service as specified in the service configuration. For example,
`&quot;pubsub.googleapis.com&quot;`.

See google.api.Service for the definition of a service name. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for the AllocateQuota method.
    &quot;serviceConfigId&quot;: &quot;A String&quot;, # Specifies which version of service configuration should be used to process
        # the request. If unspecified or no matching version can be found, the latest
        # one will be used.
    &quot;allocateOperation&quot;: { # Represents information regarding a quota operation. # Operation that describes the quota allocation.
      &quot;labels&quot;: { # Labels describing the operation.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;consumerId&quot;: &quot;A String&quot;, # Identity of the consumer for whom this quota operation is being performed.
          #
          # This can be in one of the following formats:
          #   project:&lt;project_id&gt;,
          #   project_number:&lt;project_number&gt;,
          #   api_key:&lt;api_key&gt;.
      &quot;operationId&quot;: &quot;A String&quot;, # Identity of the operation. This is expected to be unique within the scope
          # of the service that generated the operation, and guarantees idempotency in
          # case of retries.
          #
          # In order to ensure best performance and latency in the Quota backends,
          # operation_ids are optimally associated with time, so that related
          # operations can be accessed fast in storage. For this reason, the
          # recommended token for services that intend to operate at a high QPS is
          # Unix time in nanos + UUID
      &quot;methodName&quot;: &quot;A String&quot;, # Fully qualified name of the API method for which this quota operation is
          # requested. This name is used for matching quota rules or metric rules and
          # billing status rules defined in service configuration.
          #
          # This field should not be set if any of the following is true:
          # (1) the quota operation is performed on non-API resources.
          # (2) quota_metrics is set because the caller is doing quota override.
          #
          # Example of an RPC method name:
          #     google.example.library.v1.LibraryService.CreateShelf
      &quot;quotaMode&quot;: &quot;A String&quot;, # Quota mode for this operation.
      &quot;quotaMetrics&quot;: [ # Represents information about this operation. Each MetricValueSet
          # corresponds to a metric defined in the service configuration.
          # The data type used in the MetricValueSet must agree with
          # the data type specified in the metric definition.
          #
          # Within a single operation, it is not allowed to have more than one
          # MetricValue instances that have the same metric names and identical
          # label value combinations. If a request has such duplicated MetricValue
          # instances, the entire request is rejected with
          # an invalid argument error.
          #
          # This field is mutually exclusive with method_name.
        { # Represents a set of metric values in the same metric.
            # Each metric value in the set should have a unique combination of start time,
            # end time, and label values.
          &quot;metricName&quot;: &quot;A String&quot;, # The metric name defined in the service configuration.
          &quot;metricValues&quot;: [ # The values in this metric.
            { # Represents a single metric value.
              &quot;startTime&quot;: &quot;A String&quot;, # The start of the time period over which this metric value&#x27;s measurement
                  # applies. The time period has different semantics for different metric
                  # types (cumulative, delta, and gauge). See the metric definition
                  # documentation in the service configuration for details.
              &quot;moneyValue&quot;: { # Represents an amount of money with its currency type. # A money value.
                &quot;nanos&quot;: 42, # Number of nano (10^-9) units of the amount.
                    # The value must be between -999,999,999 and +999,999,999 inclusive.
                    # If `units` is positive, `nanos` must be positive or zero.
                    # If `units` is zero, `nanos` can be positive, zero, or negative.
                    # If `units` is negative, `nanos` must be negative or zero.
                    # For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
                &quot;units&quot;: &quot;A String&quot;, # The whole units of the amount.
                    # For example if `currencyCode` is `&quot;USD&quot;`, then 1 unit is one US dollar.
                &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in ISO 4217.
              },
              &quot;labels&quot;: { # The labels describing the metric value.
                  # See comments on google.api.servicecontrol.v1.Operation.labels for
                  # the overriding relationship.
                  # Note that this map must not contain monitored resource labels.
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;stringValue&quot;: &quot;A String&quot;, # A text string value.
              &quot;doubleValue&quot;: 3.14, # A double precision floating point value.
              &quot;int64Value&quot;: &quot;A String&quot;, # A signed 64-bit integer value.
              &quot;distributionValue&quot;: { # Distribution represents a frequency distribution of double-valued sample # A distribution value.
                  # points. It contains the size of the population of sample points plus
                  # additional optional information:
                  #
                  #   - the arithmetic mean of the samples
                  #   - the minimum and maximum of the samples
                  #   - the sum-squared-deviation of the samples, used to compute variance
                  #   - a histogram of the values of the sample points
                &quot;sumOfSquaredDeviation&quot;: 3.14, # The sum of squared deviations from the mean:
                    #   Sum[i=1..count]((x_i - mean)^2)
                    # where each x_i is a sample values. If `count` is zero then this field
                    # must be zero, otherwise validation of the request fails.
                &quot;exemplars&quot;: [ # Example points. Must be in increasing order of `value` field.
                  { # Exemplars are example points that may be used to annotate aggregated
                      # distribution values. They are metadata that gives information about a
                      # particular value added to a Distribution bucket, such as a trace ID that
                      # was active when a value was added. They may contain further information,
                      # such as a example values and timestamps, origin, etc.
                    &quot;value&quot;: 3.14, # Value of the exemplar point. This value determines to which bucket the
                        # exemplar belongs.
                    &quot;timestamp&quot;: &quot;A String&quot;, # The observation (sampling) time of the above value.
                    &quot;attachments&quot;: [ # Contextual information about the example value. Examples are:
                        #
                        #   Trace: type.googleapis.com/google.monitoring.v3.SpanContext
                        #
                        #   Literal string: type.googleapis.com/google.protobuf.StringValue
                        #
                        #   Labels dropped during aggregation:
                        #     type.googleapis.com/google.monitoring.v3.DroppedLabels
                        #
                        # There may be only a single attachment of any given message type in a
                        # single exemplar, and this is enforced by the system.
                      {
                        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
                      },
                    ],
                  },
                ],
                &quot;exponentialBuckets&quot;: { # Describing buckets with exponentially growing width. # Buckets with exponentially growing width.
                  &quot;growthFactor&quot;: 3.14, # The i&#x27;th exponential bucket covers the interval
                      #   [scale * growth_factor^(i-1), scale * growth_factor^i)
                      # where i ranges from 1 to num_finite_buckets inclusive.
                      # Must be larger than 1.0.
                  &quot;scale&quot;: 3.14, # The i&#x27;th exponential bucket covers the interval
                      #   [scale * growth_factor^(i-1), scale * growth_factor^i)
                      # where i ranges from 1 to num_finite_buckets inclusive.
                      # Must be &gt; 0.
                  &quot;numFiniteBuckets&quot;: 42, # The number of finite buckets. With the underflow and overflow buckets,
                      # the total number of buckets is `num_finite_buckets` + 2.
                      # See comments on `bucket_options` for details.
                },
                &quot;minimum&quot;: 3.14, # The minimum of the population of values. Ignored if `count` is zero.
                &quot;linearBuckets&quot;: { # Describing buckets with constant width. # Buckets with constant width.
                  &quot;numFiniteBuckets&quot;: 42, # The number of finite buckets. With the underflow and overflow buckets,
                      # the total number of buckets is `num_finite_buckets` + 2.
                      # See comments on `bucket_options` for details.
                  &quot;width&quot;: 3.14, # The i&#x27;th linear bucket covers the interval
                      #   [offset + (i-1) * width, offset + i * width)
                      # where i ranges from 1 to num_finite_buckets, inclusive.
                      # Must be strictly positive.
                  &quot;offset&quot;: 3.14, # The i&#x27;th linear bucket covers the interval
                      #   [offset + (i-1) * width, offset + i * width)
                      # where i ranges from 1 to num_finite_buckets, inclusive.
                },
                &quot;mean&quot;: 3.14, # The arithmetic mean of the samples in the distribution. If `count` is
                    # zero then this field must be zero.
                &quot;count&quot;: &quot;A String&quot;, # The total number of samples in the distribution. Must be &gt;= 0.
                &quot;bucketCounts&quot;: [ # The number of samples in each histogram bucket. `bucket_counts` are
                    # optional. If present, they must sum to the `count` value.
                    #
                    # The buckets are defined below in `bucket_option`. There are N buckets.
                    # `bucket_counts[0]` is the number of samples in the underflow bucket.
                    # `bucket_counts[1]` to `bucket_counts[N-1]` are the numbers of samples
                    # in each of the finite buckets. And `bucket_counts[N] is the number
                    # of samples in the overflow bucket. See the comments of `bucket_option`
                    # below for more details.
                    #
                    # Any suffix of trailing zeros may be omitted.
                  &quot;A String&quot;,
                ],
                &quot;explicitBuckets&quot;: { # Describing buckets with arbitrary user-provided width. # Buckets with arbitrary user-provided width.
                  &quot;bounds&quot;: [ # &#x27;bound&#x27; is a list of strictly increasing boundaries between
                      # buckets. Note that a list of length N-1 defines N buckets because
                      # of fenceposting. See comments on `bucket_options` for details.
                      #
                      # The i&#x27;th finite bucket covers the interval
                      #   [bound[i-1], bound[i])
                      # where i ranges from 1 to bound_size() - 1. Note that there are no
                      # finite buckets at all if &#x27;bound&#x27; only contains a single element; in
                      # that special case the single bound defines the boundary between the
                      # underflow and overflow buckets.
                      #
                      # bucket number                   lower bound    upper bound
                      #  i == 0 (underflow)              -inf           bound[i]
                      #  0 &lt; i &lt; bound_size()            bound[i-1]     bound[i]
                      #  i == bound_size() (overflow)    bound[i-1]     +inf
                    3.14,
                  ],
                },
                &quot;maximum&quot;: 3.14, # The maximum of the population of values. Ignored if `count` is zero.
              },
              &quot;boolValue&quot;: True or False, # A boolean value.
              &quot;endTime&quot;: &quot;A String&quot;, # The end of the time period over which this metric value&#x27;s measurement
                  # applies.
            },
          ],
        },
      ],
    },
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response message for the AllocateQuota method.
    &quot;operationId&quot;: &quot;A String&quot;, # The same operation_id value used in the AllocateQuotaRequest. Used for
        # logging and diagnostics purposes.
    &quot;serviceConfigId&quot;: &quot;A String&quot;, # ID of the actual config used to process the request.
    &quot;allocateInfo&quot;: { # WARNING: DO NOT use this field until this warning message is removed.
      &quot;unusedArguments&quot;: [ # A list of label keys that were unused by the server in processing the
          # request. Thus, for similar requests repeated in a certain future time
          # window, the caller can choose to ignore these labels in the requests
          # to achieve better client-side cache hits and quota aggregation for rate
          # quota. This field is not populated for allocation quota checks.
        &quot;A String&quot;,
      ],
    },
    &quot;allocateErrors&quot;: [ # Indicates the decision of the allocate.
      { # Represents error information for QuotaOperation.
        &quot;subject&quot;: &quot;A String&quot;, # Subject to whom this error applies. See the specific enum for more details
            # on this field. For example, &quot;clientip:&lt;ip address of client&gt;&quot; or
            # &quot;project:&lt;Google developer project id&gt;&quot;.
        &quot;description&quot;: &quot;A String&quot;, # Free-form text that provides details on the cause of the error.
        &quot;code&quot;: &quot;A String&quot;, # Error code.
      },
    ],
    &quot;quotaMetrics&quot;: [ # Quota metrics to indicate the result of allocation. Depending on the
        # request, one or more of the following metrics will be included:
        #
        # 1. Per quota group or per quota metric incremental usage will be specified
        # using the following delta metric :
        #   &quot;serviceruntime.googleapis.com/api/consumer/quota_used_count&quot;
        #
        # 2. The quota limit reached condition will be specified using the following
        # boolean metric :
        #   &quot;serviceruntime.googleapis.com/quota/exceeded&quot;
      { # Represents a set of metric values in the same metric.
          # Each metric value in the set should have a unique combination of start time,
          # end time, and label values.
        &quot;metricName&quot;: &quot;A String&quot;, # The metric name defined in the service configuration.
        &quot;metricValues&quot;: [ # The values in this metric.
          { # Represents a single metric value.
            &quot;startTime&quot;: &quot;A String&quot;, # The start of the time period over which this metric value&#x27;s measurement
                # applies. The time period has different semantics for different metric
                # types (cumulative, delta, and gauge). See the metric definition
                # documentation in the service configuration for details.
            &quot;moneyValue&quot;: { # Represents an amount of money with its currency type. # A money value.
              &quot;nanos&quot;: 42, # Number of nano (10^-9) units of the amount.
                  # The value must be between -999,999,999 and +999,999,999 inclusive.
                  # If `units` is positive, `nanos` must be positive or zero.
                  # If `units` is zero, `nanos` can be positive, zero, or negative.
                  # If `units` is negative, `nanos` must be negative or zero.
                  # For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
              &quot;units&quot;: &quot;A String&quot;, # The whole units of the amount.
                  # For example if `currencyCode` is `&quot;USD&quot;`, then 1 unit is one US dollar.
              &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in ISO 4217.
            },
            &quot;labels&quot;: { # The labels describing the metric value.
                # See comments on google.api.servicecontrol.v1.Operation.labels for
                # the overriding relationship.
                # Note that this map must not contain monitored resource labels.
              &quot;a_key&quot;: &quot;A String&quot;,
            },
            &quot;stringValue&quot;: &quot;A String&quot;, # A text string value.
            &quot;doubleValue&quot;: 3.14, # A double precision floating point value.
            &quot;int64Value&quot;: &quot;A String&quot;, # A signed 64-bit integer value.
            &quot;distributionValue&quot;: { # Distribution represents a frequency distribution of double-valued sample # A distribution value.
                # points. It contains the size of the population of sample points plus
                # additional optional information:
                #
                #   - the arithmetic mean of the samples
                #   - the minimum and maximum of the samples
                #   - the sum-squared-deviation of the samples, used to compute variance
                #   - a histogram of the values of the sample points
              &quot;sumOfSquaredDeviation&quot;: 3.14, # The sum of squared deviations from the mean:
                  #   Sum[i=1..count]((x_i - mean)^2)
                  # where each x_i is a sample values. If `count` is zero then this field
                  # must be zero, otherwise validation of the request fails.
              &quot;exemplars&quot;: [ # Example points. Must be in increasing order of `value` field.
                { # Exemplars are example points that may be used to annotate aggregated
                    # distribution values. They are metadata that gives information about a
                    # particular value added to a Distribution bucket, such as a trace ID that
                    # was active when a value was added. They may contain further information,
                    # such as a example values and timestamps, origin, etc.
                  &quot;value&quot;: 3.14, # Value of the exemplar point. This value determines to which bucket the
                      # exemplar belongs.
                  &quot;timestamp&quot;: &quot;A String&quot;, # The observation (sampling) time of the above value.
                  &quot;attachments&quot;: [ # Contextual information about the example value. Examples are:
                      #
                      #   Trace: type.googleapis.com/google.monitoring.v3.SpanContext
                      #
                      #   Literal string: type.googleapis.com/google.protobuf.StringValue
                      #
                      #   Labels dropped during aggregation:
                      #     type.googleapis.com/google.monitoring.v3.DroppedLabels
                      #
                      # There may be only a single attachment of any given message type in a
                      # single exemplar, and this is enforced by the system.
                    {
                      &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
                    },
                  ],
                },
              ],
              &quot;exponentialBuckets&quot;: { # Describing buckets with exponentially growing width. # Buckets with exponentially growing width.
                &quot;growthFactor&quot;: 3.14, # The i&#x27;th exponential bucket covers the interval
                    #   [scale * growth_factor^(i-1), scale * growth_factor^i)
                    # where i ranges from 1 to num_finite_buckets inclusive.
                    # Must be larger than 1.0.
                &quot;scale&quot;: 3.14, # The i&#x27;th exponential bucket covers the interval
                    #   [scale * growth_factor^(i-1), scale * growth_factor^i)
                    # where i ranges from 1 to num_finite_buckets inclusive.
                    # Must be &gt; 0.
                &quot;numFiniteBuckets&quot;: 42, # The number of finite buckets. With the underflow and overflow buckets,
                    # the total number of buckets is `num_finite_buckets` + 2.
                    # See comments on `bucket_options` for details.
              },
              &quot;minimum&quot;: 3.14, # The minimum of the population of values. Ignored if `count` is zero.
              &quot;linearBuckets&quot;: { # Describing buckets with constant width. # Buckets with constant width.
                &quot;numFiniteBuckets&quot;: 42, # The number of finite buckets. With the underflow and overflow buckets,
                    # the total number of buckets is `num_finite_buckets` + 2.
                    # See comments on `bucket_options` for details.
                &quot;width&quot;: 3.14, # The i&#x27;th linear bucket covers the interval
                    #   [offset + (i-1) * width, offset + i * width)
                    # where i ranges from 1 to num_finite_buckets, inclusive.
                    # Must be strictly positive.
                &quot;offset&quot;: 3.14, # The i&#x27;th linear bucket covers the interval
                    #   [offset + (i-1) * width, offset + i * width)
                    # where i ranges from 1 to num_finite_buckets, inclusive.
              },
              &quot;mean&quot;: 3.14, # The arithmetic mean of the samples in the distribution. If `count` is
                  # zero then this field must be zero.
              &quot;count&quot;: &quot;A String&quot;, # The total number of samples in the distribution. Must be &gt;= 0.
              &quot;bucketCounts&quot;: [ # The number of samples in each histogram bucket. `bucket_counts` are
                  # optional. If present, they must sum to the `count` value.
                  #
                  # The buckets are defined below in `bucket_option`. There are N buckets.
                  # `bucket_counts[0]` is the number of samples in the underflow bucket.
                  # `bucket_counts[1]` to `bucket_counts[N-1]` are the numbers of samples
                  # in each of the finite buckets. And `bucket_counts[N] is the number
                  # of samples in the overflow bucket. See the comments of `bucket_option`
                  # below for more details.
                  #
                  # Any suffix of trailing zeros may be omitted.
                &quot;A String&quot;,
              ],
              &quot;explicitBuckets&quot;: { # Describing buckets with arbitrary user-provided width. # Buckets with arbitrary user-provided width.
                &quot;bounds&quot;: [ # &#x27;bound&#x27; is a list of strictly increasing boundaries between
                    # buckets. Note that a list of length N-1 defines N buckets because
                    # of fenceposting. See comments on `bucket_options` for details.
                    #
                    # The i&#x27;th finite bucket covers the interval
                    #   [bound[i-1], bound[i])
                    # where i ranges from 1 to bound_size() - 1. Note that there are no
                    # finite buckets at all if &#x27;bound&#x27; only contains a single element; in
                    # that special case the single bound defines the boundary between the
                    # underflow and overflow buckets.
                    #
                    # bucket number                   lower bound    upper bound
                    #  i == 0 (underflow)              -inf           bound[i]
                    #  0 &lt; i &lt; bound_size()            bound[i-1]     bound[i]
                    #  i == bound_size() (overflow)    bound[i-1]     +inf
                  3.14,
                ],
              },
              &quot;maximum&quot;: 3.14, # The maximum of the population of values. Ignored if `count` is zero.
            },
            &quot;boolValue&quot;: True or False, # A boolean value.
            &quot;endTime&quot;: &quot;A String&quot;, # The end of the time period over which this metric value&#x27;s measurement
                # applies.
          },
        ],
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="check">check(serviceName, body=None, x__xgafv=None)</code>
  <pre>Checks whether an operation on a service should be allowed to proceed
based on the configuration of the service and related policies. It must be
called before the operation is executed.

If feasible, the client should cache the check results and reuse them for
60 seconds. In case of any server errors, the client should rely on the
cached results for much longer time to avoid outage.
WARNING: There is general 60s delay for the configuration and policy
propagation, therefore callers MUST NOT depend on the `Check` method having
the latest policy information.

NOTE: the CheckRequest has the size limit of 64KB.

This method requires the `servicemanagement.services.check` permission
on the specified service. For more information, see
[Cloud IAM](https://cloud.google.com/iam).

Args:
  serviceName: string, The service name as specified in its service configuration. For example,
`&quot;pubsub.googleapis.com&quot;`.

See
[google.api.Service](https://cloud.google.com/service-management/reference/rpc/google.api#google.api.Service)
for the definition of a service name. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for the Check method.
    &quot;skipActivationCheck&quot;: True or False, # Indicates if service activation check should be skipped for this request.
        # Default behavior is to perform the check and apply relevant quota.
        # WARNING: Setting this flag to &quot;true&quot; will disable quota enforcement.
    &quot;operation&quot;: { # Represents information regarding an operation. # The operation to be checked.
      &quot;operationId&quot;: &quot;A String&quot;, # Identity of the operation. This must be unique within the scope of the
          # service that generated the operation. If the service calls
          # Check() and Report() on the same operation, the two calls should carry
          # the same id.
          #
          # UUID version 4 is recommended, though not required.
          # In scenarios where an operation is computed from existing information
          # and an idempotent id is desirable for deduplication purpose, UUID version 5
          # is recommended. See RFC 4122 for details.
      &quot;operationName&quot;: &quot;A String&quot;, # Fully qualified name of the operation. Reserved for future use.
      &quot;endTime&quot;: &quot;A String&quot;, # End time of the operation.
          # Required when the operation is used in ServiceController.Report,
          # but optional when the operation is used in ServiceController.Check.
      &quot;startTime&quot;: &quot;A String&quot;, # Required. Start time of the operation.
      &quot;importance&quot;: &quot;A String&quot;, # DO NOT USE. This is an experimental field.
      &quot;labels&quot;: { # Labels describing the operation. Only the following labels are allowed:
          #
          # - Labels describing monitored resources as defined in
          #   the service configuration.
          # - Default labels of metric values. When specified, labels defined in the
          #   metric value override these default.
          # - The following labels defined by Google Cloud Platform:
          #     - `cloud.googleapis.com/location` describing the location where the
          #        operation happened,
          #     - `servicecontrol.googleapis.com/user_agent` describing the user agent
          #        of the API request,
          #     - `servicecontrol.googleapis.com/service_agent` describing the service
          #        used to handle the API request (e.g. ESP),
          #     - `servicecontrol.googleapis.com/platform` describing the platform
          #        where the API is served, such as App Engine, Compute Engine, or
          #        Kubernetes Engine.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;resources&quot;: [ # The resources that are involved in the operation.
          # The maximum supported number of entries in this field is 100.
        { # Describes a resource associated with this operation.
          &quot;resourceName&quot;: &quot;A String&quot;, # Name of the resource. This is used for auditing purposes.
          &quot;resourceLocation&quot;: &quot;A String&quot;, # The location of the resource. If not empty, the resource will be checked
              # against location policy. The value must be a valid zone, region or
              # multiregion. For example: &quot;europe-west4&quot; or &quot;northamerica-northeast1-a&quot;
          &quot;resourceContainer&quot;: &quot;A String&quot;, # The identifier of the parent of this resource instance.
              # Must be in one of the following formats:
              #     - “projects/&lt;project-id or project-number&gt;”
              #     - “folders/&lt;folder-id&gt;”
              #     - “organizations/&lt;organization-id&gt;”
        },
      ],
      &quot;logEntries&quot;: [ # Represents information to be logged.
        { # An individual log entry.
          &quot;httpRequest&quot;: { # A common proto for logging HTTP requests. Only contains semantics # Optional. Information about the HTTP request associated with this
              # log entry, if applicable.
              # defined by the HTTP specification. Product-specific logging
              # information MUST be defined in a separate message.
            &quot;referer&quot;: &quot;A String&quot;, # The referer URL of the request, as defined in
                # [HTTP/1.1 Header Field
                # Definitions](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html).
            &quot;latency&quot;: &quot;A String&quot;, # The request processing latency on the server, from the time the request was
                # received until the response was sent.
            &quot;userAgent&quot;: &quot;A String&quot;, # The user agent sent by the client. Example:
                # `&quot;Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Q312461; .NET
                # CLR 1.0.3705)&quot;`.
            &quot;cacheFillBytes&quot;: &quot;A String&quot;, # The number of HTTP response bytes inserted into cache. Set only when a
                # cache fill was attempted.
            &quot;requestMethod&quot;: &quot;A String&quot;, # The request method. Examples: `&quot;GET&quot;`, `&quot;HEAD&quot;`, `&quot;PUT&quot;`, `&quot;POST&quot;`.
            &quot;requestSize&quot;: &quot;A String&quot;, # The size of the HTTP request message in bytes, including the request
                # headers and the request body.
            &quot;responseSize&quot;: &quot;A String&quot;, # The size of the HTTP response message sent back to the client, in bytes,
                # including the response headers and the response body.
            &quot;protocol&quot;: &quot;A String&quot;, # Protocol used for the request. Examples: &quot;HTTP/1.1&quot;, &quot;HTTP/2&quot;, &quot;websocket&quot;
            &quot;requestUrl&quot;: &quot;A String&quot;, # The scheme (http, https), the host name, the path, and the query
                # portion of the URL that was requested.
                # Example: `&quot;http://example.com/some/info?color=red&quot;`.
            &quot;remoteIp&quot;: &quot;A String&quot;, # The IP address (IPv4 or IPv6) of the client that issued the HTTP
                # request. Examples: `&quot;192.168.1.1&quot;`, `&quot;FE80::0202:B3FF:FE1E:8329&quot;`.
            &quot;serverIp&quot;: &quot;A String&quot;, # The IP address (IPv4 or IPv6) of the origin server that the request was
                # sent to.
            &quot;cacheLookup&quot;: True or False, # Whether or not a cache lookup was attempted.
            &quot;cacheHit&quot;: True or False, # Whether or not an entity was served from cache
                # (with or without validation).
            &quot;cacheValidatedWithOriginServer&quot;: True or False, # Whether or not the response was validated with the origin server before
                # being served from cache. This field is only meaningful if `cache_hit` is
                # True.
            &quot;status&quot;: 42, # The response code indicating the status of the response.
                # Examples: 200, 404.
          },
          &quot;operation&quot;: { # Additional information about a potentially long-running operation with which # Optional. Information about an operation associated with the log entry, if
              # applicable.
              # a log entry is associated.
            &quot;id&quot;: &quot;A String&quot;, # Optional. An arbitrary operation identifier. Log entries with the
                # same identifier are assumed to be part of the same operation.
            &quot;producer&quot;: &quot;A String&quot;, # Optional. An arbitrary producer identifier. The combination of
                # `id` and `producer` must be globally unique.  Examples for `producer`:
                # `&quot;MyDivision.MyBigCompany.com&quot;`, `&quot;github.com/MyProject/MyApplication&quot;`.
            &quot;first&quot;: True or False, # Optional. Set this to True if this is the first log entry in the operation.
            &quot;last&quot;: True or False, # Optional. Set this to True if this is the last log entry in the operation.
          },
          &quot;name&quot;: &quot;A String&quot;, # Required. The log to which this log entry belongs. Examples: `&quot;syslog&quot;`,
              # `&quot;book_log&quot;`.
          &quot;insertId&quot;: &quot;A String&quot;, # A unique ID for the log entry used for deduplication. If omitted,
              # the implementation will generate one based on operation_id.
          &quot;textPayload&quot;: &quot;A String&quot;, # The log entry payload, represented as a Unicode string (UTF-8).
          &quot;protoPayload&quot;: { # The log entry payload, represented as a protocol buffer that is
              # expressed as a JSON object. The only accepted type currently is
              # AuditLog.
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
          },
          &quot;labels&quot;: { # A set of user-defined (key, value) data that provides additional
              # information about the log entry.
            &quot;a_key&quot;: &quot;A String&quot;,
          },
          &quot;trace&quot;: &quot;A String&quot;, # Optional. Resource name of the trace associated with the log entry, if any.
              # If this field contains a relative resource name, you can assume the name is
              # relative to `//tracing.googleapis.com`. Example:
              # `projects/my-projectid/traces/06796866738c859f2f19b7cfb3214824`
          &quot;severity&quot;: &quot;A String&quot;, # The severity of the log entry. The default value is
              # `LogSeverity.DEFAULT`.
          &quot;sourceLocation&quot;: { # Additional information about the source code location that produced the log # Optional. Source code location information associated with the log entry,
              # if any.
              # entry.
            &quot;line&quot;: &quot;A String&quot;, # Optional. Line within the source file. 1-based; 0 indicates no line number
                # available.
            &quot;file&quot;: &quot;A String&quot;, # Optional. Source file name. Depending on the runtime environment, this
                # might be a simple name or a fully-qualified name.
            &quot;function&quot;: &quot;A String&quot;, # Optional. Human-readable name of the function or method being invoked, with
                # optional context such as the class or package name. This information may be
                # used in contexts such as the logs viewer, where a file and line number are
                # less meaningful. The format can vary by language. For example:
                # `qual.if.ied.Class.method` (Java), `dir/package.func` (Go), `function`
                # (Python).
          },
          &quot;structPayload&quot;: { # The log entry payload, represented as a structure that
              # is expressed as a JSON object.
            &quot;a_key&quot;: &quot;&quot;, # Properties of the object.
          },
          &quot;timestamp&quot;: &quot;A String&quot;, # The time the event described by the log entry occurred. If
              # omitted, defaults to operation start time.
        },
      ],
      &quot;userLabels&quot;: { # User defined labels for the resource that this operation is associated
          # with. Only a combination of 1000 user labels per consumer project are
          # allowed.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;metricValueSets&quot;: [ # Represents information about this operation. Each MetricValueSet
          # corresponds to a metric defined in the service configuration.
          # The data type used in the MetricValueSet must agree with
          # the data type specified in the metric definition.
          #
          # Within a single operation, it is not allowed to have more than one
          # MetricValue instances that have the same metric names and identical
          # label value combinations. If a request has such duplicated MetricValue
          # instances, the entire request is rejected with
          # an invalid argument error.
        { # Represents a set of metric values in the same metric.
            # Each metric value in the set should have a unique combination of start time,
            # end time, and label values.
          &quot;metricName&quot;: &quot;A String&quot;, # The metric name defined in the service configuration.
          &quot;metricValues&quot;: [ # The values in this metric.
            { # Represents a single metric value.
              &quot;startTime&quot;: &quot;A String&quot;, # The start of the time period over which this metric value&#x27;s measurement
                  # applies. The time period has different semantics for different metric
                  # types (cumulative, delta, and gauge). See the metric definition
                  # documentation in the service configuration for details.
              &quot;moneyValue&quot;: { # Represents an amount of money with its currency type. # A money value.
                &quot;nanos&quot;: 42, # Number of nano (10^-9) units of the amount.
                    # The value must be between -999,999,999 and +999,999,999 inclusive.
                    # If `units` is positive, `nanos` must be positive or zero.
                    # If `units` is zero, `nanos` can be positive, zero, or negative.
                    # If `units` is negative, `nanos` must be negative or zero.
                    # For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
                &quot;units&quot;: &quot;A String&quot;, # The whole units of the amount.
                    # For example if `currencyCode` is `&quot;USD&quot;`, then 1 unit is one US dollar.
                &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in ISO 4217.
              },
              &quot;labels&quot;: { # The labels describing the metric value.
                  # See comments on google.api.servicecontrol.v1.Operation.labels for
                  # the overriding relationship.
                  # Note that this map must not contain monitored resource labels.
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;stringValue&quot;: &quot;A String&quot;, # A text string value.
              &quot;doubleValue&quot;: 3.14, # A double precision floating point value.
              &quot;int64Value&quot;: &quot;A String&quot;, # A signed 64-bit integer value.
              &quot;distributionValue&quot;: { # Distribution represents a frequency distribution of double-valued sample # A distribution value.
                  # points. It contains the size of the population of sample points plus
                  # additional optional information:
                  #
                  #   - the arithmetic mean of the samples
                  #   - the minimum and maximum of the samples
                  #   - the sum-squared-deviation of the samples, used to compute variance
                  #   - a histogram of the values of the sample points
                &quot;sumOfSquaredDeviation&quot;: 3.14, # The sum of squared deviations from the mean:
                    #   Sum[i=1..count]((x_i - mean)^2)
                    # where each x_i is a sample values. If `count` is zero then this field
                    # must be zero, otherwise validation of the request fails.
                &quot;exemplars&quot;: [ # Example points. Must be in increasing order of `value` field.
                  { # Exemplars are example points that may be used to annotate aggregated
                      # distribution values. They are metadata that gives information about a
                      # particular value added to a Distribution bucket, such as a trace ID that
                      # was active when a value was added. They may contain further information,
                      # such as a example values and timestamps, origin, etc.
                    &quot;value&quot;: 3.14, # Value of the exemplar point. This value determines to which bucket the
                        # exemplar belongs.
                    &quot;timestamp&quot;: &quot;A String&quot;, # The observation (sampling) time of the above value.
                    &quot;attachments&quot;: [ # Contextual information about the example value. Examples are:
                        #
                        #   Trace: type.googleapis.com/google.monitoring.v3.SpanContext
                        #
                        #   Literal string: type.googleapis.com/google.protobuf.StringValue
                        #
                        #   Labels dropped during aggregation:
                        #     type.googleapis.com/google.monitoring.v3.DroppedLabels
                        #
                        # There may be only a single attachment of any given message type in a
                        # single exemplar, and this is enforced by the system.
                      {
                        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
                      },
                    ],
                  },
                ],
                &quot;exponentialBuckets&quot;: { # Describing buckets with exponentially growing width. # Buckets with exponentially growing width.
                  &quot;growthFactor&quot;: 3.14, # The i&#x27;th exponential bucket covers the interval
                      #   [scale * growth_factor^(i-1), scale * growth_factor^i)
                      # where i ranges from 1 to num_finite_buckets inclusive.
                      # Must be larger than 1.0.
                  &quot;scale&quot;: 3.14, # The i&#x27;th exponential bucket covers the interval
                      #   [scale * growth_factor^(i-1), scale * growth_factor^i)
                      # where i ranges from 1 to num_finite_buckets inclusive.
                      # Must be &gt; 0.
                  &quot;numFiniteBuckets&quot;: 42, # The number of finite buckets. With the underflow and overflow buckets,
                      # the total number of buckets is `num_finite_buckets` + 2.
                      # See comments on `bucket_options` for details.
                },
                &quot;minimum&quot;: 3.14, # The minimum of the population of values. Ignored if `count` is zero.
                &quot;linearBuckets&quot;: { # Describing buckets with constant width. # Buckets with constant width.
                  &quot;numFiniteBuckets&quot;: 42, # The number of finite buckets. With the underflow and overflow buckets,
                      # the total number of buckets is `num_finite_buckets` + 2.
                      # See comments on `bucket_options` for details.
                  &quot;width&quot;: 3.14, # The i&#x27;th linear bucket covers the interval
                      #   [offset + (i-1) * width, offset + i * width)
                      # where i ranges from 1 to num_finite_buckets, inclusive.
                      # Must be strictly positive.
                  &quot;offset&quot;: 3.14, # The i&#x27;th linear bucket covers the interval
                      #   [offset + (i-1) * width, offset + i * width)
                      # where i ranges from 1 to num_finite_buckets, inclusive.
                },
                &quot;mean&quot;: 3.14, # The arithmetic mean of the samples in the distribution. If `count` is
                    # zero then this field must be zero.
                &quot;count&quot;: &quot;A String&quot;, # The total number of samples in the distribution. Must be &gt;= 0.
                &quot;bucketCounts&quot;: [ # The number of samples in each histogram bucket. `bucket_counts` are
                    # optional. If present, they must sum to the `count` value.
                    #
                    # The buckets are defined below in `bucket_option`. There are N buckets.
                    # `bucket_counts[0]` is the number of samples in the underflow bucket.
                    # `bucket_counts[1]` to `bucket_counts[N-1]` are the numbers of samples
                    # in each of the finite buckets. And `bucket_counts[N] is the number
                    # of samples in the overflow bucket. See the comments of `bucket_option`
                    # below for more details.
                    #
                    # Any suffix of trailing zeros may be omitted.
                  &quot;A String&quot;,
                ],
                &quot;explicitBuckets&quot;: { # Describing buckets with arbitrary user-provided width. # Buckets with arbitrary user-provided width.
                  &quot;bounds&quot;: [ # &#x27;bound&#x27; is a list of strictly increasing boundaries between
                      # buckets. Note that a list of length N-1 defines N buckets because
                      # of fenceposting. See comments on `bucket_options` for details.
                      #
                      # The i&#x27;th finite bucket covers the interval
                      #   [bound[i-1], bound[i])
                      # where i ranges from 1 to bound_size() - 1. Note that there are no
                      # finite buckets at all if &#x27;bound&#x27; only contains a single element; in
                      # that special case the single bound defines the boundary between the
                      # underflow and overflow buckets.
                      #
                      # bucket number                   lower bound    upper bound
                      #  i == 0 (underflow)              -inf           bound[i]
                      #  0 &lt; i &lt; bound_size()            bound[i-1]     bound[i]
                      #  i == bound_size() (overflow)    bound[i-1]     +inf
                    3.14,
                  ],
                },
                &quot;maximum&quot;: 3.14, # The maximum of the population of values. Ignored if `count` is zero.
              },
              &quot;boolValue&quot;: True or False, # A boolean value.
              &quot;endTime&quot;: &quot;A String&quot;, # The end of the time period over which this metric value&#x27;s measurement
                  # applies.
            },
          ],
        },
      ],
      &quot;traceSpans&quot;: [ # Unimplemented. A list of Cloud Trace spans. The span names shall contain
          # the id of the destination project which can be either the produce or the
          # consumer project.
        { # A span represents a single operation within a trace. Spans can be
            # nested to form a trace tree. Often, a trace contains a root span
            # that describes the end-to-end latency, and one or more subspans for
            # its sub-operations. A trace can also contain multiple root spans,
            # or none at all. Spans do not need to be contiguous&amp;mdash;there may be
            # gaps or overlaps between spans in a trace.
          &quot;childSpanCount&quot;: 42, # An optional number of child spans that were generated while this span
              # was active. If set, allows implementation to detect missing child spans.
          &quot;sameProcessAsParentSpan&quot;: True or False, # (Optional) Set this parameter to indicate whether this span is in
              # the same process as its parent. If you do not set this parameter,
              # Stackdriver Trace is unable to take advantage of this helpful
              # information.
          &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # An optional final status for this span.
              # different programming environments, including REST APIs and RPC APIs. It is
              # used by [gRPC](https://github.com/grpc). Each `Status` message contains
              # three pieces of data: error code, error message, and error details.
              #
              # You can find out more about this error model and how to work with it in the
              # [API Design Guide](https://cloud.google.com/apis/design/errors).
            &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
            &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
                # user-facing error message should be localized and sent in the
                # google.rpc.Status.details field, or localized by the client.
            &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
                # message types for APIs to use.
              {
                &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
              },
            ],
          },
          &quot;name&quot;: &quot;A String&quot;, # The resource name of the span in the following format:
              #
              #     projects/[PROJECT_ID]/traces/[TRACE_ID]/spans/SPAN_ID is a unique identifier for a trace within a project;
              # it is a 32-character hexadecimal encoding of a 16-byte array.
              #
              # [SPAN_ID] is a unique identifier for a span within a trace; it
              # is a 16-character hexadecimal encoding of an 8-byte array.
          &quot;attributes&quot;: { # A set of attributes, each in the format `[KEY]:[VALUE]`. # A set of attributes on the span. You can have up to 32 attributes per
              # span.
            &quot;droppedAttributesCount&quot;: 42, # The number of attributes that were discarded. Attributes can be discarded
                # because their keys are too long or because there are too many attributes.
                # If this value is 0 then all attributes are valid.
            &quot;attributeMap&quot;: { # The set of attributes. Each attribute&#x27;s key can be up to 128 bytes
                # long. The value can be a string up to 256 bytes, a signed 64-bit integer,
                # or the Boolean values `true` and `false`. For example:
                #
                #     &quot;/instance_id&quot;: &quot;my-instance&quot;
                #     &quot;/http/user_agent&quot;: &quot;&quot;
                #     &quot;/http/request_bytes&quot;: 300
                #     &quot;abc.com/myattribute&quot;: true
              &quot;a_key&quot;: { # The allowed types for [VALUE] in a `[KEY]:[VALUE]` attribute.
                &quot;intValue&quot;: &quot;A String&quot;, # A 64-bit signed integer.
                &quot;stringValue&quot;: { # Represents a string that might be shortened to a specified length. # A string up to 256 bytes long.
                  &quot;truncatedByteCount&quot;: 42, # The number of bytes removed from the original string. If this
                      # value is 0, then the string was not shortened.
                  &quot;value&quot;: &quot;A String&quot;, # The shortened string. For example, if the original string is 500
                      # bytes long and the limit of the string is 128 bytes, then
                      # `value` contains the first 128 bytes of the 500-byte string.
                      #
                      # Truncation always happens on a UTF8 character boundary. If there
                      # are multi-byte characters in the string, then the length of the
                      # shortened string might be less than the size limit.
                },
                &quot;boolValue&quot;: True or False, # A Boolean value represented by `true` or `false`.
              },
            },
          },
          &quot;spanId&quot;: &quot;A String&quot;, # The [SPAN_ID] portion of the span&#x27;s resource name.
          &quot;parentSpanId&quot;: &quot;A String&quot;, # The [SPAN_ID] of this span&#x27;s parent span. If this is a root span,
              # then this field must be empty.
          &quot;endTime&quot;: &quot;A String&quot;, # The end time of the span. On the client side, this is the time kept by
              # the local machine where the span execution ends. On the server side, this
              # is the time when the server application handler stops running.
          &quot;spanKind&quot;: &quot;A String&quot;, # Distinguishes between spans generated in a particular context. For example,
              # two spans with the same name may be distinguished using `CLIENT` (caller)
              # and `SERVER` (callee) to identify an RPC call.
          &quot;startTime&quot;: &quot;A String&quot;, # The start time of the span. On the client side, this is the time kept by
              # the local machine where the span execution starts. On the server side, this
              # is the time when the server&#x27;s application handler starts running.
          &quot;displayName&quot;: { # Represents a string that might be shortened to a specified length. # A description of the span&#x27;s operation (up to 128 bytes).
              # Stackdriver Trace displays the description in the
              # Google Cloud Platform Console.
              # For example, the display name can be a qualified method name or a file name
              # and a line number where the operation is called. A best practice is to use
              # the same display name within an application and at the same call point.
              # This makes it easier to correlate spans in different traces.
            &quot;truncatedByteCount&quot;: 42, # The number of bytes removed from the original string. If this
                # value is 0, then the string was not shortened.
            &quot;value&quot;: &quot;A String&quot;, # The shortened string. For example, if the original string is 500
                # bytes long and the limit of the string is 128 bytes, then
                # `value` contains the first 128 bytes of the 500-byte string.
                #
                # Truncation always happens on a UTF8 character boundary. If there
                # are multi-byte characters in the string, then the length of the
                # shortened string might be less than the size limit.
          },
        },
      ],
      &quot;quotaProperties&quot;: { # Represents the properties needed for quota operations. # Represents the properties needed for quota check. Applicable only if this
          # operation is for a quota check request. If this is not specified, no quota
          # check will be performed.
        &quot;quotaMode&quot;: &quot;A String&quot;, # Quota mode for this operation.
      },
      &quot;consumerId&quot;: &quot;A String&quot;, # Identity of the consumer who is using the service.
          # This field should be filled in for the operations initiated by a
          # consumer, but not for service-initiated operations that are
          # not related to a specific consumer.
          #
          # - This can be in one of the following formats:
          #     - project:PROJECT_ID,
          #     - project`_`number:PROJECT_NUMBER,
          #     - projects/PROJECT_ID or PROJECT_NUMBER,
          #     - folders/FOLDER_NUMBER,
          #     - organizations/ORGANIZATION_NUMBER,
          #     - api`_`key:API_KEY.
    },
    &quot;requestProjectSettings&quot;: True or False, # Requests the project settings to be returned as part of the check response.
    &quot;serviceConfigId&quot;: &quot;A String&quot;, # Specifies which version of service configuration should be used to process
        # the request.
        # 
        # If unspecified or no matching version can be found, the
        # latest one will be used.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response message for the Check method.
    &quot;serviceRolloutId&quot;: &quot;A String&quot;, # The current service rollout id used to process the request.
    &quot;operationId&quot;: &quot;A String&quot;, # The same operation_id value used in the CheckRequest.
        # Used for logging and diagnostics purposes.
    &quot;checkErrors&quot;: [ # Indicate the decision of the check.
        #
        # If no check errors are present, the service should process the operation.
        # Otherwise the service should use the list of errors to determine the
        # appropriate action.
      { # Defines the errors to be returned in
          # google.api.servicecontrol.v1.CheckResponse.check_errors.
        &quot;detail&quot;: &quot;A String&quot;, # Free-form text providing details on the error cause of the error.
        &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # Contains public information about the check error. If available,
            # `status.code` will be non zero and client can propagate it out as public
            # error.
            # different programming environments, including REST APIs and RPC APIs. It is
            # used by [gRPC](https://github.com/grpc). Each `Status` message contains
            # three pieces of data: error code, error message, and error details.
            #
            # You can find out more about this error model and how to work with it in the
            # [API Design Guide](https://cloud.google.com/apis/design/errors).
          &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
          &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
              # user-facing error message should be localized and sent in the
              # google.rpc.Status.details field, or localized by the client.
          &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
              # message types for APIs to use.
            {
              &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
            },
          ],
        },
        &quot;subject&quot;: &quot;A String&quot;, # Subject to whom this error applies. See the specific code enum for more
            # details on this field. For example:
            #
            # - &quot;project:&lt;project-id or project-number&gt;&quot;
            # - &quot;folder:&lt;folder-id&gt;&quot;
            # - &quot;organization:&lt;organization-id&gt;&quot;
        &quot;code&quot;: &quot;A String&quot;, # The error code.
      },
    ],
    &quot;checkInfo&quot;: { # Contains additional information about the check operation. # Feedback data returned from the server during processing a Check request.
      &quot;unusedArguments&quot;: [ # A list of fields and label keys that are ignored by the server.
          # The client doesn&#x27;t need to send them for following requests to improve
          # performance and allow better aggregation.
        &quot;A String&quot;,
      ],
      &quot;consumerInfo&quot;: { # `ConsumerInfo` provides information about the consumer. # Consumer info of this check.
        &quot;type&quot;: &quot;A String&quot;, # The type of the consumer which should have been defined in
            # [Google Resource Manager](https://cloud.google.com/resource-manager/).
        &quot;projectNumber&quot;: &quot;A String&quot;, # The Google cloud project number, e.g. 1234567890. A value of 0 indicates
            # no project number is found.
            #
            # NOTE: This field is deprecated after Chemist support flexible consumer
            # id. New code should not depend on this field anymore.
        &quot;consumerNumber&quot;: &quot;A String&quot;, # The consumer identity number, can be Google cloud project number, folder
            # number or organization number e.g. 1234567890. A value of 0 indicates no
            # consumer number is found.
      },
    },
    &quot;serviceConfigId&quot;: &quot;A String&quot;, # The actual config id used to process the request.
    &quot;quotaInfo&quot;: { # Contains the quota information for a quota check response. # Quota information for the check request associated with this response.
      &quot;limitExceeded&quot;: [ # Quota Metrics that have exceeded quota limits.
          # For QuotaGroup-based quota, this is QuotaGroup.name
          # For QuotaLimit-based quota, this is QuotaLimit.name
          # See: google.api.Quota
          # Deprecated: Use quota_metrics to get per quota group limit exceeded status.
        &quot;A String&quot;,
      ],
      &quot;quotaConsumed&quot;: { # Map of quota group name to the actual number of tokens consumed. If the
          # quota check was not successful, then this will not be populated due to no
          # quota consumption.
          #
          # We are not merging this field with &#x27;quota_metrics&#x27; field because of the
          # complexity of scaling in Chemist client code base. For simplicity, we will
          # keep this field for Castor (that scales quota usage) and &#x27;quota_metrics&#x27;
          # for SuperQuota (that doesn&#x27;t scale quota usage).
        &quot;a_key&quot;: 42,
      },
      &quot;quotaMetrics&quot;: [ # Quota metrics to indicate the usage. Depending on the check request, one or
          # more of the following metrics will be included:
          #
          # 1. For rate quota, per quota group or per quota metric incremental usage
          # will be specified using the following delta metric:
          #   &quot;serviceruntime.googleapis.com/api/consumer/quota_used_count&quot;
          #
          # 2. For allocation quota, per quota metric total usage will be specified
          # using the following gauge metric:
          #   &quot;serviceruntime.googleapis.com/allocation/consumer/quota_used_count&quot;
          #
          # 3. For both rate quota and allocation quota, the quota limit reached
          # condition will be specified using the following boolean metric:
          #   &quot;serviceruntime.googleapis.com/quota/exceeded&quot;
        { # Represents a set of metric values in the same metric.
            # Each metric value in the set should have a unique combination of start time,
            # end time, and label values.
          &quot;metricName&quot;: &quot;A String&quot;, # The metric name defined in the service configuration.
          &quot;metricValues&quot;: [ # The values in this metric.
            { # Represents a single metric value.
              &quot;startTime&quot;: &quot;A String&quot;, # The start of the time period over which this metric value&#x27;s measurement
                  # applies. The time period has different semantics for different metric
                  # types (cumulative, delta, and gauge). See the metric definition
                  # documentation in the service configuration for details.
              &quot;moneyValue&quot;: { # Represents an amount of money with its currency type. # A money value.
                &quot;nanos&quot;: 42, # Number of nano (10^-9) units of the amount.
                    # The value must be between -999,999,999 and +999,999,999 inclusive.
                    # If `units` is positive, `nanos` must be positive or zero.
                    # If `units` is zero, `nanos` can be positive, zero, or negative.
                    # If `units` is negative, `nanos` must be negative or zero.
                    # For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
                &quot;units&quot;: &quot;A String&quot;, # The whole units of the amount.
                    # For example if `currencyCode` is `&quot;USD&quot;`, then 1 unit is one US dollar.
                &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in ISO 4217.
              },
              &quot;labels&quot;: { # The labels describing the metric value.
                  # See comments on google.api.servicecontrol.v1.Operation.labels for
                  # the overriding relationship.
                  # Note that this map must not contain monitored resource labels.
                &quot;a_key&quot;: &quot;A String&quot;,
              },
              &quot;stringValue&quot;: &quot;A String&quot;, # A text string value.
              &quot;doubleValue&quot;: 3.14, # A double precision floating point value.
              &quot;int64Value&quot;: &quot;A String&quot;, # A signed 64-bit integer value.
              &quot;distributionValue&quot;: { # Distribution represents a frequency distribution of double-valued sample # A distribution value.
                  # points. It contains the size of the population of sample points plus
                  # additional optional information:
                  #
                  #   - the arithmetic mean of the samples
                  #   - the minimum and maximum of the samples
                  #   - the sum-squared-deviation of the samples, used to compute variance
                  #   - a histogram of the values of the sample points
                &quot;sumOfSquaredDeviation&quot;: 3.14, # The sum of squared deviations from the mean:
                    #   Sum[i=1..count]((x_i - mean)^2)
                    # where each x_i is a sample values. If `count` is zero then this field
                    # must be zero, otherwise validation of the request fails.
                &quot;exemplars&quot;: [ # Example points. Must be in increasing order of `value` field.
                  { # Exemplars are example points that may be used to annotate aggregated
                      # distribution values. They are metadata that gives information about a
                      # particular value added to a Distribution bucket, such as a trace ID that
                      # was active when a value was added. They may contain further information,
                      # such as a example values and timestamps, origin, etc.
                    &quot;value&quot;: 3.14, # Value of the exemplar point. This value determines to which bucket the
                        # exemplar belongs.
                    &quot;timestamp&quot;: &quot;A String&quot;, # The observation (sampling) time of the above value.
                    &quot;attachments&quot;: [ # Contextual information about the example value. Examples are:
                        #
                        #   Trace: type.googleapis.com/google.monitoring.v3.SpanContext
                        #
                        #   Literal string: type.googleapis.com/google.protobuf.StringValue
                        #
                        #   Labels dropped during aggregation:
                        #     type.googleapis.com/google.monitoring.v3.DroppedLabels
                        #
                        # There may be only a single attachment of any given message type in a
                        # single exemplar, and this is enforced by the system.
                      {
                        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
                      },
                    ],
                  },
                ],
                &quot;exponentialBuckets&quot;: { # Describing buckets with exponentially growing width. # Buckets with exponentially growing width.
                  &quot;growthFactor&quot;: 3.14, # The i&#x27;th exponential bucket covers the interval
                      #   [scale * growth_factor^(i-1), scale * growth_factor^i)
                      # where i ranges from 1 to num_finite_buckets inclusive.
                      # Must be larger than 1.0.
                  &quot;scale&quot;: 3.14, # The i&#x27;th exponential bucket covers the interval
                      #   [scale * growth_factor^(i-1), scale * growth_factor^i)
                      # where i ranges from 1 to num_finite_buckets inclusive.
                      # Must be &gt; 0.
                  &quot;numFiniteBuckets&quot;: 42, # The number of finite buckets. With the underflow and overflow buckets,
                      # the total number of buckets is `num_finite_buckets` + 2.
                      # See comments on `bucket_options` for details.
                },
                &quot;minimum&quot;: 3.14, # The minimum of the population of values. Ignored if `count` is zero.
                &quot;linearBuckets&quot;: { # Describing buckets with constant width. # Buckets with constant width.
                  &quot;numFiniteBuckets&quot;: 42, # The number of finite buckets. With the underflow and overflow buckets,
                      # the total number of buckets is `num_finite_buckets` + 2.
                      # See comments on `bucket_options` for details.
                  &quot;width&quot;: 3.14, # The i&#x27;th linear bucket covers the interval
                      #   [offset + (i-1) * width, offset + i * width)
                      # where i ranges from 1 to num_finite_buckets, inclusive.
                      # Must be strictly positive.
                  &quot;offset&quot;: 3.14, # The i&#x27;th linear bucket covers the interval
                      #   [offset + (i-1) * width, offset + i * width)
                      # where i ranges from 1 to num_finite_buckets, inclusive.
                },
                &quot;mean&quot;: 3.14, # The arithmetic mean of the samples in the distribution. If `count` is
                    # zero then this field must be zero.
                &quot;count&quot;: &quot;A String&quot;, # The total number of samples in the distribution. Must be &gt;= 0.
                &quot;bucketCounts&quot;: [ # The number of samples in each histogram bucket. `bucket_counts` are
                    # optional. If present, they must sum to the `count` value.
                    #
                    # The buckets are defined below in `bucket_option`. There are N buckets.
                    # `bucket_counts[0]` is the number of samples in the underflow bucket.
                    # `bucket_counts[1]` to `bucket_counts[N-1]` are the numbers of samples
                    # in each of the finite buckets. And `bucket_counts[N] is the number
                    # of samples in the overflow bucket. See the comments of `bucket_option`
                    # below for more details.
                    #
                    # Any suffix of trailing zeros may be omitted.
                  &quot;A String&quot;,
                ],
                &quot;explicitBuckets&quot;: { # Describing buckets with arbitrary user-provided width. # Buckets with arbitrary user-provided width.
                  &quot;bounds&quot;: [ # &#x27;bound&#x27; is a list of strictly increasing boundaries between
                      # buckets. Note that a list of length N-1 defines N buckets because
                      # of fenceposting. See comments on `bucket_options` for details.
                      #
                      # The i&#x27;th finite bucket covers the interval
                      #   [bound[i-1], bound[i])
                      # where i ranges from 1 to bound_size() - 1. Note that there are no
                      # finite buckets at all if &#x27;bound&#x27; only contains a single element; in
                      # that special case the single bound defines the boundary between the
                      # underflow and overflow buckets.
                      #
                      # bucket number                   lower bound    upper bound
                      #  i == 0 (underflow)              -inf           bound[i]
                      #  0 &lt; i &lt; bound_size()            bound[i-1]     bound[i]
                      #  i == bound_size() (overflow)    bound[i-1]     +inf
                    3.14,
                  ],
                },
                &quot;maximum&quot;: 3.14, # The maximum of the population of values. Ignored if `count` is zero.
              },
              &quot;boolValue&quot;: True or False, # A boolean value.
              &quot;endTime&quot;: &quot;A String&quot;, # The end of the time period over which this metric value&#x27;s measurement
                  # applies.
            },
          ],
        },
      ],
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="report">report(serviceName, body=None, x__xgafv=None)</code>
  <pre>Reports operation results to Google Service Control, such as logs and
metrics. It should be called after an operation is completed.

If feasible, the client should aggregate reporting data for up to 5
seconds to reduce API traffic. Limiting aggregation to 5 seconds is to
reduce data loss during client crashes. Clients should carefully choose
the aggregation time window to avoid data loss risk more than 0.01%
for business and compliance reasons.

NOTE: the ReportRequest has the size limit (wire-format byte size) of
1MB.

This method requires the `servicemanagement.services.report` permission
on the specified service. For more information, see
[Google Cloud IAM](https://cloud.google.com/iam).

Args:
  serviceName: string, The service name as specified in its service configuration. For example,
`&quot;pubsub.googleapis.com&quot;`.

See
[google.api.Service](https://cloud.google.com/service-management/reference/rpc/google.api#google.api.Service)
for the definition of a service name. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request message for the Report method.
    &quot;operations&quot;: [ # Operations to be reported.
        # 
        # Typically the service should report one operation per request.
        # Putting multiple operations into a single request is allowed, but should
        # be used only when multiple operations are natually available at the time
        # of the report.
        # 
        # There is no limit on the number of operations in the same ReportRequest,
        # however the ReportRequest size should be no larger than 1MB. See
        # ReportResponse.report_errors for partial failure behavior.
      { # Represents information regarding an operation.
        &quot;operationId&quot;: &quot;A String&quot;, # Identity of the operation. This must be unique within the scope of the
            # service that generated the operation. If the service calls
            # Check() and Report() on the same operation, the two calls should carry
            # the same id.
            #
            # UUID version 4 is recommended, though not required.
            # In scenarios where an operation is computed from existing information
            # and an idempotent id is desirable for deduplication purpose, UUID version 5
            # is recommended. See RFC 4122 for details.
        &quot;operationName&quot;: &quot;A String&quot;, # Fully qualified name of the operation. Reserved for future use.
        &quot;endTime&quot;: &quot;A String&quot;, # End time of the operation.
            # Required when the operation is used in ServiceController.Report,
            # but optional when the operation is used in ServiceController.Check.
        &quot;startTime&quot;: &quot;A String&quot;, # Required. Start time of the operation.
        &quot;importance&quot;: &quot;A String&quot;, # DO NOT USE. This is an experimental field.
        &quot;labels&quot;: { # Labels describing the operation. Only the following labels are allowed:
            #
            # - Labels describing monitored resources as defined in
            #   the service configuration.
            # - Default labels of metric values. When specified, labels defined in the
            #   metric value override these default.
            # - The following labels defined by Google Cloud Platform:
            #     - `cloud.googleapis.com/location` describing the location where the
            #        operation happened,
            #     - `servicecontrol.googleapis.com/user_agent` describing the user agent
            #        of the API request,
            #     - `servicecontrol.googleapis.com/service_agent` describing the service
            #        used to handle the API request (e.g. ESP),
            #     - `servicecontrol.googleapis.com/platform` describing the platform
            #        where the API is served, such as App Engine, Compute Engine, or
            #        Kubernetes Engine.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;resources&quot;: [ # The resources that are involved in the operation.
            # The maximum supported number of entries in this field is 100.
          { # Describes a resource associated with this operation.
            &quot;resourceName&quot;: &quot;A String&quot;, # Name of the resource. This is used for auditing purposes.
            &quot;resourceLocation&quot;: &quot;A String&quot;, # The location of the resource. If not empty, the resource will be checked
                # against location policy. The value must be a valid zone, region or
                # multiregion. For example: &quot;europe-west4&quot; or &quot;northamerica-northeast1-a&quot;
            &quot;resourceContainer&quot;: &quot;A String&quot;, # The identifier of the parent of this resource instance.
                # Must be in one of the following formats:
                #     - “projects/&lt;project-id or project-number&gt;”
                #     - “folders/&lt;folder-id&gt;”
                #     - “organizations/&lt;organization-id&gt;”
          },
        ],
        &quot;logEntries&quot;: [ # Represents information to be logged.
          { # An individual log entry.
            &quot;httpRequest&quot;: { # A common proto for logging HTTP requests. Only contains semantics # Optional. Information about the HTTP request associated with this
                # log entry, if applicable.
                # defined by the HTTP specification. Product-specific logging
                # information MUST be defined in a separate message.
              &quot;referer&quot;: &quot;A String&quot;, # The referer URL of the request, as defined in
                  # [HTTP/1.1 Header Field
                  # Definitions](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html).
              &quot;latency&quot;: &quot;A String&quot;, # The request processing latency on the server, from the time the request was
                  # received until the response was sent.
              &quot;userAgent&quot;: &quot;A String&quot;, # The user agent sent by the client. Example:
                  # `&quot;Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Q312461; .NET
                  # CLR 1.0.3705)&quot;`.
              &quot;cacheFillBytes&quot;: &quot;A String&quot;, # The number of HTTP response bytes inserted into cache. Set only when a
                  # cache fill was attempted.
              &quot;requestMethod&quot;: &quot;A String&quot;, # The request method. Examples: `&quot;GET&quot;`, `&quot;HEAD&quot;`, `&quot;PUT&quot;`, `&quot;POST&quot;`.
              &quot;requestSize&quot;: &quot;A String&quot;, # The size of the HTTP request message in bytes, including the request
                  # headers and the request body.
              &quot;responseSize&quot;: &quot;A String&quot;, # The size of the HTTP response message sent back to the client, in bytes,
                  # including the response headers and the response body.
              &quot;protocol&quot;: &quot;A String&quot;, # Protocol used for the request. Examples: &quot;HTTP/1.1&quot;, &quot;HTTP/2&quot;, &quot;websocket&quot;
              &quot;requestUrl&quot;: &quot;A String&quot;, # The scheme (http, https), the host name, the path, and the query
                  # portion of the URL that was requested.
                  # Example: `&quot;http://example.com/some/info?color=red&quot;`.
              &quot;remoteIp&quot;: &quot;A String&quot;, # The IP address (IPv4 or IPv6) of the client that issued the HTTP
                  # request. Examples: `&quot;192.168.1.1&quot;`, `&quot;FE80::0202:B3FF:FE1E:8329&quot;`.
              &quot;serverIp&quot;: &quot;A String&quot;, # The IP address (IPv4 or IPv6) of the origin server that the request was
                  # sent to.
              &quot;cacheLookup&quot;: True or False, # Whether or not a cache lookup was attempted.
              &quot;cacheHit&quot;: True or False, # Whether or not an entity was served from cache
                  # (with or without validation).
              &quot;cacheValidatedWithOriginServer&quot;: True or False, # Whether or not the response was validated with the origin server before
                  # being served from cache. This field is only meaningful if `cache_hit` is
                  # True.
              &quot;status&quot;: 42, # The response code indicating the status of the response.
                  # Examples: 200, 404.
            },
            &quot;operation&quot;: { # Additional information about a potentially long-running operation with which # Optional. Information about an operation associated with the log entry, if
                # applicable.
                # a log entry is associated.
              &quot;id&quot;: &quot;A String&quot;, # Optional. An arbitrary operation identifier. Log entries with the
                  # same identifier are assumed to be part of the same operation.
              &quot;producer&quot;: &quot;A String&quot;, # Optional. An arbitrary producer identifier. The combination of
                  # `id` and `producer` must be globally unique.  Examples for `producer`:
                  # `&quot;MyDivision.MyBigCompany.com&quot;`, `&quot;github.com/MyProject/MyApplication&quot;`.
              &quot;first&quot;: True or False, # Optional. Set this to True if this is the first log entry in the operation.
              &quot;last&quot;: True or False, # Optional. Set this to True if this is the last log entry in the operation.
            },
            &quot;name&quot;: &quot;A String&quot;, # Required. The log to which this log entry belongs. Examples: `&quot;syslog&quot;`,
                # `&quot;book_log&quot;`.
            &quot;insertId&quot;: &quot;A String&quot;, # A unique ID for the log entry used for deduplication. If omitted,
                # the implementation will generate one based on operation_id.
            &quot;textPayload&quot;: &quot;A String&quot;, # The log entry payload, represented as a Unicode string (UTF-8).
            &quot;protoPayload&quot;: { # The log entry payload, represented as a protocol buffer that is
                # expressed as a JSON object. The only accepted type currently is
                # AuditLog.
              &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
            },
            &quot;labels&quot;: { # A set of user-defined (key, value) data that provides additional
                # information about the log entry.
              &quot;a_key&quot;: &quot;A String&quot;,
            },
            &quot;trace&quot;: &quot;A String&quot;, # Optional. Resource name of the trace associated with the log entry, if any.
                # If this field contains a relative resource name, you can assume the name is
                # relative to `//tracing.googleapis.com`. Example:
                # `projects/my-projectid/traces/06796866738c859f2f19b7cfb3214824`
            &quot;severity&quot;: &quot;A String&quot;, # The severity of the log entry. The default value is
                # `LogSeverity.DEFAULT`.
            &quot;sourceLocation&quot;: { # Additional information about the source code location that produced the log # Optional. Source code location information associated with the log entry,
                # if any.
                # entry.
              &quot;line&quot;: &quot;A String&quot;, # Optional. Line within the source file. 1-based; 0 indicates no line number
                  # available.
              &quot;file&quot;: &quot;A String&quot;, # Optional. Source file name. Depending on the runtime environment, this
                  # might be a simple name or a fully-qualified name.
              &quot;function&quot;: &quot;A String&quot;, # Optional. Human-readable name of the function or method being invoked, with
                  # optional context such as the class or package name. This information may be
                  # used in contexts such as the logs viewer, where a file and line number are
                  # less meaningful. The format can vary by language. For example:
                  # `qual.if.ied.Class.method` (Java), `dir/package.func` (Go), `function`
                  # (Python).
            },
            &quot;structPayload&quot;: { # The log entry payload, represented as a structure that
                # is expressed as a JSON object.
              &quot;a_key&quot;: &quot;&quot;, # Properties of the object.
            },
            &quot;timestamp&quot;: &quot;A String&quot;, # The time the event described by the log entry occurred. If
                # omitted, defaults to operation start time.
          },
        ],
        &quot;userLabels&quot;: { # User defined labels for the resource that this operation is associated
            # with. Only a combination of 1000 user labels per consumer project are
            # allowed.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;metricValueSets&quot;: [ # Represents information about this operation. Each MetricValueSet
            # corresponds to a metric defined in the service configuration.
            # The data type used in the MetricValueSet must agree with
            # the data type specified in the metric definition.
            #
            # Within a single operation, it is not allowed to have more than one
            # MetricValue instances that have the same metric names and identical
            # label value combinations. If a request has such duplicated MetricValue
            # instances, the entire request is rejected with
            # an invalid argument error.
          { # Represents a set of metric values in the same metric.
              # Each metric value in the set should have a unique combination of start time,
              # end time, and label values.
            &quot;metricName&quot;: &quot;A String&quot;, # The metric name defined in the service configuration.
            &quot;metricValues&quot;: [ # The values in this metric.
              { # Represents a single metric value.
                &quot;startTime&quot;: &quot;A String&quot;, # The start of the time period over which this metric value&#x27;s measurement
                    # applies. The time period has different semantics for different metric
                    # types (cumulative, delta, and gauge). See the metric definition
                    # documentation in the service configuration for details.
                &quot;moneyValue&quot;: { # Represents an amount of money with its currency type. # A money value.
                  &quot;nanos&quot;: 42, # Number of nano (10^-9) units of the amount.
                      # The value must be between -999,999,999 and +999,999,999 inclusive.
                      # If `units` is positive, `nanos` must be positive or zero.
                      # If `units` is zero, `nanos` can be positive, zero, or negative.
                      # If `units` is negative, `nanos` must be negative or zero.
                      # For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
                  &quot;units&quot;: &quot;A String&quot;, # The whole units of the amount.
                      # For example if `currencyCode` is `&quot;USD&quot;`, then 1 unit is one US dollar.
                  &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in ISO 4217.
                },
                &quot;labels&quot;: { # The labels describing the metric value.
                    # See comments on google.api.servicecontrol.v1.Operation.labels for
                    # the overriding relationship.
                    # Note that this map must not contain monitored resource labels.
                  &quot;a_key&quot;: &quot;A String&quot;,
                },
                &quot;stringValue&quot;: &quot;A String&quot;, # A text string value.
                &quot;doubleValue&quot;: 3.14, # A double precision floating point value.
                &quot;int64Value&quot;: &quot;A String&quot;, # A signed 64-bit integer value.
                &quot;distributionValue&quot;: { # Distribution represents a frequency distribution of double-valued sample # A distribution value.
                    # points. It contains the size of the population of sample points plus
                    # additional optional information:
                    #
                    #   - the arithmetic mean of the samples
                    #   - the minimum and maximum of the samples
                    #   - the sum-squared-deviation of the samples, used to compute variance
                    #   - a histogram of the values of the sample points
                  &quot;sumOfSquaredDeviation&quot;: 3.14, # The sum of squared deviations from the mean:
                      #   Sum[i=1..count]((x_i - mean)^2)
                      # where each x_i is a sample values. If `count` is zero then this field
                      # must be zero, otherwise validation of the request fails.
                  &quot;exemplars&quot;: [ # Example points. Must be in increasing order of `value` field.
                    { # Exemplars are example points that may be used to annotate aggregated
                        # distribution values. They are metadata that gives information about a
                        # particular value added to a Distribution bucket, such as a trace ID that
                        # was active when a value was added. They may contain further information,
                        # such as a example values and timestamps, origin, etc.
                      &quot;value&quot;: 3.14, # Value of the exemplar point. This value determines to which bucket the
                          # exemplar belongs.
                      &quot;timestamp&quot;: &quot;A String&quot;, # The observation (sampling) time of the above value.
                      &quot;attachments&quot;: [ # Contextual information about the example value. Examples are:
                          #
                          #   Trace: type.googleapis.com/google.monitoring.v3.SpanContext
                          #
                          #   Literal string: type.googleapis.com/google.protobuf.StringValue
                          #
                          #   Labels dropped during aggregation:
                          #     type.googleapis.com/google.monitoring.v3.DroppedLabels
                          #
                          # There may be only a single attachment of any given message type in a
                          # single exemplar, and this is enforced by the system.
                        {
                          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
                        },
                      ],
                    },
                  ],
                  &quot;exponentialBuckets&quot;: { # Describing buckets with exponentially growing width. # Buckets with exponentially growing width.
                    &quot;growthFactor&quot;: 3.14, # The i&#x27;th exponential bucket covers the interval
                        #   [scale * growth_factor^(i-1), scale * growth_factor^i)
                        # where i ranges from 1 to num_finite_buckets inclusive.
                        # Must be larger than 1.0.
                    &quot;scale&quot;: 3.14, # The i&#x27;th exponential bucket covers the interval
                        #   [scale * growth_factor^(i-1), scale * growth_factor^i)
                        # where i ranges from 1 to num_finite_buckets inclusive.
                        # Must be &gt; 0.
                    &quot;numFiniteBuckets&quot;: 42, # The number of finite buckets. With the underflow and overflow buckets,
                        # the total number of buckets is `num_finite_buckets` + 2.
                        # See comments on `bucket_options` for details.
                  },
                  &quot;minimum&quot;: 3.14, # The minimum of the population of values. Ignored if `count` is zero.
                  &quot;linearBuckets&quot;: { # Describing buckets with constant width. # Buckets with constant width.
                    &quot;numFiniteBuckets&quot;: 42, # The number of finite buckets. With the underflow and overflow buckets,
                        # the total number of buckets is `num_finite_buckets` + 2.
                        # See comments on `bucket_options` for details.
                    &quot;width&quot;: 3.14, # The i&#x27;th linear bucket covers the interval
                        #   [offset + (i-1) * width, offset + i * width)
                        # where i ranges from 1 to num_finite_buckets, inclusive.
                        # Must be strictly positive.
                    &quot;offset&quot;: 3.14, # The i&#x27;th linear bucket covers the interval
                        #   [offset + (i-1) * width, offset + i * width)
                        # where i ranges from 1 to num_finite_buckets, inclusive.
                  },
                  &quot;mean&quot;: 3.14, # The arithmetic mean of the samples in the distribution. If `count` is
                      # zero then this field must be zero.
                  &quot;count&quot;: &quot;A String&quot;, # The total number of samples in the distribution. Must be &gt;= 0.
                  &quot;bucketCounts&quot;: [ # The number of samples in each histogram bucket. `bucket_counts` are
                      # optional. If present, they must sum to the `count` value.
                      #
                      # The buckets are defined below in `bucket_option`. There are N buckets.
                      # `bucket_counts[0]` is the number of samples in the underflow bucket.
                      # `bucket_counts[1]` to `bucket_counts[N-1]` are the numbers of samples
                      # in each of the finite buckets. And `bucket_counts[N] is the number
                      # of samples in the overflow bucket. See the comments of `bucket_option`
                      # below for more details.
                      #
                      # Any suffix of trailing zeros may be omitted.
                    &quot;A String&quot;,
                  ],
                  &quot;explicitBuckets&quot;: { # Describing buckets with arbitrary user-provided width. # Buckets with arbitrary user-provided width.
                    &quot;bounds&quot;: [ # &#x27;bound&#x27; is a list of strictly increasing boundaries between
                        # buckets. Note that a list of length N-1 defines N buckets because
                        # of fenceposting. See comments on `bucket_options` for details.
                        #
                        # The i&#x27;th finite bucket covers the interval
                        #   [bound[i-1], bound[i])
                        # where i ranges from 1 to bound_size() - 1. Note that there are no
                        # finite buckets at all if &#x27;bound&#x27; only contains a single element; in
                        # that special case the single bound defines the boundary between the
                        # underflow and overflow buckets.
                        #
                        # bucket number                   lower bound    upper bound
                        #  i == 0 (underflow)              -inf           bound[i]
                        #  0 &lt; i &lt; bound_size()            bound[i-1]     bound[i]
                        #  i == bound_size() (overflow)    bound[i-1]     +inf
                      3.14,
                    ],
                  },
                  &quot;maximum&quot;: 3.14, # The maximum of the population of values. Ignored if `count` is zero.
                },
                &quot;boolValue&quot;: True or False, # A boolean value.
                &quot;endTime&quot;: &quot;A String&quot;, # The end of the time period over which this metric value&#x27;s measurement
                    # applies.
              },
            ],
          },
        ],
        &quot;traceSpans&quot;: [ # Unimplemented. A list of Cloud Trace spans. The span names shall contain
            # the id of the destination project which can be either the produce or the
            # consumer project.
          { # A span represents a single operation within a trace. Spans can be
              # nested to form a trace tree. Often, a trace contains a root span
              # that describes the end-to-end latency, and one or more subspans for
              # its sub-operations. A trace can also contain multiple root spans,
              # or none at all. Spans do not need to be contiguous&amp;mdash;there may be
              # gaps or overlaps between spans in a trace.
            &quot;childSpanCount&quot;: 42, # An optional number of child spans that were generated while this span
                # was active. If set, allows implementation to detect missing child spans.
            &quot;sameProcessAsParentSpan&quot;: True or False, # (Optional) Set this parameter to indicate whether this span is in
                # the same process as its parent. If you do not set this parameter,
                # Stackdriver Trace is unable to take advantage of this helpful
                # information.
            &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # An optional final status for this span.
                # different programming environments, including REST APIs and RPC APIs. It is
                # used by [gRPC](https://github.com/grpc). Each `Status` message contains
                # three pieces of data: error code, error message, and error details.
                #
                # You can find out more about this error model and how to work with it in the
                # [API Design Guide](https://cloud.google.com/apis/design/errors).
              &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
              &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
                  # user-facing error message should be localized and sent in the
                  # google.rpc.Status.details field, or localized by the client.
              &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
                  # message types for APIs to use.
                {
                  &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
                },
              ],
            },
            &quot;name&quot;: &quot;A String&quot;, # The resource name of the span in the following format:
                #
                #     projects/[PROJECT_ID]/traces/[TRACE_ID]/spans/SPAN_ID is a unique identifier for a trace within a project;
                # it is a 32-character hexadecimal encoding of a 16-byte array.
                #
                # [SPAN_ID] is a unique identifier for a span within a trace; it
                # is a 16-character hexadecimal encoding of an 8-byte array.
            &quot;attributes&quot;: { # A set of attributes, each in the format `[KEY]:[VALUE]`. # A set of attributes on the span. You can have up to 32 attributes per
                # span.
              &quot;droppedAttributesCount&quot;: 42, # The number of attributes that were discarded. Attributes can be discarded
                  # because their keys are too long or because there are too many attributes.
                  # If this value is 0 then all attributes are valid.
              &quot;attributeMap&quot;: { # The set of attributes. Each attribute&#x27;s key can be up to 128 bytes
                  # long. The value can be a string up to 256 bytes, a signed 64-bit integer,
                  # or the Boolean values `true` and `false`. For example:
                  #
                  #     &quot;/instance_id&quot;: &quot;my-instance&quot;
                  #     &quot;/http/user_agent&quot;: &quot;&quot;
                  #     &quot;/http/request_bytes&quot;: 300
                  #     &quot;abc.com/myattribute&quot;: true
                &quot;a_key&quot;: { # The allowed types for [VALUE] in a `[KEY]:[VALUE]` attribute.
                  &quot;intValue&quot;: &quot;A String&quot;, # A 64-bit signed integer.
                  &quot;stringValue&quot;: { # Represents a string that might be shortened to a specified length. # A string up to 256 bytes long.
                    &quot;truncatedByteCount&quot;: 42, # The number of bytes removed from the original string. If this
                        # value is 0, then the string was not shortened.
                    &quot;value&quot;: &quot;A String&quot;, # The shortened string. For example, if the original string is 500
                        # bytes long and the limit of the string is 128 bytes, then
                        # `value` contains the first 128 bytes of the 500-byte string.
                        #
                        # Truncation always happens on a UTF8 character boundary. If there
                        # are multi-byte characters in the string, then the length of the
                        # shortened string might be less than the size limit.
                  },
                  &quot;boolValue&quot;: True or False, # A Boolean value represented by `true` or `false`.
                },
              },
            },
            &quot;spanId&quot;: &quot;A String&quot;, # The [SPAN_ID] portion of the span&#x27;s resource name.
            &quot;parentSpanId&quot;: &quot;A String&quot;, # The [SPAN_ID] of this span&#x27;s parent span. If this is a root span,
                # then this field must be empty.
            &quot;endTime&quot;: &quot;A String&quot;, # The end time of the span. On the client side, this is the time kept by
                # the local machine where the span execution ends. On the server side, this
                # is the time when the server application handler stops running.
            &quot;spanKind&quot;: &quot;A String&quot;, # Distinguishes between spans generated in a particular context. For example,
                # two spans with the same name may be distinguished using `CLIENT` (caller)
                # and `SERVER` (callee) to identify an RPC call.
            &quot;startTime&quot;: &quot;A String&quot;, # The start time of the span. On the client side, this is the time kept by
                # the local machine where the span execution starts. On the server side, this
                # is the time when the server&#x27;s application handler starts running.
            &quot;displayName&quot;: { # Represents a string that might be shortened to a specified length. # A description of the span&#x27;s operation (up to 128 bytes).
                # Stackdriver Trace displays the description in the
                # Google Cloud Platform Console.
                # For example, the display name can be a qualified method name or a file name
                # and a line number where the operation is called. A best practice is to use
                # the same display name within an application and at the same call point.
                # This makes it easier to correlate spans in different traces.
              &quot;truncatedByteCount&quot;: 42, # The number of bytes removed from the original string. If this
                  # value is 0, then the string was not shortened.
              &quot;value&quot;: &quot;A String&quot;, # The shortened string. For example, if the original string is 500
                  # bytes long and the limit of the string is 128 bytes, then
                  # `value` contains the first 128 bytes of the 500-byte string.
                  #
                  # Truncation always happens on a UTF8 character boundary. If there
                  # are multi-byte characters in the string, then the length of the
                  # shortened string might be less than the size limit.
            },
          },
        ],
        &quot;quotaProperties&quot;: { # Represents the properties needed for quota operations. # Represents the properties needed for quota check. Applicable only if this
            # operation is for a quota check request. If this is not specified, no quota
            # check will be performed.
          &quot;quotaMode&quot;: &quot;A String&quot;, # Quota mode for this operation.
        },
        &quot;consumerId&quot;: &quot;A String&quot;, # Identity of the consumer who is using the service.
            # This field should be filled in for the operations initiated by a
            # consumer, but not for service-initiated operations that are
            # not related to a specific consumer.
            #
            # - This can be in one of the following formats:
            #     - project:PROJECT_ID,
            #     - project`_`number:PROJECT_NUMBER,
            #     - projects/PROJECT_ID or PROJECT_NUMBER,
            #     - folders/FOLDER_NUMBER,
            #     - organizations/ORGANIZATION_NUMBER,
            #     - api`_`key:API_KEY.
      },
    ],
    &quot;serviceConfigId&quot;: &quot;A String&quot;, # Specifies which version of service config should be used to process the
        # request.
        # 
        # If unspecified or no matching version can be found, the
        # latest one will be used.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Response message for the Report method.
    &quot;serviceRolloutId&quot;: &quot;A String&quot;, # The current service rollout id used to process the request.
    &quot;reportInfos&quot;: [ # Quota usage for each quota release `Operation` request.
        #
        # Fully or partially failed quota release request may or may not be present
        # in `report_quota_info`. For example, a failed quota release request will
        # have the current quota usage info when precise quota library returns the
        # info. A deadline exceeded quota request will not have quota usage info.
        #
        # If there is no quota release request, report_quota_info will be empty.
      { # Contains additional info about the report operation.
        &quot;operationId&quot;: &quot;A String&quot;, # The Operation.operation_id value from the request.
        &quot;quotaInfo&quot;: { # Contains the quota information for a quota check response. # Quota usage info when processing the `Operation`.
          &quot;limitExceeded&quot;: [ # Quota Metrics that have exceeded quota limits.
              # For QuotaGroup-based quota, this is QuotaGroup.name
              # For QuotaLimit-based quota, this is QuotaLimit.name
              # See: google.api.Quota
              # Deprecated: Use quota_metrics to get per quota group limit exceeded status.
            &quot;A String&quot;,
          ],
          &quot;quotaConsumed&quot;: { # Map of quota group name to the actual number of tokens consumed. If the
              # quota check was not successful, then this will not be populated due to no
              # quota consumption.
              #
              # We are not merging this field with &#x27;quota_metrics&#x27; field because of the
              # complexity of scaling in Chemist client code base. For simplicity, we will
              # keep this field for Castor (that scales quota usage) and &#x27;quota_metrics&#x27;
              # for SuperQuota (that doesn&#x27;t scale quota usage).
            &quot;a_key&quot;: 42,
          },
          &quot;quotaMetrics&quot;: [ # Quota metrics to indicate the usage. Depending on the check request, one or
              # more of the following metrics will be included:
              #
              # 1. For rate quota, per quota group or per quota metric incremental usage
              # will be specified using the following delta metric:
              #   &quot;serviceruntime.googleapis.com/api/consumer/quota_used_count&quot;
              #
              # 2. For allocation quota, per quota metric total usage will be specified
              # using the following gauge metric:
              #   &quot;serviceruntime.googleapis.com/allocation/consumer/quota_used_count&quot;
              #
              # 3. For both rate quota and allocation quota, the quota limit reached
              # condition will be specified using the following boolean metric:
              #   &quot;serviceruntime.googleapis.com/quota/exceeded&quot;
            { # Represents a set of metric values in the same metric.
                # Each metric value in the set should have a unique combination of start time,
                # end time, and label values.
              &quot;metricName&quot;: &quot;A String&quot;, # The metric name defined in the service configuration.
              &quot;metricValues&quot;: [ # The values in this metric.
                { # Represents a single metric value.
                  &quot;startTime&quot;: &quot;A String&quot;, # The start of the time period over which this metric value&#x27;s measurement
                      # applies. The time period has different semantics for different metric
                      # types (cumulative, delta, and gauge). See the metric definition
                      # documentation in the service configuration for details.
                  &quot;moneyValue&quot;: { # Represents an amount of money with its currency type. # A money value.
                    &quot;nanos&quot;: 42, # Number of nano (10^-9) units of the amount.
                        # The value must be between -999,999,999 and +999,999,999 inclusive.
                        # If `units` is positive, `nanos` must be positive or zero.
                        # If `units` is zero, `nanos` can be positive, zero, or negative.
                        # If `units` is negative, `nanos` must be negative or zero.
                        # For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000.
                    &quot;units&quot;: &quot;A String&quot;, # The whole units of the amount.
                        # For example if `currencyCode` is `&quot;USD&quot;`, then 1 unit is one US dollar.
                    &quot;currencyCode&quot;: &quot;A String&quot;, # The 3-letter currency code defined in ISO 4217.
                  },
                  &quot;labels&quot;: { # The labels describing the metric value.
                      # See comments on google.api.servicecontrol.v1.Operation.labels for
                      # the overriding relationship.
                      # Note that this map must not contain monitored resource labels.
                    &quot;a_key&quot;: &quot;A String&quot;,
                  },
                  &quot;stringValue&quot;: &quot;A String&quot;, # A text string value.
                  &quot;doubleValue&quot;: 3.14, # A double precision floating point value.
                  &quot;int64Value&quot;: &quot;A String&quot;, # A signed 64-bit integer value.
                  &quot;distributionValue&quot;: { # Distribution represents a frequency distribution of double-valued sample # A distribution value.
                      # points. It contains the size of the population of sample points plus
                      # additional optional information:
                      #
                      #   - the arithmetic mean of the samples
                      #   - the minimum and maximum of the samples
                      #   - the sum-squared-deviation of the samples, used to compute variance
                      #   - a histogram of the values of the sample points
                    &quot;sumOfSquaredDeviation&quot;: 3.14, # The sum of squared deviations from the mean:
                        #   Sum[i=1..count]((x_i - mean)^2)
                        # where each x_i is a sample values. If `count` is zero then this field
                        # must be zero, otherwise validation of the request fails.
                    &quot;exemplars&quot;: [ # Example points. Must be in increasing order of `value` field.
                      { # Exemplars are example points that may be used to annotate aggregated
                          # distribution values. They are metadata that gives information about a
                          # particular value added to a Distribution bucket, such as a trace ID that
                          # was active when a value was added. They may contain further information,
                          # such as a example values and timestamps, origin, etc.
                        &quot;value&quot;: 3.14, # Value of the exemplar point. This value determines to which bucket the
                            # exemplar belongs.
                        &quot;timestamp&quot;: &quot;A String&quot;, # The observation (sampling) time of the above value.
                        &quot;attachments&quot;: [ # Contextual information about the example value. Examples are:
                            #
                            #   Trace: type.googleapis.com/google.monitoring.v3.SpanContext
                            #
                            #   Literal string: type.googleapis.com/google.protobuf.StringValue
                            #
                            #   Labels dropped during aggregation:
                            #     type.googleapis.com/google.monitoring.v3.DroppedLabels
                            #
                            # There may be only a single attachment of any given message type in a
                            # single exemplar, and this is enforced by the system.
                          {
                            &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
                          },
                        ],
                      },
                    ],
                    &quot;exponentialBuckets&quot;: { # Describing buckets with exponentially growing width. # Buckets with exponentially growing width.
                      &quot;growthFactor&quot;: 3.14, # The i&#x27;th exponential bucket covers the interval
                          #   [scale * growth_factor^(i-1), scale * growth_factor^i)
                          # where i ranges from 1 to num_finite_buckets inclusive.
                          # Must be larger than 1.0.
                      &quot;scale&quot;: 3.14, # The i&#x27;th exponential bucket covers the interval
                          #   [scale * growth_factor^(i-1), scale * growth_factor^i)
                          # where i ranges from 1 to num_finite_buckets inclusive.
                          # Must be &gt; 0.
                      &quot;numFiniteBuckets&quot;: 42, # The number of finite buckets. With the underflow and overflow buckets,
                          # the total number of buckets is `num_finite_buckets` + 2.
                          # See comments on `bucket_options` for details.
                    },
                    &quot;minimum&quot;: 3.14, # The minimum of the population of values. Ignored if `count` is zero.
                    &quot;linearBuckets&quot;: { # Describing buckets with constant width. # Buckets with constant width.
                      &quot;numFiniteBuckets&quot;: 42, # The number of finite buckets. With the underflow and overflow buckets,
                          # the total number of buckets is `num_finite_buckets` + 2.
                          # See comments on `bucket_options` for details.
                      &quot;width&quot;: 3.14, # The i&#x27;th linear bucket covers the interval
                          #   [offset + (i-1) * width, offset + i * width)
                          # where i ranges from 1 to num_finite_buckets, inclusive.
                          # Must be strictly positive.
                      &quot;offset&quot;: 3.14, # The i&#x27;th linear bucket covers the interval
                          #   [offset + (i-1) * width, offset + i * width)
                          # where i ranges from 1 to num_finite_buckets, inclusive.
                    },
                    &quot;mean&quot;: 3.14, # The arithmetic mean of the samples in the distribution. If `count` is
                        # zero then this field must be zero.
                    &quot;count&quot;: &quot;A String&quot;, # The total number of samples in the distribution. Must be &gt;= 0.
                    &quot;bucketCounts&quot;: [ # The number of samples in each histogram bucket. `bucket_counts` are
                        # optional. If present, they must sum to the `count` value.
                        #
                        # The buckets are defined below in `bucket_option`. There are N buckets.
                        # `bucket_counts[0]` is the number of samples in the underflow bucket.
                        # `bucket_counts[1]` to `bucket_counts[N-1]` are the numbers of samples
                        # in each of the finite buckets. And `bucket_counts[N] is the number
                        # of samples in the overflow bucket. See the comments of `bucket_option`
                        # below for more details.
                        #
                        # Any suffix of trailing zeros may be omitted.
                      &quot;A String&quot;,
                    ],
                    &quot;explicitBuckets&quot;: { # Describing buckets with arbitrary user-provided width. # Buckets with arbitrary user-provided width.
                      &quot;bounds&quot;: [ # &#x27;bound&#x27; is a list of strictly increasing boundaries between
                          # buckets. Note that a list of length N-1 defines N buckets because
                          # of fenceposting. See comments on `bucket_options` for details.
                          #
                          # The i&#x27;th finite bucket covers the interval
                          #   [bound[i-1], bound[i])
                          # where i ranges from 1 to bound_size() - 1. Note that there are no
                          # finite buckets at all if &#x27;bound&#x27; only contains a single element; in
                          # that special case the single bound defines the boundary between the
                          # underflow and overflow buckets.
                          #
                          # bucket number                   lower bound    upper bound
                          #  i == 0 (underflow)              -inf           bound[i]
                          #  0 &lt; i &lt; bound_size()            bound[i-1]     bound[i]
                          #  i == bound_size() (overflow)    bound[i-1]     +inf
                        3.14,
                      ],
                    },
                    &quot;maximum&quot;: 3.14, # The maximum of the population of values. Ignored if `count` is zero.
                  },
                  &quot;boolValue&quot;: True or False, # A boolean value.
                  &quot;endTime&quot;: &quot;A String&quot;, # The end of the time period over which this metric value&#x27;s measurement
                      # applies.
                },
              ],
            },
          ],
        },
      },
    ],
    &quot;serviceConfigId&quot;: &quot;A String&quot;, # The actual config id used to process the request.
    &quot;reportErrors&quot;: [ # Partial failures, one for each `Operation` in the request that failed
        # processing. There are three possible combinations of the RPC status:
        #
        # 1. The combination of a successful RPC status and an empty `report_errors`
        #    list indicates a complete success where all `Operations` in the
        #    request are processed successfully.
        # 2. The combination of a successful RPC status and a non-empty
        #    `report_errors` list indicates a partial success where some
        #    `Operations` in the request succeeded. Each
        #    `Operation` that failed processing has a corresponding item
        #    in this list.
        # 3. A failed RPC status indicates a general non-deterministic failure.
        #    When this happens, it&#x27;s impossible to know which of the
        #    &#x27;Operations&#x27; in the request succeeded or failed.
      { # Represents the processing error of one Operation in the request.
        &quot;operationId&quot;: &quot;A String&quot;, # The Operation.operation_id value from the request.
        &quot;status&quot;: { # The `Status` type defines a logical error model that is suitable for # Details of the error when processing the Operation.
            # different programming environments, including REST APIs and RPC APIs. It is
            # used by [gRPC](https://github.com/grpc). Each `Status` message contains
            # three pieces of data: error code, error message, and error details.
            #
            # You can find out more about this error model and how to work with it in the
            # [API Design Guide](https://cloud.google.com/apis/design/errors).
          &quot;code&quot;: 42, # The status code, which should be an enum value of google.rpc.Code.
          &quot;message&quot;: &quot;A String&quot;, # A developer-facing error message, which should be in English. Any
              # user-facing error message should be localized and sent in the
              # google.rpc.Status.details field, or localized by the client.
          &quot;details&quot;: [ # A list of messages that carry the error details.  There is a common set of
              # message types for APIs to use.
            {
              &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
            },
          ],
        },
      },
    ],
  }</pre>
</div>

</body></html>