Anomaly Detection APIs
출처: 문서
본문
이상 탐지 API
이러한 이상 탐지 작업을 사용하여 프로그래밍 방식으로 탐지기를 생성하고 관리할 수 있어요.
목차
- TOC {:toc}
이상 탐지기 생성
Introduced 1.0 {: .label .label-purple }
이상 탐지기를 생성해요.
이 명령은 value 필드의 합계를 기반으로 이상을 찾고 결과를 사용자 지정 opensearch-ad-plugin-result-test 인덱스에 저장하는 test-detector라는 단일 엔터티 탐지기를 생성해요.
요청 예시
POST _plugins/_anomaly_detection/detectors
{
"name": "test-detector",
"description": "Test detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"feature_attributes": [
{
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"gt": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"result_index" : "opensearch-ad-plugin-result-test"
}
응답 예시
{
"_id": "VEHKTXwBwf_U8gjUXY2s",
"_version": 1,
"_seq_no": 5,
"anomaly_detector": {
"name": "test-detector",
"description": "Test detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"from": 1,
"to": null,
"include_lower": false,
"include_upper": true,
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "U0HKTXwBwf_U8gjUXY2m",
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"last_update_time": 1633392680364,
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
},
"detector_type": "SINGLE_ENTITY"
},
"_primary_term": 1
}
카테고리 필드를 지정하여 높은 카디널리티 탐지기를 생성하려면:
요청 예시
POST _plugins/_anomaly_detection/detectors
{
"name": "test-hc-detector",
"description": "Test detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"feature_attributes": [
{
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"gt": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"category_field": [
"ip"
]
}
응답 예시
{
"_id": "b0HRTXwBwf_U8gjUw43R",
"_version": 1,
"_seq_no": 6,
"anomaly_detector": {
"name": "test-hc-detector",
"description": "Test detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"from": 1,
"to": null,
"include_lower": false,
"include_upper": true,
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "bkHRTXwBwf_U8gjUw43K",
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"last_update_time": 1633393165265,
"category_field": [
"ip"
],
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
},
"detector_type": "MULTI_ENTITY"
},
"_primary_term": 1
}
최대 두 개의 카테고리 필드를 지정할 수 있어요.
"category_field": [
"ip"
]
"category_field": [
"ip", "error_type"
]
다음 옵션을 지정할 수 있어요.
| 옵션 | 설명 | 유형 | 필수 |
|---|---|---|---|
name |
탐지기의 이름이에요. | string |
예 |
description |
탐지기에 대한 설명이에요. | string |
아니요 |
time_field |
시간 필드의 이름이에요. | string |
예 |
indices |
데이터 소스로 사용할 인덱스 목록이에요. | list |
예 |
feature_attributes |
feature_name을 지정하고 enabled 매개변수를 true로 설정한 후 집계 쿼리를 지정해요. |
list |
예 |
filter_query |
특성에 대한 선택적 필터 쿼리를 제공해요. | object |
아니요 |
detection_interval |
이상 탐지기의 시간 간격이에요. | object |
예 |
window_delay |
데이터 수집을 위한 추가 처리 시간을 추가해요. | object |
아니요 |
category_field |
차원으로 데이터를 분류하거나 슬라이스해요. SQL의 GROUP BY와 유사해요. |
list |
아니요 |
탐지기 검증
Introduced 1.2 {: .label .label-purple }
탐지기 구성에 OpenSearch가 탐지기를 생성하지 못하게 할 수 있는 문제가 있는지 여부를 반환해요.
탐지기를 생성하기 전에 탐지기 구성의 문제를 식별하기 위해 탐지기 검증 API 작업을 사용할 수 있어요.
요청 본문은 탐지기 구성으로 구성되며 탐지기 생성 API의 요청 본문과 동일한 형식을 따라요.
다음과 같은 검증 옵션이 있어요.
- 탐지기 구성에 대해서만 검증하고 탐지기 생성을 완전히 차단하는 문제를 찾아요.
POST _plugins/_anomaly_detection/detectors/_validate
POST _plugins/_anomaly_detection/detectors/_validate/detector
- 소스 데이터에 대해 검증하여 탐지기가 모델 학습을 완료할 가능성을 확인해요.
POST _plugins/_anomaly_detection/detectors/_validate/model
이 API 작업의 응답은 탐지기 유형 응답으로 차단 문제를 반환하거나 모델 학습이 성공적으로 완료될 가능성을 높이기 위해 수정할 수 있는 필드를 나타내는 응답을 반환해요. 모델 유형 문제는 탐지기 생성이 성공하기 위해 수정할 필요는 없지만, 해결되지 않으면 탐지기가 학습에 성공하지 못할 가능성이 있어요.
요청 예시
POST _plugins/_anomaly_detection/detectors/_validate
POST _plugins/_anomaly_detection/detectors/_validate/detector
{
"name": "test-detector",
"description": "Test detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"feature_attributes": [
{
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"gt": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
}
}
탐지기 검증 API가 탐지기 구성에서 문제를 찾지 못하면 빈 응답을 반환해요.
응답 예시
{}
탐지기 검증 API가 구성 문제를 찾으면 문제를 설명하는 메시지를 반환해요. 이 예에서는 특성 쿼리가 데이터 소스에 존재하지 않는 필드에 대해 집계해요.
응답 예시
{
"detector": {
"feature_attributes": {
"message": "Feature has invalid query returning empty aggregated data: average_total_rev",
"sub_issues": {
"average_total_rev": "Feature has invalid query returning empty aggregated data"
}
}
}
}
다음 요청은 모델 학습이 성공할 수 있는지 확인하기 위해 소스 데이터에 대해 검증해요. 이 예에서는 데이터가 5분마다 수집되고 탐지기 간격이 1분으로 설정되어 있어요.
POST _plugins/_anomaly_detection/detectors/_validate/model
{
"name": "test-detector",
"description": "Test detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"feature_attributes": [
{
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"gt": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
}
}
탐지기 검증 API가 구성에서 개선할 영역을 식별하면 모델 학습을 개선하기 위해 구성을 변경하기 위한 제안이 포함된 응답을 반환해요.
응답 예시
이 예에서는 탐지기 검증 API가 탐지기 간격 길이를 최소 4분으로 변경하면 모델 학습 성공 확률을 높일 수 있음을 나타내는 응답을 반환해요.
{
"model": {
"detection_interval": {
"message": "The selected detector interval might collect sparse data. Consider changing interval length to: 4",
"suggested_value": {
"period": {
"interval": 4,
"unit": "Minutes"
}
}
}
}
}
또 다른 응답은 현재 필터링된 데이터가 모델이 올바르게 학습하기에는 너무 희소하기 때문에 filter_query(데이터 필터)를 변경할 수 있음을 나타낼 수 있어요. 이는 인덱스가 선택한 필터 외부에 있는 데이터도 수집하기 때문에 발생할 수 있어요. 다른 filter_query를 사용하면 데이터를 더 조밀하게 만들 수 있어요.
{
"model": {
"filter_query": {
"message": "Data is too sparse after data filter is applied. Consider changing the data filter"
}
}
}
탐지기 가져오기
Introduced 1.0 {: .label .label-purple }
detector_id를 기반으로 탐지기에 대한 모든 정보를 반환해요.
요청 예시
GET _plugins/_anomaly_detection/detectors/{detectorId}
응답 예시
{
"_id": "VEHKTXwBwf_U8gjUXY2s",
"_version": 1,
"_primary_term": 1,
"_seq_no": 5,
"anomaly_detector": {
"name": "test-detector",
"description": "Test detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"from": 1,
"to": null,
"include_lower": false,
"include_upper": true,
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "U0HKTXwBwf_U8gjUXY2m",
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"last_update_time": 1633392680364,
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
},
"detector_type": "SINGLE_ENTITY"
}
}
_작업_은 주기적으로 실행하도록 예약하는 것이므로 실시간 이상 탐지에만 적용되며 한 번만 실행하는 히스토리 분석에는 적용되지 않아요.
실시간 탐지기를 시작하면 Anomaly Detection 플러그인이 작업을 생성하거나 작업이 이미 존재하면 업데이트해요. 실시간 탐지기를 시작하거나 다시 시작하면 플러그인이 탐지기 구성 스냅샷, 실시간 작업 상태(초기화 중/실행 중/중지됨), 초기화 진행률 등의 런타임 정보를 기록하는 새로운 실시간 작업을 생성해요.
단일 탐지기는 하나의 실시간 작업만 가질 수 있지만(작업 ID는 탐지기 ID와 동일), 실시간 작업을 다시 시작할 때마다 새 실시간 작업이 생성되므로 여러 실시간 작업을 가질 수 있어요. plugins.anomaly_detection.max_old_ad_task_docs_per_detector 설정으로 실시간 작업 수를 제한할 수 있어요.
히스토리 분석에는 연결된 작업이 없어요. 탐지기에 대한 히스토리 분석을 시작하거나 다시 실행하면 Anomaly Detection 플러그인이 상태, 조정/작업자 노드, 작업 진행률 등의 히스토리 분석 런타임 정보를 추적하는 새로운 히스토리 배치 작업을 생성해요. plugins.anomaly_detection.max_old_ad_task_docs_per_detector 설정으로 히스토리 작업 수를 제한할 수 있어요.
실시간 분석 작업 정보를 가져오려면 job=true를 사용해요.
요청 예시
GET _plugins/_anomaly_detection/detectors/{detectorId}?job=true
응답 예시
{
"_id": "VEHKTXwBwf_U8gjUXY2s",
"_version": 1,
"_primary_term": 1,
"_seq_no": 5,
"anomaly_detector": {
"name": "test-detector",
"description": "Test detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"from": 1,
"to": null,
"include_lower": false,
"include_upper": true,
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "U0HKTXwBwf_U8gjUXY2m",
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"last_update_time": 1633392680364,
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
},
"detector_type": "SINGLE_ENTITY"
},
"anomaly_detector_job": {
"name": "VEHKTXwBwf_U8gjUXY2s",
"schedule": {
"interval": {
"start_time": 1633393656357,
"period": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"enabled": true,
"enabled_time": 1633393656357,
"last_update_time": 1633393656357,
"lock_duration_seconds": 60,
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
}
}
}
실시간 및 히스토리 분석 작업 정보를 모두 가져오려면 task=true를 사용해요.
요청 예시
GET _plugins/_anomaly_detection/detectors/{detectorId}?task=true
응답 예시
{
"_id": "VEHKTXwBwf_U8gjUXY2s",
"_version": 1,
"_primary_term": 1,
"_seq_no": 5,
"anomaly_detector": {
"name": "test-detector",
"description": "Test detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"from": 1,
"to": null,
"include_lower": false,
"include_upper": true,
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "U0HKTXwBwf_U8gjUXY2m",
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"last_update_time": 1633392680364,
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
},
"detector_type": "SINGLE_ENTITY"
},
"realtime_detection_task": {
"task_id": "nkTZTXwBjd8s6RK4QlMq",
"last_update_time": 1633393776375,
"started_by": "admin",
"error": "",
"state": "RUNNING",
"detector_id": "VEHKTXwBwf_U8gjUXY2s",
"task_progress": 0,
"init_progress": 1,
"execution_start_time": 1633393656362,
"is_latest": true,
"task_type": "REALTIME_SINGLE_ENTITY",
"coordinating_node": "SWD7ihu9TaaW1zKwFZNVNg",
"detector": {
"name": "test-detector",
"description": "Test detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"from": 1,
"to": null,
"include_lower": false,
"include_upper": true,
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "U0HKTXwBwf_U8gjUXY2m",
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"last_update_time": 1633392680364,
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
},
"detector_type": "SINGLE_ENTITY"
},
"estimated_minutes_left": 0,
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
}
},
"historical_analysis_task": {
"task_id": "99DaTXwB6HknB84StRN1",
"last_update_time": 1633393797040,
"started_by": "admin",
"state": "RUNNING",
"detector_id": "VEHKTXwBwf_U8gjUXY2s",
"task_progress": 0.89285713,
"init_progress": 1,
"current_piece": 1633328940000,
"execution_start_time": 1633393751412,
"is_latest": true,
"task_type": "HISTORICAL_SINGLE_ENTITY",
"coordinating_node": "SWD7ihu9TaaW1zKwFZNVNg",
"worker_node": "2Z4q22BySEyzakYt_A0A2A",
"detector": {
"name": "test-detector",
"description": "Test detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"from": 1,
"to": null,
"include_lower": false,
"include_upper": true,
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "U0HKTXwBwf_U8gjUXY2m",
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"last_update_time": 1633392680364,
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
},
"detector_type": "SINGLE_ENTITY"
},
"detection_date_range": {
"start_time": 1632788951329,
"end_time": 1633393751329
},
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
}
}
}
탐지기 업데이트
Introduced 1.0 {: .label .label-purple }
설명 변경이나 특성 추가 또는 제거를 포함한 모든 변경 사항으로 탐지기를 업데이트해요.
탐지기를 업데이트하려면 먼저 실시간 탐지와 히스토리 분석을 모두 중지해야 해요.
카테고리 필드는 업데이트할 수 없어요. {: .note }
요청 예시
PUT _plugins/_anomaly_detection/detectors/{detectorId}
{
"name": "test-detector",
"description": "Test update detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"feature_attributes": [
{
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"gt": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
}
}
응답 예시
{
"_id": "VEHKTXwBwf_U8gjUXY2s",
"_version": 2,
"_seq_no": 7,
"anomaly_detector": {
"name": "test-detector",
"description": "Test update detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"from": 1,
"to": null,
"include_lower": false,
"include_upper": true,
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "3kHiTXwBwf_U8gjUlY15",
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"last_update_time": 1633394267522,
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
},
"detector_type": "SINGLE_ENTITY"
},
"_primary_term": 1
}
탐지기 삭제
Introduced 1.0 {: .label .label-purple }
detector_id를 기반으로 탐지기를 삭제해요.
탐지기를 삭제하려면 먼저 실시간 탐지와 히스토리 분석을 모두 중지해야 해요.
요청 예시
DELETE _plugins/_anomaly_detection/detectors/{detectorId}
응답 예시
{
"_index": ".opensearch-anomaly-detectors",
"_id": "70TxTXwBjd8s6RK4j1Pj",
"_version": 2,
"result": "deleted",
"forced_refresh": true,
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"_seq_no": 9,
"_primary_term": 1
}
탐지기 미리보기
Introduced 1.0 {: .label .label-purple }
이상 탐지기에 날짜 범위를 전달하여 해당 날짜 범위 내의 이상을 반환해요.
단일 엔터티 탐지기를 미리보려면:
요청 예시
POST _plugins/_anomaly_detection/detectors/_preview
{
"period_start": 1633048868000,
"period_end": 1633394468000,
"detector": {
"name": "test-detector",
"description": "Test update detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"feature_attributes": [
{
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"gt": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
}
}
}
응답 예시
{
"anomaly_result": [
{
"detector_id": null,
"data_start_time": 1633049280000,
"data_end_time": 1633049340000,
"schema_version": 0,
"feature_data": [
{
"feature_id": "8EHmTXwBwf_U8gjU0Y0u",
"feature_name": "test",
"data": 0
}
],
"anomaly_grade": 0,
"confidence": 0
},
...
],
"anomaly_detector": {
"name": "test-detector",
"description": "Test update detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"from": 1,
"to": null,
"include_lower": false,
"include_upper": true,
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "8EHmTXwBwf_U8gjU0Y0u",
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"detector_type": "SINGLE_ENTITY"
}
}
카테고리 필드를 지정하면 각 결과가 엔터티와 연결되어요.
요청 예시
POST _plugins/_anomaly_detection/detectors/_preview
{
"period_start": 1633048868000,
"period_end": 1633394468000,
"detector": {
"name": "test-detector",
"description": "Test update detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"feature_attributes": [
{
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"gt": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"category_field": [
"error_type"
]
}
}
응답 예시
{
"anomaly_result": [
{
"detector_id": null,
"data_start_time": 1633049280000,
"data_end_time": 1633049340000,
"schema_version": 0,
"feature_data": [
{
"feature_id": "tkTpTXwBjd8s6RK4DlOZ",
"feature_name": "test",
"data": 0
}
],
"anomaly_grade": 0,
"confidence": 0,
"entity": [
{
"name": "error_type",
"value": "error1"
}
]
},
...
],
"anomaly_detector": {
"name": "test-detector",
"description": "Test update detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"from": 1,
"to": null,
"include_lower": false,
"include_upper": true,
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "tkTpTXwBjd8s6RK4DlOZ",
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"category_field": [
"error_type"
],
"detector_type": "MULTI_ENTITY"
}
}
탐지기 ID로 탐지기를 미리볼 수 있어요.
POST _plugins/_anomaly_detection/detectors/_preview
{
"detector_id": "VEHKTXwBwf_U8gjUXY2s",
"period_start": 1633048868000,
"period_end": 1633394468000
}
또는:
POST _opendistro/_anomaly_detection/detectors/VEHKTXwBwf_U8gjUXY2s/_preview
{
"period_start": 1633048868000,
"period_end": 1633394468000
}
응답 예시
{
"anomaly_result": [
{
"detector_id": "VEHKTXwBwf_U8gjUXY2s",
"data_start_time": 1633049280000,
"data_end_time": 1633049340000,
"schema_version": 0,
"feature_data": [
{
"feature_id": "3kHiTXwBwf_U8gjUlY15",
"feature_name": "test",
"data": 0
}
],
"anomaly_grade": 0,
"confidence": 0,
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
}
},
...
],
"anomaly_detector": {
"name": "test-detector",
"description": "Test update detector",
"time_field": "timestamp",
"indices": [
"server_log*"
],
"filter_query": {
"bool": {
"filter": [
{
"range": {
"value": {
"from": 1,
"to": null,
"include_lower": false,
"include_upper": true,
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "3kHiTXwBwf_U8gjUlY15",
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"last_update_time": 1633394267522,
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
},
"detector_type": "SINGLE_ENTITY"
}
}
탐지기 작업 시작
Introduced 1.0 {: .label .label-purple }
실시간 또는 히스토리 이상 탐지기 작업을 시작해요.
실시간 탐지기 작업을 시작하려면:
요청 예시
POST _plugins/_anomaly_detection/detectors/{detectorId}/_start
응답 예시
{
"_id": "VEHKTXwBwf_U8gjUXY2s",
"_version": 3,
"_seq_no": 6,
"_primary_term": 1
}
_id는 실시간 작업 ID를 나타내며, 이는 탐지기 ID와 동일해요.
히스토리 분석을 시작하려면:
POST _plugins/_anomaly_detection/detectors/{detectorId}/_start
{
"start_time": 1633048868000,
"end_time": 1633394468000
}
응답 예시
{
"_id": "f9DsTXwB6HknB84SoRTY",
"_version": 1,
"_seq_no": 958,
"_primary_term": 1
}
_id는 히스토리 배치 작업 ID를 나타내며, 이는 임의의 UUID(범용 고유 식별자)예요.
탐지기 작업 중지
Introduced 1.0 {: .label .label-purple }
실시간 또는 히스토리 이상 탐지기 작업을 중지해요.
실시간 탐지기 작업을 중지하려면:
요청 예시
POST _plugins/_anomaly_detection/detectors/{detectorId}/_stop
응답 예시
{
"_id": "VEHKTXwBwf_U8gjUXY2s",
"_version": 0,
"_seq_no": 0,
"_primary_term": 0
}
히스토리 분석을 중지하려면:
Introduced 1.1 {: .label .label-purple }
POST _plugins/_anomaly_detection/detectors/{detectorId}/_stop?historical=true
응답 예시
{
"_id": "f9DsTXwB6HknB84SoRTY",
"_version": 0,
"_seq_no": 0,
"_primary_term": 0
}
탐지기 검색
Introduced 1.0 {: .label .label-purple }
검색 쿼리에 대한 모든 이상 탐지기를 반환해요.
server_log* 인덱스를 사용하여 탐지기를 검색하려면:
요청 예시
GET _plugins/_anomaly_detection/detectors/_search
POST _plugins/_anomaly_detection/detectors/_search
{
"query": {
"wildcard": {
"indices": {
"value": "server_log*"
}
}
}
}
응답 예시
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": ".opensearch-anomaly-detectors",
"_id": "Zi5zTXwBwf_U8gjUTfJG",
"_version": 1,
"_seq_no": 1,
"_primary_term": 1,
"_score": 1,
"_source": {
"name": "test",
"description": "test",
"time_field": "timestamp",
"indices": [
"server_log"
],
"filter_query": {
"match_all": {
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 5,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "ZS5zTXwBwf_U8gjUTfIn",
"feature_name": "test_feature",
"feature_enabled": true,
"aggregation_query": {
"test_feature": {
"sum": {
"field": "value"
}
}
}
}
],
"last_update_time": 1633386974533,
"category_field": [
"error_type"
],
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
},
"detector_type": "MULTI_ENTITY"
}
},
...
]
}
}
탐지기 작업 검색
Introduced 1.1 {: .label .label-purple }
탐지기 작업을 검색해요.
높은 카디널리티 탐지기에 대한 최신 탐지기 수준 히스토리 분석 작업을 검색하려면
요청 예시
GET _plugins/_anomaly_detection/detectors/tasks/_search
POST _plugins/_anomaly_detection/detectors/tasks/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"detector_id": "Zi5zTXwBwf_U8gjUTfJG"
}
},
{
"term": {
"task_type": "HISTORICAL_HC_DETECTOR"
}
},
{
"term": {
"is_latest": "true"
}
}
]
}
}
}
응답 예시
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0,
"hits": [
{
"_index": ".opensearch-anomaly-detection-state",
"_id": "fm-RTXwBYwCbWecgB753",
"_version": 34,
"_seq_no": 928,
"_primary_term": 1,
"_score": 0,
"_source": {
"detector_id": "Zi5zTXwBwf_U8gjUTfJG",
"error": "",
"detection_date_range": {
"start_time": 1630794960000,
"end_time": 1633386960000
},
"task_progress": 1,
"last_update_time": 1633389090738,
"execution_start_time": 1633388922742,
"state": "FINISHED",
"coordinating_node": "2Z4q22BySEyzakYt_A0A2A",
"task_type": "HISTORICAL_HC_DETECTOR",
"execution_end_time": 1633389090738,
"started_by": "admin",
"init_progress": 0,
"is_latest": true,
"detector": {
"category_field": [
"error_type"
],
"description": "test",
"ui_metadata": {
"features": {
"test_feature": {
"aggregationBy": "sum",
"aggregationOf": "value",
"featureType": "simple_aggs"
}
},
"filters": []
},
"feature_attributes": [
{
"feature_id": "ZS5zTXwBwf_U8gjUTfIn",
"feature_enabled": true,
"feature_name": "test_feature",
"aggregation_query": {
"test_feature": {
"sum": {
"field": "value"
}
}
}
}
],
"schema_version": 0,
"time_field": "timestamp",
"last_update_time": 1633386974533,
"indices": [
"server_log"
],
"window_delay": {
"period": {
"unit": "Minutes",
"interval": 1
}
},
"detection_interval": {
"period": {
"unit": "Minutes",
"interval": 5
}
},
"name": "testhc",
"filter_query": {
"match_all": {
"boost": 1
}
},
"shingle_size": 8,
"user": {
"backend_roles": [
"admin"
],
"custom_attribute_names": [],
"roles": [
"own_index",
"all_access"
],
"name": "admin",
"user_requested_tenant": "__user__"
},
"detector_type": "MULTI_ENTITY"
},
"user": {
"backend_roles": [
"admin"
],
"custom_attribute_names": [],
"roles": [
"own_index",
"all_access"
],
"name": "admin",
"user_requested_tenant": "__user__"
}
}
}
]
}
}
높은 카디널리티 탐지기의 히스토리 분석에 대한 최신 엔터티 수준 작업을 검색하려면:
요청 예시
GET _plugins/_anomaly_detection/detectors/tasks/_search
POST _plugins/_anomaly_detection/detectors/tasks/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"detector_id": "Zi5zTXwBwf_U8gjUTfJG"
}
},
{
"term": {
"task_type": "HISTORICAL_HC_ENTITY"
}
},
{
"term": {
"is_latest": "true"
}
}
]
}
},
"sort": [
{
"execution_start_time": {
"order": "desc"
}
}
],
"size": 100
}
모든 엔터티 수준 히스토리 작업의 상태를 검색하고 집계하려면:
parent_task_id는 프로필 탐지기 API로 얻을 수 있는 작업 ID와 동일해요.
GET _plugins/_anomaly_detection/detectors/<detector_ID>/_profile/ad_task.
{: .note }
요청 예시
GET _plugins/_anomaly_detection/detectors/tasks/_search
POST _plugins/_anomaly_detection/detectors/tasks/_search
{
"size": 0,
"query": {
"bool": {
"filter": [
{
"term": {
"detector_id": {
"value": "Zi5zTXwBwf_U8gjUTfJG",
"boost": 1
}
}
},
{
"term": {
"parent_task_id": {
"value": "fm-RTXwBYwCbWecgB753",
"boost": 1
}
}
},
{
"terms": {
"task_type": [
"HISTORICAL_HC_ENTITY"
],
"boost": 1
}
}
]
}
},
"aggs": {
"test": {
"terms": {
"field": "state",
"size": 100
}
}
}
}
응답 예시
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 32,
"relation": "eq"
},
"max_score": null,
"hits": []
},
"aggregations": {
"test": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "FINISHED",
"doc_count": 32
}
]
}
}
}
탐지기 결과 검색
Introduced 1.0 {: .label .label-purple }
검색 쿼리에 대한 모든 결과를 반환해요.
다음과 같은 검색 옵션이 있어요.
-
기본 결과 인덱스만 검색하려면 검색 API를 사용하면 돼요.
POST _plugins/_anomaly_detection/detectors/results/_search/ -
사용자 지정 결과 인덱스와 기본 결과 인덱스를 모두 검색하려면 사용자 지정 결과 인덱스를 검색 API에 추가하거나:
POST _plugins/_anomaly_detection/detectors/results/_search/{custom_result_index}또는 사용자 지정 결과 인덱스를 추가하고
only_query_custom_result_index매개변수를false로 설정해요.POST _plugins/_anomaly_detection/detectors/results/_search/{custom_result_index}?only_query_custom_result_index=false -
사용자 지정 결과 인덱스만 검색하려면 사용자 지정 결과 인덱스를 검색 API에 추가하고
only_query_custom_result_index매개변수를true로 설정해요.POST _plugins/_anomaly_detection/detectors/results/_search/{custom_result_index}?only_query_custom_result_index=true
다음 예는 실시간 분석에 대해 등급이 0보다 큰 이상 결과를 검색해요.
요청 예시
GET _plugins/_anomaly_detection/detectors/results/_search/opensearch-ad-plugin-result-test
POST _plugins/_anomaly_detection/detectors/results/_search/opensearch-ad-plugin-result-test
{
"query": {
"bool": {
"filter": [
{
"term": {
"detector_id": "EWy02nwBm38sXcF2AiFJ"
}
},
{
"range": {
"anomaly_grade": {
"gt": 0
}
}
}
],
"must_not": [
{
"exists": {
"field": "task_id"
}
}
]
}
}
}
이 예에서처럼 사용자 지정 결과 인덱스를 지정하면 검색 결과 API는 기본 결과 인덱스와 사용자 지정 결과 인덱스를 모두 검색해요.
사용자 지정 결과 인덱스를 지정하지 않고 _plugins/_anomaly_detection/detectors/results/_search URL만 사용하면 Anomaly Detection 플러그인은 기본 결과 인덱스만 검색해요.
실시간 탐지는 이상 결과에 작업 ID를 유지하지 않으므로 작업 ID는 null이 돼요.
응답 본문 필드에 대한 자세한 내용은 이상 결과 매핑을 참조해요.
응답 예시
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 90,
"relation": "eq"
},
"max_score": 0,
"hits": [
{
"_index": ".opensearch-anomaly-results-history-2021.10.04-1",
"_id": "686KTXwB6HknB84SMr6G",
"_version": 1,
"_seq_no": 103622,
"_primary_term": 1,
"_score": 0,
"_source": {
"detector_id": "EWy02nwBm38sXcF2AiFJ",
"confidence": 0.918886275269358,
"model_id": "EWy02nwBm38sXcF2AiFJ_entity_error16",
"schema_version": 4,
"anomaly_score": 1.1093755891885446,
"execution_start_time": 1633388475001,
"data_end_time": 1633388414989,
"data_start_time": 1633388114989,
"feature_data": [
{
"feature_id": "ZS5zTXwBwf_U8gjUTfIn",
"feature_name": "test_feature",
"data": 0.532
}
],
"relevant_attribution": [
{
"feature_id": "ZS5zTXwBwf_U8gjUTfIn",
"data": 1.0
}
],
"expected_values": [
{
"likelihood": 1,
"value_list": [
{
"feature_id": "ZS5zTXwBwf_U8gjUTfIn",
"data": 2
}
]
}
],
"execution_end_time": 1633388475014,
"user": {
"backend_roles": [
"admin"
],
"custom_attribute_names": [],
"roles": [
"own_index",
"all_access"
],
"name": "admin",
"user_requested_tenant": "__user__"
},
"anomaly_grade": 0.031023547546561225,
"entity": [
{
"name": "error_type",
"value": "error16"
}
]
}
},
...
]
}
}
히스토리 분석은 원하는 만큼 여러 번 실행할 수 있어요. 따라서 동일한 탐지기에 대해 여러 작업이 존재할 수 있어요.
최신 히스토리 배치 작업을 먼저 검색한 다음 히스토리 배치 작업 결과를 검색할 수 있어요.
task_id로 히스토리 분석에 대해 grade가 0보다 큰 이상 결과를 검색하려면:
요청 예시
GET _plugins/_anomaly_detection/detectors/results/_search
POST _plugins/_anomaly_detection/detectors/results/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"detector_id": "Zi5zTXwBwf_U8gjUTfJG"
}
},
{
"range": {
"anomaly_grade": {
"gt": 0
}
}
},
{
"term": {
"task_id": "fm-RTXwBYwCbWecgB753"
}
}
]
}
}
}
응답 예시
{
"took": 915,
"timed_out": false,
"_shards": {
"total": 3,
"successful": 3,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 4115,
"relation": "eq"
},
"max_score": 0,
"hits": [
{
"_index": ".opensearch-anomaly-results-history-2021.10.04-1",
"_id": "VRyRTXwBDx7vzPBV8jYC",
"_version": 1,
"_seq_no": 149657,
"_primary_term": 1,
"_score": 0,
"_source": {
"detector_id": "Zi5zTXwBwf_U8gjUTfJG",
"confidence": 0.9642989263957601,
"task_id": "fm-RTXwBYwCbWecgB753",
"model_id": "Zi5zTXwBwf_U8gjUTfJG_entity_error24",
"schema_version": 4,
"anomaly_score": 1.2260712437521946,
"execution_start_time": 1633388982692,
"data_end_time": 1631721300000,
"data_start_time": 1631721000000,
"feature_data": [
{
"feature_id": "ZS5zTXwBwf_U8gjUTfIn",
"feature_name": "test_feature",
"data": 10
}
],
"execution_end_time": 1633388982709,
"user": {
"backend_roles": [
"admin"
],
"custom_attribute_names": [],
"roles": [
"own_index",
"all_access"
],
"name": "admin",
"user_requested_tenant": "__user__"
},
"anomaly_grade": 0.14249628345655782,
"entity": [
{
"name": "error_type",
"value": "error1"
}
]
}
},
...
]
}
}
상위 이상 검색
Introduced 1.2 {: .label .label-purple }
높은 카디널리티 탐지기에 대한 상위 이상 결과를 범주형 필드 값으로 버킷팅하여 반환해요.
실시간 결과 또는 히스토리 결과를 분석할지 지정하려면 historical 부울 매개변수를 전달할 수 있어요.
요청 예시
GET _plugins/_anomaly_detection/detectors/{detectorId}/results/_topAnomalies?historical=false
{
"size": 3,
"category_field": [
"ip"
],
"order": "severity",
"task_id": "example-task-id",
"start_time_ms": 123456789000,
"end_time_ms": 987654321000
}
응답 예시
{
"buckets": [
{
"key": {
"ip": "1.2.3.4"
},
"doc_count": 10,
"max_anomaly_grade": 0.8
},
{
"key": {
"ip": "5.6.7.8"
},
"doc_count": 12,
"max_anomaly_grade": 0.6
},
{
"key": {
"ip": "9.10.11.12"
},
"doc_count": 3,
"max_anomaly_grade": 0.5
}
]
}
다음 옵션을 지정할 수 있어요.
| 옵션 | 설명 | 유형 | 필수 |
|---|---|---|---|
size |
보려는 상위 버킷 수를 지정해요. 기본값은 10이에요. 최대 개수는 10,000이에요. | integer |
아니요 |
category_field |
집계하려는 범주형 필드 집합을 지정해요. 기본값은 탐지기의 모든 범주형 필드예요. | list |
아니요 |
order |
severity(이상 등급) 또는 occurrence(이상 횟수)를 지정해요. 기본값은 severity예요. |
string |
아니요 |
task_id |
특정 작업의 결과만 보려면 히스토리 작업 ID를 지정해요. historical=true인 경우에만 사용하고, 그렇지 않으면 Anomaly Detection 플러그인이 이 매개변수를 무시해요. |
string |
아니요 |
start_time_ms |
결과 분석을 시작할 시간을 Epoch 밀리초 단위로 지정해요. | long |
예 |
end_time_ms |
결과 분석을 종료할 시간을 Epoch 밀리초 단위로 지정해요. | long |
예 |
탐지기 통계 가져오기
Introduced 1.0 {: .label .label-purple }
이 플러그인이 어떻게 작동하는지에 대한 정보를 제공해요.
모든 통계를 가져오려면:
요청 예시
GET _plugins/_anomaly_detection/stats
응답 예시
{
"anomaly_detectors_index_status": "green",
"anomaly_detection_state_status": "green",
"single_entity_detector_count": 2,
"detector_count": 5,
"multi_entity_detector_count": 3,
"anomaly_detection_job_index_status": "green",
"models_checkpoint_index_status": "green",
"anomaly_results_index_status": "green",
"nodes": {
"2Z4q22BySEyzakYt_A0A2A": {
"ad_execute_request_count": 95,
"models": [
{
"detector_id": "WTBnTXwBjd8s6RK4b1Sz",
"model_type": "rcf",
"last_used_time": 1633398197185,
"model_id": "WTBnTXwBjd8s6RK4b1Sz_model_rcf_0",
"last_checkpoint_time": 1633396573679
},
...
],
"ad_canceled_batch_task_count": 0,
"ad_hc_execute_request_count": 75,
"ad_hc_execute_failure_count": 0,
"model_count": 28,
"ad_execute_failure_count": 1,
"ad_batch_task_failure_count": 0,
"ad_total_batch_task_execution_count": 27,
"ad_executing_batch_task_count": 3
},
"SWD7ihu9TaaW1zKwFZNVNg": {
"ad_execute_request_count": 12,
"models": [
{
"detector_id": "Zi5zTXwBwf_U8gjUTfJG",
"model_type": "entity",
"last_used_time": 1633398375008,
"model_id": "Zi5zTXwBwf_U8gjUTfJG_entity_error13",
"last_checkpoint_time": 1633392973682,
"entity": [
{
"name": "error_type",
"value": "error13"
}
]
},
...
],
"ad_canceled_batch_task_count": 1,
"ad_hc_execute_request_count": 0,
"ad_hc_execute_failure_count": 0,
"model_count": 15,
"ad_execute_failure_count": 2,
"ad_batch_task_failure_count": 0,
"ad_total_batch_task_execution_count": 27,
"ad_executing_batch_task_count": 4
},
"TQDUXEzyTJyV0H6_T4hYUw": {
"ad_execute_request_count": 0,
"models": [
{
"detector_id": "Zi5zTXwBwf_U8gjUTfJG",
"model_type": "entity",
"last_used_time": 1633398375004,
"model_id": "Zi5zTXwBwf_U8gjUTfJG_entity_error24",
"last_checkpoint_time": 1633388177359,
"entity": [
{
"name": "error_type",
"value": "error24"
}
]
},
...
],
"ad_canceled_batch_task_count": 0,
"ad_hc_execute_request_count": 0,
"ad_hc_execute_failure_count": 0,
"model_count": 22,
"ad_execute_failure_count": 0,
"ad_batch_task_failure_count": 0,
"ad_total_batch_task_execution_count": 28,
"ad_executing_batch_task_count": 3
}
}
}
model_count 매개변수는 각 노드의 메모리에서 실행 중인 모델의 총 개수를 보여줘요.
히스토리컬 분석을 위해 다음 필드의 값을 볼 수 있어요:
ad_total_batch_task_execution_countad_executing_batch_task_countad_canceled_batch_task_countad_batch_task_failure_count
히스토리컬 분석을 실행하지 않은 경우 이 값은 0으로 표시돼요.
특정 노드의 모든 통계를 가져오려면:
요청 예시
GET _plugins/_anomaly_detection/{nodeId}/stats
노드의 특정 통계를 가져오려면:
요청 예시
GET _plugins/_anomaly_detection/{nodeId}/stats/{stat}
예를 들어, SWD7ihu9TaaW1zKwFZNVNg 노드의 ad_execute_request_count 값을 가져오려면:
GET _plugins/_anomaly_detection/SWD7ihu9TaaW1zKwFZNVNg/stats/ad_execute_request_count
응답 예시
{
"nodes": {
"SWD7ihu9TaaW1zKwFZNVNg": {
"ad_execute_request_count": 12
}
}
}
특정 유형의 통계를 가져오려면:
요청 예시
GET _plugins/_anomaly_detection/stats/{stat}
예를 들어:
GET _plugins/_anomaly_detection/stats/ad_executing_batch_task_count
응답 예시
{
"nodes": {
"2Z4q22BySEyzakYt_A0A2A": {
"ad_executing_batch_task_count": 3
},
"SWD7ihu9TaaW1zKwFZNVNg": {
"ad_executing_batch_task_count": 3
},
"TQDUXEzyTJyV0H6_T4hYUw": {
"ad_executing_batch_task_count": 4
}
}
}
탐지기 프로파일
Introduced 1.0 {: .label .label-purple }
탐지기 문제 해결을 돕기 위해 현재 오류 및 샤인글 크기를 포함한 탐지기의 현재 상태와 메모리 사용량에 대한 정보를 반환해요.
이 명령은 각 탐지기에 대해 이상 탐지 작업을 실행하는 노드를 식별하여 로그를 찾는 데 도움을 줘요.
또한 초기화 비율, 필요한 샤인글, 예상 남은 시간을 추적하는 데 도움을 줘요.
요청 예시
GET _plugins/_anomaly_detection/detectors/{detectorId}/_profile/
GET _plugins/_anomaly_detection/detectors/{detectorId}/_profile?_all=true
GET _plugins/_anomaly_detection/detectors/{detectorId}/_profile/{type}
GET _plugins/_anomaly_detection/detectors/{detectorId}/_profile/{type1},{type2}
응답 예시
GET _plugins/_anomaly_detection/detectors/{detectorId}/_profile
{
"state": "DISABLED",
"error": "Stopped detector: AD models memory usage exceeds our limit."
}
GET _plugins/_anomaly_detection/detectors/{detectorId}/_profile?_all=true&pretty
{
"state": "RUNNING",
"error": "",
"models": [
{
"model_id": "3Dh6TXwBwf_U8gjURE0F_entity_KSLSh0Wv05RQXiBAQHTEZg",
"entity": [
{
"name": "ip",
"value": "192.168.1.1"
},
{
"name": "error_type",
"value": "error8"
}
],
"model_size_in_bytes": 403491,
"node_id": "2Z4q22BySEyzakYt_A0A2A"
},
...
],
"total_size_in_bytes": 12911712,
"init_progress": {
"percentage": "100%"
},
"total_entities": 33,
"active_entities": 32,
"ad_task": {
"ad_task": {
"task_id": "D3I5TnwBYwCbWecg7lN9",
"last_update_time": 1633399993685,
"started_by": "admin",
"state": "RUNNING",
"detector_id": "3Dh6TXwBwf_U8gjURE0F",
"task_progress": 0,
"init_progress": 0,
"execution_start_time": 1633399991933,
"is_latest": true,
"task_type": "HISTORICAL_HC_DETECTOR",
"coordinating_node": "2Z4q22BySEyzakYt_A0A2A",
"detector": {
"name": "testhc-mc",
"description": "test",
"time_field": "timestamp",
"indices": [
"server_log"
],
"filter_query": {
"match_all": {
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 5,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "2zh6TXwBwf_U8gjUQ039",
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"ui_metadata": {
"features": {
"test": {
"aggregationBy": "sum",
"aggregationOf": "value",
"featureType": "simple_aggs"
}
},
"filters": []
},
"last_update_time": 1633387430916,
"category_field": [
"ip",
"error_type"
],
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
},
"detector_type": "MULTI_ENTITY"
},
"detection_date_range": {
"start_time": 1632793800000,
"end_time": 1633398600000
},
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
}
},
"node_id": "2Z4q22BySEyzakYt_A0A2A",
"task_id": "D3I5TnwBYwCbWecg7lN9",
"task_type": "HISTORICAL_HC_DETECTOR",
"detector_task_slots": 10,
"total_entities_count": 32,
"pending_entities_count": 22,
"running_entities_count": 10,
"running_entities": [ """[{"name":"ip","value":"192.168.1.1"},{"name":"error_type","value":"error9"}]""",
...],
"entity_task_profiles": [
{
"shingle_size": 8,
"rcf_total_updates": 1994,
"threshold_model_trained": true,
"threshold_model_training_data_size": 0,
"model_size_in_bytes": 1593240,
"node_id": "2Z4q22BySEyzakYt_A0A2A",
"entity": [
{
"name": "ip",
"value": "192.168.1.1"
},
{
"name": "error_type",
"value": "error7"
}
],
"task_id": "E3I5TnwBYwCbWecg9FMm",
"task_type": "HISTORICAL_HC_ENTITY"
},
...
]
},
"model_count": 32
}
GET _plugins/_anomaly_detection/detectors/{detectorId}/_profile/total_size_in_bytes
{
"total_size_in_bytes": 13369344
}
히스토리컬 분석에서만 ad_task 필드를 볼 수 있어요.
model_count 매개변수는 탐지기가 각 노드의 메모리에서 실행하는 모델의 총 개수를 보여줘요. 클러스터에서 여러 모델을 실행 중이고 그 개수를 알고 싶을 때 유용해요.
카테고리 필드를 구성한 경우 필드의 고유 값 개수와 메모리에서 모델이 실행 중인 모든 활성 엔터티를 볼 수 있어요.
이 데이터를 사용하여 이상 탐지에 필요한 메모리 양을 추정할 수 있으므로 클러스터 크기를 결정하는 데 도움이 돼요. 예를 들어, 탐지기에 백만 개의 엔터티가 있고 그중 10개만 메모리에서 활성 상태인 경우 클러스터를 확장하거나 추가해야 해요.
단일 엔터티 탐지기의 경우:
응답 예시
{
"state": "INIT",
"total_size_in_bytes": 0,
"init_progress": {
"percentage": "0%",
"needed_shingles": 128
},
"ad_task": {
"ad_task": {
"task_id": "cfUNOXwBFLNqSEcxAlde",
"last_update_time": 1633044731640,
"started_by": "admin",
"state": "RUNNING",
"detector_id": "qL4NOXwB__6eNorTAKtJ",
"task_progress": 0.49603173,
"init_progress": 1,
"current_piece": 1632739800000,
"execution_start_time": 1633044726365,
"is_latest": true,
"task_type": "HISTORICAL_SINGLE_ENTITY",
"coordinating_node": "bCtWtxWPThq0BIn5P5I4Xw",
"worker_node": "dIyavWhmSYWGz65b4u-lpQ",
"detector": {
"name": "detector1",
"description": "test",
"time_field": "timestamp",
"indices": [
"server_log"
],
"filter_query": {
"match_all": {
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 5,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "p74NOXwB__6eNorTAKss",
"feature_name": "test-feature",
"feature_enabled": true,
"aggregation_query": {
"test_feature": {
"sum": {
"field": "value"
}
}
}
}
],
"ui_metadata": {
"features": {
"test-feature": {
"aggregationBy": "sum",
"aggregationOf": "value",
"featureType": "simple_aggs"
}
},
"filters": []
},
"last_update_time": 1633044725832,
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
},
"detector_type": "SINGLE_ENTITY"
},
"detection_date_range": {
"start_time": 1632439925885,
"end_time": 1633044725885
},
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
}
},
"shingle_size": 8,
"rcf_total_updates": 1994,
"threshold_model_trained": true,
"threshold_model_training_data_size": 0,
"model_size_in_bytes": 1593240,
"node_id": "dIyavWhmSYWGz65b4u-lpQ",
"detector_task_slots": 1
}
}
total_entities 매개변수는 탐지기의 카테고리 필드 수를 포함한 총 엔터티 수를 보여줘요.
엔터티의 총 개수를 가져오는 것은 둘 이상의 카테고리 필드가 있는 탐지기의 실시간 분석에 비용이 많이 드는 작업이에요. 기본적으로 실시간 탐지 프로파일의 경우 탐지기는 최대 10,000개까지 엔터티 수를 계산해요. 히스토리컬 분석의 경우 Anomaly Detection 플러그인은 기본적으로 상위 1,000개의 엔터티만 감지하고 상위 엔터티를 메모리에 캐시하므로 히스토리컬 분석을 위해 엔터티의 총 개수를 가져오는 데 비용이 많이 들지 않아요.
profile 작업은 또한 각 엔터티에 대한 정보를 제공해요. 예를 들어 엔터티의 last_sample_timestamp 및 last_active_timestamp와 같은 정보요. last_sample_timestamp는 엔터티를 포함하는 입력 데이터 소스 인덱스의 마지막 문서를 보여주고, last_active_timestamp는 엔터티의 모델이 모델 캐시에서 마지막으로 확인된 타임스탬프를 보여줘요.
엔터티에 대한 이상 결과가 없는 경우 엔터티에 샘플 데이터가 없거나 메모리 및 디스크 IO와 같은 리소스가 엔터티 수에 비해 제한되어 있기 때문이에요.
요청 예시
GET _plugins/_anomaly_detection/detectors/{detectorId}/_profile?_all=true
{
"entity": [
{
"name": "host",
"value": "i-00f28ec1eb8997686"
}
]
}
응답 예시
{
"is_active": true,
"last_active_timestamp": 1604026394879,
"last_sample_timestamp": 1604026394879,
"init_progress": {
"percentage": "100%"
},
"model": {
"model_id": "TFUdd3UBBwIAGQeRh5IS_entity_i-00f28ec1eb8997686",
"model_size_in_bytes": 712480,
"node_id": "MQ-bTBW3Q2uU_2zX3pyEQg"
},
"state": "RUNNING"
}
히스토리컬 분석에 대해서만 프로파일 정보를 가져오려면 ad_task를 지정해요. _all을 지정하는 것은 다중 카테고리 고카디널리티 탐지기에 비용이 많이 드는 작업이에요.
요청 예시
GET _plugins/_anomaly_detection/detectors/{detectorId}/_profile?_all
GET _plugins/_anomaly_detection/detectors/{detectorId}/_profile/ad_task
응답 예시
{
"ad_task": {
"ad_task": {
"task_id": "CHI0TnwBYwCbWecgqgRA",
"last_update_time": 1633399648413,
"started_by": "admin",
"state": "RUNNING",
"detector_id": "3Dh6TXwBwf_U8gjURE0F",
"task_progress": 0,
"init_progress": 0,
"execution_start_time": 1633399646784,
"is_latest": true,
"task_type": "HISTORICAL_HC_DETECTOR",
"coordinating_node": "2Z4q22BySEyzakYt_A0A2A",
"detector": {
"name": "testhc-mc",
"description": "test",
"time_field": "timestamp",
"indices": [
"server_log"
],
"filter_query": {
"match_all": {
"boost": 1
}
},
"detection_interval": {
"period": {
"interval": 5,
"unit": "Minutes"
}
},
"window_delay": {
"period": {
"interval": 1,
"unit": "Minutes"
}
},
"shingle_size": 8,
"schema_version": 0,
"feature_attributes": [
{
"feature_id": "2zh6TXwBwf_U8gjUQ039",
"feature_name": "test",
"feature_enabled": true,
"aggregation_query": {
"test": {
"sum": {
"field": "value"
}
}
}
}
],
"ui_metadata": {
"features": {
"test": {
"aggregationBy": "sum",
"aggregationOf": "value",
"featureType": "simple_aggs"
}
},
"filters": []
},
"last_update_time": 1633387430916,
"category_field": [
"ip",
"error_type"
],
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
},
"detector_type": "MULTI_ENTITY"
},
"detection_date_range": {
"start_time": 1632793800000,
"end_time": 1633398600000
},
"user": {
"name": "admin",
"backend_roles": [
"admin"
],
"roles": [
"own_index",
"all_access"
],
"custom_attribute_names": [],
"user_requested_tenant": "__user__"
}
},
"node_id": "2Z4q22BySEyzakYt_A0A2A",
"task_id": "CHI0TnwBYwCbWecgqgRA",
"task_type": "HISTORICAL_HC_DETECTOR",
"detector_task_slots": 10,
"total_entities_count": 32,
"pending_entities_count": 22,
"running_entities_count": 10,
"running_entities" : [
"""[{"name":"ip","value":"192.168.1.1"},{"name":"error_type","value":"error9"}]""",
...
],
"entity_task_profiles": [
{
"shingle_size": 8,
"rcf_total_updates": 994,
"threshold_model_trained": true,
"threshold_model_training_data_size": 0,
"model_size_in_bytes": 1593240,
"node_id": "2Z4q22BySEyzakYt_A0A2A",
"entity": [
{
"name": "ip",
"value": "192.168.1.1"
},
{
"name": "error_type",
"value": "error6"
}
],
"task_id": "9XI0TnwBYwCbWecgsAd6",
"task_type": "HISTORICAL_HC_ENTITY"
},
...
]
}
}
탐지기 결과 삭제
Introduced 1.1 {: .label .label-purple }
쿼리를 기반으로 탐지기의 결과를 삭제해요.
탐지기 결과 삭제 API는 기본 결과 인덱스의 이상 결과 문서만 삭제해요. 사용자 정의 결과 인덱스에 저장된 이상 결과 문서는 삭제를 지원하지 않아요.
사용자 정의 결과 인덱스에서 필요하지 않은 이상 결과 문서는 수동으로 삭제해야 해요.
요청 예시
DELETE _plugins/_anomaly_detection/detectors/results
{
"query": {
"bool": {
"filter": [
{
"term": {
"detector_id": {
"value": "rlDtOHwBD5tpxlbyW7Nt"
}
}
},
{
"term": {
"task_id": {
"value": "TM3tOHwBCi2h__AOXlyQ"
}
}
},
{
"range": {
"data_start_time": {
"lte": 1632441600000
}
}
}
]
}
}
}
응답 예시
{
"took": 48,
"timed_out": false,
"total": 28,
"updated": 0,
"created": 0,
"deleted": 28,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1,
"throttled_until_millis": 0,
"failures": []
}
모니터 생성
Introduced 1.0 {: .label .label-purple }
탐지기에 대한 알림을 설정하기 위해 모니터를 생성해요.
요청 예시
POST _plugins/_alerting/monitors
{
"type": "monitor",
"name": "test-monitor",
"enabled": true,
"schedule": {
"period": {
"interval": 20,
"unit": "MINUTES"
}
},
"inputs": [
{
"search": {
"indices": [
".opensearch-anomaly-results*"
],
"query": {
"size": 1,
"query": {
"bool": {
"filter": [
{
"range": {
"data_end_time": {
"from": "{{period_end}}||-20m",
"to": "{{period_end}}",
"include_lower": true,
"include_upper": true,
"boost": 1
}
}
},
{
"term": {
"detector_id": {
"value": "m4ccEnIBTXsGi3mvMt9p",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"sort": [
{
"anomaly_grade": {
"order": "desc"
}
},
{
"confidence": {
"order": "desc"
}
}
],
"aggregations": {
"max_anomaly_grade": {
"max": {
"field": "anomaly_grade"
}
}
}
}
}
}
],
"triggers": [
{
"name": "test-trigger",
"severity": "1",
"condition": {
"script": {
"source": "return ctx.results[0].aggregations.max_anomaly_grade.value != null && ctx.results[0].aggregations.max_anomaly_grade.value > 0.7 && ctx.results[0].hits.hits[0]._source.confidence > 0.7",
"lang": "painless"
}
},
"actions": [
{
"name": "test-action",
"destination_id": "ld7912sBlQ5JUWWFThoW",
"message_template": {
"source": "This is my message body."
},
"throttle_enabled": false,
"subject_template": {
"source": "TheSubject"
}
}
]
}
]
}
응답 예시
{
"_id": "OClTEnIBmSf7y6LP11Jz",
"_version": 1,
"_seq_no": 10,
"_primary_term": 1,
"monitor": {
"type": "monitor",
"schema_version": 1,
"name": "test-monitor",
"enabled": true,
"enabled_time": 1589445384043,
"schedule": {
"period": {
"interval": 20,
"unit": "MINUTES"
}
},
"inputs": [
{
"search": {
"indices": [
".opensearch-anomaly-results*"
],
"query": {
"size": 1,
"query": {
"bool": {
"filter": [
{
"range": {
"data_end_time": {
"from": "{{period_end}}||-20m",
"to": "{{period_end}}",
"include_lower": true,
"include_upper": true,
"boost": 1
}
}
},
{
"term": {
"detector_id": {
"value": "m4ccEnIBTXsGi3mvMt9p",
"boost": 1
}
}
}
],
"adjust_pure_negative": true,
"boost": 1
}
},
"sort": [
{
"anomaly_grade": {
"order": "desc"
}
},
{
"confidence": {
"order": "desc"
}
}
],
"aggregations": {
"max_anomaly_grade": {
"max": {
"field": "anomaly_grade"
}
}
}
}
}
}
],
"triggers": [
{
"id": "NilTEnIBmSf7y6LP11Jr",
"name": "test-trigger",
"severity": "1",
"condition": {
"script": {
"source": "return ctx.results[0].aggregations.max_anomaly_grade.value != null && ctx.results[0].aggregations.max_anomaly_grade.value > 0.7 && ctx.results[0].hits.hits[0]._source.confidence > 0.7",
"lang": "painless"
}
},
"actions": [
{
"id": "NylTEnIBmSf7y6LP11Jr",
"name": "test-action",
"destination_id": "ld7912sBlQ5JUWWFThoW",
"message_template": {
"source": "This is my message body.",
"lang": "mustache"
},
"throttle_enabled": false,
"subject_template": {
"source": "TheSubject",
"lang": "mustache"
}
}
]
}
],
"last_update_time": 1589445384043
}
}