跳转至

开启链路指标告警规则与自定义链路告警规则

Insight 自 v0.33.0 版本起,内置了针对服务链路(SpanMetrics)的核心监控告警策略,在通过 Helm 安装 Insight 时可通过参数 --set victoria-metrics-k8s-stack.defaultRules.spanmetrics=true 来开启。开启之后,无需用户手动配置基础规则, 即可实现对服务或接口调用的错误率、请求延时两大关键维度的自动化监控与异常告警,进一步降低可观测性落地门槛,提升微服务架构下的问题发现效率。

本文针对 Insight 可观测平台内置的 SpanMetrics 告警规则(VMRule 类型)进行详细说明,帮助你理解各告警规则对应的指标含义、PromQL 逻辑,以便在告警中心中正确配置或自定义相关告警规则。

该组规则支持服务级(整服务维度)和 Span 级(具体接口 / 方法维度)的异常检测,兼顾整体服务健康度与细粒度问题定位。

内置告警规则明细

内置规则共包含 4 条核心告警,分为错误率和延时两大类别,覆盖服务/Span 两个粒度,具体配置如下表所示:

告警名称 监控维度 监控指标 触发条件 严重级别 持续生效时间
ServiceErrorRate 服务级错误率 calls_total 服务端 Span 错误率 ≥ 15%(统计窗口 10 分钟) critical 10 分钟
SpanErrorRate Span 级错误率 calls_total 具体接口的服务端 Span 错误率 ≥ 15%(统计窗口 10 分钟) critical 10 分钟
ServiceLatency 服务级平均延时 duration_milliseconds_bucket 服务端 Span 平均调用延时 ≥ 1000ms(1 秒,统计窗口 10 分钟) critical 10 分钟
SpanLatency Span 级平均延时 duration_milliseconds_bucket 具体接口的服务端 Span 平均调用延时 ≥ 1000ms(1 秒,统计窗口 10 分钟) critical 10 分钟

以下是内置告警规则的具体内容:

apiVersion: operator.victoriametrics.com/v1beta1
kind: VMRule
metadata:
  name: spanmetrics
  namespace: insight-system
  labels:
    # 规则默认部署在 insight-system 命名空间,带有此标识的告警规则为内置规则
    "operator.insight.io/builtin-rule": "true" 
spec:
  groups:
  - name: spanmetrics
    rules:
    - alert: ServiceErrorRate
      annotations:
        description: Error rate of Service {{ $labels.service_name }} in cluster/namespace {{ $labels.cluster }}/{{ $labels.k8s_namespace_name }} is greater than {{ printf "%.2f" $value }}%.'
      expr: 100 * (sum(rate(calls_total{status_code="STATUS_CODE_ERROR",span_kind =~"SPAN_KIND_SERVER"}[10m])) by (cluster,namespace,k8s_namespace_name,k8s,service_name) / sum(rate(calls_total{span_kind =~"SPAN_KIND_SERVER"}[10m])) by (cluster,namespace,k8s_namespace_name,service_name)) >= 15
      for: 10m
      labels:
        severity: critical
        # namespace from k8s_namespace_name: backward Backwards-compatible scenarios where the agent is not upgraded
        namespace: '{{ $labels.k8s_namespace_name }}'
    - alert: SpanErrorRate
      annotations:
        description: Error rate of SpanName {{ $labels.span_name }} of {{ $labels.pod }} Service {{ $labels.service_name }} in cluster/namespace {{ $labels.cluster }}/{{ $labels.k8s_namespace_name }} is greater than {{ printf "%.2f" $value }}%.
      expr: 100 * (sum(rate(calls_total{status_code="STATUS_CODE_ERROR",span_kind =~"SPAN_KIND_SERVER"}[10m])) by (cluster,namespace,k8s_namespace_name,service_name,span_name) / sum(rate(calls_total{span_kind =~"SPAN_KIND_SERVER"}[10m])) by (cluster,namespace,k8s_namespace_name,service_name,span_name)) >= 15
      for: 10m
      labels:
        severity: critical
        namespace: '{{ $labels.k8s_namespace_name }}'
    - alert: ServiceLatency
      annotations:
        description: Latency of Service {{ $labels.service_name }} in cluster/namespace {{ $labels.cluster }}/{{ $labels.k8s_namespace_name }} is greater than {{ printf "%.2f" $value }}.
      expr: (sum(rate(duration_milliseconds_bucket{span_kind =~"SPAN_KIND_SERVER"}[10m])) by (cluster,namespace,k8s_namespace_name,service_name,le)) >= 1000
      for: 10m
      labels:
        severity: critical
        namespace: '{{ $labels.k8s_namespace_name }}'
    - alert: SpanLatency
      annotations:
        description: Latency of SpanName {{ $labels.span_name }} of {{ $labels.pod }} Service {{ $labels.service_name }} in cluster/namespace {{ $labels.cluster }}/{{ $labels.k8s_namespace_name }} is greater than {{ printf "%.2f" $value }}.
      expr: (sum(rate(duration_milliseconds_bucket{span_kind =~"SPAN_KIND_SERVER"}[10m])) by (cluster,namespace,k8s_namespace_name,service_name,span_name,le)) >= 1000
      for: 10m
      labels:
        severity: critical
        namespace: '{{ $labels.k8s_namespace_name }}'

规则特点说明

  • 统计范围:仅针对 span_kind=~"SPAN_KIND_SERVER"(服务端 Span),聚焦服务对外提供的接口调用,排除客户端、内部链路等非核心场景;
  • 指标计算:错误率采用 rate 函数计算每秒调用速率,延时采用 increase 函数计算计数器增量,避免精度丢失,符合 Prometheus 计数器指标的最佳实践;
  • 标签透传:告警信息中包含 cluster(集群)、service_name(服务名)、k8s_namespace_name(命名空间)、span_name(接口名)等关键标签,便于快速定位问题所属环境与业务模块。

自定义规则

此处主要举例说明如何在创建规则是编写 PromQL 语句满足业务需求。界面操作请参考:告警策略

例如:

  • 先为 集群 对象创建告警策略:

    支付服务示例告警组

  • 再通过 PromQL 添加告警规则:

    支付服务示例告警规则

以下是不同场景的 PromQL 示例说明:

示例一

调整特定服务的错误率阈值(核心服务严格监控):支付服务(service_name: "pay-service"), 需将错误率阈值从内置的 15% 降至 5%,且持续 5 分钟即触发告警。

100 * (sum(rate(calls_total{status_code="STATUS_CODE_ERROR",span_kind=~"SPAN_KIND_SERVER",service_name="pay-service"}[5m])) by (cluster,service_name,k8s_namespace_name) / sum(rate(calls_total{span_kind=~"SPAN_KIND_SERVER",service_name="pay-service"}[5m])) by (cluster,service_name,k8s_namespace_name)) >= 5

示例二

监控特定服务的 P95 延迟(细粒度性能监控):订单服务的「创建订单」接口(span_name: "createOrder"),需监控其 P95 延迟,超过 800ms 即触发告警。

histogram_quantile(0.95, sum(rate(duration_milliseconds_bucket{span_kind=~"SPAN_KIND_SERVER",service_name="order-service",span_name="createOrder"}[10m])) by (cluster,k8s_namespace_name,service_name,span_name,le)) >= 800

Note

内置规则仅监控平均延迟,P95/P99 分位值延迟需基于 duration_milliseconds_bucket(直方图指标)计算,更贴合真实用户体验。

示例三

监控服务调用量突降(可用性兜底监控): 用户服务(service_name: "user-service")的调用量突然下降 50% 以上,可能是服务不可用或流量异常,需及时告警。

rate(calls_total{span_kind=~"SPAN_KIND_SERVER",service_name="user-service"}[5m]) / rate(calls_total{span_kind=~"SPAN_KIND_SERVER",service_name="user-service"}[5m] offset 5m) <= 0.5

评论