Devops's Blog

Запрос в elk выводим больше 9999


Выведем такие теги за 6 дней где
"request": "DT1=00"
"x_forwarded_for" существует
"tls_cipher" существует

Так как данных за 6 дней получается больше чем 9999 hits , выбираем в кибане самый большой объем данных и пытаемся получить промежуток времени в который уложимся до 9999 hits, у меня получилось 5 мин.

php скрипт


<?php
error_reporting(E_ALL);
ini_set("log_errors", true);
ini_set('display_errors', true);
ini_set('memory_limit', '1024M');
date_default_timezone_set('Europe/Moscow');

require '/opt/web/vendor/autoload.php';
use Elasticsearch\ClientBuilder;

class raznoe {

 private $hosts;
 private $client;
 private $date1;
 private $date2;
 private $find;
 private $conver_id;
 private $message;
 private $clienti_d;
 private $version;
 private $final;
 private $conf=array();
 private $id;
 private $meta;


 public function init()
 {

  $this->hosts = [
    [
      'host' => 'server.elk.local',
      'port' => '9200',
      'user' => 'username',
      'pass' => 'passwd'
    ]
];

  $this->client = ClientBuilder::create()
                    ->setHosts($this->hosts)
                    ->build();
 }

 public function find_step1($date1,$date2)
 {
         $json= '{
  "version": true,
  "size": 9999,
  "sort": [
    {
      "@timestamp": {
        "order": "desc",
        "unmapped_type": "boolean"
      }
    }
  ],
 "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "filter": [
        {
          "match_phrase": {
            "request": "DT1=00"
          }
        },
        {
          "exists": {
            "field": "x_forwarded_for"
          }
        },
        {
          "exists": {
            "field": "tls_cipher"
          }
        },
        {
          "range": {
          "@timestamp": {
              "gte": "'.$date1.'",
              "lte": "'.$date2.'",
              "format": "strict_date_optional_time"
            }
          }
        }
      ],
      "should": [],
      "must_not": []
    }
  }
}';

$params = [
    'index' => "access",
    'body'  => $json
];

$results = $this->client->search($params);
for($i=0;$i<count($results['hits']['hits']);$i++)
{
        echo $results['hits']['hits'][$i]['_source']['@timestamp']." ".$results['hits']['hits'][$i]['_source']['x_forwarded_for']." ".$results['hits']['hits'][$i]['_source']['tls_cipher']." ".$results['hits']['hits'][$i]['_source']['tls_ver']."\n";
}


 }


}

$raznoe= new raznoe;
$raznoe->init();
$data1="2024-01-29T21:00:00";
$data2="2024-01-29T21:00:00";
for($i=0;$i<1728;$i++)
{
        if($i==0) {$j=0;} else {$j=5;}
        $data1=date('Y-m-dTH:i:s',(strtotime ( "+".$j." minutes" , strtotime ( $data1) ) ));
        $data2=date('Y-m-dTH:i:s',(strtotime ( "+5 minutes" , strtotime ( $data2) ) ));
        $data1=str_replace ("MSK", "T", $data1);
        $data2=str_replace ("MSK", "T", $data2);
        $raznoe->find_step1($data1,$data2);
        echo $data1."\n".$data2."\n\n";

}


?>

Выводим за 6 дней с 2024-01-29T21:00:00 , вывод будем делать каждые 5 мин , 1728 - это столько раз повторяется 5 мин в течении 6 дней