本文档介绍了基于日志的指标标签,并说明了如何对基于日志的指标创建和使用标签。
如果您熟悉标签,则可以直接转到本页面上的创建标签部分。
基于日志的指标标签概览
标签可让基于日志的指标包含多个时序,每个标签值组合对应一个时序。所有基于日志的指标都附带若干默认标签。
通过指定提取器表达式,您可以在计数器类型和分布类型指标中创建更多用户定义的标签。提取器表达式告知 Cloud Logging 如何从日志条目中提取标签值。您可以将标签的值指定为以下任一值:
LogEntry
对象中已命名字段的全部内容。- 命名字段中与正则表达式 (regexp) 相匹配的一部分。
您可以从 httpRequest.status
等 LogEntry
内置字段中提取标签,也可以从负载字段 textPayload
、jsonPayload
或 protoPayload
中提取标签。
如需了解正则表达式,请参阅 RE2 语法。
请勿在提取器表达式中放置敏感信息,也不要将敏感数据提取到标签中。这些数据会被视为服务数据。
用户定义的标签的限制
以下限制适用于用户定义的标签:
最多可为每个指标创建 10 个用户定义的标签。
标签一经创建便无法删除。
您可以修改已创建标签的提取器表达式和说明。
您不能更改已创建标签的名称或值类型。
仅保留标签值的前 1024 个字符。
每个基于日志的指标最多只能有约 30000 个活跃的时序,这取决于每个标签(包括默认标签)的可能值的数量。
例如,如果您的日志条目来自 100 项资源(例如虚拟机实例),而您定义了具有 20 个可能值的标签,那么您的指标最多可能有 2000 个时间序列。
如果您拥有的时间序列或数据点过多,则您的费用将会升高,并且您的运行可能会受到限制。如需详细了解基于日志的指标的费用,请参阅“Cloud Monitoring 价格:需付费的指标”。如需了解应用于基于日志的指标的限制,请参阅“配额和限制:基于日志的指标”和排查基于日志的指标的问题。
默认标签
大多数基于日志的指标都附带若干预定义标签:
资源标签:所有指标均使用受监控的资源对象来标识时序数据的来源。每种资源类型都包括一个类型名称和一个或多个标签。资源类型的示例包括虚拟机实例、Cloud SQL 数据库和负载平衡器。
资源及其标签与 Cloud Monitoring 中的其他指标标签分开列出,但两者具有相同的效果:它们会在指标中创建更多时间序列。如需了解详情,请参阅指标、时间序列和资源。
log:此标签包含日志条目中
logName
字段的LOG_ID
部分的值。severity:此标签包含日志条目中
severity
字段的值。默认情况下,severity 标签仅在基于日志的系统指标中提供。
使用 Metrics Explorer 查看标签
如需查看为基于日志的指标生成的时间序列中的标签,请执行以下操作:
-
在 Google Cloud 控制台中,前往基于日志的指标页面:
如果您使用搜索栏查找此页面,请选择子标题为 Logging 的结果。
找到要查看的指标,然后在指标的 more_vert 更多菜单中选择在 Metrics Explorer 中查看。
在继续操作之前,请等待图表显示数据,如果您创建的是基于日志的指标,则可能需要等待几分钟。
如需查看可用标签,请展开过滤条件字段。您可能会看到资源标签和指标标签。标签列表因资源类型和指标类型而异。例如:
gce_instance
资源类型有三个资源标签:project_id
、instance_id
和zone
。logging/log_entry_count
指标类型有两个指标标签:log
和severity
。用户定义的标签也会显示在此部分中。
如需验证用户定义的标签是否从日志条目中提取正确的数据,请执行以下操作:
将 Aggregation 元素更改为 Unaggregated。
在图表中,选择表格或两者均有。
在工具栏中,依次选择 view_column Column display menu(列显示菜单),然后选择您的标签。此菜单会显示包含数据的所有标签。
如果您没有看到自己创建的标签,请检查字段名称和提取器表达式。
创建标签
您在创建指标的同时创建用户定义的标签。计数器指标和分布指标都可以包含标签。您不能为(基于日志的)系统指标添加标签。
如需创建标签,您需要在日志条目中指定字段,然后定义一个用于从指定字段中提取值的表达式。
控制台
创建基于日志的指标时,创建日志指标面板会包含一个用于添加标签的选项。
点击添加标签。
提示:要查看日志条目内的字段和值,请执行以下操作:
- 在过滤器选择部分中,点击预览日志。
- 在查看日志窗格中,选择一个日志条目并点击其旁边的展开箭头 navigate_next。
- 点击展开嵌套字段。
在标签部分中设置以下字段:
标签名称:输入标签名称。例如
ID
。该名称必须符合以下条件:
- 长度不超过 100 个字符。
- 匹配正则表达式 [a-zA-Z][a-zA-Z0-9_]*。
- 不能只包含字符串“log”。
说明:对标签进行说明。尽可能具体地说明预期日志值的格式,例如
Instance number
。标签类型:选择字符串、布尔值或整数。
字段名称:输入包含标签值的日志条目字段名称。系统会在您输入时即时向您提供选项。在此示例中,该字段为:
labels."compute.googleapis.com/resource_id"
正则表达式:如果标签的值包含字段的全部内容,则可以将此字段留空。否则,请指定用于从该字段值中提取标签值的正则表达式捕获组。
例如,假设该字段通常包含如下文本:
The instance number is 0123456789; the ID is my-test-instance22
如果您希望标签值为实例编号,则有许多正则表达式可用来提取正确的编号。例如,在以下表达式中,括号是一个捕获组,用于标识文本将被提取的部分:
The instance number is ([0-9]+); .*
如需详细了解正则表达式,请参阅 RE2 语法。
点击完成,以创建标签。您可以重复上述步骤添加更多标签。
要完成指标的创建,请点击创建指标。
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
中的 metricDescriptor
和 labelExtractors
字段添加一个细分。
语法如下所示:
{ ... metricDescriptor: { labels: [ { key: LABEL_NAME, valueType: LABEL_TYPE, description: LABEL_DESCRIPTION }, ... ] }, labelExtractors: { LABEL_NAME: EXTRACTOR_EXPRESSION, ... }, }
相应语法元素的含义如下:
- LABEL_NAME:字符串形式的标签名称。
- VALUE_TYPE:标签的类型:
STRING
、BOOL
或INT64
。 - 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
。
为了尽可能减少标签值的数量,您不想提取详细信息。您只想在标签中存储 get
或 coordination
等值。此外,您决定不想在标签值中添加常用前缀 io.k8s.
。
接下来,您需要配置标签。由于 permission
字段是重复字段,其父级是 authorizationInfo
字段,因此您可以按如下方式设置字段名称:
protoPayload.authorizationInfo.permission
最后,您需要创建以下正则表达式:
io.k8s.([a-z]+).*