为基于日志的指标配置标签

本文档介绍了基于日志的指标标签,并说明了如何对基于日志的指标创建和使用标签。

如果您熟悉标签,则可以直接转到本页面上的创建标签部分。

基于日志的指标标签概览

标签可让基于日志的指标包含多个时序,每个标签值组合对应一个时序。所有基于日志的指标都附带若干默认标签

通过指定提取器表达式,您可以在计数器类型和分布类型指标中创建更多用户定义的标签。提取器表达式告知 Cloud Logging 如何从日志条目中提取标签值。您可以将标签的值指定为以下任一值:

  • LogEntry 对象中已命名字段的全部内容。
  • 命名字段中与正则表达式 (regexp) 相匹配的一部分。

您可以从 httpRequest.statusLogEntry 内置字段中提取标签,也可以从负载字段 textPayloadjsonPayloadprotoPayload 中提取标签。

如需了解正则表达式,请参阅 RE2 语法

请勿在提取器表达式中放置敏感信息,也不要将敏感数据提取到标签中。这些数据会被视为服务数据。

用户定义的标签的限制

以下限制适用于用户定义的标签:

  • 最多可为每个指标创建 10 个用户定义的标签。

  • 标签一经创建便无法删除。

    • 您可以修改已创建标签的提取器表达式和说明。

    • 您不能更改已创建标签的名称或值类型。

  • 仅保留标签值的前 1024 个字符。

  • 每个基于日志的指标最多只能有约 30000 个活跃的时序,这取决于每个标签(包括默认标签)的可能值的数量。

    例如,如果您的日志条目来自 100 项资源(例如虚拟机实例),而您定义了具有 20 个可能值的标签,那么您的指标最多可能有 2000 个时间序列。

如果您拥有的时间序列或数据点过多,则您的费用将会升高,并且您的运行可能会受到限制。如需详细了解基于日志的指标的费用,请参阅“Cloud Monitoring 价格:需付费的指标”。如需了解应用于基于日志的指标的限制,请参阅“配额和限制:基于日志的指标”排查基于日志的指标的问题

默认标签

大多数基于日志的指标都附带若干预定义标签:

  • 资源标签:所有指标均使用受监控的资源对象来标识时序数据的来源。每种资源类型都包括一个类型名称和一个或多个标签。资源类型的示例包括虚拟机实例、Cloud SQL 数据库和负载平衡器。

    资源及其标签与 Cloud Monitoring 中的其他指标标签分开列出,但两者具有相同的效果:它们会在指标中创建更多时间序列。如需了解详情,请参阅指标、时间序列和资源

  • log:此标签包含日志条目中 logName 字段的 LOG_ID 部分的值。

  • severity:此标签包含日志条目中 severity 字段的值。默认情况下,severity 标签仅在基于日志的系统指标中提供。

使用 Metrics Explorer 查看标签

如需查看为基于日志的指标生成的时间序列中的标签,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往基于日志的指标页面:

    前往基于日志的指标

    如果您使用搜索栏查找此页面,请选择子标题为 Logging 的结果。

  2. 找到要查看的指标,然后在指标的 更多菜单中选择在 Metrics Explorer 中查看

    在继续操作之前,请等待图表显示数据,如果您创建的是基于日志的指标,则可能需要等待几分钟。

  3. 如需查看可用标签,请展开过滤条件字段。您可能会看到资源标签和指标标签。标签列表因资源类型和指标类型而异。例如:

    • gce_instance 资源类型有三个资源标签project_idinstance_idzone

    • logging/log_entry_count 指标类型有两个指标标签logseverity。用户定义的标签也会显示在此部分中。

  4. 如需验证用户定义的标签是否从日志条目中提取正确的数据,请执行以下操作:

    1. Aggregation 元素更改为 Unaggregated

    2. 在图表中,选择表格两者均有

    3. 在工具栏中,依次选择 Column display menu(列显示菜单),然后选择您的标签。此菜单会显示包含数据的所有标签。

      如果您没有看到自己创建的标签,请检查字段名称和提取器表达式。

创建标签

您在创建指标的同时创建用户定义的标签。计数器指标和分布指标都可以包含标签。您不能为(基于日志的)系统指标添加标签。

如需创建标签,您需要在日志条目中指定字段,然后定义一个用于从指定字段中提取值的表达式。

控制台

  1. 创建基于日志的指标时,创建日志指标面板会包含一个用于添加标签的选项。

  2. 点击添加标签

    提示:要查看日志条目内的字段和值,请执行以下操作:

    1. 过滤器选择部分中,点击预览日志
    2. 查看日志窗格中,选择一个日志条目并点击其旁边的展开箭头
    3. 点击展开嵌套字段
  3. 标签部分中设置以下字段:

    1. 标签名称:输入标签名称。例如 ID

      该名称必须符合以下条件:

      • 长度不超过 100 个字符。
      • 匹配正则表达式 [a-zA-Z][a-zA-Z0-9_]*。
      • 不能只包含字符串“log”。
    2. 说明:对标签进行说明。尽可能具体地说明预期日志值的格式,例如 Instance number

    3. 标签类型:选择字符串布尔值整数

    4. 字段名称:输入包含标签值的日志条目字段名称。系统会在您输入时即时向您提供选项。在此示例中,该字段为:

      labels."compute.googleapis.com/resource_id"
      
    5. 正则表达式:如果标签的值包含字段的全部内容,则可以将此字段留空。否则,请指定用于从该字段值中提取标签值的正则表达式捕获组。

      例如,假设该字段通常包含如下文本:

      The instance number is 0123456789; the ID is my-test-instance22
      

      如果您希望标签值为实例编号,则有许多正则表达式可用来提取正确的编号。例如,在以下表达式中,括号是一个捕获组,用于标识文本将被提取的部分:

      The instance number is ([0-9]+); .*
      

      如需详细了解正则表达式,请参阅 RE2 语法

  4. 点击完成,以创建标签。您可以重复上述步骤添加更多标签。

  5. 要完成指标的创建,请点击创建指标

gcloud

如需创建包含自定义标签的日志基于指标,您必须创建一个文件,其中包含 JSON 或 YAML 格式的 LogMetric 定义表示法,包括自定义标签。然后,使用 --config-from-file 标志调用 create 命令来创建指标,将 FILENAME 替换为 JSON 或 YAML 文件的名称:

gcloud logging metrics create METRIC_NAME --config-from-file FILENAME

如需了解详情,请参阅 gcloud logging metrics create

API

在对 Logging API 的 projects.metrics.create 方法的调用的请求正文中,标签被指定为 LogMetric 对象的一部分。如需了解完整的方法调用,请参阅创建计数器指标创建分布指标

对于每一个标签,您必须向 LogMetric 中的 metricDescriptorlabelExtractors 字段添加一个细分。

语法如下所示:

{
  ...
  metricDescriptor: {
      labels: [
        { key: LABEL_NAME, valueType: LABEL_TYPE,
          description: LABEL_DESCRIPTION },
        ...
      ]
  },
  labelExtractors: {
    LABEL_NAME: EXTRACTOR_EXPRESSION,
    ...
  },
}

相应语法元素的含义如下:

  • LABEL_NAME:字符串形式的标签名称。
  • VALUE_TYPE:标签的类型:STRINGBOOLINT64
  • LABEL_DESCRIPTION:标签的说明。
  • EXTRACTOR_EXPRESSION:一个用于组合日志条目字段名称与可选的正则表达式的字符串。提取器表达式可以是以下各项之一:

    EXTRACT(FIELD)
    
    REGEXP_EXTRACT(FIELD, REGEXP)
    

如需详细了解正则表达式,请参阅 RE2 语法

以下是含有两个标签的示例:

{
  ...
  metricDescriptor: {
      labels: [
        { key: "label_name_a", valueType: STRING },
        { key: "label_name_b", valueType: INT64 },
      ]
  },
  labelExtractors: {
    "label_name_a":
      "REGEXP_EXTRACT(jsonPayload.field_a, \"before ([a-zA-Z ]+) after\")",
    "label_name_b": "EXTRACT(jsonPayload.field_b)",
  },
}

如需了解详情,请参阅 LogMetric 类型。

示例

本部分提供了一些示例,可帮助您开始为用户定义的基于日志的指标创建标签。创建标签后,我们建议您使用 Metrics Explorer 验证标签

提示:

  • 指定提取器表达式时,您必须使用捕获组。
  • 如果您未指定提取器表达式,则系统会提取字段的整个值。
  • 请确保任何标签的可能值集都受到限制。最好使用一小组离散的值(如“红色”“绿色”和“蓝色”)。例如,如果您为颜色标签提取 8 位 RGB 值,则可以具有超过 1600 万个不同的值。这意味着您可以拥有超过 1,600 万个时间序列。

    请勿提取高分辨率值,例如时间戳、任何种类的唯一标识符、用户 ID、IP 地址、未参数化网址等。

从审核日志中提取状态代码

如果字段不包含任何特殊字符,则您可以在基于日志的指标的标签中使用字段名称。

例如,对于审核日志,protoPayload 字段符合 AuditLog 结构。因此,如需从审核日志中提取 status 字段,您可以将字段名称设置为 protoPayload.status.code,并将提取器表达式留空。

如果您只想提取错误代码的第一位数字,可以将提取器表达式设置为 (\d)\d\d

从包含特殊字符的字段中提取值

如果日志条目中的字段包含特殊字符,请用双引号括住该字段。

例如,如需提取 k8s-pod/k8s-app 标签的整个值,请将字段名称设置为 labels."k8s-pod/k8s-app",并将表达式留空。

从文本载荷中提取值

请考虑以下格式的日志条目:

textPayload: "unfinished_task_instance_count.py:61 Unfinished task instance count metric value 0 for state: deferred"

如需从采用旧格式的日志条目中提取状态值(例如 deferred),您可以执行以下操作:

  • 字段名称:textPayload
  • 提取器表达式:^unfinished.*state: ([a-z]+)

从重复字段中提取值

日志条目可能包含包含重复字段的字段。在 JSON 中,这些字段使用方括号 ([]) 显示。从标签的角度来看,可以将重复字段视为集合,将标签提取器视为迭代器。您在定义标签时提供匹配条件,提取器会迭代该集合,直到找到匹配项。系统始终会返回第一个匹配项,即使集合的多个成员都符合条件也是如此。

您决定创建一个用于统计审核日志的基于日志的指标。在配置标签之前,您查看了多个审核日志,发现 protoPayload 的格式符合 AuditLog 结构。以下示例展示了审核日志条目的一部分。

{
  ...
  protoPayload: {
    @type: "type.googleapis.com/google.cloud.audit.AuditLog"
    authenticationInfo: {1}
    authorizationInfo: [
      0: {
        granted: true
        permission: "io.k8s.coordination.v1.leases.get"
        resource: "coordination.k8s.io/v1/namespaces/kube-system/leases/maintenance-controller"
      }
    ]
    requestMetadata: {2}
    status: {1}
    ...
  }
  ...
}

您决定为基于日志的指标创建一个标签,用于存储 permission 字段中的信息。您会发现,这些字段的格式为 io.k8s.xxx,其中 xxx 是一个字符串,用于提供有关请求的更多详细信息。此字符串的值可能为 get,也可能采用更复杂的格式,例如 io.k8s.coordination.v1.leases.get

为了尽可能减少标签值的数量,您不想提取详细信息。您只想在标签中存储 getcoordination 等值。此外,您决定不想在标签值中添加常用前缀 io.k8s.

接下来,您需要配置标签。由于 permission 字段是重复字段,其父级是 authorizationInfo 字段,因此您可以按如下方式设置字段名称:

protoPayload.authorizationInfo.permission

最后,您需要创建以下正则表达式:

io.k8s.([a-z]+).*