4. 标签设计原则:基数控制、命名规范、避免动态标签

在 Loki 中,标签(Label)是日志数据的索引键值对。标签设计的好坏直接决定了查询性能、存储效率以及告警规则的可靠性。对于弹性伸缩健康检查场景,错误的标签设计会导致基数爆炸、查询超时、告警延迟甚至系统不可用。本节从三个核心原则出发,给出可落地的标签设计指南。

4.1 基数控制:高基数是告警系统的第一杀手

基数(Cardinality) 指一个标签值可能出现的不同取值的数量。Loki 的倒排索引会将每个标签键值对作为索引项,高基数标签会生成海量索引条目,导致内存膨胀、写入变慢、查询扫描范围剧增。

基数等级 示例标签 对 Loki 的影响 健康检查场景风险
低基数(< 100) severity、status、region 索引高效,查询快 安全
中基数(100 ~ 10,000) pod_name、host 索引可接受,需控制数量 需定期清理
高基数(> 10,000) request_id、user_ip、trace_id 索引膨胀,写入性能下降 禁止使用
⚠️ 高基数陷阱: 在弹性伸缩场景中,pod_name 或 instance_id 会随扩缩容频繁变化。如果直接将 pod_name 作为 Loki 标签,每次 Pod 重建都会产生新的标签值,导致基数随时间线性增长。正确的做法是将 pod_name 放在日志行内,而非标签中。

4.2 命名规范:可读性与可发现性

统一的标签命名规范能降低团队协作成本,避免因命名歧义导致的告警规则误匹配。推荐采用以下规范:

  • 使用小写字母 + 下划线:例如 health_status、scaling_group,避免使用驼峰或大写。
  • 前缀命名空间:使用 app_、env_、check_ 等前缀区分标签用途。例如 app_name、env_stage、check_type。
  • 避免缩写歧义:svc 不如 service 清晰,hcheck 不如 health_check 直观。
  • 保留标准标签:Loki 保留标签如 job、instance、__name__ 等,不要覆盖或滥用。
✅ 推荐命名示例:
app_name=api-gateway
env_stage=production
check_type=liveness
scaling_group=web-asg-001

4.3 避免动态标签:将变量放入日志行

动态标签 指标签值随每次日志事件变化,例如 request_id、user_id、session_id、timestamp 等。这些标签会直接导致基数爆炸,必须严格禁止。

正确的做法是:

  1. 将动态值放入日志行内容,通过 logfmt 或 json 格式结构化输出。
  2. 使用 Loki 的 | pattern 或 | json 解析器 在查询时提取,而非在采集时建立索引。
  3. 固定标签只保留用于过滤和聚合的维度,例如服务名、环境、健康检查类型、状态码。
# ❌ 错误:将动态值作为标签
{app="web", request_id="abc-123-def"}  # 高基数!

# ✅ 正确:动态值放在日志行内
{app="web", env="prod"} | json | request_id == "abc-123-def"
💡 经验法则: 如果一个标签的值在一天内可能产生超过 1000 个不同的取值,它就不应该作为 Loki 标签。将其放入日志行,使用 LogQL 的 | label_format 或 | json 在查询时按需提取。

4.4 标签设计决策流程

下图展示了在弹性伸缩健康检查场景中,如何判断一个字段是否应该作为 Loki 标签:

标签设计决策流程 候选字段 用于告警过滤或聚合? 基数 < 1000? 值随每次日志变化? ✅ 作为 Loki 标签 ❌ 放入日志行,查询时解析 三个判断条件:是否用于过滤 → 基数是否可控 → 值是否动态变化

4.5 弹性伸缩场景标签设计清单

针对弹性伸缩健康检查,推荐使用以下固定标签集:

标签键 示例值 基数 说明
app api-gateway 低(< 50) 服务/应用名称
env prod 低(< 10) 部署环境
check_type liveness 低(< 10) 健康检查类型
status pass 低(< 5) 检查结果状态
scaling_group web-asg-001 中(< 500) 弹性伸缩组标识
region us-east-1 低(< 20) 部署区域
📌 核心原则总结:
  • 低基数 + 固定值 → 作为标签
  • 高基数或动态值 → 放入日志行
  • 命名统一 → 小写 + 下划线 + 前缀
  • 定期审计 → 使用 label_names 和 label_values 监控基数变化