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"