如何基于Jaeger与OpenTelemetry实现微服务告警?
基于Jaeger+OpenTelemetry实现链路告警(邮件通知)
Jaeger本身确实没有内置告警系统,但可以通过以下几种成熟方案实现你需要的邮件告警功能:
方案1:自定义脚本轮询Jaeger Query API
Jaeger提供了REST API可以查询链路数据,你可以写脚本定期拉取数据,判断是否触发告警条件,再调用邮件服务发送通知。
- 核心步骤:
- 调用Jaeger的
/api/traces接口,传入服务名、时间范围、错误标签(如error=true)等参数,获取符合条件的Trace数据 - 在脚本中过滤出满足告警规则的链路:比如某个服务的Span耗时超过阈值、存在错误Span等
- 集成邮件发送逻辑(比如Python的
smtplib、Go的net/smtp库),触发条件时发送告警邮件 - 用定时任务(Linux cron、Windows任务计划)定期执行脚本
- 调用Jaeger的
示例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来实现告警和邮件通知,这是监控体系中常用的组合。
- 核心步骤:
- 确认Jaeger实例开启指标暴露:Collector默认在14269端口、Query在16686端口提供
/metrics端点 - 配置Prometheus采集Jaeger指标:
scrape_configs: - job_name: 'jaeger' static_configs: - targets: ['your-jaeger-collector:14269'] - 编写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秒" - 配置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 }}' - 重启Prometheus和Alertmanager,验证指标采集和告警触发逻辑。
- 确认Jaeger实例开启指标暴露:Collector默认在14269端口、Query在16686端口提供
方案3:通过Grafana实现可视化+告警
用Grafana连接Jaeger数据源,创建链路监控面板,再利用Grafana自带的告警功能发送邮件,适合需要可视化+告警一体化的场景。
- 核心步骤:
- 在Grafana中添加Jaeger数据源,填入Jaeger Query的访问地址
- 创建仪表盘,添加错误率、Span耗时分布、Trace数量等面板
- 为目标面板配置告警规则:比如设置"平均耗时超过5秒"、"错误率超过2%"等触发条件
- 在Grafana的告警通道中配置邮件通知,填写SMTP服务器信息和接收邮箱
- 启用告警规则,当链路数据满足条件时,Grafana会自动发送邮件告警
内容的提问来源于stack exchange,提问作者user19337829
相关产品推荐
相关产品推荐

