[comment]: # ({47c25517-4ff8e217})
# 8 Configuration d'Elasticsearch

::: noteimportant
 La prise en charge d'Elasticsearch est expérimentale !

:::

Zabbix prend en charge le stockage des données historiques au moyen d'Elasticsearch
au lieu d'une base de données. Les utilisateurs peuvent choisir l'emplacement de stockage des données historiques
entre une base de données compatible et Elasticsearch. La procédure de configuration
décrite dans cette section s'applique à la version 7.X d'Elasticsearch. Si une version antérieure ou ultérieure d'Elasticsearch est
utilisée, certaines fonctionnalités peuvent ne pas fonctionner comme prévu.

::: notewarning
1\.Si toutes les données d'historique sont stockées dans Elasticsearch,
les tendances ne sont **ni** calculées **ni** stockées dans la base de données. En l'absence de tendances
calculées et stockées, la période de conservation du stockage de l'historique peut devoir être
allongée.<br>
2\. Lorsque Elasticsearch est utilisé, les requêtes de plage récupérant des valeurs depuis la base de données sont limitées par l'horodatage de la période de stockage des données.
:::

[comment]: # ({/47c25517-4ff8e217})

[comment]: # ({0b6587bd-0b6587bd})
#### Configuration

Pour assurer une bonne communication entre tous les éléments impliqués, assurez-vous que les paramètres du fichier de configuration du serveur et du fichier de configuration frontal sont correctement configurés.

[comment]: # ({/0b6587bd-0b6587bd})

[comment]: # ({293ef64c-293ef64c})

##### Serveur et interface Zabbix

Projet de fichier de configuration du serveur Zabbix avec les paramètres à mettre à jour :

    ### Option: HistoryStorageURL
    # History storage HTTP[S] URL.
    #
    # Mandatory: no
    # Default:
    # HistoryStorageURL= 
    ### Option: HistoryStorageTypes
    # Comma separated list of value types to be sent to the history storage.
    #
    # Mandatory: no
    # Default:
    # HistoryStorageTypes=uint,dbl,str,log,text

Exemples de valeurs de paramètres pour remplir le fichier de configuration du serveur Zabbix :

    HistoryStorageURL=http://test.elasticsearch.lan:9200
    HistoryStorageTypes=str,log,text

Cette configuration force le serveur Zabbix à stocker les valeurs d'historique de types numériques dans la base de données correspondante et les données d'historique textuelles dans Elasticsearch.

Elasticsearch prend en charge les types d'éléments suivants :

    uint,dbl,str,log,text

Explication du type d'élément pris en charge :

|   |   |   |
|---|---|---|
|**Type de valeur de l'élément**|**Table de base de données**|**Type Elasticsearch**|
|Numérique (non signé)|history\_uint|uint|
|Numérique (flottant)|history|dbl|
|Caractère|history\_str|str|
|Journal|history\_log|log|
|Texte|history\_text|text|

Projet de fichier de configuration de l'interface Zabbix (`conf/zabbix.conf.php`) avec les paramètres à mettre à jour :

    // Elasticsearch url (can be string if same url is used for all types).
    $HISTORY['url']   = [
          'uint' => 'http://localhost:9200',
          'text' => 'http://localhost:9200'
    ];
    // Value types stored in Elasticsearch.
    $HISTORY['types'] = ['uint', 'text'];

Exemples de valeurs de paramètres pour remplir le fichier de configuration de l'interface Zabbix :

    $HISTORY['url']   = 'http://test.elasticsearch.lan:9200';
    $HISTORY['types'] = ['str', 'text', 'log'];

Cette configuration oblige à stocker les valeurs d'historique `Texte`, `Caractère` et `Journal` dans Elasticsearch.

Il est également nécessaire de rendre $HISTORY global dans `conf/zabbix.conf.php` pour s'assurer que tout fonctionne correctement (voir `conf/zabbix.conf.php.example` pour savoir comment procéder) :

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

[comment]: # ({/293ef64c-293ef64c})

[comment]: # ({000d1106-e9a9c5bd})
##### Installation d'Elasticsearch et création du mapping

Les deux dernières étapes pour faire fonctionner l'ensemble sont l'installation d'Elasticsearch lui-même et la création du processus de mapping.

Pour installer Elasticsearch, veuillez vous référer au [guide d'installation d'Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/current/setup.html).

::: noteclassic
Le mapping est une structure de données dans Elasticsearch (similaire à une table dans une base de données). Le mapping pour tous les types de données d'historique est disponible ici: `database/elasticsearch/elasticsearch.map`.
:::

::: notewarning
La création du mapping est obligatoire. Certaines fonctionnalités seront interrompues si le mapping n'est pas créé conformément aux instructions.
:::

Pour créer le mapping pour le type `text`, envoyez la requête suivante à Elasticsearch:

``` {.java}
curl -X PUT \
 http://your-elasticsearch.here: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"
         }
      }
   }
}'
```

Une requête similaire doit être exécutée pour la création du mapping des valeurs d'historique `Character` et `Log`, avec la correction du type correspondante.

::: noteclassic
Pour travailler avec Elasticsearch, veuillez consulter les [Exigences](/manual/installation/requirements#serverproxy) pour obtenir des informations supplémentaires.
:::

::: noteclassic
[Housekeeper](/manual/web_interface/frontend_sections/administration/housekeeping) ne supprime aucune donnée d'Elasticsearch.
:::

[comment]: # ({/000d1106-e9a9c5bd})

[comment]: # ({8451a0a2-8451a0a2})
#### Stockage des données d'historique dans plusieurs index basés sur la date

Cette section décrit les étapes supplémentaires requises pour travailler avec des pipelines et ingérer des nœuds.

Pour commencer, vous devez créer des modèles pour les index.

L'exemple suivant montre une demande de création de modèle uint :

``` {.java}
curl -X PUT \
 http://your-elasticsearch.here:9200/_template/uint_template \
 -H 'content-type:application/json' \
 -d '{
   "index_patterns": [
      "uint*"
   ],
   "settings": {
      "index": {
         "number_of_replicas": 1,
         "number_of_shards": 5
      }
   },
   "mappings": {
      "properties": {
         "itemid": {
            "type": "long"
         },
         "clock": {
            "format": "epoch_second",
            "type": "date"
         },
         "value": {
            "type": "long"
         }
      }
   }
}'
```

Pour créer d'autres modèles, l'utilisateur doit modifier l'URL (la dernière partie est le nom du modèle), modifiez le champ `"index_patterns"` pour qu'il corresponde au nom de l'index et pour définir un mappage valide, qui peut être extrait de `database/elasticsearch/elasticsearch.map`.

Par exemple, la commande suivante peut être utilisée pour créer un modèle pour l'index de texte :

``` {.java}
curl -X PUT \
 http://your-elasticsearch.here: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"
         }
      }
   }
}'
```

Ceci est nécessaire pour permettre à Elasticsearch de définir un mappage valide pour les index créés automatiquement. Ensuite, il est nécessaire de créer la définition du pipeline. Le pipeline est une sorte de prétraitement des données avant de pousserles données dans des index. La commande suivante peut être utilisée pour créer un pipeline pour l'index uint :

``` {.java}
curl -X PUT \
 http://your-elasticsearch.here:9200/_ingest/pipeline/uint-pipeline \
 -H 'content-type:application/json' \
 -d '{
   "description": "daily uint index naming",
   "processors": [
      {
         "date_index_name": {
            "field": "clock",
            "date_formats": [
               "UNIX"
            ],
            "index_name_prefix": "uint-",
            "date_rounding": "d"
         }
      }
   ]
}'
```

L'utilisateur peut modifier le paramètre d'arrondi ("date\_arrondi") pour définir une période de rotation spécifique de l'index Pour créer d'autres pipelines, l'utilisateur doit changer l'URL (la dernière partie est le nom du pipeline) et changer le champ "index\_name\_prefix" pour correspondre au nom de l'index.

Voir également la [documentation Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/master/date-index-name-processor.html).

De plus, le stockage des données d'historique dans plusieurs index basés sur la date devrait également être activé dans le nouveau paramètre de la configuration du serveur Zabbix :

    ### Option: HistoryStorageDateIndex
    # Enable preprocessing of history values in history storage to store values in different indices based on date.
    # 0 - disable
    # 1 - enable
    #
    # Mandatory: no
    # Default:
    # HistoryStorageDateIndex=0

[comment]: # ({/8451a0a2-8451a0a2})

[comment]: # ({52123e63-5c4a5e3c})
#### Dépannage

Les étapes suivantes peuvent vous aider à résoudre les problèmes liés à la configuration d'Elasticsearch :

1. Vérifiez que le mapping est correct (requête GET vers l'URL de l'index requis, par exemple `http://localhost:9200/uint`).
2. Vérifiez que les shards ne sont pas dans un état d'échec (le redémarrage d'Elasticsearch devrait aider).
3. Vérifiez la configuration d'Elasticsearch. La configuration doit autoriser l'accès depuis l'hôte de l'interface Zabbix et l'hôte du serveur Zabbix.
4. Vérifiez les journaux d'Elasticsearch.
5. [``LogSlowQueries``](/manual/appendix/config/zabbix_server#logslowqueries) peut être utilisé pour rechercher des requêtes lentes dans la base de données Elasticsearch.

Si vous rencontrez toujours des problèmes avec votre installation, veuillez créer un rapport de bogue en incluant toutes les informations de cette liste (mapping, journaux d'erreurs, configuration, version, etc.)

[comment]: # ({/52123e63-5c4a5e3c})
