Использование Scroll API для получения данных из Elastic Search

17 0

На одном из наших проектов мы разработали отчет, который позволяет с использованием Scroll API получить из Elastic Search необходимую информацию о входах, выходах пользователей из системы DIRECTUM в оперативном режиме за произвольный интересующий промежуток времени по необходимому набору параметров.

Для обеспечения заказчика удобным, визуально наглядным инструментом для контроля и анализа массива данных о нахождении пользователей в СЭД DIRECTUM был разработан отчет. Он позволяет получить информацию о входах, выходах пользователей за определенный период. Работа отчета основывается на возможностях системы ELK Stack (Elasticsearch, Logstash и Kibana). В ElasticSearch хранятся логи службы сервера сеансов. Задача отчета – обратиться в ELK Stack и получить необходимую информацию.

Для обращения в ELK Stack используется Scroll API.

Получение данных состоит из 2 этапов:

1. Создание SearchRequest

Выполняется GET запрос с параметром scroll, который сообщает Elasticsearch, как долго должен поддерживаться поисковый контекст. Его значение (к примеру, 1m) не обязательно должно быть большим для обработки всех данных, оно просто должно быть достаточным для обработки предыдущего пакета результатов. Каждый запрос устанавливает новое время. Параметр size позволяет настроить максимальное количество объектов, которое будет возвращаться с каждым пакетом результатов. @timestamp, ip, action, host_name, username - названия полей в базе.

Пример запроса:

Method = "GET"
URL = 'http://test:9200/ss_logstash-2*/_search?scroll=1m&q=(username:"Ivanov" OR username:"Test") AND (@timestamp:[2019-03-18 TO 2019-03-19])&sort=username.keyword,@timestamp&size=100&_source=host_name,username,ip,@timestamp,action'
try
  XMLHTTP = CreateObject("MSXML2.ServerXMLHTTP")
  XMLHTTP.Open(Method; URL; FALSE)
  XMLHTTP.Send(null) 
    
  Status = XMLHTTP.status
  ResponseText = XMLHTTP.ResponseText        
  if Status <> 200
    Raise(CreateException("HTTPError"; Status & ": " & ResponseText; ecWarning))
  endif
  Result = ResponseText
finally
  XMLHTTP = nil
endfinally

Запрос возвращает данные в формате JSON для дальнейшей обработки.

Пример JSON:

{
    "_scroll_id": "DnF1ZXJ5VGhlbkZldGNoAgAAAAACJEqPFmhUVmNIc3NHU2pHMEJKTUtmUVlySWcAAAAAAiRKjhZoVFZjSHNzR1NqRzBCSk1LZlFZckln",
    "took": 3,
    "timed_out": false,
    "_shards": {
        "total": 2,
        "successful": 2,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 3,
        "max_score": null,
        "hits": [{
                "_index": "ss_logstash-2019",
                "_type": "log",
                "_id": "4FObVsxgko7MYefCm7u6/vxI9xg=",
                "_score": null,
                "_source": {
                    "@timestamp": "2019-03-19T08:26:37.800Z",
                    "ip": "192.112.116.3",
                    "action": "Registration",
                    "host_name": "Test01.domain",
                    "username": "Ivanov"
                },
                "sort": ["Ivanov", 1552983997800]
            }, {
                "_index": "ss_logstash-2019",
                "_type": "log",
                "_id": "5gPA5cRj6CAZJnmv6kxMK0Tt/kE=",
                "_score": null,
                "_source": {
                    "@timestamp": "2019-03-19T11:15:30.676Z",
                    "ip": "192.112.116.3",
                    "action": "Unregistration",
                    "host_name": "Test01.domain",
                    "username": "Ivanov"
                },
                "sort": ["Ivanov", 1552994130676]
            }, {
                "_index": "ss_logstash-2019",
                "_type": "log",
                "_id": "v6Xo3aeMUrj9UIfmGck04aqBC+4=",
                "_score": null,
                "_source": {
                    "@timestamp": "2019-03-19T07:10:38.439Z",
                    "ip": "192.168.65.5",
                    "action": "Registration",
                    "host_name": "Test02.domain",
                    "username": "Test"
                },
                "sort": ["Test", 1552979438439]
            }
        ]
    }
}

В рамках первого запроса необходимо получить scroll_id.

2. Создание SearchScrollRequest

Пример URL:

http://test:9200/_search/scroll?scroll=1m&scroll_id=DnF1ZXJ5VGhlbkZldGNoAgAAAAAAEat5FmhUVmNIc3NHU2pHMEJKTUtmUVlySWcAAAAAABGreBZoVFZjSHNzR1NqRzBCSk1LZlFZckln

Scroll_id необходимо использовать в SearchScrollRequest для получения следующего пакета результатов и т. д. Этот процесс будет продолжаться в цикле до тех пор, пока не будут получены все результаты до конца выборки. Первоначальный запрос и каждый последующий возвращает новый scroll_id, следует использовать только самый последний scroll_id.

Поисковый контекст автоматически удаляется при превышении времени ожидания. Если он больше не используется, рекомендуется явно очищать, поскольку это может влиять на производительность.

В качестве критериев для запуска отчета можно указать как пользователей, так и определенную рабочую станцию.

Запрос параметров

Результатом работы отчета является таблица с данными о входе/выходе пользователей.

Отчет о входе/выходе пользователей

Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий