Alibaba Cloud Elasticsearch propose le plug-in aliyun-timestream pour optimiser le stockage et l'utilisation des données de séries temporelles. Ce plug-in permet d'exécuter des instructions en langage de requête Prometheus (PromQL) afin d'interroger les données dans Elasticsearch. Il s'intègre également de manière transparente à Prometheus et Grafana. Cette rubrique décrit l'utilisation des API Prometheus via le plug-in aliyun-timestream.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
-
Un cluster Alibaba Cloud Elasticsearch répondant à l'une des exigences de version suivantes :
Version du cluster V7.10, version du noyau V1.8.0 ou ultérieure
Version du cluster V7.16 ou ultérieure, version du noyau V1.7.0 ou ultérieure
Pour savoir comment créer un cluster, consultez Création d'un cluster Alibaba Cloud Elasticsearch.
Description des API Prometheus
Les API Prometheus permettent d'interroger les données écrites via l'API remote write de Prometheus ou les données présentes dans n'importe quel index de séries temporelles.
Lorsque vous utilisez une API Prometheus pour interroger des données, les préfixes et suffixes des champs de métriques et des champs de dimension ne figurent pas dans la réponse. Si vous interrogez des données écrites selon le modèle de données de séries temporelles par défaut, le préfixe metrics. des champs de métriques et le préfixe labels. des champs de dimension sont omis.
Par exemple, les données suivantes ont été écrites à l'aide de l'API remote write de Prometheus :
{
"labels": {
"instance": "127.0.0.1:9114",
"job": "elasticsearch"
},
"metrics": {
"up": 0.0,
"scrape_samples_post_metric_relabeling": 0.0,
"scrape_samples_scraped": 0.0,
"scrape_duration_seconds": 4.45999E-4,
"scrape_series_added": 0.0
},
"@timestamp": "1655717638795"
}
Si vous utilisez une API Prometheus pour interroger les données précédentes, le préfixe
labels.
des champs de dimension n'apparaît pas dans la réponse. Le code suivant illustre la réponse de l'API /api/v1/labels lors de l'interrogation de ces données :
{
"status" : "success",
"data" : [
"__name__",
"instance",
"job"
]
}
De même, lors de l'interrogation de ces données via une API Prometheus, le préfixe
metrics.
des champs de métriques est masqué. Voici un exemple de réponse de l'API /api/v1/metadata pour ces mêmes données :
{
"status" : "success",
"data" : {
"scrape_samples_post_metric_relabeling" : [
{
"type" : "gauge",
"help" : "",
"unit" : ""
}
],
"scrape_samples_scraped" : [
{
"type" : "gauge",
"help" : "",
"unit" : ""
}
],
"scrape_duration_seconds" : [
{
"type" : "gauge",
"help" : "",
"unit" : ""
}
],
"scrape_series_added" : [
{
"type" : "gauge",
"help" : "",
"unit" : ""
}
],
"up" : [
{
"type" : "gauge",
"help" : "",
"unit" : ""
}
]
}
}
Si vous personnalisez les paramètres lors de la création d'un index de séries temporelles, vous devez spécifier des préfixes et des suffixes pour les champs de métriques et les champs de dimension que vous téléchargez. À défaut, l'interrogation des données de l'index via une API Prometheus renverra les données brutes avec leurs préfixes réels. Le code ci-dessous montre comment définir ces préfixes et suffixes :
PUT _time_stream/{name}
{
"time_stream": {
"labels_fields": "@labels.*_l",
"metrics_fields": "@metrics.*_m",
"label_prefix": "@labels.",
"label_suffix": "_l",
"metric_prefix": "@metrics.",
"metric_suffix": "_m"
}
}
API Remote Write
Syntaxe de la requête
POST /_time_stream/prom_write/{index}
---PB data---
Remarques d'utilisation
En configurant le paramètre remote_write lors de l'installation de Prometheus, vous pouvez synchroniser les données vers Elasticsearch. Voici un exemple de configuration :
remote_write:
- url: "http://127.0.0.1:9200/_time_stream/prom_write/prom_index"
basic_auth:
username: elastic
password: xxxx
Prometheus utilise l'API remote write pour écrire des données dans les index de séries temporelles uniquement selon le modèle de données de séries temporelles par défaut, où le préfixe des champs de dimension est labels. et celui des champs de métriques est metrics..
API Instant Query
Syntaxe de la requête
GET /_time_stream/prom/{index}/query
POST /_time_stream/prom/{index}/query
Remarques d'utilisation
Pour plus d'informations sur l'API de requête instantanée de Prometheus, consultez Requêtes instantanées Prometheus.
API Range Query
Syntaxe de la requête
GET /_time_stream/prom/{index}/query_range
POST /_time_stream/prom/{index}/query_range
Remarques d'utilisation
Pour plus d'informations sur l'API de requête par plage de Prometheus, consultez Requêtes par plage Prometheus.
API Series Metadata
Syntaxe de la requête
GET /_time_stream/prom/{index}/series
POST /_time_stream/prom/{index}/series
Remarques d'utilisation
L'API Series Metadata de Prometheus permet d'obtenir la liste des séries temporelles. Pour en savoir plus sur cette API, consultez Recherche de séries par correspondance de libellés Prometheus.
API Label Metadata
Syntaxe de la requête
GET /_time_stream/prom/{index}/labels
POST /_time_stream/prom/{index}/labels
Remarques d'utilisation
L'API Label Metadata de Prometheus sert à récupérer la liste des dimensions. Pour plus de détails sur cette API, reportez-vous à Obtention des noms de libellés Prometheus.
API Label Value Metadata
Syntaxe de la requête
GET /_time_stream/prom/{index}/label/<label_name>/values
Remarques d'utilisation
L'API Label Value Metadata de Prometheus permet d'interroger la liste des valeurs de dimension. Pour approfondir le sujet, consultez Interrogation des valeurs de libellés Prometheus.
API Metric Metadata
Syntaxe de la requête
GET /_time_stream/prom/{index}/metadata
Remarques d'utilisation
L'API Metric Metadata de Prometheus permet d'obtenir la liste des métriques. Pour plus d'informations, consultez Interrogation des métadonnées de métriques Prometheus.
Prise en charge de PromQL par aliyun-timestream
Prise en charge des expressions
| Expression | Type | Prise en charge | Description |
| powOp | binaryOperator | Oui | Puissance |
| unaryOp | binaryOperator | Oui | Positif et négatif |
| multOp | binaryOperator | Oui | Multiplication, division et modulo |
| addOp | binaryOperator | Oui | Addition et soustraction |
| compareOp | binaryOperator | Oui | Comparaison (==, >=, >, <=, < et !=) |
| andUnlessOp | binaryOperator | Oui | Opération ensembliste (and, or et unless) |
| orOp | binaryOperator | Oui | Opération ensembliste (or) |
| function | vector | Oui | Fonction |
| aggregation | vector | Oui | Opération d'agrégation |
| instantSelector | vector | Oui | Sélecteur instantané |
| matrixSelector | vector | Oui | Sélecteur de vecteur |
| offset | vector | Oui | Décalage |
| literal | vector | Oui | Constante |
| labelMatcher | vector | Oui | Correspondance de libellé |
| grouping | group | Non | Agrégation par groupe, incluant on, ignoring, group_left et group_right |
Prise en charge des opérateurs d'agrégation
| Opérateur d'agrégation | Prise en charge |
| sum (calcul de la somme sur les dimensions) | Oui |
| min (sélection du minimum sur les dimensions) | Oui |
| max (sélection du maximum sur les dimensions) | Oui |
| avg (calcul de la moyenne sur les dimensions) | Oui |
| group (toutes les valeurs du vecteur résultant sont 1) | Non |
| stddev (calcul de l'écart type de la population sur les dimensions) | Non |
| stdvar (calcul de la variance standard de la population sur les dimensions) | Non |
| count (comptage du nombre d'éléments dans le vecteur) | Oui |
| count_values (comptage du nombre d'éléments ayant la même valeur) | Oui |
| bottomk (plus petits k éléments par valeur d'échantillon) | Oui |
| topk (plus grands k éléments par valeur d'échantillon) | Oui |
| quantile (calcul du φ-quantile (0 ≤ φ ≤ 1) sur les dimensions) | Oui |
Prise en charge des fonctions
| Fonction | Prise en charge |
| abs(v instant-vector) | Oui |
| absent(v instant-vector) | Non |
| absent_over_time(v range-vector) | Non |
| ceil(v instant-vector) | Oui |
| changes(v range-vector) | Non |
| clamp(v instant-vector, min scalar, max scalar) | Oui |
| clamp_max(v instant-vector, max scalar) | Oui |
| clamp_min(v instant-vector, min scalar) | Oui |
| day_of_month(v=vector(time()) instant-vector) | Oui |
| day_of_week(v=vector(time()) instant-vector) | Oui |
| days_in_month(v=vector(time()) instant-vector) | Non |
| delta(v range-vector) | Oui |
| deriv(v range-vector) | Non |
| exp(v instant-vector) | Oui |
| floor(v instant-vector) | Oui |
| histogram_quantile(φ scalar, b instant-vector) | Non |
| holt_winters(v range-vector, sf scalar, tf scalar) | Non |
| hour(v=vector(time()) instant-vector) | Oui |
| idelta(v range-vector) | Oui |
| increase(v range-vector) | Oui |
| irate(v range-vector) | Oui |
| label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...) | Non |
| label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string) | Non |
| ln(v instant-vector) | Oui |
| log2(v instant-vector) | Non |
| log10(v instant-vector) | Oui |
| minute(v=vector(time()) instant-vector) | Oui |
| month(v=vector(time()) instant-vector) | Oui |
| predict_linear(v range-vector, t scalar) | Non |
| rate(v range-vector) | Oui |
| resets(v range-vector) | Non |
| round(v instant-vector, to_nearest=1 scalar) | Non |
| scalar(v instant-vector) | Non |
| sgn(v instant-vector) | Oui |
| sort(v instant-vector) | Non |
| sort_desc() | Non |
| sqrt(v instant-vector) | Oui |
| time() | Non |
| timestamp(v instant-vector) | Oui |
| vector(s scalar) | Non |
| year(v=vector(time()) instant-vector) | Oui |
| avg_over_time(range-vector) | Oui |
| min_over_time(range-vector) | Oui |
| max_over_time(range-vector) | Oui |
| sum_over_time(range-vector) | Oui |
| count_over_time(range-vector) | Oui |
| quantile_over_time(scalar, range-vector) | Oui |
| stddev_over_time(range-vector) | Non |
| stdvar_over_time(range-vector) | Non |
| last_over_time(range-vector) | Oui |
| present_over_time(range-vector) | Non |
| acos(v instant-vector) | Oui |
| acosh(v instant-vector) | Oui |
| asin(v instant-vector) | Oui |
| asinh(v instant-vector) | Non |
| atan(v instant-vector) | Oui |
| atanh(v instant-vector) | Non |
| cos(v instant-vector) | Oui |
| cosh(v instant-vector) | Oui |
| sin(v instant-vector) | Oui |
| sinh(v instant-vector) | Oui |
| tan(v instant-vector) | Oui |
| tanh(v instant-vector) | Oui |
| deg(v instant-vector) | Oui |
| pi() | Oui |
| rad(v instant-vector) | Oui |