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_templatesava Elasticsearch instances URL. - Izmantojiet
"text*"laukā"index_patterns", lai atbilstu indeksa nosaukumam. - Izmantojiet kartējumu
textvē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-pipelinesavas Elasticsearch instances URL. - Iekļaujiet
date_index_nameprocesoru, 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:
-
Pārbaudiet Elasticsearch vai Zabbix servera žurnālus, lai atrastu kļūdas.
-
Lai identificētu lēnus vaicājumus, izmantojiet
log_slow_queriesopciju Zabbix servera konfigurācijas parametrāHistoryProvider. -
Pārliecinieties, ka Elasticsearch atļauj piekļuvi no Zabbix servera un Zabbix lietotāja saskarne.
-
Pārliecinieties, ka
auto_create_indexir 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": {} }
- Pārbaudiet, vai mappingi, veidnes un ingest pipeline ir pareizi, nosūtot
GETpieprasī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ā.
-
Pārbaudiet, vai kādi shards nav kļūmes stāvoklī; Elasticsearch restartēšana var šo problēmu atrisināt.
-
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
}
}
}'
- 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/*"