Scroll API ile Tüm Sorgu Sonucunu Bash Script ile Dosyaya Kaydetmek
Apinizer üzeridne tutulan logların başka ortamlara aktarılması ya da başka ürünler kullanılarak incelenmesi gerekebilir.
Bu gibi durumlarda Apinizer Log veri tabanı ElasticSearch'de tutulan verilerin sorgu ile alınması ve dosyaya kaydedilmesi gereklidir. Elastic Search yapısı gereği yapılan sorgulamalara 1000'den fazla kayıt dönmemektir.
Toplam kayıt sayısının 1000'i geçtiği durumlarda Scroll API ile sorgulama yapılması gerekmektedir.
Scroll API ile gelen sonucun işlenerek tekrar sorgulama yapılması gerekebileceğinden bu işlem bir döngü içinde yapılmalıdır.
Bu döngünün Linux Script ile uygulanmış haline aşağıda ulaşabilirsiniz.
Ön Gereksinim: JQ(Json Processor) Kurulumu
Bash Script'in düzgün çalışabilmesi JQ paketinin sunucuya kurulması gereklidir.
Bu kurulum için aşağıdaki adımları takip edebilirsiniz:
1.EPEL deposunu kurun
yum install epel-release -y
2.Sunucunuzu güncelleyin
yum update -y
3.jq(JSON Processor) aracını kurun
yum install jq -y
Scroll Yapan Script
Aşağıdaki scriptin script.sh adıyla bir dizine kaydedilip, chmod 777 komutu ile executable yapılması gereklidir.
#!/bin/bash
es_url='http://<ELASTICSEARCH_IP>:9200'
index=apinizer-log-apiproxy-<XXXX>
response=$(curl -X GET -s $es_url/$index/_search?scroll=1m -H 'Content-Type: application/json' -d @query.json)
scroll_id=$(echo $response | jq -r ._scroll_id)
hits_count=$(echo $response | jq -r '.hits.hits | length')
hits_so_far=${hits_count}
echo Got initial response with $hits_count hits and scroll ID $scroll_id
# process first page of results here (ex. put the response into result.json)
echo $response | jq . >> result.json
while [ "$hits_count" != "0" ]; do
response=$(curl -X GET -s $es_url/_search/scroll -H 'Content-Type: application/json' -d "{ \"scroll\": \"1m\", \"scroll_id\": \"$scroll_id\" }")
scroll_id=$(echo $response | jq -r ._scroll_id)
hits_count=$(echo $response | jq -r '.hits.hits | length')
hits_so_far=$((hits_so_far + hits_count))
echo "Got response with $hits_count hits (hits so far: $hits_so_far), new scroll ID $scroll_id"
# process page of results (ex. put the response into result.json)
echo $response | jq . >> result.json
done
echo Done!
#script reference: https://gist.github.com/toripiyo/8b14e8a387069bae372d49296b0077d7
Örnek Sorgu
Aşağıdaki sorgunun query.json adıyla script.sh dosyasıyla aynı dizine kaydedilmesi gereklidir.
Bu sorgunun Apinizer ElasticSearch adresine gönderilmesi gerekli olduğundan istek yapılan adres ve index adının kendi ortamınıza göre düzeltilmesi gereklidir.
curl --location --request POST 'http://<ELASTICSEARCH_IP>:9200/apinizer-log-apiproxy-abcd/_search' --header 'Content-Type: application/json' --data-raw '{
"from": 0,
"size": 3000000,
"query": {
"bool": {
"filter": [
{
"bool": {
"filter": [
{
"bool": {
"filter": [
{
"match": {
"uok": {
"query": "username",
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 1.0
}
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
},
{
"bool": {
"filter": [
{
"bool": {
"should": [
{
"term": {
"pi": {
"value": "6130d19b59f2007bff548d29",
"boost": 1.0
}
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
},
{
"range": {
"@timestamp": {
"from": "now-4320m/m",
"to": "now/m",
"include_lower": true,
"include_upper": true,
"boost": 1.0
}
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
}
],
"adjust_pure_negative": true,
"boost": 1.0
}
},
"_source": {
"includes": [
"@timestamp",
"uok",
"fcrb",
"sc",
"pet",
"rt",
"tch",
"tcb",
"hr1ra",
"et",
"fcrh"
],
"excludes": []
}
}'
Bu sorgu içerisinde yer alan alanların ne anlama geldiğine bakmak için bu sayfayı ziyaret edebilirsiniz.
Scriptin Çalıştırılması
Bunun için yapmanız gereken komut dosyasından ./script.sh yazmak olacaktır.
Sonrasında aşağıdaki şekilde bilgi notları gelmeye başlayacaktır, ve sonuçlar result.json dosyasında birikecektir.