<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="cloudprofiler_v2.html">Stackdriver Profiler API</a> . <a href="cloudprofiler_v2.projects.html">projects</a> . <a href="cloudprofiler_v2.projects.profiles.html">profiles</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#create">create(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">CreateProfile creates a new profile resource in the online mode.</p>
<p class="toc_element">
  <code><a href="#createOffline">createOffline(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">CreateOfflineProfile creates a new profile resource in the offline mode.</p>
<p class="toc_element">
  <code><a href="#patch">patch(name, body=None, updateMask=None, x__xgafv=None)</a></code></p>
<p class="firstline">UpdateProfile updates the profile bytes and labels on the profile resource</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="create">create(parent, body=None, x__xgafv=None)</code>
  <pre>CreateProfile creates a new profile resource in the online mode.

The server ensures that the new profiles are created at a constant rate per
deployment, so the creation request may hang for some time until the next
profile session is available.

The request may fail with ABORTED error if the creation is not available
within ~1m, the response will indicate the duration of the backoff the
client should take before attempting creating a profile again. The backoff
duration is returned in google.rpc.RetryInfo extension on the response
status. To a gRPC client, the extension will be return as a
binary-serialized proto in the trailing metadata item named
&quot;google.rpc.retryinfo-bin&quot;.

Args:
  parent: string, Parent project to create the profile in. (required)
  body: object, The request body.
    The object takes the form of:

{ # CreateProfileRequest describes a profile resource online creation request.
      # The deployment field must be populated. The profile_type specifies the list
      # of profile types supported by the agent. The creation call will hang until a
      # profile of one of these types needs to be collected.
    &quot;deployment&quot;: { # Deployment contains the deployment identification information. # Deployment details.
      &quot;target&quot;: &quot;A String&quot;, # Target is the service name used to group related deployments:
          # * Service name for GAE Flex / Standard.
          # * Cluster and container name for GKE.
          # * User-specified string for direct GCE profiling (e.g. Java).
          # * Job name for Dataflow.
          # Validation regex: `^[a-z]([-a-z0-9_.]{0,253}[a-z0-9])?$`.
      &quot;labels&quot;: { # Labels identify the deployment within the user universe and same target.
          # Validation regex for label names: `^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$`.
          # Value for an individual label must be &lt;= 512 bytes, the total
          # size of all label names and values must be &lt;= 1024 bytes.
          #
          # Label named &quot;language&quot; can be used to record the programming language of
          # the profiled deployment. The standard choices for the value include &quot;java&quot;,
          # &quot;go&quot;, &quot;python&quot;, &quot;ruby&quot;, &quot;nodejs&quot;, &quot;php&quot;, &quot;dotnet&quot;.
          #
          # For deployments running on Google Cloud Platform, &quot;zone&quot; or &quot;region&quot; label
          # should be present describing the deployment location. An example of a zone
          # is &quot;us-central1-a&quot;, an example of a region is &quot;us-central1&quot; or
          # &quot;us-central&quot;.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;projectId&quot;: &quot;A String&quot;, # Project ID is the ID of a cloud project.
          # Validation regex: `^a-z{4,61}[a-z0-9]$`.
    },
    &quot;profileType&quot;: [ # One or more profile types that the agent is capable of providing.
      &quot;A String&quot;,
    ],
  }

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

Returns:
  An object of the form:

    { # Profile resource.
      &quot;name&quot;: &quot;A String&quot;, # Output only. Opaque, server-assigned, unique ID for this profile.
      &quot;duration&quot;: &quot;A String&quot;, # Duration of the profiling session.
          # Input (for the offline mode) or output (for the online mode).
          # The field represents requested profiling duration. It may slightly differ
          # from the effective profiling duration, which is recorded in the profile
          # data, in case the profiling can&#x27;t be stopped immediately (e.g. in case
          # stopping the profiling is handled asynchronously).
      &quot;deployment&quot;: { # Deployment contains the deployment identification information. # Deployment this profile corresponds to.
        &quot;target&quot;: &quot;A String&quot;, # Target is the service name used to group related deployments:
            # * Service name for GAE Flex / Standard.
            # * Cluster and container name for GKE.
            # * User-specified string for direct GCE profiling (e.g. Java).
            # * Job name for Dataflow.
            # Validation regex: `^[a-z]([-a-z0-9_.]{0,253}[a-z0-9])?$`.
        &quot;labels&quot;: { # Labels identify the deployment within the user universe and same target.
            # Validation regex for label names: `^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$`.
            # Value for an individual label must be &lt;= 512 bytes, the total
            # size of all label names and values must be &lt;= 1024 bytes.
            #
            # Label named &quot;language&quot; can be used to record the programming language of
            # the profiled deployment. The standard choices for the value include &quot;java&quot;,
            # &quot;go&quot;, &quot;python&quot;, &quot;ruby&quot;, &quot;nodejs&quot;, &quot;php&quot;, &quot;dotnet&quot;.
            #
            # For deployments running on Google Cloud Platform, &quot;zone&quot; or &quot;region&quot; label
            # should be present describing the deployment location. An example of a zone
            # is &quot;us-central1-a&quot;, an example of a region is &quot;us-central1&quot; or
            # &quot;us-central&quot;.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;projectId&quot;: &quot;A String&quot;, # Project ID is the ID of a cloud project.
            # Validation regex: `^a-z{4,61}[a-z0-9]$`.
      },
      &quot;profileType&quot;: &quot;A String&quot;, # Type of profile.
          # For offline mode, this must be specified when creating the profile. For
          # online mode it is assigned and returned by the server.
      &quot;labels&quot;: { # Input only. Labels associated to this specific profile. These labels will
          # get merged with the deployment labels for the final data set.  See
          # documentation on deployment labels for validation rules and limits.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;profileBytes&quot;: &quot;A String&quot;, # Input only. Profile bytes, as a gzip compressed serialized proto, the
          # format is https://github.com/google/pprof/blob/master/proto/profile.proto.
    }</pre>
</div>

<div class="method">
    <code class="details" id="createOffline">createOffline(parent, body=None, x__xgafv=None)</code>
  <pre>CreateOfflineProfile creates a new profile resource in the offline mode.
The client provides the profile to create along with the profile bytes, the
server records it.

Args:
  parent: string, Parent project to create the profile in. (required)
  body: object, The request body.
    The object takes the form of:

{ # Profile resource.
    &quot;name&quot;: &quot;A String&quot;, # Output only. Opaque, server-assigned, unique ID for this profile.
    &quot;duration&quot;: &quot;A String&quot;, # Duration of the profiling session.
        # Input (for the offline mode) or output (for the online mode).
        # The field represents requested profiling duration. It may slightly differ
        # from the effective profiling duration, which is recorded in the profile
        # data, in case the profiling can&#x27;t be stopped immediately (e.g. in case
        # stopping the profiling is handled asynchronously).
    &quot;deployment&quot;: { # Deployment contains the deployment identification information. # Deployment this profile corresponds to.
      &quot;target&quot;: &quot;A String&quot;, # Target is the service name used to group related deployments:
          # * Service name for GAE Flex / Standard.
          # * Cluster and container name for GKE.
          # * User-specified string for direct GCE profiling (e.g. Java).
          # * Job name for Dataflow.
          # Validation regex: `^[a-z]([-a-z0-9_.]{0,253}[a-z0-9])?$`.
      &quot;labels&quot;: { # Labels identify the deployment within the user universe and same target.
          # Validation regex for label names: `^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$`.
          # Value for an individual label must be &lt;= 512 bytes, the total
          # size of all label names and values must be &lt;= 1024 bytes.
          #
          # Label named &quot;language&quot; can be used to record the programming language of
          # the profiled deployment. The standard choices for the value include &quot;java&quot;,
          # &quot;go&quot;, &quot;python&quot;, &quot;ruby&quot;, &quot;nodejs&quot;, &quot;php&quot;, &quot;dotnet&quot;.
          #
          # For deployments running on Google Cloud Platform, &quot;zone&quot; or &quot;region&quot; label
          # should be present describing the deployment location. An example of a zone
          # is &quot;us-central1-a&quot;, an example of a region is &quot;us-central1&quot; or
          # &quot;us-central&quot;.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;projectId&quot;: &quot;A String&quot;, # Project ID is the ID of a cloud project.
          # Validation regex: `^a-z{4,61}[a-z0-9]$`.
    },
    &quot;profileType&quot;: &quot;A String&quot;, # Type of profile.
        # For offline mode, this must be specified when creating the profile. For
        # online mode it is assigned and returned by the server.
    &quot;labels&quot;: { # Input only. Labels associated to this specific profile. These labels will
        # get merged with the deployment labels for the final data set.  See
        # documentation on deployment labels for validation rules and limits.
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;profileBytes&quot;: &quot;A String&quot;, # Input only. Profile bytes, as a gzip compressed serialized proto, the
        # format is https://github.com/google/pprof/blob/master/proto/profile.proto.
  }

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

Returns:
  An object of the form:

    { # Profile resource.
      &quot;name&quot;: &quot;A String&quot;, # Output only. Opaque, server-assigned, unique ID for this profile.
      &quot;duration&quot;: &quot;A String&quot;, # Duration of the profiling session.
          # Input (for the offline mode) or output (for the online mode).
          # The field represents requested profiling duration. It may slightly differ
          # from the effective profiling duration, which is recorded in the profile
          # data, in case the profiling can&#x27;t be stopped immediately (e.g. in case
          # stopping the profiling is handled asynchronously).
      &quot;deployment&quot;: { # Deployment contains the deployment identification information. # Deployment this profile corresponds to.
        &quot;target&quot;: &quot;A String&quot;, # Target is the service name used to group related deployments:
            # * Service name for GAE Flex / Standard.
            # * Cluster and container name for GKE.
            # * User-specified string for direct GCE profiling (e.g. Java).
            # * Job name for Dataflow.
            # Validation regex: `^[a-z]([-a-z0-9_.]{0,253}[a-z0-9])?$`.
        &quot;labels&quot;: { # Labels identify the deployment within the user universe and same target.
            # Validation regex for label names: `^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$`.
            # Value for an individual label must be &lt;= 512 bytes, the total
            # size of all label names and values must be &lt;= 1024 bytes.
            #
            # Label named &quot;language&quot; can be used to record the programming language of
            # the profiled deployment. The standard choices for the value include &quot;java&quot;,
            # &quot;go&quot;, &quot;python&quot;, &quot;ruby&quot;, &quot;nodejs&quot;, &quot;php&quot;, &quot;dotnet&quot;.
            #
            # For deployments running on Google Cloud Platform, &quot;zone&quot; or &quot;region&quot; label
            # should be present describing the deployment location. An example of a zone
            # is &quot;us-central1-a&quot;, an example of a region is &quot;us-central1&quot; or
            # &quot;us-central&quot;.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;projectId&quot;: &quot;A String&quot;, # Project ID is the ID of a cloud project.
            # Validation regex: `^a-z{4,61}[a-z0-9]$`.
      },
      &quot;profileType&quot;: &quot;A String&quot;, # Type of profile.
          # For offline mode, this must be specified when creating the profile. For
          # online mode it is assigned and returned by the server.
      &quot;labels&quot;: { # Input only. Labels associated to this specific profile. These labels will
          # get merged with the deployment labels for the final data set.  See
          # documentation on deployment labels for validation rules and limits.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;profileBytes&quot;: &quot;A String&quot;, # Input only. Profile bytes, as a gzip compressed serialized proto, the
          # format is https://github.com/google/pprof/blob/master/proto/profile.proto.
    }</pre>
</div>

<div class="method">
    <code class="details" id="patch">patch(name, body=None, updateMask=None, x__xgafv=None)</code>
  <pre>UpdateProfile updates the profile bytes and labels on the profile resource
created in the online mode. Updating the bytes for profiles created in the
offline mode is currently not supported: the profile content must be
provided at the time of the profile creation.

Args:
  name: string, Output only. Opaque, server-assigned, unique ID for this profile. (required)
  body: object, The request body.
    The object takes the form of:

{ # Profile resource.
    &quot;name&quot;: &quot;A String&quot;, # Output only. Opaque, server-assigned, unique ID for this profile.
    &quot;duration&quot;: &quot;A String&quot;, # Duration of the profiling session.
        # Input (for the offline mode) or output (for the online mode).
        # The field represents requested profiling duration. It may slightly differ
        # from the effective profiling duration, which is recorded in the profile
        # data, in case the profiling can&#x27;t be stopped immediately (e.g. in case
        # stopping the profiling is handled asynchronously).
    &quot;deployment&quot;: { # Deployment contains the deployment identification information. # Deployment this profile corresponds to.
      &quot;target&quot;: &quot;A String&quot;, # Target is the service name used to group related deployments:
          # * Service name for GAE Flex / Standard.
          # * Cluster and container name for GKE.
          # * User-specified string for direct GCE profiling (e.g. Java).
          # * Job name for Dataflow.
          # Validation regex: `^[a-z]([-a-z0-9_.]{0,253}[a-z0-9])?$`.
      &quot;labels&quot;: { # Labels identify the deployment within the user universe and same target.
          # Validation regex for label names: `^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$`.
          # Value for an individual label must be &lt;= 512 bytes, the total
          # size of all label names and values must be &lt;= 1024 bytes.
          #
          # Label named &quot;language&quot; can be used to record the programming language of
          # the profiled deployment. The standard choices for the value include &quot;java&quot;,
          # &quot;go&quot;, &quot;python&quot;, &quot;ruby&quot;, &quot;nodejs&quot;, &quot;php&quot;, &quot;dotnet&quot;.
          #
          # For deployments running on Google Cloud Platform, &quot;zone&quot; or &quot;region&quot; label
          # should be present describing the deployment location. An example of a zone
          # is &quot;us-central1-a&quot;, an example of a region is &quot;us-central1&quot; or
          # &quot;us-central&quot;.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;projectId&quot;: &quot;A String&quot;, # Project ID is the ID of a cloud project.
          # Validation regex: `^a-z{4,61}[a-z0-9]$`.
    },
    &quot;profileType&quot;: &quot;A String&quot;, # Type of profile.
        # For offline mode, this must be specified when creating the profile. For
        # online mode it is assigned and returned by the server.
    &quot;labels&quot;: { # Input only. Labels associated to this specific profile. These labels will
        # get merged with the deployment labels for the final data set.  See
        # documentation on deployment labels for validation rules and limits.
      &quot;a_key&quot;: &quot;A String&quot;,
    },
    &quot;profileBytes&quot;: &quot;A String&quot;, # Input only. Profile bytes, as a gzip compressed serialized proto, the
        # format is https://github.com/google/pprof/blob/master/proto/profile.proto.
  }

  updateMask: string, Field mask used to specify the fields to be overwritten. Currently only
profile_bytes and labels fields are supported by UpdateProfile, so only
those fields can be specified in the mask. When no mask is provided, all
fields are overwritten.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Profile resource.
      &quot;name&quot;: &quot;A String&quot;, # Output only. Opaque, server-assigned, unique ID for this profile.
      &quot;duration&quot;: &quot;A String&quot;, # Duration of the profiling session.
          # Input (for the offline mode) or output (for the online mode).
          # The field represents requested profiling duration. It may slightly differ
          # from the effective profiling duration, which is recorded in the profile
          # data, in case the profiling can&#x27;t be stopped immediately (e.g. in case
          # stopping the profiling is handled asynchronously).
      &quot;deployment&quot;: { # Deployment contains the deployment identification information. # Deployment this profile corresponds to.
        &quot;target&quot;: &quot;A String&quot;, # Target is the service name used to group related deployments:
            # * Service name for GAE Flex / Standard.
            # * Cluster and container name for GKE.
            # * User-specified string for direct GCE profiling (e.g. Java).
            # * Job name for Dataflow.
            # Validation regex: `^[a-z]([-a-z0-9_.]{0,253}[a-z0-9])?$`.
        &quot;labels&quot;: { # Labels identify the deployment within the user universe and same target.
            # Validation regex for label names: `^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$`.
            # Value for an individual label must be &lt;= 512 bytes, the total
            # size of all label names and values must be &lt;= 1024 bytes.
            #
            # Label named &quot;language&quot; can be used to record the programming language of
            # the profiled deployment. The standard choices for the value include &quot;java&quot;,
            # &quot;go&quot;, &quot;python&quot;, &quot;ruby&quot;, &quot;nodejs&quot;, &quot;php&quot;, &quot;dotnet&quot;.
            #
            # For deployments running on Google Cloud Platform, &quot;zone&quot; or &quot;region&quot; label
            # should be present describing the deployment location. An example of a zone
            # is &quot;us-central1-a&quot;, an example of a region is &quot;us-central1&quot; or
            # &quot;us-central&quot;.
          &quot;a_key&quot;: &quot;A String&quot;,
        },
        &quot;projectId&quot;: &quot;A String&quot;, # Project ID is the ID of a cloud project.
            # Validation regex: `^a-z{4,61}[a-z0-9]$`.
      },
      &quot;profileType&quot;: &quot;A String&quot;, # Type of profile.
          # For offline mode, this must be specified when creating the profile. For
          # online mode it is assigned and returned by the server.
      &quot;labels&quot;: { # Input only. Labels associated to this specific profile. These labels will
          # get merged with the deployment labels for the final data set.  See
          # documentation on deployment labels for validation rules and limits.
        &quot;a_key&quot;: &quot;A String&quot;,
      },
      &quot;profileBytes&quot;: &quot;A String&quot;, # Input only. Profile bytes, as a gzip compressed serialized proto, the
          # format is https://github.com/google/pprof/blob/master/proto/profile.proto.
    }</pre>
</div>

</body></html>