Source step functions - wildberries-tech/universal-harvester GitHub Wiki
Для каждого источника в Universal Harvester написана одна или несколько функций получения данных. Для каждой функции могут быть определены обязательные параметры или блоки шага query.
Elastic
generic_query
Получение данных из elastic, ровно тех, которые вы можете получить с помощью интерфейса Discover в Kibana. Получение не ограничено по объёму данных и количеству записей.
{
"description": "Поиск по логу DNS",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "generic_query",
"input_parameters":
{
"timestamp_start":
{
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S.%f%z",
"required": true,
"default": "now",
"description": "Опорное время поиска (start)."
},
"timestamp_stop":
{
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S.%f%z",
"required": true,
"default": "now",
"description": "Опорное время поиска (stop)."
},
"search_value":
{
"type": "string",
"max_length": 100,
"required": true,
"description": "То, что мы ищем, мультипоиск по всем полям, возможен wildcard."
}
},
"query":
{
"index": "index-*",
"size": 1000,
"search_after_shift": -10,
"sort":
[
{
"@timestamp":
{
"order": "desc",
"unmapped_type": "boolean"
}
}
],
"fields":
[
{
"field": "srcip",
"include_unmapped": "true"
},
{
"field": "srcport",
"include_unmapped": "true"
},
{
"field": "domain_name",
"include_unmapped": "true"
},
{
"field": "@timestamp",
"format": "strict_date_optional_time"
}
],
"query":
{
"bool":
{
"must":
[],
"filter":
[
{
"bool":
{
"should":
[
{
"match_phrase":
{
"domain_name": "%(search_value)s"
}
}
],
"minimum_should_match": 1
}
},
{
"range":
{
"@timestamp":
{
"format": "strict_date_optional_time",
"gte": "%(timestamp_start)s",
"lte": "%(timestamp_stop)s"
}
}
}
],
"should":
[],
"must_not":
[]
}
}
},
"generate_parameters":
{
"lte":
{
"type": "copy",
"copy_source": "timestamp_stop"
}
}
}
aggs_query
Получение данных из elastic, как в интерфейсе aggregation table.
{
"description": "",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "aggs_query",
"input_parameters":
{
"timestamp_field":
{
"type": "string",
"max_length": 100,
"required": false,
"default": "@timestamp",
"description": "Наиболее релевантное поле времени"
},
"timestamp":
{
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S.%f%z",
"required": false,
"default": "now",
"description": "Опорное время поиска, от него берутся дельты в секундах."
},
"time_delta":
{
"type": "integer",
"required": false,
"default": 172800,
"description": "Дельта времени в секундах."
},
"target_search_field":
{
"type": "string",
"max_length": 100,
"required": false,
"default": "value",
"description": "Поле в применяемых данных с целью поиска"
},
"target_data":
{
"type": "string",
"max_length": 100,
"required": false,
"default": "unique_values",
"description": "Имя применяемых данных"
}
},
"query":
{
"index": "foobar-events",
"size": 0,
"aggs":
{
"2":
{
"terms":
{
"field": "address",
"order":
{
"_count": "desc"
},
"missing": "__missing__",
"size": 500
},
"aggs":
{
"3":
{
"terms":
{
"field": "hid",
"order":
{
"_count": "desc"
},
"missing": "__missing__",
"size": 50000
},
"aggs":
{
"4":
{
"terms":
{
"field": "hostname",
"order":
{
"_count": "desc"
},
"missing": "__missing__",
"size": 50000
},
"aggs":
{
"5":
{
"min":
{
"field": "%(timestamp_field)s"
}
},
"6":
{
"max":
{
"field": "%(timestamp_field)s"
}
}
}
}
}
}
}
}
},
"query":
{
"bool":
{
"must":
[],
"filter":
[
{
"multi_match":
{
"type": "phrase",
"query": "%(search_value)s",
"lenient": true
}
},
{
"match_phrase":
{
"logger": "foobar"
}
},
{
"range":
{
"%(timestamp_field)s":
{
"format": "strict_date_optional_time",
"gte": "%(gte)s",
"lte": "%(lte)s"
}
}
}
],
"should":
[],
"must_not":
[]
}
}
},
"apply":
{
"target_data": "%(target_data)s",
"target_parameters":
[
{
"column_name": "%(target_search_field)s",
"as": "search_value"
}
]
},
"generate_parameters":
{
"gte":
{
"type": "-timedelta",
"timestamp_field": "timestamp",
"delta_field": "time_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
},
"lte":
{
"type": "+timedelta",
"timestamp_field": "timestamp",
"delta_field": "time_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
}
}
}
pid_hierarchy
Последовательность запросов по восстановлению иерархии pid->parent_pid.
{
"description": "Построение дерева процессов по указанному процессу",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function":"pid_hierarchy",
"input_parameters": {
"timestamp_field": {
"type": "string",
"max_length": 100,
"required": false,
"default": "process.start",
"description":"Актуальное поле времени запуска процесса"
},
"timestamp": {
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S%z",
"required": true,
"default": "now",
"description":"Время запуска целевого процесса"
},
"host_search_field": {
"type": "string",
"max_length": 100,
"required": false,
"default": "hid",
"description":"По какому полю идентифицируем хост"
},
"host_search_field_value": {
"type": "string",
"max_length": 100,
"required": true,
"default": "Please fill a hid",
"description":"Идентификатор хоста"
},
"process_pid": {
"type": "integer",
"required": true,
"default": 0,
"description":"Process ID, по которому хотим узнать иерархию"
},
"parent_deep": {
"type": "integer",
"required": false,
"default": 16,
"description":"Глубина поиска родителей"
},
"parent_delta": {
"type": "integer",
"required": false,
"default": 86000,
"description":"Глубина поиска родителей в секундах"
},
"child_deep": {
"type": "integer",
"required": false,
"default": 8,
"description":"Глубина поиска детей"
},
"child_delta": {
"type": "integer",
"required": false,
"default": 2600,
"description":"Глубина поиска детей в секундах"
},
"index": {
"type": "string",
"max_length": 100,
"required": false,
"default": "audit-*",
"description":"В каком индексе ищем."
}
},
"query":
{
"index": "%(index)s",
"size": 1000,
"search_after_shift": -10,
"sort": [{"%(timestamp_field)s": {"order": "desc","unmapped_type": "boolean"}}],
"fields": [{"field": "*","include_unmapped": "true"}],
"query":{"bool":{"must":[],"filter":[{"range":{"%(timestamp_field)s":{"format":"strict_date_optional_time","gte":"%(timestamp)s","lte":"%(timestamp)s"}}},{"match_phrase":{"%(host_search_field)s":"%(host_search_field_value)s"}},{"match_phrase":{"pid":"%(process_pid)i"}}],"should":[],"must_not":[]}}
},
"generate_parameters":
{
"gte":
{
"type": "-timedelta",
"timestamp_field": "timestamp",
"delta_field": "parent_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
},
"lte":
{
"type": "+timedelta",
"timestamp_field": "timestamp",
"delta_field": "child_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
}
}
}
pid_siblings
Получение сиблингов процесса (список процессов того же родителя, что и у целевого процесса).
{
"description": "Поиск сиблингов (процессов с аналогичным parent pid)",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function":"pid_siblings",
"input_parameters": {
"timestamp_field": {
"type": "string",
"max_length": 100,
"required": false,
"default": "process.start",
"description":"Актуальное поле времени запуска процесса"
},
"timestamp": {
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S%z",
"required": true,
"default": "now",
"description":"Время запуска целевого процесса"
},
"host_search_field": {
"type": "string",
"max_length": 100,
"required": false,
"default": "hid",
"description":"По какому полю идентифицируем хост"
},
"host_search_field_value": {
"type": "string",
"max_length": 100,
"required": true,
"default": "Please fill a hid",
"description":"Идентификатор хоста"
},
"process_pid": {
"type": "integer",
"required": true,
"default": 0,
"description":"Process ID, по которому хотим узнать"
},
"parent_delta": {
"type": "integer",
"required": false,
"default": 86000,
"description":"Глубина поиска родителей в секундах"
},
"child_delta": {
"type": "integer",
"required": false,
"default": 2600,
"description":"Глубина поиска детей в секундах"
},
"index": {
"type": "string",
"max_length": 100,
"required": false,
"default": "audit-*",
"description":"В каком индексе elastic ищем"
}
},
"query":
{
"index": "%(index)s",
"size": 1000,
"search_after_shift": -10,
"sort": [{"%(timestamp_field)s": {"order": "desc","unmapped_type": "boolean"}}],
"fields": [{"field": "*","include_unmapped": "true"}],
"query":{"bool":{"must":[],"filter":[{"range":{"%(timestamp_field)s":{"format":"strict_date_optional_time","gte":"%(timestamp)s","lte":"%(timestamp)s"}}},{"match_phrase":{"%(host_search_field)s":"%(host_search_field_value)s"}},{"match_phrase":{"pid":"%(process_pid)i"}}],"should":[],"must_not":[]}}
},
"generate_parameters":
{
"gte":
{
"type": "-timedelta",
"timestamp_field": "timestamp",
"delta_field": "parent_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
},
"lte":
{
"type": "+timedelta",
"timestamp_field": "timestamp",
"delta_field": "child_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
}
}
}
Elastic proxypass (kibana)
generic_query
Получение данных из elastic, ровно тех, которые вы можете получить с помощью интерфейса Discover в Kibana. Получение не ограничено по объёму данных и количеству записей.
{
"description": "Поиск по логу DNS",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "generic_query",
"input_parameters":
{
"timestamp_start":
{
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S.%f%z",
"required": true,
"default": "now",
"description": "Опорное время поиска (start)."
},
"timestamp_stop":
{
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S.%f%z",
"required": true,
"default": "now",
"description": "Опорное время поиска (stop)."
},
"search_value":
{
"type": "string",
"max_length": 100,
"required": true,
"description": "То, что мы ищем, мультипоиск по всем полям, возможен wildcard."
},
"index": {
"type": "string",
"max_length": 100,
"required": false,
"default": "%(index)s",
"description":"В каком индексе ищем."
}
},
"query":
{
"url": "https://kibana.example.ru/api/console/proxy?path=/%(index)s/_search?batched_reduce_size=64&method=POST",
"size": 1000,
"search_after_shift": -10,
"sort":
[
{
"@timestamp":
{
"order": "desc",
"unmapped_type": "boolean"
}
}
],
"fields":
[
{
"field": "srcip",
"include_unmapped": "true"
},
{
"field": "srcport",
"include_unmapped": "true"
},
{
"field": "domain_name",
"include_unmapped": "true"
},
{
"field": "@timestamp",
"format": "strict_date_optional_time"
}
],
"query":
{
"bool":
{
"must":
[],
"filter":
[
{
"bool":
{
"should":
[
{
"match_phrase":
{
"domain_name": "%(search_value)s"
}
}
],
"minimum_should_match": 1
}
},
{
"range":
{
"@timestamp":
{
"format": "strict_date_optional_time",
"gte": "%(timestamp_start)s",
"lte": "%(timestamp_stop)s"
}
}
}
],
"should":
[],
"must_not":
[]
}
}
},
"generate_parameters":
{
"lte":
{
"type": "copy",
"copy_source": "timestamp_stop"
}
}
}
aggs_query
Получение данных из elastic, как в интерфейсе aggregation table.
{
"description": "",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "aggs_query",
"input_parameters":
{
"timestamp_field":
{
"type": "string",
"max_length": 100,
"required": false,
"default": "@timestamp",
"description": "Наиболее релевантное поле времени"
},
"timestamp":
{
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S.%f%z",
"required": false,
"default": "now",
"description": "Опорное время поиска, от него берутся дельты в секундах."
},
"time_delta":
{
"type": "integer",
"required": false,
"default": 172800,
"description": "Дельта времени в секундах."
},
"target_search_field":
{
"type": "string",
"max_length": 100,
"required": false,
"default": "value",
"description": "Поле в применяемых данных с целью поиска"
},
"target_data":
{
"type": "string",
"max_length": 100,
"required": false,
"default": "unique_values",
"description": "Имя применяемых данных"
},
"index": {
"type": "string",
"max_length": 100,
"required": false,
"default": "%(index)s",
"description":"В каком индексе ищем."
}
},
"query":
{
"url": "https://kibana.example.ru/api/console/proxy?path=/%(index)s/_search?batched_reduce_size=64&method=POST",
"size": 0,
"aggs":
{
"2":
{
"terms":
{
"field": "address",
"order":
{
"_count": "desc"
},
"missing": "__missing__",
"size": 500
},
"aggs":
{
"3":
{
"terms":
{
"field": "hid",
"order":
{
"_count": "desc"
},
"missing": "__missing__",
"size": 50000
},
"aggs":
{
"4":
{
"terms":
{
"field": "hostname",
"order":
{
"_count": "desc"
},
"missing": "__missing__",
"size": 50000
},
"aggs":
{
"5":
{
"min":
{
"field": "%(timestamp_field)s"
}
},
"6":
{
"max":
{
"field": "%(timestamp_field)s"
}
}
}
}
}
}
}
}
},
"query":
{
"bool":
{
"must":
[],
"filter":
[
{
"multi_match":
{
"type": "phrase",
"query": "%(search_value)s",
"lenient": true
}
},
{
"match_phrase":
{
"logger": "foobar"
}
},
{
"range":
{
"%(timestamp_field)s":
{
"format": "strict_date_optional_time",
"gte": "%(gte)s",
"lte": "%(lte)s"
}
}
}
],
"should":
[],
"must_not":
[]
}
}
},
"apply":
{
"target_data": "%(target_data)s",
"target_parameters":
[
{
"column_name": "%(target_search_field)s",
"as": "search_value"
}
]
},
"generate_parameters":
{
"gte":
{
"type": "-timedelta",
"timestamp_field": "timestamp",
"delta_field": "time_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
},
"lte":
{
"type": "+timedelta",
"timestamp_field": "timestamp",
"delta_field": "time_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
}
}
}
pid_hierarchy
Последовательность запросов по восстановлению иерархии pid->parent_pid.
{
"description": "Построение дерева процессов по указанному процессу",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function":"pid_hierarchy",
"input_parameters": {
"timestamp_field": {
"type": "string",
"max_length": 100,
"required": false,
"default": "process.start",
"description":"Актуальное поле времени запуска процесса"
},
"timestamp": {
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S%z",
"required": true,
"default": "now",
"description":"Время запуска целевого процесса"
},
"host_search_field": {
"type": "string",
"max_length": 100,
"required": false,
"default": "hid",
"description":"По какому полю идентифицируем хост"
},
"host_search_field_value": {
"type": "string",
"max_length": 100,
"required": true,
"default": "Please fill a hid",
"description":"Идентификатор хоста"
},
"process_pid": {
"type": "integer",
"required": true,
"default": 0,
"description":"Process ID, по которому хотим узнать иерархию"
},
"parent_deep": {
"type": "integer",
"required": false,
"default": 16,
"description":"Глубина поиска родителей"
},
"parent_delta": {
"type": "integer",
"required": false,
"default": 86000,
"description":"Глубина поиска родителей в секундах"
},
"child_deep": {
"type": "integer",
"required": false,
"default": 8,
"description":"Глубина поиска детей"
},
"child_delta": {
"type": "integer",
"required": false,
"default": 2600,
"description":"Глубина поиска детей в секундах"
},
"index": {
"type": "string",
"max_length": 100,
"required": false,
"default": "audit-*",
"description":"В каком индексе ищем."
}
},
"query":
{
"index": "%(index)s",
"url": "https://kibana.example.ru/api/console/proxy?path=/%(index)s/_search?batched_reduce_size=64&method=POST",
"size": 1000,
"search_after_shift": -10,
"sort": [{"%(timestamp_field)s": {"order": "desc","unmapped_type": "boolean"}}],
"fields": [{"field": "*","include_unmapped": "true"}],
"query":{"bool":{"must":[],"filter":[{"range":{"%(timestamp_field)s":{"format":"strict_date_optional_time","gte":"%(timestamp)s","lte":"%(timestamp)s"}}},{"match_phrase":{"%(host_search_field)s":"%(host_search_field_value)s"}},{"match_phrase":{"pid":"%(process_pid)i"}}],"should":[],"must_not":[]}}
},
"generate_parameters":
{
"gte":
{
"type": "-timedelta",
"timestamp_field": "timestamp",
"delta_field": "parent_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
},
"lte":
{
"type": "+timedelta",
"timestamp_field": "timestamp",
"delta_field": "child_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
}
}
}
pid_siblings
Получение сиблингов процесса (список процессов того же родителя, что и у целевого процесса).
{
"description": "Поиск сиблингов (процессов с аналогичным parent pid)",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function":"pid_siblings",
"input_parameters": {
"timestamp_field": {
"type": "string",
"max_length": 100,
"required": false,
"default": "process.start",
"description":"Актуальное поле времени запуска процесса"
},
"timestamp": {
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S%z",
"required": true,
"default": "now",
"description":"Время запуска целевого процесса"
},
"host_search_field": {
"type": "string",
"max_length": 100,
"required": false,
"default": "hid",
"description":"По какому полю идентифицируем хост"
},
"host_search_field_value": {
"type": "string",
"max_length": 100,
"required": true,
"default": "Please fill a hid",
"description":"Идентификатор хоста"
},
"process_pid": {
"type": "integer",
"required": true,
"default": 0,
"description":"Process ID, по которому хотим узнать"
},
"parent_delta": {
"type": "integer",
"required": false,
"default": 86000,
"description":"Глубина поиска родителей в секундах"
},
"child_delta": {
"type": "integer",
"required": false,
"default": 2600,
"description":"Глубина поиска детей в секундах"
},
"index": {
"type": "string",
"max_length": 100,
"required": false,
"default": "audit-*",
"description":"В каком индексе elastic ищем"
}
},
"query":
{
"index": "%(index)s",
"url": "https://kibana.example.ru/api/console/proxy?path=/%(index)s/_search?batched_reduce_size=64&method=POST",
"size": 1000,
"search_after_shift": -10,
"sort": [{"%(timestamp_field)s": {"order": "desc","unmapped_type": "boolean"}}],
"fields": [{"field": "*","include_unmapped": "true"}],
"query":{"bool":{"must":[],"filter":[{"range":{"%(timestamp_field)s":{"format":"strict_date_optional_time","gte":"%(timestamp)s","lte":"%(timestamp)s"}}},{"match_phrase":{"%(host_search_field)s":"%(host_search_field_value)s"}},{"match_phrase":{"pid":"%(process_pid)i"}}],"should":[],"must_not":[]}}
},
"generate_parameters":
{
"gte":
{
"type": "-timedelta",
"timestamp_field": "timestamp",
"delta_field": "parent_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
},
"lte":
{
"type": "+timedelta",
"timestamp_field": "timestamp",
"delta_field": "child_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
}
}
}
Opensearch
generic_query
Получение данных из opensearch, ровно тех, которые вы можете получить с помощью интерфейса Discover в Kibana. Получение не ограничено по объёму данных и количеству записей.
{
"description": "Поиск по логу DNS",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "generic_query",
"input_parameters":
{
"timestamp_start":
{
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S.%f%z",
"required": true,
"default": "now",
"description": "Опорное время поиска (start)."
},
"timestamp_stop":
{
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S.%f%z",
"required": true,
"default": "now",
"description": "Опорное время поиска (stop)."
},
"search_value":
{
"type": "string",
"max_length": 100,
"required": true,
"description": "То, что мы ищем, мультипоиск по всем полям, возможен wildcard."
}
},
"query":
{
"index": "index-*",
"size": 1000,
"search_after_shift": -10,
"sort":
[
{
"@timestamp":
{
"order": "desc",
"unmapped_type": "boolean"
}
}
],
"fields":
[
{
"field": "srcip",
"include_unmapped": "true"
},
{
"field": "srcport",
"include_unmapped": "true"
},
{
"field": "domain_name",
"include_unmapped": "true"
},
{
"field": "@timestamp",
"format": "strict_date_optional_time"
}
],
"query":
{
"bool":
{
"must":
[],
"filter":
[
{
"bool":
{
"should":
[
{
"match_phrase":
{
"domain_name": "%(search_value)s"
}
}
],
"minimum_should_match": 1
}
},
{
"range":
{
"@timestamp":
{
"format": "strict_date_optional_time",
"gte": "%(timestamp_start)s",
"lte": "%(timestamp_stop)s"
}
}
}
],
"should":
[],
"must_not":
[]
}
}
},
"generate_parameters":
{
"lte":
{
"type": "copy",
"copy_source": "timestamp_stop"
}
}
}
aggs_query
Получение данных из opensearch, как в интерфейсе aggregation table.
{
"description": "",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "aggs_query",
"input_parameters":
{
"timestamp_field":
{
"type": "string",
"max_length": 100,
"required": false,
"default": "@timestamp",
"description": "Наиболее релевантное поле времени"
},
"timestamp":
{
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S.%f%z",
"required": false,
"default": "now",
"description": "Опорное время поиска, от него берутся дельты в секундах."
},
"time_delta":
{
"type": "integer",
"required": false,
"default": 172800,
"description": "Дельта времени в секундах."
},
"target_search_field":
{
"type": "string",
"max_length": 100,
"required": false,
"default": "value",
"description": "Поле в применяемых данных с целью поиска"
},
"target_data":
{
"type": "string",
"max_length": 100,
"required": false,
"default": "unique_values",
"description": "Имя применяемых данных"
}
},
"query":
{
"index": "foobar-events",
"size": 0,
"aggs":
{
"2":
{
"terms":
{
"field": "address",
"order":
{
"_count": "desc"
},
"missing": "__missing__",
"size": 500
},
"aggs":
{
"3":
{
"terms":
{
"field": "hid",
"order":
{
"_count": "desc"
},
"missing": "__missing__",
"size": 50000
},
"aggs":
{
"4":
{
"terms":
{
"field": "hostname",
"order":
{
"_count": "desc"
},
"missing": "__missing__",
"size": 50000
},
"aggs":
{
"5":
{
"min":
{
"field": "%(timestamp_field)s"
}
},
"6":
{
"max":
{
"field": "%(timestamp_field)s"
}
}
}
}
}
}
}
}
},
"query":
{
"bool":
{
"must":
[],
"filter":
[
{
"multi_match":
{
"type": "phrase",
"query": "%(search_value)s",
"lenient": true
}
},
{
"match_phrase":
{
"logger": "foobar"
}
},
{
"range":
{
"%(timestamp_field)s":
{
"format": "strict_date_optional_time",
"gte": "%(gte)s",
"lte": "%(lte)s"
}
}
}
],
"should":
[],
"must_not":
[]
}
}
},
"apply":
{
"target_data": "%(target_data)s",
"target_parameters":
[
{
"column_name": "%(target_search_field)s",
"as": "search_value"
}
]
},
"generate_parameters":
{
"gte":
{
"type": "-timedelta",
"timestamp_field": "timestamp",
"delta_field": "time_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
},
"lte":
{
"type": "+timedelta",
"timestamp_field": "timestamp",
"delta_field": "time_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
}
}
}
Netbox
finder
Поиск данных по конкретному IP-адресу.
{
"description": "",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "finder",
"input_parameters":
{
"target": {
"type": "string",
"max_length": 100,
"required": true,
"description":"Что ищем в netbox, попадает в api параметр /api/ipam/ip-addresses/?q="
},
"fast_flag": {
"type": "boolean",
"required": false,
"default": true,
"description":"Флаг пропуска дополнительных поисков в /api/ipam/prefixes/?q= и /api/tenancy/contact-assignments/?object_id="
}
},
"query":{},
"generate_parameters":
{}
}
search_cidr_by_ip
Поиск ближайшего к запрашиваемому адресу cidr.
{
"description": "",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "search_cidr_by_ip",
"input_parameters":
{
"target": {
"type": "ip_address",
"required": true,
"description":"По какому адресу ищем узел или ближайшую сеть"
}
},
"query":{
"search_parameter":"target"
},
"generate_parameters":
{}
}
SQLite3 in memory
query
Основная функция преобразования и объединения данных (фильтрация, перестановка столбцов, переименование, JOIN, UNION, DISTINCT, GROUP BY и т.д., доступны все возможности sqlite3 + дополнительные функции). Таблицы соответствуют data_name в сценарии или outervision в отладочном запуске шага. Важно: обращение к data_name ведёт к ожиданию выполнения шага с этим data_name, от этого зависит последовательность выполнения шагов.
{
"description": "",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "query",
"input_parameters":{
"subject":{
"type": "string",
"max_length": 100,
"required": false,
"default":"subject",
"description": ""
}
},
"query":
{
"preparatory_queries":
[
"CREATE TABLE IF NOT EXISTS events (`foobar_1` TEXT, `foobar_2` TEXT, `foobar_3` TEXT, `foobar_histogram` TEXT);"
],
"final_query": "SELECT '%(subject)s' as subject, unixtime_to_iso_timestamp(`foobar_histogram`/1000) as timestamp, `foobar_1` as foobar_1_name, `foobar_2` as foobar_2_name, `foobar_3` as foobar_3_name FROM events ORDER BY `foobar_histogram`;"
},
"generate_parameters":
{}
}
additional sqlite3 functions
Для удобства обработки данных в sqlite3 были добавлены кастомные функции:
- regexp(pattern, string) -- найдено ли паттерн в строке;
- regexp_substr(pattern, string) -- все вхождения паттерна в строку, текстовая репрезентация листа;
- ip_is_private(ip_address) -- если ip-адрес относится к приватной сети, то возвращает 1, иначе 0;
- unixtime_to_iso_timestamp(unix_timestamp) -- преобразует unix_timestamp (миллисекунды) в iso формат;
- bytes_to_string(int_bytes) -- преобразует количество байт в pretty вид;
- ip_port2ip(ip_port) -- выделяет из конкатенации ip:port только ip;
- validate_ip_address(ip_address) -- проверяет ip-адрес на валидность;
- datetime_to_timestamp(string, format) -- преобразует текстовое время в unix_timestamp.
duckdb in memory step functions
query
Основная функция преобразования и объединения данных (фильтрация, перестановка столбцов, переименование, JOIN, UNION, DISTINCT, GROUP BY и т.д., доступны все возможности duckdb + дополнительные функции). Таблицы соответствуют data_name в сценарии или outervision в отладочном запуске шага. Важно: обращение к data_name ведёт к ожиданию выполнения шага с этим data_name, от этого зависит последовательность выполнения шагов. Для duckdb присутствует параметр type, который отвечает за представление данных: table или view. View работает быстрее на больших данных, но имеет определённые ограничения на модификации данных.
{
"description": "",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "query",
"input_parameters":{
"subject":{
"type": "string",
"max_length": 100,
"required": false,
"default":"subject",
"description": ""
}
},
"query":
{
"preparatory_queries":
[
"CREATE TABLE IF NOT EXISTS events (\"foobar_1\" TEXT, \"foobar_2\" TEXT, \"foobar_3\" TEXT, \"foobar_histogram\" TEXT);"
],
"final_query": "SELECT '%(subject)s' as subject, unixtime_to_iso_timestamp(\"foobar_histogram\"/1000) as timestamp, \"foobar_1\" as foobar_1_name, \"foobar_2\" as foobar_2_name, \"foobar_3\" as foobar_3_name FROM events ORDER BY \"foobar_histogram\";",
"type":"table"
},
"generate_parameters":
{}
}
additional duckdb functions
Для удобства обработки данных в sqlite3 были добавлены кастомные функции:
- regexp(pattern, string) -- найдено ли паттерн в строке;
- regexp_substr(pattern, string) -- все вхождения паттерна в строку, текстовая репрезентация листа;
- ip_is_private(ip_address) -- если ip-адрес относится к приватной сети, то возвращает 1, иначе 0;
- unixtime_to_iso_timestamp(unix_timestamp) -- преобразует unix_timestamp (миллисекунды) в iso формат;
- bytes_to_string(int_bytes) -- преобразует количество байт в pretty вид;
- ip_port2ip(ip_port) -- выделяет из конкатенации ip:port только ip;
- validate_ip_address(ip_address) -- проверяет ip-адрес на валидность;
- datetime_to_timestamp(string, format) -- преобразует текстовое время в unix_timestamp.
PostgreSQL
query
{
"description": "",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "query",
"input_parameters":{
"subject":{
"type": "string",
"max_length": 100,
"required": false,
"default":"subject",
"description": ""
}
},
"query":
{
"preparatory_queries":[],
"final_query": "SELECT foobar_1, foobar_2, foobar_3, foobar_4 FROM foobar_table WHERE foobar_1='%(subject)s' ORDER BY foobar_2 DESC LIMIT 10;"
},
"generate_parameters":
{}
}
MSSQL step functions
query
{
"description": "",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "query",
"input_parameters":{
"subject":{
"type": "string",
"max_length": 100,
"required": false,
"default":"subject",
"description": ""
}
},
"query":
{
"preparatory_queries":[],
"final_query": "SELECT foobar_1, foobar_2, foobar_3, foobar_4 FROM foobar_table WHERE foobar_1='%(subject)s' ORDER BY foobar_2 DESC LIMIT 10;"
},
"generate_parameters":
{}
}
MySQL
query
{
"description": "",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "query",
"input_parameters":{
"subject":{
"type": "string",
"max_length": 100,
"required": false,
"default":"subject",
"description": ""
}
},
"query":
{
"preparatory_queries":[],
"final_query": "SELECT foobar_1, foobar_2, foobar_3, foobar_4 FROM foobar_table WHERE foobar_1='%(subject)s' ORDER BY foobar_2 DESC LIMIT 10;"
},
"generate_parameters":
{}
}
DNS
query
{
"description": "Разыменовывание dns имени",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "query",
"input_parameters":{
"domain_name": {
"type": "string",
"max_length": 100,
"required": true,
"description":""
}
},
"query":{},
"generate_parameters":{}
}
GitLab
get_namespace_owner
Получение owner по неймспейсу gitlab.
{
"description": "",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "query",
"input_parameters":{
"namespace": {
"type": "string",
"max_length": 100,
"required": true,
"description":""
},
"project_id": {
"type": "string",
"max_length": 100,
"required": false,
"default": "12345",
"description":""
}
},
"query":{},
"generate_parameters":{}
}
search
Стандартный поиск по gitlab.
{
"description": "",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "query",
"input_parameters":{
"target": {
"type": "string",
"max_length": 100,
"required": true,
"description":""
},
"scope": {
"type": "string",
"max_length": 100,
"required": false,
"default": "blobs",
"description":""
}
},
"query":{},
"generate_parameters":{}
}
Iris IRP
get_all_alerts
{
"description": "",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "get_all_alerts",
"input_parameters":{
"search_value": {
"type": "string",
"max_length": 100,
"required": true,
"description":""
},
"start_date": {
"type": "datetime",
"format": "%Y-%m-%d",
"required": true,
"description":""
},
"end_date": {
"type": "datetime",
"format": "%Y-%m-%d",
"required": true,
"description":""
}
},
"query":{
"per_page":10000,
"search_field":"alert_assets"
},
"generate_parameters":{}
}
Teleport
get_hosts
{
"description": "Получение информации о хостах",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "get_hosts",
"input_parameters":{},
"query":{
"ttl":600
},
"generate_parameters":{}
}
YouTrack
search_in_project
Поиск в выбранном проетке.
{
"description": "Получение данных из youtrack по карточкам (issue) в проекте",
"example": "",
"llm":
{
"preprompt": "Данные из youtrack (issue)",
"postprompt": ""
},
"source_function": "search_in_project",
"input_parameters":{
"target": {
"type": "string",
"max_length": 100,
"required": true,
"description":"Что ищем"
},
"project_id": {
"type": "string",
"max_length": 100,
"required": false,
"description":"12345"
}
},
"query":{
"fields": ["idReadable", "description", "summary", "created", "updated", "resolved"]
},
"generate_parameters":{}
}
search_in_all_projects
Поиск по всем проектам.
{
"description": "Получение данных из youtrack по карточкам (issue)",
"example": "",
"llm":
{
"preprompt": "Данные из youtrack (issue)",
"postprompt": ""
},
"source_function": "search_in_all_projects",
"input_parameters":{
"target": {
"type": "string",
"max_length": 100,
"required": true,
"description":"Что ищем"
}
},
"query":{
"fields": ["idReadable", "description", "summary", "created", "updated", "resolved"]
},
"generate_parameters":{}
}
search_in_all_articles
Поиск по базе знаний.
{
"description": "Получение данных из youtrack (база знаний)",
"example": "",
"llm":
{
"preprompt": "Данные из youtrack (база знаний)",
"postprompt": ""
},
"source_function": "search_in_all_articles",
"input_parameters":{
"target": {
"type": "string",
"max_length": 100,
"required": true,
"description":"Что ищем"
},
"top": {
"type": "integer",
"required": false,
"default": 100,
"description":"Количество забираемых записей из youtrack"
},
"with_content_flag": {
"type": "boolean",
"required": false,
"default": false,
"description":"Флаг загрузки контента статей"
}
},
"query":{
"fields": ["idReadable", "summary", "created", "updated"],
"fields_with_content": ["idReadable", "summary", "created", "updated", "content"]
},
"generate_parameters":{}
}
Grafana
get_table
Позволяет получить таблицу с данными из grafana.
{
"description": "Получение данных из grafana",
"example": "",
"llm":
{
"preprompt": "Инвентаризационные данные из grafana",
"postprompt": ""
},
"source_function": "get_table",
"input_parameters":{
"timestamp": {
"type": "datetime",
"format": "%Y-%m-%dT%H:%M:%S.%f%z",
"required": false,
"default": "now",
"description":"Опорное время поиска, от него берутся дельты в секундах."
},
"time_delta": {
"type": "integer",
"required": false,
"default": 1800,
"description":"Дельта времени в секундах"
}
},
"query":{
"api_path": "/api/ds/query/",
"datasource_type": "prometheus",
"expr":"probe_success{foo=\"bar\"}",
"server_timezone":"Europe/Moscow",
"ttl":600,
"data_source_uid": {"foo": "bar"}
},
"generate_parameters":
{
"gte":
{
"type": "-timedelta",
"timestamp_field": "timestamp",
"delta_field": "time_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
},
"lte":
{
"type": "+timedelta",
"timestamp_field": "timestamp",
"delta_field": "time_delta",
"output_format": "%Y-%m-%dT%H:%M:%S.%f%z"
}
}
}
Pandas
dynamic_aggr
Кастомная функция pandas, динамическая агрегация предполагает максимальное сжатие данных по выбранным полям (значения объединяются в list).
"TBD":"TBD"
aggr
Стандартное агрегирование данных с помощью pandas.
{
"description": "Агрегация данных",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "aggr",
"input_parameters":{
"target_data": {
"type": "string",
"max_length": 100,
"required": true,
"default": "target_data",
"description":"Данные для агрегирования"
},
"list_to_str_dict": {
"type": "dict",
"required": false,
"default": {},
"description":"Правило преобразования поля pandas list->str"
},
"groupby_list": {
"type": "list",
"required": true,
"default": [],
"description":"Поля агрегирования помимо поля времени key"
},
"agg_dict": {
"type": "dict",
"required": true,
"default": {},
"description":"Описание агрегации pandas"
}
},
"query":
{
"target_data":"%(target_data)s",
"list_to_str_dict":"%(list_to_str_dict)d",
"groupby_list":"%(groupby_list)l",
"agg_dict":"%(agg_dict)d"
},
"generate_parameters":
{}
}
time_grouper_aggr
Стандартное агрегирование данных с помощью pandas + добавление группировки по времени.
{
"description": "Агрегация данных по периодам времени",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "time_grouper_aggr",
"input_parameters":{
"frequency": {
"type": "string",
"max_length": 100,
"required": false,
"default": "600s",
"description":"Период агрегирования"
},
"key": {
"type": "string",
"max_length": 100,
"required": true,
"default": "timestamp",
"description":"Поле времени"
},
"format": {
"type": "string",
"max_length": 100,
"required": false,
"default": "%Y-%m-%dT%H:%M:%S.%f%z",
"description":"Формат времени"
},
"target_data": {
"type": "string",
"max_length": 100,
"required": true,
"default": "target_data",
"description":"Данные для агрегирования"
},
"list_to_str_dict": {
"type": "dict",
"required": false,
"default": {},
"description":"Правило преобразования поля pandas list->str"
},
"groupby_list": {
"type": "list",
"required": true,
"default": [],
"description":"Поля агрегирования помимо поля времени key"
},
"agg_dict": {
"type": "dict",
"required": true,
"default": {},
"description":"Описание агрегации pandas"
}
},
"query":
{
"target_data":"%(target_data)s",
"list_to_str_dict":"%(list_to_str_dict)d",
"groupby_list":"%(groupby_list)l",
"agg_dict":"%(agg_dict)d"
},
"generate_parameters":
{}
}
shift
Сдвиг столбца на указанное количество строк.
{
"description": "Сдвиг столбца данных",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "shift",
"input_parameters":{
"target_data": {
"type": "string",
"max_length": 100,
"required": true,
"default": "target_data",
"description":"Данные для сдвига"
},
"list_to_str_dict": {
"type": "dict",
"required": false,
"default": {},
"description":"Правило преобразования поля pandas list->str"
},
"groupby_list": {
"type": "list",
"required": true,
"default": [],
"description":"Поля группировки данных для сдвига в группе"
},
"target_column": {
"type": "string",
"max_length": 100,
"required": true,
"default": "target_column",
"description":"Столбец для сдвига"
},
"result_column": {
"type": "string",
"max_length": 100,
"required": true,
"default": "result_column",
"description":"Итоговый столбец"
},
"shift": {
"type": "integer",
"required": true,
"default": 1,
"description":"Размер сдвига"
},
"fill_value": {
"type": "string",
"max_length": 100,
"required": true,
"default": "fill_value",
"description":"Заполнение пустого значения сдвига"
}
},
"query":
{
"target_data":"%(target_data)s",
"list_to_str_dict":"%(list_to_str_dict)d",
"groupby_list":"%(groupby_list)l",
"target_column":"%(target_column)s",
"result_column":"%(result_column)s",
"shift":"%(shift)i",
"fill_value":"%(fill_value)s"
},
"generate_parameters":
{}
}
union
Объединение блоков данных в один с добавлением столбца data_name
{
"description": "Объединение блоков данных",
"example": "",
"llm":
{
"preprompt": "",
"postprompt": ""
},
"source_function": "shift",
"input_parameters":{
"target_data": {
"type": "list",
"max_length": 100,
"required": true,
"default": ["target_data_1", "target_data_2"],
"description":"Данные для объединения"
}
},
"query":
{
"target_data":"%(target_data)l"
},
"generate_parameters":
{}
}
Ollama
chat
Взаимодействие с LLM через API ollama.
"TBD":"TBD"
Local llama
chat
Взаимодействие с локальной LLM (TBD).
"TBD":"TBD"