附录 J:计数函数

编辑

当存储桶中的事件数出现异常时,计数函数会检测到异常。

如果您的数据是稀疏的,并且您想忽略存储桶计数为零的情况,请使用 non_zero_count 函数。

使用 distinct_count 函数来确定一个字段中不同值的数量何时不寻常,而不是总计数。

如果要监视异常高的事件速率,请使用高侧函数。如果要查看事件速率的下降,请使用低侧函数。

机器学习功能包括以下计数函数

Count、high_count、low_count

编辑

当存储桶中的事件数出现异常时,count 函数会检测到异常。

当存储桶中的事件计数异常高时,high_count 函数会检测到异常。

当存储桶中的事件计数异常低时,low_count 函数会检测到异常。

这些函数支持以下属性

  • by_field_name(可选)
  • over_field_name(可选)
  • partition_field_name(可选)

有关这些属性的更多信息,请参阅创建异常检测作业 API

示例 1:使用计数函数分析事件。

PUT _ml/anomaly_detectors/example1
{
  "analysis_config": {
    "detectors": [{
      "function" : "count"
    }]
  },
  "data_description": {
    "time_field":"timestamp",
    "time_format": "epoch_ms"
  }
}

此示例可能是最简单的分析。它识别事件总计数高于或低于通常水平的时间段。

当您在异常检测作业的检测器中使用此函数时,它会对事件速率进行建模,并检测事件速率何时与过去的行为相比异常。

示例 2:使用 high_count 函数分析错误。

PUT _ml/anomaly_detectors/example2
{
  "analysis_config": {
    "detectors": [{
      "function" : "high_count",
      "by_field_name" : "error_code",
      "over_field_name": "user"
    }]
  },
  "data_description": {
    "time_field":"timestamp",
    "time_format": "epoch_ms"
  }
}

如果您在异常检测作业的检测器中使用此 high_count 函数,它将为每个错误代码建模事件速率。它会检测与其他用户相比生成异常高错误代码计数的用户。

示例 3:使用 low_count 函数分析状态代码。

PUT _ml/anomaly_detectors/example3
{
  "analysis_config": {
    "detectors": [{
      "function" : "low_count",
      "by_field_name" : "status_code"
    }]
  },
  "data_description": {
    "time_field":"timestamp",
    "time_format": "epoch_ms"
  }
}

在此示例中,该函数会检测状态代码的事件计数何时低于通常水平。

当您在异常检测作业的检测器中使用此函数时,它会对每个状态代码的事件速率进行建模,并检测状态代码何时与过去的行为相比计数异常低。

示例 4:使用计数函数分析聚合数据。

PUT _ml/anomaly_detectors/example4
{
  "analysis_config": {
    "summary_count_field_name" : "events_per_min",
    "detectors": [{
      "function" : "count"
    }]
  },
  "data_description": {
    "time_field":"timestamp",
    "time_format": "epoch_ms"
  }
}

如果您正在分析聚合的 events_per_min 字段,请不要使用求和函数(例如,sum(events_per_min))。相反,请使用计数函数和 summary_count_field_name 属性。有关更多信息,请参阅为了更快的性能聚合数据

Non_zero_count、high_non_zero_count、low_non_zero_count

编辑

当存储桶中的事件数出现异常时,non_zero_count 函数会检测到异常,但它会忽略存储桶计数为零的情况。如果已知您的数据是稀疏的或存在间隙,并且这些间隙并不重要,请使用此函数。

当存储桶中的事件数异常高时,high_non_zero_count 函数会检测到异常,并且它会忽略存储桶计数为零的情况。

当存储桶中的事件数异常低时,low_non_zero_count 函数会检测到异常,并且它会忽略存储桶计数为零的情况。

这些函数支持以下属性

  • by_field_name(可选)
  • partition_field_name(可选)

有关这些属性的更多信息,请参阅创建异常检测作业 API

例如,如果您有以下每个存储桶的事件数

1,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,43,31,0,0,0,0,0,0,0,0,0,0,0,0,2,1

non_zero_count 函数仅对以下数据建模

1,22,2,43,31,2,1

示例 5:使用 high_non_zero_count 函数分析签名。

PUT _ml/anomaly_detectors/example5
{
  "analysis_config": {
    "detectors": [{
      "function" : "high_non_zero_count",
      "by_field_name" : "signaturename"
    }]
  },
  "data_description": {
    "time_field":"timestamp",
    "time_format": "epoch_ms"
  }
}

如果您在异常检测作业的检测器中使用此 high_non_zero_count 函数,它将为 signaturename 字段建模事件计数。它会忽略计数为零的任何存储桶,并检测 signaturename 值何时与其过去的行为相比具有异常高的事件计数。

对于 non_zero_counthigh_non_zero_countlow_non_zero_count 函数,不支持总体分析(使用 over_field_name 属性值)。如果您想进行总体分析并且您的数据是稀疏的,请使用为这种情况优化的 count 函数。

Distinct_count、high_distinct_count、low_distinct_count

编辑

当一个字段中不同值的数量不寻常时,distinct_count 函数会检测到异常。

当一个字段中不同值的数量异常高时,high_distinct_count 函数会检测到异常。

当一个字段中不同值的数量异常低时,low_distinct_count 函数会检测到异常。

这些函数支持以下属性

  • field_name(必需)
  • by_field_name(可选)
  • over_field_name(可选)
  • partition_field_name(可选)

有关这些属性的更多信息,请参阅创建异常检测作业 API

示例 6:使用 distinct_count 函数分析用户。

PUT _ml/anomaly_detectors/example6
{
  "analysis_config": {
    "detectors": [{
      "function" : "distinct_count",
      "field_name" : "user"
    }]
  },
  "data_description": {
    "time_field":"timestamp",
    "time_format": "epoch_ms"
  }
}

distinct_count 函数会检测系统何时有异常多的登录用户。当您在异常检测作业的检测器中使用此函数时,它会对用户的不同计数进行建模。它还会检测与过去相比,不同用户的数量何时不寻常。

示例 7:使用 high_distinct_count 函数分析端口。

PUT _ml/anomaly_detectors/example7
{
  "analysis_config": {
    "detectors": [{
      "function" : "high_distinct_count",
      "field_name" : "dst_port",
      "over_field_name": "src_ip"
    }]
  },
  "data_description": {
    "time_field":"timestamp",
    "time_format": "epoch_ms"
  }
}

此示例检测端口扫描实例。当您在异常检测作业的检测器中使用此函数时,它会对端口的不同计数进行建模。它还会检测与其他 src_ip 值相比,连接到异常多不同 dst_ports 值的 src_ip 值。