Skip to content

Extraction 提取

什么是 Extraction

Extraction(提取)是告警平台中的一项关键功能,用于从告警数据中提取额外的属性和信息。通过使用正则表达式(Regex)匹配告警内容,Extraction 能够从非结构化或半结构化的告警文本中提取出结构化的数据,进一步丰富告警信息,便于后续处理和分析。

Extraction 的核心价值

  • 结构化处理:将非结构化文本转换为结构化数据
  • 信息增强:从告警描述、消息等文本字段中提取有价值的信息
  • 数据标准化:统一不同来源告警的数据格式
  • 自动化前提:为后续的自动化处理提供更精确的数据基础

功能特性

提取机制

  • 正则表达式:使用强大的正则表达式语法进行精确匹配
  • 命名捕获组:支持通过命名捕获组提取多个属性
  • 条件过滤:可设置条件表达式,只对特定告警应用提取规则
  • 优先级控制:通过优先级设置控制多个规则的执行顺序

处理流程

  • 预处理选项:可选择在告警标准化前或后应用提取规则
  • 属性指定:明确指定要处理的告警属性(如描述、消息等)
  • 批量处理:支持对历史告警批量应用提取规则
  • 执行记录:记录每次提取规则的执行结果和提取的数据

使用场景

1. 错误代码提取

从告警消息中提取错误代码,便于快速分类和处理。

示例

json
// 告警原始信息
{
  "message": "应用程序遇到错误: ERR-5023 - 数据库连接超时"
}

// 提取后信息
{
  "message": "应用程序遇到错误: ERR-5023 - 数据库连接超时",
  "error_code": "ERR-5023",
  "error_type": "数据库连接超时"
}

使用的正则表达式

(?<error_code>ERR-\d+)\s*-\s*(?<error_type>.+)

2. IP 地址和端口提取

从告警描述中提取 IP 地址、端口号等网络信息。

示例

json
// 告警原始信息
{
  "description": "无法连接到服务器 192.168.1.25:3306,连接被拒绝"
}

// 提取后信息
{
  "description": "无法连接到服务器 192.168.1.25:3306,连接被拒绝",
  "ip_address": "192.168.1.25",
  "port": "3306",
  "error_type": "连接被拒绝"
}

使用的正则表达式

(?<ip_address>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}):(?<port>\d+).*(?<error_type>连接被拒绝|超时|无响应)

3. 日志级别和组件提取

从日志格式的告警中提取日志级别、组件名称等信息。

示例

json
// 告警原始信息
{
  "message": "[ERROR] [UserService] 用户认证失败: 无效的凭证"
}

// 提取后信息
{
  "message": "[ERROR] [UserService] 用户认证失败: 无效的凭证",
  "log_level": "ERROR",
  "component": "UserService",
  "error_description": "用户认证失败: 无效的凭证"
}

使用的正则表达式

\[(?<log_level>ERROR|WARN|INFO|DEBUG)\]\s*\[(?<component>\w+)\]\s*(?<error_description>.+)

4. 版本号和环境信息提取

从告警中提取应用版本、环境标识等信息。

示例

json
// 告警原始信息
{
  "description": "生产环境 (PROD) 应用 v2.3.5 发生内存泄漏"
}

// 提取后信息
{
  "description": "生产环境 (PROD) 应用 v2.3.5 发生内存泄漏",
  "environment": "PROD",
  "version": "v2.3.5",
  "issue_type": "内存泄漏"
}

使用的正则表达式

环境\s*\((?<environment>\w+)\).*v(?<version>[\d\.]+).*(?<issue_type>内存泄漏|CPU过高|磁盘满)

数据模型

Extraction 规则模型

typescript
interface ExtractionRule {
  id: number;
  priority: number;
  name: string;
  description?: string;
  created_by?: string;
  created_at: Date;
  updated_at?: Date;
  updated_by?: string;
  disabled: boolean;
  pre: boolean;         // 是否在预处理阶段应用
  condition?: string;   // 应用规则的条件
  attribute: string;    // 要处理的属性
  regex: string;        // 正则表达式
}

命名捕获组提取

命名捕获组是 Extraction 功能的核心,它允许从文本中提取多个命名属性:

javascript
function extractNamedGroups(regexString, text) {
  try {
    const regex = new RegExp(regexString);
    const match = text.match(regex);
    
    if (match && match.groups) {
      return match.groups;
    }
  } catch (error) {
    console.error("正则表达式错误:", error);
  }
  
  return {};
}

配置示例

基本提取规则

yaml
extraction_rule:
  name: "错误码提取"
  priority: 100
  pre: false
  attribute: "message"
  regex: "(?<error_code>ERR-\\d+)\\s*-\\s*(?<error_type>.+)"
  condition: "source == 'application_logs'"

多属性提取规则

yaml
extraction_rule:
  name: "日志格式提取"
  priority: 200
  pre: true
  attribute: "description"
  regex: "\\[(?<timestamp>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})\\]\\s*\\[(?<log_level>\\w+)\\]\\s*\\[(?<component>[\\w\\.]+)\\]\\s*(?<message>.+)"
  condition: "source contains 'log'"

工作流程

  1. 规则配置:设置提取规则,包括目标属性、正则表达式和条件
  2. 告警接收:系统接收到新告警
  3. 条件匹配:检查告警是否符合规则条件
  4. 提取处理
    • 获取目标属性的值
    • 应用正则表达式进行匹配
    • 提取命名捕获组的值
  5. 结果处理
    • 将提取的值添加为告警的新属性
    • 更新告警记录

最佳实践

1. 正则表达式设计

  • 使用命名捕获组((?<name>pattern))而非普通捕获组
  • 编写具有足够特异性的正则表达式,避免误匹配
  • 为复杂模式添加注释,提高可维护性
  • 测试正则表达式在不同告警数据上的表现

2. 提取规则管理

  • 为规则设置有意义的名称和描述
  • 根据数据重要性和处理逻辑设置合理的优先级
  • 使用条件表达式限制规则的应用范围
  • 定期审查和优化现有规则

3. 属性命名

  • 使用一致的命名约定(如蛇形命名法或驼峰命名法)
  • 避免与现有属性名冲突
  • 使用有意义的前缀区分不同类型的提取数据
  • 为相关属性使用一致的命名模式

与其他功能的集成

与 Mapping 功能的区别与协作

区别

  • Extraction:从现有告警数据中提取新属性
  • Mapping:将告警数据与外部数据源关联映射

协作

  • 先使用 Extraction 从告警文本中提取关键信息
  • 再使用 Mapping 将提取的信息与外部数据关联
  • 两者结合可以实现更强大的告警富化能力

与告警处理流程的集成

  • 可在告警预处理阶段应用(设置 pre=true
  • 可在告警标准化后应用(设置 pre=false
  • 提取的属性可用于告警分类、路由和自动化处理
  • 提取的数据可用于告警可视化和分析

常见问题与解决方案

1. 正则表达式不匹配

  • 检查目标属性中的文本格式是否与预期一致
  • 验证正则表达式语法是否正确
  • 考虑文本中可能的特殊字符和换行符
  • 使用在线工具测试和调试正则表达式

2. 命名冲突

  • 检查提取的属性名是否与现有属性冲突
  • 使用更具体的前缀避免命名冲突
  • 考虑使用条件表达式限制规则应用范围
  • 调整规则优先级解决冲突

3. 性能问题

  • 避免使用过于复杂的正则表达式
  • 限制回溯次数,防止灾难性回溯
  • 使用更精确的条件表达式减少不必要的处理
  • 定期清理和优化低效的提取规则

实际应用案例

案例1:日志告警格式化

某公司的日志监控系统产生的告警格式不统一,包含各种不同的时间格式、日志级别表示和组件标识。通过配置 Extraction 规则,成功从混乱的日志告警中提取出统一的时间戳、日志级别、组件名称和错误信息,大大提高了告警的可读性和自动化处理能力。

案例2:数据库错误分类

某金融系统的数据库告警中包含大量错误代码和详细信息,但格式复杂且难以直接使用。通过 Extraction 功能,从告警文本中提取出错误代码、错误类型和影响范围,并据此自动分类和路由告警,减少了数据库团队的手动分类工作,提高了响应速度。

案例3:网络设备告警解析

某电信公司的网络设备告警包含大量专业术语和设备特定的标识符,通过 Extraction 功能,从这些告警中提取出设备类型、位置、故障类型和影响范围,使非专业人员也能快速理解告警含义,并根据提取的信息自动分配给相应的专家团队。

基于 Apache 2.0 许可发布