夜莺-Nightingale
夜莺V7
项目介绍 功能概览
部署升级 部署升级
数据接入 数据接入
告警管理 告警管理
数据查看 数据查看
功能介绍 功能介绍
API FAQ
夜莺V6
项目介绍 架构介绍
快速开始 快速开始
黄埔营
安装部署 安装部署
升级
采集器 采集器
使用手册 使用手册
API API
数据库表结构 数据库表结构
FAQ FAQ
开源生态
Prometheus
版权声明
第1章:天降奇兵 第1章:天降奇兵
第2章:探索PromQL 第2章:探索PromQL
第3章:Prometheus告警处理 第3章:Prometheus告警处理
第4章:Exporter详解 第4章:Exporter详解
第5章:数据与可视化 第5章:数据与可视化
第6章:集群与高可用 第6章:集群与高可用
第7章:Prometheus服务发现 第7章:Prometheus服务发现
第8章:监控Kubernetes 第8章:监控Kubernetes
第9章:Prometheus Operator 第9章:Prometheus Operator
参考资料

Callback 事件处理器

概述

Callback 是 Nightingale 告警系统中的一个事件处理器,它允许您通过 HTTP 调用将告警事件信息发送到外部服务。当告警事件流经此处理器时,处理器会将事件数据以 JSON 格式发送到指定的 URL,用于通知外部系统或触发自动化处理流程。与 Event Update 处理器不同,Callback 处理器不会修改事件内容,主要用于事件通知和集成。

工作原理

  1. 事件接收:处理器接收到告警事件
  2. 数据序列化:将事件对象转换为 JSON 格式
  3. HTTP 调用:通过 POST 请求将 JSON 数据发送到配置的 URL

配置说明

基础配置

URL(必填)

  • 说明:外部服务的 HTTP 接口地址
  • 格式:完整的 HTTP/HTTPS URL
  • 示例https://your-service.com/api/alert-webhook

高级配置

授权配置

  • 授权用户名:HTTP Basic 认证的用户名
  • 授权密码:HTTP Basic 认证的密码
  • 使用场景:当外部服务需要身份验证时使用

HTTP Headers

  • 说明:自定义 HTTP 请求头
  • 格式:键值对形式
  • 默认包含Content-Type: application/json
  • 示例
    X-API-Key: your-api-key
    Authorization: Bearer your-token
    X-Custom-Header: custom-value
    

HTTP Proxy

  • 说明:HTTP 代理服务器地址
  • 格式http://proxy-host:porthttps://proxy-host:port
  • 使用场景:当需要通过代理访问外部服务时

Callback Timeout

  • 说明:HTTP 请求超时时间
  • 单位:毫秒(ms)
  • 默认值:10000(10秒)
  • 建议:根据外部服务响应时间适当调整

TLS InsecureSkipVerify

  • 说明:是否跳过 TLS 证书验证
  • 默认值:关闭(验证证书)
  • 注意:仅在测试环境或私有证书时开启

外部服务接口规范

您的外部服务需要满足以下要求:

请求格式

  • 方法:POST
  • Content-Type:application/json
  • 请求体:完整的告警事件 JSON 对象

响应格式

  • 状态码:建议返回 200 表示接收成功
  • 响应体:可选,响应内容会记录到 Nightingale 日志中

事件对象结构示例

{
  "rule_name": "规则名称",
  "severity": 2,
  "tags": [
    "host=server01",
    "service=web"
  ],
  "tags_map": {
    "host": "server01",
    "service": "web"
  },
  "annotations": {
    "summary": "告警摘要",
    "description": "详细描述"
  }
}

使用场景

场景 1:ITSM 工单创建
自动在服务管理系统中创建故障工单

场景 2:自动化运维
触发自动化修复脚本或运维操作

场景 3:数据同步
将告警数据同步到外部监控或分析系统

实际使用案例

Python 服务示例

以下是一个使用 Python 标准库的简单示例,演示如何创建一个外部服务来接收 Callback 请求:

1. 创建 Python 服务文件 (callback_receiver.py)

from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import logging
from datetime import datetime
from urllib.parse import urlparse

# Configure logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class CallbackHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        """Handle POST requests"""
        try:
            # Parse request path
            parsed_path = urlparse(self.path)
            
            if parsed_path.path == '/api/alert-webhook':
                self.handle_alert_callback()
            else:
                self.send_error(404, "Not Found")
                
        except Exception as e:
            logger.error(f"Error handling request: {str(e)}")
            self.send_error(500, "Internal Server Error")
    
    def handle_alert_callback(self):
        """Handle alert callback from Nightingale"""
        try:
            # Read request body
            content_length = int(self.headers.get('Content-Length', 0))
            if content_length == 0:
                self.send_error(400, "Empty request body")
                return
                
            post_data = self.rfile.read(content_length)
            event = json.loads(post_data.decode('utf-8'))
            
            print(json.dumps(event, ensure_ascii=False, indent=2))
            
            response = {
                "status": "success",
                "message": "Alert received and printed"
            }
            
            response_data = json.dumps(response, ensure_ascii=False).encode('utf-8')
            self.wfile.write(response_data)
            
        except json.JSONDecodeError as e:
            logger.error(f"JSON parsing error: {str(e)}")
            self.send_error(400, "Invalid JSON")
        except Exception as e:
            logger.error(f"Error processing event: {str(e)}")
            self.send_error(500, "Internal Server Error")
    
    def log_message(self, format, *args):
        """Custom log format"""
        logger.info(f"{self.address_string()} - {format % args}")

if __name__ == '__main__':
    server_host = '0.0.0.0'
    server_port = 5001
    
    print("Alert callback receiver starting...")
    print(f"Webhook endpoint: http://localhost:{server_port}/api/alert-webhook")
    print("Press Ctrl+C to stop")
    print("=" * 80)
    
    try:
        server = HTTPServer((server_host, server_port), CallbackHandler)
        server.serve_forever()
    except KeyboardInterrupt:
        print("\nStopping service...")
        server.shutdown()
        print("Service stopped")

2. 启动服务

python callback_receiver.py

服务启动后会在 http://localhost:5001 监听请求。

3. 在 Nightingale 中配置

在 Callback 处理器配置页面中设置:

  • URL: http://localhost:5001/api/alert-webhook

与 Event Update 处理器的区别

特性 Callback 处理器 Event Update 处理器
主要用途 事件通知和集成 动态更新事件内容
事件修改 不修改事件 可以修改事件
响应处理 仅记录响应日志 将响应作为新事件内容
适用场景 工单、集成 事件丰富、动态处理

常见问题

Q: 如果外部服务不可用怎么办?

A: 处理器会记录错误日志,并继续传递原始事件,不会中断告警流水线。

Q: 支持重试机制吗?

A: 当前版本不支持自动重试,如需重试请在外部服务侧实现。

Q: 如何调试配置问题?

A: 可以点击页面上的"测试"按钮验证配置,同时查看 Nightingale 日志。

Q: 响应时间过长怎么办?

A: 可以适当增加 Timeout 设置,或者优化外部服务的响应性能。

注意事项

  • 确保外部服务的高可用性,避免影响告警处理流程
  • 合理设置超时时间,平衡响应速度和服务稳定性
  • 定期监控外部服务的性能和可用性
  • 在生产环境使用前充分测试配置和外部服务
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat