[role="xpack"]
[testenv="basic"]
[[get-transform-stats]]
= Get {transform} statistics API

[subs="attributes"]
++++
<titleabbrev>Get {transform} statistics</titleabbrev>
++++

Retrieves usage information for {transforms}.


[[get-transform-stats-request]]
== {api-request-title}

`GET _transform/<transform_id>/_stats`

`GET _transform/<transform_id>,<transform_id>/_stats` +

`GET _transform/_stats` +

`GET _transform/_all/_stats` +

`GET _transform/*/_stats` +


[[get-transform-stats-prereqs]]
== {api-prereq-title}

Requires the following privileges:

* cluster: `monitor_transform` (the `transform_user` built-in role grants this 
  privilege)
* destination index: `read`, `view_index_metadata`.


[[get-transform-stats-desc]]
== {api-description-title}

You can get statistics for multiple {transforms} in a single API
request by using a comma-separated list of identifiers or a wildcard expression.
You can get statistics for all {transforms} by using `_all`, by
specifying `*` as the `<transform_id>`, or by omitting the
`<transform_id>`.


[[get-transform-stats-path-parms]]
== {api-path-parms-title}

`<transform_id>`::
(Optional, string)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=transform-id-wildcard]
  

[[get-transform-stats-query-parms]]
== {api-query-parms-title}

`allow_no_match`::
(Optional, Boolean)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=allow-no-match-transforms1]

`from`::
(Optional, integer)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=from-transforms]

`size`::
(Optional, integer)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=size-transforms]

[role="child_attributes"]
[[get-transform-stats-response]]
== {api-response-body-title}

The API returns an array of statistics objects for {transforms}, which are
sorted by the `id` value in ascending order. All of these properties are
informational; you cannot update their values.

//Begin checkpointing
`checkpointing`::
(object) Contains statistics about <<transform-checkpoints,checkpoints>>.
+
.Properties of `checkpointing`
[%collapsible%open]
====
`changes_last_detected_at`:::
(date)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=checkpointing-changes-last-detected-at]

//Begin checkpointing.last
`last`:::
(object) Contains statistics about the last completed checkpoint. 
+
.Properties of `last`
[%collapsible%open]
=====
`checkpoint`::::
(integer) The sequence number for the checkpoint.
`time_upper_bound_millis`::::
(date) When using time-based synchronization, this timestamp indicates the
upper bound of data that is included in the checkpoint.
`timestamp_millis`::::
(date) The timestamp of the checkpoint, which indicates when the checkpoint
was created.
=====
//End checkpointing.last

`last_search_time`:::
(date)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=checkpointing-last-search-time]

//Begin checkpointing.next
`next`:::
(object) Contains statistics about the next checkpoint that is currently in
progress. This object appears only when the {transform} `state` is `indexing`.
+
.Properties of `next`
[%collapsible%open]
=====
`checkpoint`::::
(integer) The sequence number for the checkpoint.

`checkpoint_progress`::::
(object) Contains statistics about the progress of the checkpoint. For example,
it lists the `total_docs`, `docs_remaining`, `percent_complete`,
`docs_processed`, and `docs_indexed`. This information is available only for
batch {transforms} and the first checkpoint of {ctransforms}.

`time_upper_bound_millis`::::
(date) When using time-based synchronization, this timestamp indicates the
upper bound of data that is included in the checkpoint.

`timestamp_millis`::::
(date) The timestamp of the checkpoint, which indicates when the checkpoint was
created.
=====
//End checkpointing.next

`operations_behind`:::
(integer) The number of operations that have occurred on the source index but
have not been applied to the destination index yet. A high number can indicate
that the {transform} is failing to keep up. 
====
//End checkpointing

`id`::
(string)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=transform-id]

//Begin node
`node`::
(object) For started {transforms} only, the node upon which the {transform} is
started.
+
.Properties of `node`
[%collapsible%open]
====
`attributes`:::
(object) A list of attributes for the node.

`ephemeral_id`:::
(string) The node ephemeral ID.

`id`:::
(string) The unique identifier of the node. For example, "0-o0tOoRTwKFZifatTWKNw".

`name`:::
(string) The node name. For example, `0-o0tOo`.

`transport_address`:::
(string) The host and port where transport HTTP connections are accepted. For
example, `127.0.0.1:9300`.
====
//End node

`reason`::
(string)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=state-transform-reason]

`state`::
(string)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=state-transform]

//Begin stats
`stats`::
(object) An object that provides statistical information about the {transform}.
+
.Properties of `stats`
[%collapsible%open]
====

`delete_time_in_ms`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=delete-time-ms]

`documents_deleted`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=docs-deleted-transform]

`documents_indexed`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=docs-indexed]

`documents_processed`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=docs-processed]

`exponential_avg_checkpoint_duration_ms`:::
(double)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=exponential-avg-checkpoint-duration-ms]

`exponential_avg_documents_indexed`:::
(double)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=exponential-avg-documents-indexed]

`exponential_avg_documents_processed`:::
(double)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=exponential-avg-documents-processed]

`index_failures`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=index-failures]

`index_time_in_ms`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=index-time-ms]

`index_total`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=index-total]

`pages_processed`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=pages-processed]

`processing_time_in_ms`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=processing-time-ms]

`processing_total`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=processing-total]

`search_failures`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=search-failures]

`search_time_in_ms`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=search-time-ms]

`search_total`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=search-total]

`trigger_count`:::
(long)
include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=trigger-count]
====
//End stats
  
[[get-transform-stats-response-codes]]
== {api-response-codes-title}

`404` (Missing resources)::
  If `allow_no_match` is `false`, this code indicates that there are no
  resources that match the request or only partial matches for the request. 

[[get-transform-stats-example]]
== Examples

The following example skips for the first five {transforms} and
gets usage information for a maximum of ten results: 

[source,console]
--------------------------------------------------
GET _transform/_stats?from=5&size=10
--------------------------------------------------
// TEST[skip:todo]

The following example gets usage information for the {transform}:

[source,console]
--------------------------------------------------
GET _transform/ecommerce-customer-transform/_stats
--------------------------------------------------
// TEST[skip:todo]

The API returns the following results:

[source,console-result]
----
{
  "count" : 1,
  "transforms" : [
    {
      "id" : "ecommerce-customer-transform",
      "state" : "started",
      "node" : {
        "id" : "cpTIGMsVQ8Gqwqlxxxxxxx",
        "name" : "my.home",
        "ephemeral_id" : "5-L21nFsQxxxxxxxxxx-xx",
        "transport_address" : "127.0.0.1:9300",
        "attributes" : { }
      },
      "stats" : {
        "pages_processed" : 78,
        "documents_processed" : 6027,
        "documents_indexed" : 68,
        "documents_deleted": 22,
        "delete_time_in_ms": 214,
        "trigger_count" : 168,
        "index_time_in_ms" : 412,
        "index_total" : 20,
        "index_failures" : 0,
        "search_time_in_ms" : 353,
        "search_total" : 78,
        "search_failures" : 0,
        "processing_time_in_ms" : 8,
        "processing_total" : 78,
        "exponential_avg_checkpoint_duration_ms" : 97.30637923893185,
        "exponential_avg_documents_indexed" : 2.2064915040974062,
        "exponential_avg_documents_processed" : 179.89419945785045
      },
      "checkpointing" : {
        "last" : {
          "checkpoint" : 20,
          "timestamp_millis" : 1585344558220,
          "time_upper_bound_millis" : 1585344498220
        },
        "changes_last_detected_at" : 1585344558219
      }
    }
  ]
}
----
