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 设置,或者优化外部服务的响应性能。

注意事项

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

更新时间 2025-03-12

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云