> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> Conçu pour la réduction et l'agrégation/la mise en moyenne (rollup) des données Graphite.

# Moteur de table GraphiteMergeTree

Ce moteur est conçu pour la réduction et l'agrégation/la mise en moyenne (rollup) des données [Graphite](http://graphite.readthedocs.io/en/latest/index.html). Il peut être utile aux développeurs qui souhaitent utiliser ClickHouse comme système de stockage pour Graphite.

Vous pouvez utiliser n'importe quel moteur de table ClickHouse pour stocker les données Graphite si vous n'avez pas besoin de rollup, mais si vous en avez besoin, utilisez `GraphiteMergeTree`. Le moteur réduit le volume de stockage et améliore l'efficacité des requêtes Graphite.

Le moteur hérite des propriétés de [MergeTree](/docs/fr/reference/engines/table-engines/mergetree-family/mergetree).

<div id="creating-table">
  ## Créer une table
</div>

```sql theme={null}
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    Path String,
    Time DateTime,
    Value Float64,
    Version <Numeric_type>
    ...
) ENGINE = GraphiteMergeTree(config_section)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
```

Voir une description détaillée de la requête [CREATE TABLE](/docs/fr/reference/statements/create/table).

Une table destinée aux données Graphite doit comporter les colonnes suivantes :

* Nom de la métrique (capteur Graphite). Type de données : `String`.

* Date et heure de mesure de la métrique. Type de données : `DateTime`.

* Valeur de la métrique. Type de données : `Float64`.

* Version de la métrique. Type de données : tout type numérique (ClickHouse conserve les lignes ayant la version la plus élevée ou la dernière écrite si les versions sont identiques. Les autres lignes sont supprimées lors de la fusion des parties de données).

Les noms de ces colonnes doivent être définis dans la configuration de rollup.

**Paramètres de GraphiteMergeTree**

* `config_section` — Nom de la section du fichier de configuration dans laquelle sont définies les règles de rollup.

**Clauses de requête**

Lors de la création d'une table `GraphiteMergeTree`, les mêmes [clauses](/docs/fr/reference/engines/table-engines/mergetree-family/mergetree#table_engine-mergetree-creating-a-table) sont requises que lors de la création d'une table `MergeTree`.

<details markdown="1">
  <summary>Méthode obsolète de création d'une table</summary>

  <Note>
    N'utilisez pas cette méthode dans les nouveaux projets et, si possible, faites migrer les anciens projets vers la méthode décrite ci-dessus.
  </Note>

  ```sql theme={null}
  CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
  (
      EventDate Date,
      Path String,
      Time DateTime,
      Value Float64,
      Version <Numeric_type>
      ...
  ) ENGINE [=] GraphiteMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, config_section)
  ```

  Tous les paramètres, à l'exception de `config_section`, ont la même signification que dans `MergeTree`.

  * `config_section` — Nom de la section du fichier de configuration dans laquelle sont définies les règles de rollup.
</details>

<div id="rollup-configuration">
  ## Configuration du rollup
</div>

Les paramètres du rollup sont définis par le paramètre [graphite\_rollup](/docs/fr/reference/settings/server-settings/settings#graphite) dans la configuration du serveur. Le nom du paramètre peut être choisi librement. Vous pouvez créer plusieurs configurations et les utiliser pour différentes tables.

Structure de la configuration du rollup :

* required-columns
* patterns

<div id="required-columns">
  ### Colonnes requises
</div>

<div id="path_column_name">
  #### `path_column_name`
</div>

`path_column_name` — Nom de la colonne qui stocke le nom de la métrique (capteur Graphite). Valeur par défaut : `Path`.

<div id="time_column_name">
  #### `time_column_name`
</div>

`time_column_name` — Le nom de la colonne qui stocke l’heure de mesure de la métrique. Valeur par défaut : `Time`.

<div id="value_column_name">
  #### `value_column_name`
</div>

`value_column_name` — Le nom de la colonne qui stocke la valeur de la métrique à l’instant défini dans `time_column_name`. Valeur par défaut : `Value`.

<div id="version_column_name">
  #### `version_column_name`
</div>

`version_column_name` — Le nom de la colonne stockant la version de la métrique. Valeur par défaut : `Timestamp`.

<div id="patterns">
  ### Patterns
</div>

Structure de la section `patterns` :

```text theme={null}
pattern
    rule_type
    regexp
    function
pattern
    rule_type
    regexp
    age + precision
    ...
pattern
    rule_type
    regexp
    function
    age + precision
    ...
pattern
    ...
default
    function
    age + precision
    ...
```

<Warning>
  Les sections `pattern` doivent être strictement ordonnées :

  1. Les sections `pattern` sans `function` ni `retention`.
  2. Les sections `pattern` avec `function` et `retention`.
  3. La section `default`.
</Warning>

Lors du traitement d’une ligne, ClickHouse vérifie les règles dans les sections `pattern`. Chacune des sections `pattern` (y compris `default`) peut contenir le paramètre `function` pour l’agrégation, les paramètres `retention`, ou les deux. Si le nom de la métrique correspond à `regexp`, les règles de la section `pattern` (ou des sections `pattern`) sont appliquées ; sinon, les règles de la section `default` sont utilisées.

Champs des sections `pattern` et `default` :

* `rule_type` - le type d’une règle. Il s’applique uniquement à certaines métriques. Le moteur l’utilise pour séparer les métriques simples et les métriques avec tags. Paramètre facultatif. Valeur par défaut : `all`.
  Il n’est pas nécessaire lorsque les performances ne sont pas critiques, ou lorsqu’un seul type de métriques est utilisé, par exemple des métriques simples. Par défaut, un seul ensemble de règles est créé. Sinon, si l’un des types spéciaux est défini, deux ensembles différents sont créés. Un pour les métriques simples (root.branch.leaf) et un pour les métriques avec tags (root.branch.leaf;tag1=value1).
  Les règles par défaut se retrouvent dans les deux ensembles.
  Valeurs valides :
  * `all` (par défaut) - une règle universelle, utilisée lorsque `rule_type` est omis.
  * `plain` - une règle pour les métriques simples. Le champ `regexp` est traité comme une expression régulière.
  * `tagged` - une règle pour les métriques avec tags (les métriques sont stockées dans la DB au format `someName?tag1=value1&tag2=value2&tag3=value3`). L’expression régulière doit être triée par nom de tag, le premier tag devant être `__name__` s’il existe. Le champ `regexp` est traité comme une expression régulière.
  * `tag_list` - une règle pour les métriques avec tags, avec une DSL simple pour faciliter la description des métriques au format graphite `someName;tag1=value1;tag2=value2`, `someName` ou `tag1=value1;tag2=value2`. Le champ `regexp` est converti en règle `tagged`. Le tri par nom de tag n’est pas nécessaire, il sera effectué automatiquement. La valeur d’un tag (mais pas son nom) peut être définie comme une expression régulière, par exemple `env=(dev|staging)`.
* `regexp` – Un motif pour le nom de la métrique (expression régulière ou DSL).
* `age` – L’âge minimal des données, en secondes.
* `precision`– Le niveau de précision utilisé pour définir l’âge des données en secondes. Doit être un diviseur de 86400 (secondes dans une journée).
* `function` – Le nom de la fonction d’agrégation à appliquer aux données dont l’âge se situe dans l’intervalle `[age, age + precision]`. Fonctions acceptées : min / max / any / avg. La moyenne est calculée de manière imprécise, comme la moyenne des moyennes.

<div id="configuration-example">
  ### Exemple de configuration sans types de règles
</div>

```xml theme={null}
<graphite_rollup>
    <version_column_name>Version</version_column_name>
    <pattern>
        <regexp>click_cost</regexp>
        <function>any</function>
        <retention>
            <age>0</age>
            <precision>5</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>60</precision>
        </retention>
    </pattern>
    <default>
        <function>max</function>
        <retention>
            <age>0</age>
            <precision>60</precision>
        </retention>
        <retention>
            <age>3600</age>
            <precision>300</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>3600</precision>
        </retention>
    </default>
</graphite_rollup>
```

<div id="configuration-typed-example">
  ### Exemple de configuration avec type de règle
</div>

```xml theme={null}
<graphite_rollup>
    <version_column_name>Version</version_column_name>
    <pattern>
        <rule_type>plain</rule_type>
        <regexp>click_cost</regexp>
        <function>any</function>
        <retention>
            <age>0</age>
            <precision>5</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>60</precision>
        </retention>
    </pattern>
    <pattern>
        <rule_type>tagged</rule_type>
        <regexp>^((.*)|.)min\?</regexp>
        <function>min</function>
        <retention>
            <age>0</age>
            <precision>5</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>60</precision>
        </retention>
    </pattern>
    <pattern>
        <rule_type>tagged</rule_type>
        <regexp><![CDATA[^someName\?(.*&)*tag1=value1(&|$)]]></regexp>
        <function>min</function>
        <retention>
            <age>0</age>
            <precision>5</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>60</precision>
        </retention>
    </pattern>
    <pattern>
        <rule_type>tag_list</rule_type>
        <regexp>someName;tag2=value2</regexp>
        <retention>
            <age>0</age>
            <precision>5</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>60</precision>
        </retention>
    </pattern>
    <default>
        <function>max</function>
        <retention>
            <age>0</age>
            <precision>60</precision>
        </retention>
        <retention>
            <age>3600</age>
            <precision>300</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>3600</precision>
        </retention>
    </default>
</graphite_rollup>
```

<Note>
  Le rollup des données est effectué pendant les fusions. En général, pour les anciennes partitions, les fusions ne démarrent pas ; pour effectuer le rollup, il faut donc déclencher une fusion non planifiée à l’aide de [optimize](/docs/fr/reference/statements/optimize). Vous pouvez également utiliser des outils supplémentaires, par exemple [graphite-ch-optimizer](https://github.com/innogames/graphite-ch-optimizer).
</Note>
