创建异常检测任务 API

编辑

实例化一个异常检测任务。

请求

编辑

PUT _ml/anomaly_detectors/<job_id>

先决条件

编辑

需要 manage_ml 集群权限。此权限包含在 machine_learning_admin 内置角色中。

如果包含 datafeed_config,还必须具有源索引的 read 索引权限。

描述

编辑
  • 必须使用 Kibana 或此 API 创建异常检测任务。请勿使用 Elasticsearch 索引 API 将任务直接放入 .ml-config 索引。如果启用了 Elasticsearch 安全功能,请勿向用户授予 .ml-config 索引的 write 权限。
  • 如果包含 datafeed_config 并且启用了 Elasticsearch 安全功能,则您的数据馈送会记住创建它的用户在创建时拥有的角色,并使用相同的角色运行查询。如果提供 辅助授权标头,则会改为使用这些凭据。

路径参数

编辑
<job_id>
(必需,字符串)异常检测任务的标识符。此标识符可以包含小写字母数字字符 (a-z 和 0-9)、连字符和下划线。它必须以字母数字字符开头和结尾。

请求正文

编辑
allow_lazy_open
(可选,布尔值)高级配置选项。指定当没有足够的机器学习节点容量可以立即将此任务分配给节点时,是否可以打开此任务。默认值为 false;如果无法立即找到有能力运行任务的机器学习节点,则 打开异常检测任务 API 将返回错误。但是,这也受集群范围的 xpack.ml.max_lazy_ml_nodes 设置的限制;请参阅 高级机器学习设置。如果此选项设置为 true,则 打开异常检测任务 API 不会返回错误,并且任务在 opening 状态中等待,直到有足够的机器学习节点容量可用。
analysis_config

(必需,对象)分析配置,指定如何分析数据。创建任务后,您无法更改分析配置;所有属性都是信息性的。

analysis_config 的属性
bucket_span
时间单位)分析聚合到的时间间隔的大小,通常在 5m1h 之间。此值应为整数天数,或等于一天中整数个存储桶; [8.1] 在 8.1 中已弃用。不符合这些建议的值已被弃用,并且在未来版本中将不允许使用 。如果异常检测任务使用具有 聚合的数据馈送,则此值还必须可被日期直方图聚合的间隔整除。默认值为 5m。有关更多信息,请参阅 存储桶跨度
categorization_analyzer

(对象或字符串)如果指定了 categorization_field_name,还可以定义用于解释分类字段的分析器。此属性不能与 categorization_filters 同时使用。分类分析器指定分类过程如何解释 categorization_field。语法与在 分析端点 中定义 analyzer 的语法非常相似。有关更多信息,请参阅 分类日志消息

categorization_analyzer 字段可以指定为字符串或对象。如果它是字符串,则必须引用 内置分析器或由另一个插件添加的分析器。如果它是对象,则具有以下属性

categorization_analyzer 的属性
char_filter
(字符串或对象数组)一个或多个 字符过滤器。除了内置字符过滤器外,其他插件还可以提供更多字符过滤器。此属性是可选的。如果未指定,则在分类之前不应用任何字符过滤器。如果您正在自定义分析器的某些其他方面,并且需要实现与 categorization_filters 等效的功能(当自定义分析器的某些其他方面时不允许使用该功能),请在此处添加它们作为 模式替换字符过滤器
tokenizer
(字符串或对象)应用字符过滤器后要使用的 分词器的名称或定义。如果将 categorization_analyzer 指定为对象,则此属性是强制性的。机器学习提供了一个名为 ml_standard 的分词器,该分词器以一种已确定在各种英文日志文件格式上产生良好分类结果的方式进行分词。如果您想使用该分词器,但更改字符或令牌过滤器,请在您的 categorization_analyzer 中指定 "tokenizer": "ml_standard"。此外,还提供了 ml_classic 分词器,该分词器的分词方式与旧版本(6.2 之前)中不可自定义的分词器相同。ml_classic 是 6.2 到 7.13 版本中的默认分类分词器,因此,如果您需要与在这些版本中创建的任务的默认分类相同,请在您的 categorization_analyzer 中指定 "tokenizer": "ml_classic"

从 Elasticsearch 8.10.0 开始,使用新的版本号来跟踪机器学习插件中的配置和状态更改。此新版本号与产品版本分离,并且会独立递增。

filter
(字符串或对象数组)一个或多个 令牌过滤器。除了内置令牌过滤器外,其他插件还可以提供更多令牌过滤器。此属性是可选的。如果未指定,则在分类之前不应用任何令牌过滤器。
categorization_field_name
(字符串)如果指定了此属性,则将对指定字段的值进行分类。必须通过将 by_field_nameover_field_namepartition_field_name 设置为关键字 mlcategory,在检测器中使用生成的类别。有关更多信息,请参阅 分类日志消息
categorization_filters
(字符串数组)如果指定了 categorization_field_name,您还可以定义可选过滤器。此属性需要一个正则表达式数组。这些表达式用于从分类字段值中过滤掉匹配的序列。您可以使用此功能通过在定义类别时排除对序列的考虑来微调分类。例如,您可以排除日志文件中出现的 SQL 语句。有关更多信息,请参阅 分类日志消息。此属性不能与 categorization_analyzer 同时使用。如果您只想定义在令牌化之前应用的简单正则表达式过滤器,则设置此属性是最简单的方法。如果您还想自定义令牌化器或令牌化后过滤,请改用 categorization_analyzer 属性,并将过滤器作为 pattern_replace 字符过滤器包含在内。效果完全相同。
detectors

(数组)检测器配置对象数组。检测器配置对象指定任务分析哪些数据字段。它们还指定使用哪些分析函数。您可以为一个任务指定多个检测器。

如果 detectors 数组不包含至少一个检测器,则不会发生任何分析,并且会返回错误。

detectors 的属性
by_field_name
(字符串)用于分割数据的字段。特别是,此属性用于分析拆分数据相对于其自身历史记录的情况。它用于查找拆分上下文中不寻常的值。
custom_rules

(数组)自定义规则对象数组,使您可以自定义检测器的工作方式。例如,规则可以指示检测器应在哪些条件下跳过结果。Kibana 将自定义规则称为任务规则。有关更多示例,请参阅 使用自定义规则自定义检测器

custom_rules 的属性
actions

(数组)当规则适用时要触发的操作集。如果指定了多个操作,则会合并所有操作的效果。可用的操作包括

  • skip_result:将不会创建结果。这是默认值。除非您还指定 skip_model_update,否则模型将像往常一样使用相应的序列值进行更新。
  • skip_model_update:该序列的值将不会用于更新模型。除非您还指定 skip_result,否则结果将像往常一样创建。当某些值预计会持续异常并且它们以负面影响其余结果的方式影响模型时,此操作非常适合。
  • force_time_shift:此操作会将异常检测器内部的时间移动指定的量。例如,这对于快速适应预先已知的夏令时事件非常有用。此操作需要在 params 对象中包含 force_time_shift 参数。
params

(对象)一组参数对象,用于自定义自定义规则操作数组中定义的操作。可用的参数(取决于指定的操作)包括:force_time_shift

params 的属性
force_time_shift
(对象)将 time_shift_amount 设置为您想要移动时间的有符号秒数。
conditions

(数组)一个可选的数字条件数组,当规则适用时使用。规则必须具有非空的范围或至少一个条件。多个条件通过逻辑 AND 组合在一起。条件具有以下属性

conditions 的属性
applies_to
(字符串)指定条件适用的结果属性。可用的选项为 actualtypicaldiff_from_typicaltime。如果您的检测器使用 lat_longmetricrarefreq_rare 函数,您只能指定适用于 time 的条件。
operator
(字符串)指定条件运算符。可用的选项为 gt(大于)、gte(大于或等于)、lt(小于)和 lte(小于或等于)。
value
(双精度浮点数)使用 operatorapplies_to 字段进行比较的值。
scope

(对象)一个可选的规则适用范围的序列。规则必须具有非空的范围或至少一个条件。默认情况下,范围包括所有序列。范围设置允许用于 by_field_nameover_field_namepartition_field_name 中指定的任何字段。要为字段添加范围,请将字段名称添加为 scope 对象中的键,并将其值设置为具有以下属性的对象

scope 的属性
filter_id
(字符串)要使用的过滤器的 ID。
filter_type
(字符串)include(规则适用于过滤器中的值)或 exclude(规则适用于过滤器中不包含的值)。默认为 include
detector_description
(字符串)检测器的描述。例如,Low event rate
detector_index

(整数)检测器的唯一标识符。此标识符基于 analysis_config 中检测器的顺序,从零开始。

如果您为此属性指定一个值,则会被忽略。

exclude_frequent
(字符串)包含以下值之一:allnonebyover。如果设置,则频繁的实体将被排除在影响异常结果之外。实体可以被认为是随着时间的推移频繁的,或者在人群中频繁的。如果您同时使用 over 和 by 字段,则可以将 exclude_frequent 设置为所有字段的 all,或者将特定字段设置为 byover
field_name

(字符串)检测器在函数中使用的字段。如果您使用事件速率函数(例如 countrare),请不要指定此字段。

field_name 不能包含双引号或反斜杠。

function
(字符串)使用的分析函数。例如,countraremeanminmaxsum。有关更多信息,请参见函数参考
over_field_name
(字符串)用于拆分数据的字段。特别是,此属性用于分析相对于所有拆分历史记录的拆分。它用于查找所有拆分群体中的异常值。有关更多信息,请参见执行人群分析
partition_field_name
(字符串)用于分割分析的字段。当您使用此属性时,此字段的每个值都有完全独立的基准。
use_null
(布尔值)定义当 by 或 partition 字段没有值时,是否将新序列用作空序列。默认值为 false
influencers
(字符串数组)影响因素字段名称的逗号分隔列表。通常,这些可以是检测器配置中使用的 by、over 或 partition 字段。您可能还想使用未在检测器中明确命名的字段名称,但该字段名称可作为输入数据的一部分。当您使用多个检测器时,建议使用影响因素,因为它会聚合每个影响因素实体的结果。
latency

(时间单位)用于预期无序数据的时间窗口大小。默认值为 0(无延迟)。如果您指定非零值,则该值必须大于或等于一秒。有关时间单位的更多信息,请参见时间单位

延迟仅当您使用发布数据 API 发送数据时适用。

model_prune_window
(可选,时间单位)高级配置选项。影响在给定时间段内未更新的模型的修剪。该值必须设置为 bucket_span 的倍数。如果设置得太低,可能会从模型中删除重要信息。通常,设置为 30d 或更长。如果未设置,则仅当模型内存状态达到软限制或硬限制时才会发生模型修剪。对于在 8.1 及更高版本中创建的作业,默认值为 30d 或 20 倍 bucket_span 中的较大值。
multivariate_by_fields

(布尔值)此功能保留供内部使用。不支持在客户环境中使用,并且不受官方 GA 功能的支持 SLA 约束。

如果设置为 true,分析将自动查找给定 by 字段值的指标之间的相关性,并在这些相关性停止保持时报告异常。例如,假设主机 A 上的 CPU 和内存使用率通常与主机 B 上的相同指标高度相关。出现这种相关性可能是因为它们正在运行负载均衡的应用程序。如果启用此属性,则当例如主机 A 上的 CPU 使用率很高而主机 B 上的 CPU 使用率很低时,将报告异常。也就是说,当主机 A 的 CPU 相对于主机 B 的 CPU 而言不寻常时,您会看到异常。

要使用 multivariate_by_fields 属性,您还必须在检测器中指定 by_field_name

per_partition_categorization

(可选,对象)与分类如何与分区字段交互相关的设置。

per_partition_categorization 的属性
enabled
(布尔值)要启用此设置,您还必须在每个使用关键字 mlcategory 的检测器中将 partition_field_name 属性设置为相同的值。否则,作业创建失败。
stop_on_warn
(布尔值)仅当启用了每个分区的分类时,才能将此设置设置为 true。如果为 true,则当分类状态更改为 warn 时,分类和后续异常检测都会为分区停止。此设置使得可以创建一个作业,其中预期分类对某些分区运行良好,而对其他分区则不然;对于分类效果不佳的分区,您不必永远付出不良分类的代价。
summary_count_field_name

(字符串)如果指定此属性,则预计馈送到作业的数据将是预先汇总的。此属性值是包含已汇总的原始数据点计数的字段的名称。相同的 summary_count_field_name 适用于作业中的所有检测器。

summary_count_field_name 属性不能与 metric 函数一起使用。

analysis_limits

(可选,对象)可以为内存中保存数学模型所需的资源应用限制。这些限制是近似的,并且可以按作业设置。它们不控制其他进程(例如 Elasticsearch Java 进程)使用的内存。

analysis_limits 的属性
categorization_examples_limit

(长整型)每个类别在内存和结果数据存储中存储的最大示例数。默认值为 4。如果增加此值,则会提供更多示例,但是这要求您有更多可用存储。如果将此值设置为 0,则不会存储任何示例。

categorization_examples_limit 仅适用于使用分类的分析。有关更多信息,请参见对日志消息进行分类

model_memory_limit

(长整型或字符串)分析处理所需的大致最大内存资源量。一旦接近此限制,数据修剪将变得更加激进。一旦超过此限制,则不再对新实体进行建模。在 6.1 及更高版本中创建的作业的默认值为 1024mb。但是,如果 xpack.ml.max_model_memory_limit 设置的值大于 0 且小于 1024mb,则改为使用该值。如果未设置 xpack.ml.max_model_memory_limit,但是设置了 xpack.ml.use_auto_machine_memory_percent,则默认的 model_memory_limit 将设置为集群中可以分配的最大大小,上限为 1024mb。默认值相对较小,以确保高资源使用是有意识的决定。如果您的作业预计分析高基数字段,则可能需要使用更高的值。

从 Elasticsearch 8.10.0 开始,使用新的版本号来跟踪机器学习插件中的配置和状态更改。此新版本号与产品版本分离,并且会独立递增。

如果您指定一个数字而不是字符串,则假定单位为 MiB。为了清晰起见,建议指定字符串。如果您指定字节大小单位 bkb,并且该数字不等于离散的兆字节数,则将其向下舍入到最接近的 MiB。最小有效值为 1 MiB。如果您指定的值小于 1 MiB,则会发生错误。有关支持的字节大小单位的更多信息,请参见字节大小单位

如果您为 xpack.ml.max_model_memory_limit 设置指定一个值,则当您尝试创建 model_memory_limit 值大于该设置值的作业时,会发生错误。有关更多信息,请参见机器学习设置

background_persist_interval

(可选,时间单位)高级配置选项。每次定期持久化模型之间的时间。默认值是 3 到 4 小时之间的随机值,这避免了所有作业在完全相同的时间持久化。允许的最小值为 1 小时。

对于非常大的模型(数 GB),持久化可能需要 10-20 分钟,因此不要将 background_persist_interval 值设置得太低。

custom_settings
(可选,对象)高级配置选项。包含有关作业的自定义元数据。例如,它可以包含自定义 URL 信息,如将自定义 URL 添加到机器学习结果中所示。
daily_model_snapshot_retention_after_days

(可选,长整型)高级配置选项,影响此作业的旧模型快照的自动删除。它指定一个时间段(以天为单位),在此时间段之后,只保留每天的第一个快照。此时间段相对于此作业的最新快照的时间戳。有效值的范围为 0model_snapshot_retention_days。对于新作业,默认值为 1。对于在 7.8.0 版本之前创建的作业,默认值与 model_snapshot_retention_days 匹配。有关更多信息,请参阅模型快照

从 Elasticsearch 8.10.0 开始,使用新的版本号来跟踪机器学习插件中的配置和状态更改。此新版本号与产品版本分离,并且会独立递增。

data_description

(必需,对象)数据描述定义了当您使用post data API 向作业发送数据时输入数据的格式。请注意,当使用数据源时,只需要设置 time_field,其余属性会自动设置。当通过post data API 接收数据时,它不会存储在 Elasticsearch 中。只保留异常检测的结果。

data_description 的属性
format
(字符串)目前仅支持 xcontent 格式,这是默认值。
time_field
(字符串)包含时间戳的字段的名称。默认值为 time
time_format

(字符串)时间格式,可以是 epochepoch_ms 或自定义模式。默认值为 epoch,它指的是 UNIX 或 Epoch 时间(自 1970 年 1 月 1 日以来的秒数)。值 epoch_ms 表示时间以自纪元以来的毫秒为单位进行测量。epochepoch_ms 时间格式接受整数值或实数值。

自定义模式必须符合 Java DateTimeFormatter 类。当您使用日期时间格式模式时,建议您提供完整的日期、时间和时区。例如:yyyy-MM-dd'T'HH:mm:ssX。如果您指定的模式不足以生成完整的时间戳,作业创建将失败。

datafeed_config

(可选,对象)数据源,它从 Elasticsearch 中检索数据以供作业分析。您可以将一个数据源与每个异常检测作业关联。

datafeed 的属性
aggregations
(可选,对象)如果设置,数据源将执行聚合搜索。对聚合的支持是有限的,应仅与低基数数据一起使用。有关更多信息,请参阅聚合数据以获得更快性能
chunking_config

(可选,对象)可能需要数据源在较长的时间段内(几个月或几年)进行搜索。此搜索将拆分为时间块,以确保管理 Elasticsearch 上的负载。分块配置控制如何计算这些时间块的大小,这是一个高级配置选项。

chunking_config 的属性
mode

(字符串)有三种可用模式

  • auto:动态计算块大小。当数据源不使用聚合时,这是默认值和推荐值。
  • manual:根据指定的 time_span 应用分块。当数据源使用聚合时,请使用此模式。
  • off:不应用分块。
time_span
时间单位)每个搜索将查询的时间跨度。仅当模式设置为 manual 时,此设置才适用。例如:3h
datafeed_id

(可选,字符串)唯一标识数据源的数字字符串。此标识符可以包含小写字母数字字符(a-z 和 0-9)、连字符和下划线。它必须以字母数字字符开头和结尾。

默认为与异常检测作业相同的 ID。

delayed_data_check_config

(可选,对象)指定数据源是否检查丢失的数据以及窗口的大小。例如:{"enabled": true, "check_window": "1h"}

数据源可以选择在已读取的索引上进行搜索,以确定是否随后向该索引添加了任何数据。如果发现丢失的数据,则很好地表明 query_delay 选项设置得太低,并且数据在数据源经过那个时间点之后被索引。请参阅使用延迟数据

此检查仅在实时数据源上运行。

delayed_data_check_config 的属性
check_window
时间单位)搜索延迟数据的时间窗口。此时间窗口以最新完成的存储桶结束。它默认为 null,这会导致在实时数据源运行时计算适当的 check_window。特别是,默认的 check_window 跨度计算基于 2h8 * bucket_span 的最大值。
enabled
(布尔值)指定数据源是否定期检查延迟数据。默认为 true
frequency
(可选,时间单位)当数据源实时运行时进行计划查询的间隔。默认值是短存储桶跨度的存储桶跨度,或者,对于较长的存储桶跨度,是存储桶跨度的合理分数。例如:150s。当 frequency 短于存储桶跨度时,将写入最后一个(部分)存储桶的临时结果,然后最终被完整存储桶的结果覆盖。如果数据源使用聚合,则此值必须可被日期直方图聚合的间隔整除。
indices

(必需,数组)索引名称的数组。支持通配符。例如:["it_ops_metrics", "server*"]

如果任何索引位于远程集群中,则机器学习节点需要具有 remote_cluster_client 角色。

indices_options

(可选,对象)指定搜索期间使用的索引扩展选项。

例如

{
   "expand_wildcards": ["all"],
   "ignore_unavailable": true,
   "allow_no_indices": "false",
   "ignore_throttled": true
}

有关这些选项的更多信息,请参阅多目标语法

max_empty_searches
(可选,整数)如果实时数据源从未看到任何数据(包括在任何初始训练期间),则它会在这么多次返回没有文档的实时搜索后自动停止自身并关闭其关联的作业。换句话说,它将在 frequency 乘以 max_empty_searches 的实时操作后停止。如果未设置,则没有结束时间并且看不到数据的实时数据源将保持启动状态,直到显式停止它为止。默认情况下,不设置此设置。
query
(可选,对象)Elasticsearch 查询特定于域的语言 (DSL)。此值对应于 Elasticsearch 搜索 POST 正文中的查询对象。可以使用 Elasticsearch 支持的所有选项,因为此对象按原样传递给 Elasticsearch。默认情况下,此属性具有以下值:{"match_all": {"boost": 1}}
query_delay
(可选,时间单位)查询数据落后于实时的时间(以秒为单位)。例如,如果上午 10:04 的数据可能要到上午 10:06 才能在 Elasticsearch 中搜索到,请将此属性设置为 120 秒。默认值在 60s120s 之间随机选择。当在同一节点上运行多个作业时,此随机性可以提高查询性能。有关更多信息,请参阅处理延迟数据
runtime_mappings

(可选,对象)指定数据源搜索的运行时字段。

例如

{
  "day_of_week": {
    "type": "keyword",
    "script": {
      "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))"
    }
  }
}
script_fields
(可选,对象)指定计算自定义表达式并将脚本字段返回到数据源的脚本。作业中的检测器配置对象可以包含使用这些脚本字段的函数。有关更多信息,请参阅使用脚本字段转换数据脚本字段
scroll_size
(可选,无符号整数)当数据源不使用聚合时,在 Elasticsearch 搜索中使用的 size 参数。默认值为 1000。最大值为 index.max_result_window 的值,默认值为 10,000。
description
(可选,字符串)作业的描述。
groups
(可选,字符串数组)作业组列表。一个作业可以不属于任何组或属于多个组。
model_plot_config

(可选,对象)此高级配置选项将模型信息与结果一起存储。它提供了更详细的异常检测视图。

如果您启用模型图,则可能会给系统性能增加相当大的开销;对于具有许多实体的作业来说,这是不可行的。

模型图提供了模型及其边界的简化和指示性视图。它不显示复杂的功能,例如多元相关性或多模态数据。因此,可能会偶尔报告在模型图中看不到的异常。

模型图配置可以在创建作业时或稍后更新时进行配置。如果遇到性能问题,则必须将其禁用。

model_plot_config 的属性
annotations_enabled
(布尔值)如果为 true,则启用对正在分析的每个实体的模型更改注释的计算和存储。默认为 enabled
enabled
(布尔值)如果为 true,则启用对正在分析的每个实体的模型边界的计算和存储。默认情况下,不启用此设置。
terms
[预览] 此功能为技术预览版,可能会在未来的版本中更改或删除。Elastic 将努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。 (字符串)将数据收集限制为此逗号分隔的分区或按字段值列表。如果未指定术语或为空字符串,则不应用任何过滤。例如,“CPU,NetworkIn,DiskWrites”。不支持通配符。使用“单指标查看器”时,只能查看指定的 terms
model_snapshot_retention_days
(可选,长整型)高级配置选项,影响此作业的旧模型快照的自动删除。它指定快照保留的最长时限(以天为单位)。此期限相对于此作业的最新快照的时间戳。默认值为 10,表示删除比最新快照旧十天的快照。有关更多信息,请参阅模型快照
renormalization_window_days
(可选,长整型)高级配置选项。根据新数据,对分数进行调整的期限。默认值为 30 天或 100 个 bucket_spans 中较长的一个。
results_index_name
(可选,字符串)影响机器学习结果索引名称的文本字符串。默认值为 shared,这将生成名为 .ml-anomalies-shared 的索引。
results_retention_days
(可选,长整型)高级配置选项。结果保留的时间段(以天为单位)。年龄是根据最新 bucket 结果的时间戳计算的。如果此属性具有非空值,则每天 00:30(服务器时间)会从 Elasticsearch 中删除比最新 bucket 结果旧指定天数的结果。默认值为 null,表示保留所有结果。系统生成的注释也算作用于保留目的的结果;它们在与结果相同的天数后被删除。用户添加的注释将永久保留。

示例

编辑

创建异常检测作业和数据馈送

resp = client.ml.put_job(
    job_id="test-job1",
    pretty=True,
    analysis_config={
        "bucket_span": "15m",
        "detectors": [
            {
                "detector_description": "Sum of bytes",
                "function": "sum",
                "field_name": "bytes"
            }
        ]
    },
    data_description={
        "time_field": "timestamp",
        "time_format": "epoch_ms"
    },
    analysis_limits={
        "model_memory_limit": "11MB"
    },
    model_plot_config={
        "enabled": True,
        "annotations_enabled": True
    },
    results_index_name="test-job1",
    datafeed_config={
        "indices": [
            "kibana_sample_data_logs"
        ],
        "query": {
            "bool": {
                "must": [
                    {
                        "match_all": {}
                    }
                ]
            }
        },
        "runtime_mappings": {
            "hour_of_day": {
                "type": "long",
                "script": {
                    "source": "emit(doc['timestamp'].value.getHour());"
                }
            }
        },
        "datafeed_id": "datafeed-test-job1"
    },
)
print(resp)
const response = await client.ml.putJob({
  job_id: "test-job1",
  pretty: "true",
  analysis_config: {
    bucket_span: "15m",
    detectors: [
      {
        detector_description: "Sum of bytes",
        function: "sum",
        field_name: "bytes",
      },
    ],
  },
  data_description: {
    time_field: "timestamp",
    time_format: "epoch_ms",
  },
  analysis_limits: {
    model_memory_limit: "11MB",
  },
  model_plot_config: {
    enabled: true,
    annotations_enabled: true,
  },
  results_index_name: "test-job1",
  datafeed_config: {
    indices: ["kibana_sample_data_logs"],
    query: {
      bool: {
        must: [
          {
            match_all: {},
          },
        ],
      },
    },
    runtime_mappings: {
      hour_of_day: {
        type: "long",
        script: {
          source: "emit(doc['timestamp'].value.getHour());",
        },
      },
    },
    datafeed_id: "datafeed-test-job1",
  },
});
console.log(response);
PUT _ml/anomaly_detectors/test-job1?pretty
{
  "analysis_config": {
    "bucket_span": "15m",
    "detectors": [
      {
        "detector_description": "Sum of bytes",
        "function": "sum",
        "field_name": "bytes"
      }
    ]
  },
  "data_description": {
    "time_field": "timestamp",
    "time_format": "epoch_ms"
  },
  "analysis_limits": {
    "model_memory_limit": "11MB"
  },
  "model_plot_config": {
    "enabled": true,
    "annotations_enabled": true
  },
  "results_index_name": "test-job1",
  "datafeed_config":
  {
    "indices": [
    "kibana_sample_data_logs"
    ],
    "query": {
      "bool": {
        "must": [
          {
            "match_all": {}
          }
        ]
      }
    },
    "runtime_mappings": {
      "hour_of_day": {
        "type": "long",
        "script": {
          "source": "emit(doc['timestamp'].value.getHour());"
        }
      }
    },
    "datafeed_id": "datafeed-test-job1"
  }
}

API 返回以下结果

{
  "job_id" : "test-job1",
  "job_type" : "anomaly_detector",
  "job_version" : "8.4.0",
  "create_time" : 1656087283340,
  "datafeed_config" : {
    "datafeed_id" : "datafeed-test-job1",
    "job_id" : "test-job1",
    "authorization" : {
      "roles" : [
        "superuser"
      ]
    },
    "query_delay" : "61499ms",
    "chunking_config" : {
      "mode" : "auto"
    },
    "indices_options" : {
      "expand_wildcards" : [
        "open"
      ],
      "ignore_unavailable" : false,
      "allow_no_indices" : true,
      "ignore_throttled" : true
    },
    "query" : {
      "bool" : {
        "must" : [
          {
            "match_all" : { }
          }
        ]
      }
    },
    "indices" : [
      "kibana_sample_data_logs"
    ],
    "scroll_size" : 1000,
    "delayed_data_check_config" : {
      "enabled" : true
    },
    "runtime_mappings" : {
      "hour_of_day" : {
        "type" : "long",
        "script" : {
          "source" : "emit(doc['timestamp'].value.getHour());"
        }
      }
    }
  },
  "analysis_config" : {
    "bucket_span" : "15m",
    "detectors" : [
      {
        "detector_description" : "Sum of bytes",
        "function" : "sum",
        "field_name" : "bytes",
        "detector_index" : 0
      }
    ],
    "influencers" : [ ],
    "model_prune_window" : "30d"
  },
  "analysis_limits" : {
    "model_memory_limit" : "11mb",
    "categorization_examples_limit" : 4
  },
  "data_description" : {
    "time_field" : "timestamp",
    "time_format" : "epoch_ms"
  },
  "model_plot_config" : {
    "enabled" : true,
    "annotations_enabled" : true
  },
  "model_snapshot_retention_days" : 10,
  "daily_model_snapshot_retention_after_days" : 1,
  "results_index_name" : "custom-test-job1",
  "allow_lazy_open" : false
}