<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="cloudtrace_v1.html">Cloud Trace API</a> . <a href="cloudtrace_v1.projects.html">projects</a> . <a href="cloudtrace_v1.projects.traces.html">traces</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#get">get(projectId, traceId, x__xgafv=None)</a></code></p>
<p class="firstline">Gets a single trace by its ID.</p>
<p class="toc_element">
  <code><a href="#list">list(projectId, endTime=None, orderBy=None, view=None, pageToken=None, pageSize=None, startTime=None, filter=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns of a list of traces that match the specified filter conditions.</p>
<p class="toc_element">
  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
<p class="firstline">Retrieves the next page of results.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="get">get(projectId, traceId, x__xgafv=None)</code>
  <pre>Gets a single trace by its ID.

Args:
  projectId: string, Required. ID of the Cloud project where the trace data is stored. (required)
  traceId: string, Required. ID of the trace to return. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A trace describes how long it takes for an application to perform an
      # operation. It consists of a set of spans, each of which represent a single
      # timed event within the operation.
    &quot;projectId&quot;: &quot;A String&quot;, # Project ID of the Cloud project where the trace data is stored.
    &quot;traceId&quot;: &quot;A String&quot;, # Globally unique identifier for the trace. This identifier is a 128-bit
        # numeric value formatted as a 32-byte hex string. For example,
        # `382d4f4c6b7bb2f4a972559d9085001d`. The numeric value should not be zero.
    &quot;spans&quot;: [ # Collection of spans in the trace.
      { # A span represents a single timed event within a trace. Spans can be nested
          # and form a trace tree. Often, a trace contains a root span that describes the
          # end-to-end latency of an operation and, optionally, one or more subspans for
          # its suboperations. Spans do not need to be contiguous. There may be gaps
          # between spans in a trace.
        &quot;spanId&quot;: &quot;A String&quot;, # Identifier for the span. Must be a 64-bit integer other than 0 and
            # unique within a trace. For example, `2205310701640571284`.
        &quot;kind&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 `RPC_CLIENT`
            # and `RPC_SERVER` to identify queueing latency associated with the span.
        &quot;startTime&quot;: &quot;A String&quot;, # Start time of the span in nanoseconds from the UNIX epoch.
        &quot;name&quot;: &quot;A String&quot;, # Name of the span. Must be less than 128 bytes. The span name is sanitized
            # and displayed in the Trace tool in the Google Cloud Platform Console.
            # The name may be a method name or some other per-call site name.
            # For the same executable and the same call point, a best practice is
            # to use a consistent name, which makes it easier to correlate
            # cross-trace spans.
        &quot;endTime&quot;: &quot;A String&quot;, # End time of the span in nanoseconds from the UNIX epoch.
        &quot;parentSpanId&quot;: &quot;A String&quot;, # Optional. ID of the parent span, if any.
        &quot;labels&quot;: { # Collection of labels associated with the span. Label keys must be less than
            # 128 bytes. Label values must be less than 16 kilobytes (10MB for
            # `/stacktrace` values).
            #
            # Some predefined label keys exist, or you may create your own. When creating
            # your own, we recommend the following formats:
            #
            # * `/category/product/key` for agents of well-known products (e.g.
            #   `/db/mongodb/read_size`).
            # * `short_host/path/key` for domain-specific keys (e.g.
            #   `foo.com/myproduct/bar`)
            #
            # Predefined labels include:
            #
            # *   `/agent`
            # *   `/component`
            # *   `/error/message`
            # *   `/error/name`
            # *   `/http/client_city`
            # *   `/http/client_country`
            # *   `/http/client_protocol`
            # *   `/http/client_region`
            # *   `/http/host`
            # *   `/http/method`
            # *   `/http/path`
            # *   `/http/redirected_url`
            # *   `/http/request/size`
            # *   `/http/response/size`
            # *   `/http/route`
            # *   `/http/status_code`
            # *   `/http/url`
            # *   `/http/user_agent`
            # *   `/pid`
            # *   `/stacktrace`
            # *   `/tid`
          &quot;a_key&quot;: &quot;A String&quot;,
        },
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(projectId, endTime=None, orderBy=None, view=None, pageToken=None, pageSize=None, startTime=None, filter=None, x__xgafv=None)</code>
  <pre>Returns of a list of traces that match the specified filter conditions.

Args:
  projectId: string, Required. ID of the Cloud project where the trace data is stored. (required)
  endTime: string, End of the time interval (inclusive) during which the trace data was
collected from the application.
  orderBy: string, Optional. Field used to sort the returned traces.
Can be one of the following:

*   `trace_id`
*   `name` (`name` field of root span in the trace)
*   `duration` (difference between `end_time` and `start_time` fields of
     the root span)
*   `start` (`start_time` field of the root span)

Descending order can be specified by appending `desc` to the sort field
(for example, `name desc`).

Only one sort field is permitted.
  view: string, Optional. Type of data returned for traces in the list. Default is
`MINIMAL`.
  pageToken: string, Token identifying the page of results to return. If provided, use the
value of the `next_page_token` field from a previous request.
  pageSize: integer, Optional. Maximum number of traces to return. If not specified or &lt;= 0, the
implementation selects a reasonable value.  The implementation may
return fewer traces than the requested page size.
  startTime: string, Start of the time interval (inclusive) during which the trace data was
collected from the application.
  filter: string, Optional. A filter against labels for the request.

By default, searches use prefix matching. To specify exact match, prepend
a plus symbol (`+`) to the search term.
Multiple terms are ANDed. Syntax:

*   `root:NAME_PREFIX` or `NAME_PREFIX`: Return traces where any root
    span starts with `NAME_PREFIX`.
*   `+root:NAME` or `+NAME`: Return traces where any root span&#x27;s name is
    exactly `NAME`.
*   `span:NAME_PREFIX`: Return traces where any span starts with
    `NAME_PREFIX`.
*   `+span:NAME`: Return traces where any span&#x27;s name is exactly
    `NAME`.
*   `latency:DURATION`: Return traces whose overall latency is
    greater or equal to than `DURATION`. Accepted units are nanoseconds
    (`ns`), milliseconds (`ms`), and seconds (`s`). Default is `ms`. For
    example, `latency:24ms` returns traces whose overall latency
    is greater than or equal to 24 milliseconds.
*   `label:LABEL_KEY`: Return all traces containing the specified
    label key (exact match, case-sensitive) regardless of the key:value
    pair&#x27;s value (including empty values).
*   `LABEL_KEY:VALUE_PREFIX`: Return all traces containing the specified
    label key (exact match, case-sensitive) whose value starts with
    `VALUE_PREFIX`. Both a key and a value must be specified.
*   `+LABEL_KEY:VALUE`: Return all traces containing a key:value pair
    exactly matching the specified text. Both a key and a value must be
    specified.
*   `method:VALUE`: Equivalent to `/http/method:VALUE`.
*   `url:VALUE`: Equivalent to `/http/url:VALUE`.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The response message for the `ListTraces` method.
    &quot;nextPageToken&quot;: &quot;A String&quot;, # If defined, indicates that there are more traces that match the request
        # and that this value should be passed to the next request to continue
        # retrieving additional traces.
    &quot;traces&quot;: [ # List of trace records as specified by the view parameter.
      { # A trace describes how long it takes for an application to perform an
          # operation. It consists of a set of spans, each of which represent a single
          # timed event within the operation.
        &quot;projectId&quot;: &quot;A String&quot;, # Project ID of the Cloud project where the trace data is stored.
        &quot;traceId&quot;: &quot;A String&quot;, # Globally unique identifier for the trace. This identifier is a 128-bit
            # numeric value formatted as a 32-byte hex string. For example,
            # `382d4f4c6b7bb2f4a972559d9085001d`. The numeric value should not be zero.
        &quot;spans&quot;: [ # Collection of spans in the trace.
          { # A span represents a single timed event within a trace. Spans can be nested
              # and form a trace tree. Often, a trace contains a root span that describes the
              # end-to-end latency of an operation and, optionally, one or more subspans for
              # its suboperations. Spans do not need to be contiguous. There may be gaps
              # between spans in a trace.
            &quot;spanId&quot;: &quot;A String&quot;, # Identifier for the span. Must be a 64-bit integer other than 0 and
                # unique within a trace. For example, `2205310701640571284`.
            &quot;kind&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 `RPC_CLIENT`
                # and `RPC_SERVER` to identify queueing latency associated with the span.
            &quot;startTime&quot;: &quot;A String&quot;, # Start time of the span in nanoseconds from the UNIX epoch.
            &quot;name&quot;: &quot;A String&quot;, # Name of the span. Must be less than 128 bytes. The span name is sanitized
                # and displayed in the Trace tool in the Google Cloud Platform Console.
                # The name may be a method name or some other per-call site name.
                # For the same executable and the same call point, a best practice is
                # to use a consistent name, which makes it easier to correlate
                # cross-trace spans.
            &quot;endTime&quot;: &quot;A String&quot;, # End time of the span in nanoseconds from the UNIX epoch.
            &quot;parentSpanId&quot;: &quot;A String&quot;, # Optional. ID of the parent span, if any.
            &quot;labels&quot;: { # Collection of labels associated with the span. Label keys must be less than
                # 128 bytes. Label values must be less than 16 kilobytes (10MB for
                # `/stacktrace` values).
                #
                # Some predefined label keys exist, or you may create your own. When creating
                # your own, we recommend the following formats:
                #
                # * `/category/product/key` for agents of well-known products (e.g.
                #   `/db/mongodb/read_size`).
                # * `short_host/path/key` for domain-specific keys (e.g.
                #   `foo.com/myproduct/bar`)
                #
                # Predefined labels include:
                #
                # *   `/agent`
                # *   `/component`
                # *   `/error/message`
                # *   `/error/name`
                # *   `/http/client_city`
                # *   `/http/client_country`
                # *   `/http/client_protocol`
                # *   `/http/client_region`
                # *   `/http/host`
                # *   `/http/method`
                # *   `/http/path`
                # *   `/http/redirected_url`
                # *   `/http/request/size`
                # *   `/http/response/size`
                # *   `/http/route`
                # *   `/http/status_code`
                # *   `/http/url`
                # *   `/http/user_agent`
                # *   `/pid`
                # *   `/stacktrace`
                # *   `/tid`
              &quot;a_key&quot;: &quot;A String&quot;,
            },
          },
        ],
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
  <pre>Retrieves the next page of results.

Args:
  previous_request: The request for the previous page. (required)
  previous_response: The response from the request for the previous page. (required)

Returns:
  A request object that you can call &#x27;execute()&#x27; on to request the next
  page. Returns None if there are no more items in the collection.
    </pre>
</div>

</body></html>