Elasticsearch iestatīšana

Zabbix var glabāt vēstures datus Elasticsearch kā alternatīvu relāciju datubāzei.

Elasticsearch atbalsts pašlaik ir eksperimentāls.

Šajā rokasgrāmatā ir aprakstīta atbalstīto versiju Elasticsearch iestatīšana. Ja izmantojat citu versiju, dažas funkcijas var nedarboties, kā paredzēts.

Elasticsearch var glabāt šādus vērtību tipus:

Vienuma vērtības tips Datubāzes tabula Elasticsearch tips
Skaitlisks (neparakstīts) history_uint uint
Skaitlisks (peldošs) history dbl
Rakstzīme history_str str
Žurnāls history_log log
Teksts history_text text
Binārs history_bin nav atbalstīts ar Zabbix
JSON history_json json

Elasticsearch nepieņem JSON masīvus. JSON vērtībai jābūt vai nu vienam objektam, vai objektu kopai.

Svarīgas piezīmes

  • Elasticsearch nepieciešams libcurl. Skatiet prasības, lai iegūtu detalizētu informāciju.
  • housekeeper nedzēš datus no Elasticsearch. Lai kontrolētu, cik ilgi dati tiek saglabāti, skatiet Index Lifecycle Management.
  • Zabbix programmā Elasticsearch netiek aprēķinātas vai saglabātas tendences. Apsveriet iespēju pagarināt vēstures glabāšanas periodu, lai saglabātu vecākus datus.
  • Ja tiek izmantots Elasticsearch, diapazona vaicājumi, kas izgūst vērtības no datubāzes, ir ierobežoti ar datu glabāšanas perioda laikspiedolu.
  • Elasticsearch nav atbalstīts Zabbix starpniekserveriem.

Ja Elasticsearch vēl nav instalēts, pirms turpināšanas skatiet oficiālo instalēšanas rokasgrāmatu.

Elasticsearch konfigurēšana

Lai glabātu vēstures datus Elasticsearch, jums ir nepieciešams:

  • Izveidot indeksu katram vērtības tipam, ko vēlaties glabāt — šeit Elasticsearch glabā datus, līdzīgi kā tabulā relāciju datubāzē.
  • Definēt kartējumu katram indeksam — tas nosaka datu struktūru, līdzīgi kā tabulas shēma.
  • Iestatīt uzņemšanas konveijeru, lai apstrādātu vērtības pirms glabāšanas (nepieciešams JSON vērtībām un uz datumu balstītiem indeksiem).

Elasticsearch var glabāt datus vienā indeksā katram vērtības tipam vai vairākos uz datumu balstītos indeksos. Abas pieejas ir aprakstītas tālāk.

Vēstures glabāšana vienā indeksā

Šajā pieejā visi vēstures dati konkrētam vērtības tipam tiek ierakstīti vienā indeksā (piemēram, uint vai text).

Lai izveidotu indeksu vērtības tipam Numeric (unsigned), nosūtiet šādu pieprasījumu (ar /uint URL adresē) uz savu Elasticsearch instanci:

curl -X PUT \
 http://localhost:9200/uint \
 -H 'content-type:application/json' \
 -d '{
     "settings": {
      "index": {
         "number_of_replicas": 1,
         "number_of_shards": 5
      }
   },
   "mappings": {
      "properties": {
         "itemid": { "type": "long" },
         "clock": { "format": "epoch_second", "type": "date" },
         "value": { "type": "long" }
      }
   }
}'

Elasticsearch atbildēs ar apstiprinājumu, ka indekss ir izveidots:

{"acknowledged": true, "shards_acknowledged": true, "index": "uint"}

Līdzīgi pieprasījumi jānosūta katram papildu vērtības tipam, kuru vēlaties glabāt Elasticsearch.

Kartējumi visiem vērtību tipiem ir pieejami Zabbix avota repozitorijā.

Piemēram, lai izveidotu indeksu vērtības tipam Text:

curl -X PUT \
 http://localhost:9200/text \
 -H 'content-type:application/json' \
 -d '{
   "settings": {
      "index": {
         "number_of_replicas": 1,
         "number_of_shards": 5
      }
   },
   "mappings": {
      "properties": {
         "itemid": { "type": "long" },
         "clock": { "format": "epoch_second", "type": "date" },
         "value": {
            "fields": {
               "analyzed": { "index": true, "type": "text", "analyzer": "standard" }
            },
            "index": false,
            "type": "text"
         }
      }
   }
}'
JSON vērtības tips

Atšķirībā no citiem vērtību tipiem JSON vērtībām pirms saglabāšanas ir nepieciešama papildu apstrāde.

Tālāk norādītais indekss izmanto atsevišķus laukus parsētām un neapstrādātām vērtībām, tāpēc ir nepieciešams ingest pipeline, lai parsētu katru vērtību kā JSON un saglabātu to pareizajā laukā.

Lai izveidotu indeksu JSON vērtības tipam, nosūtiet šādu pieprasījumu (ar /json URL adresē) uz savu Elasticsearch instanci.

curl -X PUT \
 http://localhost:9200/json \
 -H 'content-type:application/json' \
 -d '{
   "settings": {
      "number_of_shards": 5,
      "number_of_replicas": 1
   },
   "mappings": {
      "dynamic": false,
      "properties": {
         "itemid": { "type": "long" },
         "clock": { "type": "date", "format": "epoch_second" },
         "ns": { "type": "long" },
         "value_parsed": { "type": "flattened" },
         "value_raw": { "type": "keyword", "ignore_above": 1000000 }
    }
  }
}'

Pēc tam izveidojiet ingest pipeline:

curl -X PUT \
 http://localhost:9200/_ingest/pipeline/json \
 -H 'content-type:application/json' \
 -d '{
   "processors": [
      {
         "json": {
            "field": "value",
            "target_field": "value_parsed",
            "ignore_failure": true
         }
      },
      {
         "set": {
            "if": "ctx.value_parsed == null",
            "field": "value_raw",
            "value": "{{{ value }}}"
         }
      }
   ],
   "on_failure": [
      {
         "set": {
            "field": "value_raw",
            "value": "{{{ value }}}"
         }
      }
   ]
}'

Elasticsearch atbildēs ar apstiprinājumu, ka ingest pipeline tika izveidots:

{"acknowledged": true}

Vēstures glabāšana uz datumiem balstītos indeksos

Tā vietā, lai visus vēstures datus rakstītu vienā indeksā (piemēram, uint), Elasticsearch var sadalīt šos datus vairākos uz datumiem balstītos indeksos (piemēram, uint-2026-01-01, uint-2026-01-02). Tas atvieglo datu apjoma un glabāšanas termiņa pārvaldību laika gaitā.

Lai to iespējotu, jums ir jāveic šādas darbības:

  • Izveidojiet indeksa veidni katram vērtības tipam, ko vēlaties glabāt — tā nosaka Elasticsearch, kādu kartējumu piemērot, kad tas automātiski izveido jaunu uz datumu balstītu indeksu.
  • Izveidojiet ingest pipeline katram vērtības tipam — tas apstrādā katru ienākošo vērtību un novirza to uz pareizo uz datumu balstīto indeksu.
Indeksu veidnes

Lai izveidotu veidni text indeksam, nosūtiet pieprasījumu ar šādu informāciju:

  • Izmantojiet _template/text_template sava Elasticsearch instances URL.
  • Izmantojiet "text*" laukā "index_patterns", lai atbilstu indeksa nosaukumam.
  • Izmantojiet kartējumu text vērtības tipam (skatiet kartējumus Zabbix avota repozitorijā).
curl -X PUT \
 http://localhost:9200/_template/text_template \
 -H 'content-type:application/json' \
 -d '{
   "index_patterns": [ "text*" ],
   "settings": {
      "index": {
         "number_of_replicas": 1,
         "number_of_shards": 5
      }
   },
   "mappings": {
      "properties": {
         "itemid": { "type": "long" },
         "clock": { "format": "epoch_second", "type": "date" },
         "value": {
            "fields": {
               "analyzed": { "index": true, "type": "text", "analyzer": "standard" }
            },
            "index": false,
            "type": "text"
         }
      }
   }
}'

Veidne json indeksam:

curl -X PUT \
 http://localhost:9200/_template/json_template \
 -H 'content-type:application/json' \
 -d '{
   "index_patterns": [ "json*" ],
   "settings": {
      "number_of_shards": 5,
      "number_of_replicas": 1
   },
   "mappings": {
      "dynamic": false,
      "properties": {
         "itemid": { "type": "long" },
         "clock": { "type": "date", "format": "epoch_second" },
         "ns": { "type": "long" },
         "value_parsed": { "type": "flattened" },
         "value_raw": { "type": "keyword", "ignore_above": 1000000 }
      }
   }
}'
Uzņemšanas konveijeri

Lai izveidotu uzņemšanas konveijeru text indeksam:

  • Izmantojiet _ingest/pipeline/text-pipeline savas Elasticsearch instances URL.
  • Iekļaujiet date_index_name procesoru, lai novirzītu katru vērtību uz pareizo uz datumu balstīto indeksu, pamatojoties uz tās laikspiedolu.
curl -X PUT \
 http://localhost:9200/_ingest/pipeline/text-pipeline \
 -H 'content-type:application/json' \
 -d '{
   "description": "daily text index naming",
   "processors": [
      {
         "date_index_name": {
            "field": "clock",
            "date_formats": ["UNIX"],
            "index_name_prefix": "text-",
            "date_rounding": "d"
         }
      }
   ]
}'

json indeksam konveijeram pirms novirzīšanas uz pareizo indeksu ir arī jāparsē JSON vērtība:

curl -X PUT \
 http://localhost:9200/_ingest/pipeline/json-pipeline \
 -H 'content-type:application/json' \
 -d '{
   "description": "daily json index naming"
   "processors": [
      {
         "json": {
            "field": "value",
            "target_field": "value_parsed",
            "ignore_failure": true
         }
      },
      {
         "script": {
            "source": "if (ctx.value_parsed == null || !(ctx.value_parsed instanceof Map)) { ctx.value_raw = ctx.value; ctx.remove(\"value_parsed\"); }"
         }
      },
      {
         "date_index_name": {
            "field": "clock",
            "date_formats": [ "UNIX" ],
            "index_name_prefix": "json-",
            "date_rounding": "d"
         }
      }
   ]
}'

Zabbix servera konfigurēšana

Savā Zabbix servera konfigurācijas failā (zabbix_server.conf) iestatiet parametru HistoryProvider.

Piemēram, lai Elasticsearch glabātu Character, Log, Text un JSON tipa vērtības (vienlaikus Numeric vērtības saglabājot datubāzē):

HistoryProvider=elasticsearch;value_types="str,log,text,json",url=http://localhost:9200

Ja izmantojat uz datumu balstītus indeksus, pievienojiet parametram date_index=1:

HistoryProvider=elasticsearch;value_types="str,log,text,json",url=http://localhost:9200,date_index=1

Pēc izmaiņu veikšanas restartējiet Zabbix serveri:

systemctl restart zabbix-server

Zabbix lietotāja saskarnes konfigurēšana

Zabbix lietotāja saskarnes konfigurācijas failā (zabbix.conf.php) iestatiet mainīgo $HISTORY_PROVIDERS, lai tas atbilstu servera konfigurācijai:

$HISTORY_PROVIDERS[] = [
  'types' => ['str','log','text','json'],
  'provider' => 'elasticsearch',
  'url' => 'http://localhost:9200'
];

Problēmu novēršana

Tālāk norādītās darbības var palīdzēt novērst problēmas ar jūsu Elasticsearch konfigurāciju:

  1. Pārbaudiet Elasticsearch vai Zabbix servera žurnālus, lai atrastu kļūdas.

  2. Lai identificētu lēnus vaicājumus, izmantojiet log_slow_queries opciju Zabbix servera konfigurācijas parametrā HistoryProvider.

  3. Pārliecinieties, ka Elasticsearch atļauj piekļuvi no Zabbix servera un Zabbix lietotāja saskarne.

  4. Pārliecinieties, ka auto_create_index ir iespējots:

curl -X GET \
 "http://localhost:9200/_cluster/settings?include_defaults=true&filter_path=**.auto_create_index"

# {"defaults": {"action": {"auto_create_index": "false"} } }

Lai to iespējotu, nosūtiet šādu pieprasījumu:

curl -X PUT \
 http://localhost:9200/_cluster/settings \
 -H 'content-type:application/json' \
 -d '{
   "persistent": {
      "action.auto_create_index": "true"
   }
}'

# {"acknowledged": true, "persistent": {"action": {"auto_create_index": "true"} }, "transient": {} }
  1. Pārbaudiet, vai mappingi, veidnes un ingest pipeline ir pareizi, nosūtot GET pieprasījumus uz to attiecīgajiem URL:
curl -X GET http://localhost:9200/json
curl -X GET http://localhost:9200/_template/json*
curl -X GET http://localhost:9200/_ingest/pipeline/json*

Saņemtās atbildes varat salīdzināt ar sagaidāmajām atbildēm Elasticsearch API dokumentācijā.

  1. Pārbaudiet, vai kādi shards nav kļūmes stāvoklī; Elasticsearch restartēšana var šo problēmu atrisināt.

  2. Veiciet vaicājumu Elasticsearch, lai pārbaudītu, vai Zabbix savāktie dati ir saglabāti, piemēram:

curl 'http://localhost:9200/json/_search' \
 -H 'Content-Type: application/json' \
 -d '{
   "query": {
     "term": {
       "itemid": 42269
     }
   }
 }'
  1. Ja nepieciešams atiestatīt Elasticsearch konfigurāciju un sākt no jauna, varat dzēst visus indeksus, veidnes un ingest pipeline:
curl -X DELETE "http://localhost:9200/_all"
curl -X DELETE "http://localhost:9200/_template/*"
curl -X DELETE "http://localhost:9200/_ingest/pipeline/*"