You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Jaeger与OpenTelemetry实现微服务告警?

基于Jaeger+OpenTelemetry实现链路告警(邮件通知)

Jaeger本身确实没有内置告警系统,但可以通过以下几种成熟方案实现你需要的邮件告警功能:

方案1:自定义脚本轮询Jaeger Query API

Jaeger提供了REST API可以查询链路数据,你可以写脚本定期拉取数据,判断是否触发告警条件,再调用邮件服务发送通知。

  • 核心步骤:
    1. 调用Jaeger的/api/traces接口,传入服务名、时间范围、错误标签(如error=true)等参数,获取符合条件的Trace数据
    2. 在脚本中过滤出满足告警规则的链路:比如某个服务的Span耗时超过阈值、存在错误Span等
    3. 集成邮件发送逻辑(比如Python的smtplib、Go的net/smtp库),触发条件时发送告警邮件
    4. 用定时任务(Linux cron、Windows任务计划)定期执行脚本

示例Python脚本片段:

import requests
import smtplib
import time
from email.mime.text import MIMEText

JAEGER_API = "http://your-jaeger-query:16686/api/traces"
ALERT_RULES = {
    "service": "payment-service",
    "max_duration_ms": 3000,
    "check_error": True
}

def get_alert_traces():
    params = {
        "service": ALERT_RULES["service"],
        "start": int(time.time() - 300) * 1000,  # 最近5分钟
        "end": int(time.time()) * 1000,
        "tags": "error=true" if ALERT_RULES["check_error"] else ""
    }
    res = requests.get(JAEGER_API, params=params)
    return res.json()

def check_alerts(traces_data):
    alerts = []
    for trace in traces_data["data"]:
        trace_id = trace["traceID"]
        for span in trace["spans"]:
            if span["duration"] > ALERT_RULES["max_duration_ms"]:
                alerts.append(f"Trace [{trace_id}] 中Span [{span['operationName']}] 耗时 {span['duration']}ms,超出阈值")
    return alerts

def send_email(alerts):
    if not alerts:
        return
    msg = MIMEText("\n".join(alerts), "plain", "utf-8")
    msg["Subject"] = "Jaeger链路告警通知"
    msg["From"] = "alerts@yourcompany.com"
    msg["To"] = "dev-ops@yourcompany.com"
    
    with smtplib.SMTP("smtp.yourcompany.com", 587) as server:
        server.starttls()
        server.login("alerts@yourcompany.com", "your-smtp-password")
        server.send_message(msg)

if __name__ == "__main__":
    traces = get_alert_traces()
    alert_list = check_alerts(traces)
    send_email(alert_list)

方案2:集成Prometheus + Alertmanager

Jaeger可以暴露Prometheus格式的指标,借助Prometheus的规则引擎和Alertmanager来实现告警和邮件通知,这是监控体系中常用的组合。

  • 核心步骤:
    1. 确认Jaeger实例开启指标暴露:Collector默认在14269端口、Query在16686端口提供/metrics端点
    2. 配置Prometheus采集Jaeger指标:
      scrape_configs:
        - job_name: 'jaeger'
          static_configs:
            - targets: ['your-jaeger-collector:14269']
      
    3. 编写Prometheus告警规则(比如错误率、平均耗时阈值):
      groups:
        - name: jaeger_link_alerts
          rules:
            - alert: ServiceErrorRateExceeded
              expr: sum(rate(jaeger_traces_total{tag_error="true"}[5m])) by (service) / sum(rate(jaeger_traces_total[5m])) by (service) > 0.03
              for: 1m
              labels:
                severity: critical
              annotations:
                summary: "{{ $labels.service }} 错误率超标"
                description: "{{ $labels.service }} 最近5分钟错误率达{{ $value | printf \"%.2f\" }}%,超过3%"
            
            - alert: ServiceLatencyTooHigh
              expr: avg(rate(jaeger_traces_duration_sum[5m])) by (service) / avg(rate(jaeger_traces_duration_count[5m])) by (service) > 4
              for: 1m
              labels:
                severity: warning
              annotations:
                summary: "{{ $labels.service }} 平均耗时过高"
                description: "{{ $labels.service }} 最近5分钟平均耗时{{ $value | printf \"%.2f\" }}秒,超过4秒"
      
    4. 配置Alertmanager发送邮件:
      global:
        smtp_smarthost: 'smtp.yourcompany.com:587'
        smtp_from: 'prometheus-alert@yourcompany.com'
        smtp_auth_username: 'prometheus-alert@yourcompany.com'
        smtp_auth_password: 'your-smtp-pass'
        
      route:
        group_by: ['alertname', 'service']
        group_wait: 20s
        group_interval: 5m
        repeat_interval: 1h
        receiver: 'dev-team-email'
        
      receivers:
        - name: 'dev-team-email'
          email_configs:
            - to: 'dev-team@yourcompany.com'
              subject: '[告警] {{ .Status | toUpper }}: {{ .CommonAnnotations.summary }}'
              html: '{{ .CommonAnnotations.description }}'
      
    5. 重启Prometheus和Alertmanager,验证指标采集和告警触发逻辑。

方案3:通过Grafana实现可视化+告警

用Grafana连接Jaeger数据源,创建链路监控面板,再利用Grafana自带的告警功能发送邮件,适合需要可视化+告警一体化的场景。

  • 核心步骤:
    1. 在Grafana中添加Jaeger数据源,填入Jaeger Query的访问地址
    2. 创建仪表盘,添加错误率、Span耗时分布、Trace数量等面板
    3. 为目标面板配置告警规则:比如设置"平均耗时超过5秒"、"错误率超过2%"等触发条件
    4. 在Grafana的告警通道中配置邮件通知,填写SMTP服务器信息和接收邮箱
    5. 启用告警规则,当链路数据满足条件时,Grafana会自动发送邮件告警

内容的提问来源于stack exchange,提问作者user19337829

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:33:38