8 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 Elasticsearch 7.X iestatīšana. Ja izmantojat citu versiju, daļa funkcionalitātes var nedarboties, kā paredzēts.

Iestatīšana ietver Elasticsearch glabātuves atrašanās vietas izveidi katram vērtības tipam, priekšapstrādes iestatīšanu (ja nepieciešams) un Zabbix savienošanu ar jūsu Elasticsearch instanci.

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

Vienuma vērtības tips Datubāzes tabula Elasticsearch tips
Skaitlisks (bez zīmes) history_uint uint
Skaitlisks (peldošā komata) history dbl
Rakstzīmes history_str str
Žurnāls history_log log
Teksts history_text text
Binārs history_bin Zabbix neatbalsta
JSON history_json json

Svarīgas piezīmes

  • Elasticsearch nepieciešams libcurl. Sīkāku informāciju skatiet prasībās.
  • Housekeeper nedzēš datus no Elasticsearch.
  • Ja visi vēstures dati tiek glabāti Elasticsearch, tendences datubāzē netiek aprēķinātas vai saglabātas. Apsveriet iespēju pagarināt vēstures glabāšanas periodu.
  • Ja tiek izmantots Elasticsearch, diapazona vaicājumus, kas izgūst vērtības no datubāzes, ierobežo datu glabāšanas perioda laikspiedols.
  • Elasticsearch netiek atbalstīts Zabbix starpniekserverim; tā vietā, lūdzu, izmantojiet SQLite.

Ja Elasticsearch vēl nav instalēts, pirms turpināt 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 datumos 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 datumos balstītos indeksos (piemēram, uint-2026-01-01, uint-2026-01-02). Tas atvieglo datu apjoma un glabāšanas ilguma pārvaldību laika gaitā.

Lai to iespējotu, jums ir jāveic tālāk norādītais:

  • Izveidojiet indeksa veidni katram vērtību tipam, ko vēlaties glabāt — tā norāda Elasticsearch, kādu kartējumu piemērot, kad tas automātiski izveido jaunu datumā balstītu indeksu.
  • Izveidojiet uzņemšanas konveijeru katram vērtību tipam — tas apstrādā katru ienākošo vērtību un novirza to uz pareizo datumā balstīto indeksu.
  • Konfigurējiet parametru HistoryStorageDateIndex Zabbix servera konfigurācijas failā — tas iespējo vērtību glabāšanu vairākos datumos balstītos indeksos.
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

Jūsu Zabbix servera konfigurācijas failā (zabbix_server.conf) iestatiet šādus parametrus:

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

HistoryStorageURL=http://localhost:9200
HistoryStorageTypes=str,log,text,json

Ja izmantojat uz datumu balstītus indeksus visām Elasticsearch glabātajām vērtībām, iestatiet arī parametru HistoryStorageDateIndex:

HistoryStorageDateIndex=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) deklarējiet $HISTORY kā globālu mainīgo un iestatiet tā url un types vērtības atbilstoši servera konfigurācijai:

// Zabbix GUI configuration file.
global $DB, $HISTORY;

$HISTORY['url']   = 'http://localhost:9200';
$HISTORY['types'] = ['str', 'log', 'text', 'json'];

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 iestatījumu:

  1. Pārbaudiet, vai 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 kartējumi, veidnes un ingest cauruļvadi 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ādas šķembas nav kļūmes stāvoklī; Elasticsearch restartēšana var palīdzēt to novērst.

  2. Pārbaudiet, vai jūsu Elasticsearch konfigurācija atļauj piekļuvi no Zabbix serveris un Zabbix lietotāja saskarne.

  3. Izmantojiet Zabbix serveris konfigurācijas parametru LogSlowQueries, lai noteiktu lēnus vaicājumus.

  4. Pārbaudiet Elasticsearch žurnālus, vai tajos nav kļūdu.

  5. Ja nepieciešams atiestatīt Elasticsearch iestatījumu un sākt no jauna, varat dzēst visus indeksus, veidnes un ingest cauruļvadus:

curl -X DELETE "http://localhost:9200/_all"
curl -X DELETE "http://localhost:9200/_template/*"
curl -X DELETE "http://localhost:9200/_ingest/pipeline/*"