---
# ----------------------------------------------------------------------------
#
#     ***     AUTO GENERATED CODE    ***    Type: MMv1     ***
#
# ----------------------------------------------------------------------------
#
#     This file is automatically generated by Magic Modules and manual
#     changes will be clobbered when the file is regenerated.
#
#     Please read more about how to change this file in
#     .github/CONTRIBUTING.md.
#
# ----------------------------------------------------------------------------
subcategory: "Cloud (Stackdriver) Logging"
description: |-
  Logs-based metric can also be used to extract values from logs and create a a distribution
  of the values.
---

# google_logging_metric

Logs-based metric can also be used to extract values from logs and create a a distribution
of the values. The distribution records the statistics of the extracted values along with
an optional histogram of the values as specified by the bucket options.


To get more information about Metric, see:

* [API documentation](https://cloud.google.com/logging/docs/reference/v2/rest/v2/projects.metrics/create)
* How-to Guides
    * [Official Documentation](https://cloud.google.com/logging/docs/apis)

<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=logging_metric_basic&open_in_editor=main.tf" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Logging Metric Basic


```hcl
resource "google_logging_metric" "logging_metric" {
  name   = "my-(custom)/metric"
  filter = "resource.type=gae_app AND severity>=ERROR"
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "DISTRIBUTION"
    unit        = "1"
    labels {
      key         = "mass"
      value_type  = "STRING"
      description = "amount of matter"
    }
    labels {
      key         = "sku"
      value_type  = "INT64"
      description = "Identifying number for item"
    }
    display_name = "My metric"
  }
  value_extractor = "EXTRACT(jsonPayload.request)"
  label_extractors = {
    "mass" = "EXTRACT(jsonPayload.request)"
    "sku"  = "EXTRACT(jsonPayload.id)"
  }
  bucket_options {
    linear_buckets {
      num_finite_buckets = 3
      width              = 1
      offset             = 1
    }
  }
}
```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=logging_metric_counter_basic&open_in_editor=main.tf" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Logging Metric Counter Basic


```hcl
resource "google_logging_metric" "logging_metric" {
  name   = "my-(custom)/metric"
  filter = "resource.type=gae_app AND severity>=ERROR"
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"
  }
}
```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=logging_metric_counter_labels&open_in_editor=main.tf" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Logging Metric Counter Labels


```hcl
resource "google_logging_metric" "logging_metric" {
  name   = "my-(custom)/metric"
  filter = "resource.type=gae_app AND severity>=ERROR"
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"
    labels {
      key         = "mass"
      value_type  = "STRING"
      description = "amount of matter"
    }
  }
  label_extractors = {
    "mass" = "EXTRACT(jsonPayload.request)"
  }
}
```
## Example Usage - Logging Metric Logging Bucket


```hcl
resource "google_logging_project_bucket_config" "logging_metric" {
    location  = "global"
    project   = "my-project-name"
    bucket_id = "_Default"
}

resource "google_logging_metric" "logging_metric" {
  name        = "my-(custom)/metric"
  filter      = "resource.type=gae_app AND severity>=ERROR"
  bucket_name = google_logging_project_bucket_config.logging_metric.id
}
```
<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=logging_metric_disabled&open_in_editor=main.tf" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Logging Metric Disabled


```hcl
resource "google_logging_metric" "logging_metric" {
  name   = "my-(custom)/metric"
  filter = "resource.type=gae_app AND severity>=ERROR"
  metric_descriptor {
    metric_kind = "DELTA"
    value_type  = "INT64"
  }
  disabled = true
}
```

## Argument Reference

The following arguments are supported:


* `name` -
  (Required)
  The client-assigned metric identifier. Examples - "error_count", "nginx/requests".
  Metric identifiers are limited to 100 characters and can include only the following
  characters A-Z, a-z, 0-9, and the special characters _-.,+!*',()%/. The forward-slash
  character (/) denotes a hierarchy of name pieces, and it cannot be the first character
  of the name.

* `filter` -
  (Required)
  An advanced logs filter (https://cloud.google.com/logging/docs/view/advanced-filters) which
  is used to match log entries.


- - -


* `description` -
  (Optional)
  A description of this metric, which is used in documentation. The maximum length of the
  description is 8000 characters.

* `bucket_name` -
  (Optional)
  The resource name of the Log Bucket that owns the Log Metric. Only Log Buckets in projects
  are supported. The bucket has to be in the same project as the metric.

* `disabled` -
  (Optional)
  If set to True, then this metric is disabled and it does not generate any points.

* `metric_descriptor` -
  (Optional)
  The optional metric descriptor associated with the logs-based metric.
  If unspecified, it uses a default metric descriptor with a DELTA metric kind,
  INT64 value type, with no labels and a unit of "1". Such a metric counts the
  number of log entries matching the filter expression.
  Structure is [documented below](#nested_metric_descriptor).

* `label_extractors` -
  (Optional)
  A map from a label key string to an extractor expression which is used to extract data from a log
  entry field and assign as the label value. Each label key specified in the LabelDescriptor must
  have an associated extractor expression in this map. The syntax of the extractor expression is
  the same as for the valueExtractor field.

* `value_extractor` -
  (Optional)
  A valueExtractor is required when using a distribution logs-based metric to extract the values to
  record from a log entry. Two functions are supported for value extraction - EXTRACT(field) or
  REGEXP_EXTRACT(field, regex). The argument are 1. field - The name of the log entry field from which
  the value is to be extracted. 2. regex - A regular expression using the Google RE2 syntax
  (https://github.com/google/re2/wiki/Syntax) with a single capture group to extract data from the specified
  log entry field. The value of the field is converted to a string before applying the regex. It is an
  error to specify a regex that does not include exactly one capture group.

* `bucket_options` -
  (Optional)
  The bucketOptions are required when the logs-based metric is using a DISTRIBUTION value type and it
  describes the bucket boundaries used to create a histogram of the extracted values.
  Structure is [documented below](#nested_bucket_options).

* `project` - (Optional) The ID of the project in which the resource belongs.
    If it is not provided, the provider project is used.


<a name="nested_metric_descriptor"></a>The `metric_descriptor` block supports:

* `unit` -
  (Optional)
  The unit in which the metric value is reported. It is only applicable if the valueType is
  `INT64`, `DOUBLE`, or `DISTRIBUTION`. The supported units are a subset of
  [The Unified Code for Units of Measure](http://unitsofmeasure.org/ucum.html) standard

* `value_type` -
  (Required)
  Whether the measurement is an integer, a floating-point number, etc.
  Some combinations of metricKind and valueType might not be supported.
  For counter metrics, set this to INT64.
  Possible values are: `BOOL`, `INT64`, `DOUBLE`, `STRING`, `DISTRIBUTION`, `MONEY`.

* `metric_kind` -
  (Required)
  Whether the metric records instantaneous values, changes to a value, etc.
  Some combinations of metricKind and valueType might not be supported.
  For counter metrics, set this to DELTA.
  Possible values are: `DELTA`, `GAUGE`, `CUMULATIVE`.

* `labels` -
  (Optional)
  The set of labels that can be used to describe a specific instance of this metric type. For
  example, the appengine.googleapis.com/http/server/response_latencies metric type has a label
  for the HTTP response code, response_code, so you can look at latencies for successful responses
  or just for responses that failed.
  Structure is [documented below](#nested_labels).

* `display_name` -
  (Optional)
  A concise name for the metric, which can be displayed in user interfaces. Use sentence case
  without an ending period, for example "Request count". This field is optional but it is
  recommended to be set for any metrics associated with user-visible concepts, such as Quota.


<a name="nested_labels"></a>The `labels` block supports:

* `key` -
  (Required)
  The label key.

* `description` -
  (Optional)
  A human-readable description for the label.

* `value_type` -
  (Optional)
  The type of data that can be assigned to the label.
  Default value is `STRING`.
  Possible values are: `BOOL`, `INT64`, `STRING`.

<a name="nested_bucket_options"></a>The `bucket_options` block supports:

* `linear_buckets` -
  (Optional)
  Specifies a linear sequence of buckets that all have the same width (except overflow and underflow).
  Each bucket represents a constant absolute uncertainty on the specific value in the bucket.
  Structure is [documented below](#nested_linear_buckets).

* `exponential_buckets` -
  (Optional)
  Specifies an exponential sequence of buckets that have a width that is proportional to the value of
  the lower bound. Each bucket represents a constant relative uncertainty on a specific value in the bucket.
  Structure is [documented below](#nested_exponential_buckets).

* `explicit_buckets` -
  (Optional)
  Specifies a set of buckets with arbitrary widths.
  Structure is [documented below](#nested_explicit_buckets).


<a name="nested_linear_buckets"></a>The `linear_buckets` block supports:

* `num_finite_buckets` -
  (Required)
  Must be greater than 0.

* `width` -
  (Required)
  Must be greater than 0.

* `offset` -
  (Required)
  Lower bound of the first bucket.

<a name="nested_exponential_buckets"></a>The `exponential_buckets` block supports:

* `num_finite_buckets` -
  (Required)
  Must be greater than 0.

* `growth_factor` -
  (Required)
  Must be greater than 1.

* `scale` -
  (Required)
  Must be greater than 0.

<a name="nested_explicit_buckets"></a>The `explicit_buckets` block supports:

* `bounds` -
  (Required)
  The values must be monotonically increasing.

## Attributes Reference

In addition to the arguments listed above, the following computed attributes are exported:

* `id` - an identifier for the resource with format `{{name}}`


## Timeouts

This resource provides the following
[Timeouts](https://developer.hashicorp.com/terraform/plugin/sdkv2/resources/retries-and-customizable-timeouts) configuration options:

- `create` - Default is 20 minutes.
- `update` - Default is 20 minutes.
- `delete` - Default is 20 minutes.

## Import


Metric can be imported using any of these accepted formats:

* `{{project}} {{name}}`
* `{{name}}`


In Terraform v1.5.0 and later, use an [`import` block](https://developer.hashicorp.com/terraform/language/import) to import Metric using one of the formats above. For example:

```tf
import {
  id = "{{project}} {{name}}"
  to = google_logging_metric.default
}
```

When using the [`terraform import` command](https://developer.hashicorp.com/terraform/cli/commands/import), Metric can be imported using one of the formats above. For example:

```
$ terraform import google_logging_metric.default {{project}} {{name}}
$ terraform import google_logging_metric.default {{name}}
```

## User Project Overrides

This resource supports [User Project Overrides](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference#user_project_override).
