すべてのプロダクト
Search
ドキュメントセンター

Elasticsearch:aliyun-timestream と Prometheus API の統合

最終更新日:Jan 11, 2025

Alibaba Cloud Elasticsearch は、時系列データの保存と使用を強化するための aliyun-timestream プラグインを提供しています。このプラグインを使用すると、Prometheus Query Language(PromQL)ステートメントを実行して Elasticsearch のデータをクエリできます。このプラグインは、Prometheus および Grafana とシームレスに統合することもできます。このトピックでは、aliyun-timestream プラグインに基づいて Prometheus API を使用する方法について説明します。

背景情報

aliyun-timestream は、Elastic コミュニティによって提供される時系列製品の機能に基づいて、Alibaba Cloud Elasticsearch チームによって開発されたプラグインです。このプラグインは、時系列データの保存と使用のパフォーマンスを向上させるために使用されます。 aliyun-timestream は、ドメイン固有言語(DSL)ステートメントの代わりに Prometheus Querying Language(PromQL)ステートメントを使用して、保存されているメトリックデータをクエリします。これにより、クエリ操作が簡素化され、クエリ効率が向上します。 aliyun-timestream はストレージコストも削減します。詳細については、aliyun-timestream の概要をご参照ください。

前提条件

次のバージョン要件を満たす Elasticsearch クラスタが作成されていること。クラスタのバージョンが V7.10 で、クラスタのカーネルバージョンが V1.8.0 以降であること、またはクラスタのバージョンが V7.16 以降で、クラスタのカーネルバージョンが V1.7.0 以降であること。Elasticsearch クラスタの作成方法については、Alibaba Cloud Elasticsearch クラスタの作成をご参照ください。

Prometheus API の説明

Prometheus API を使用して、Prometheus のリモート書き込み API を使用して書き込まれたデータ、または任意の時系列インデックスのデータをクエリできます。

Prometheus API を使用してデータをクエリする場合、返されるメトリックフィールドとディメンションフィールドのプレフィックスとサフィックスは表示されません。デフォルトの時系列データモデルに基づいて書き込まれたデータを Prometheus API を使用してクエリする場合、返されるメトリックフィールドのプレフィックス metrics. は表示されず、返されるディメンションフィールドのプレフィックス labels. は表示されません。

たとえば、次のデータは Prometheus のリモート書き込み API を使用して書き込まれます。
{
  "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"
}
/api/v1/labels API を使用して上記のデータをクエリする場合、返されるディメンションフィールドのプレフィックス labels. は表示されません。次のコードは、/api/v1/labels API を使用して上記のデータをクエリした応答の例を示しています。
{
  "status" : "success",
  "data" : [
    "__name__",
    "instance",
    "job"
  ]
}
                
Prometheus API を使用して上記のデータをクエリする場合、返されるメトリックフィールドのプレフィックス metrics. は表示されません。次のコードは、/api/v1/metadata API を使用して上記のデータをクエリした応答の例を示しています。
{
  "status" : "success",
  "data" : {
    "scrape_samples_post_metric_relabeling" : [ // scrape_samples_post_metric_relabeling
      {
        "type" : "gauge",
        "help" : "",
        "unit" : ""
      }
    ],
    "scrape_samples_scraped" : [ // scrape_samples_scraped
      {
        "type" : "gauge",
        "help" : "",
        "unit" : ""
      }
    ],
    "scrape_duration_seconds" : [ // scrape_duration_seconds
      {
        "type" : "gauge",
        "help" : "",
        "unit" : ""
      }
    ],
    "scrape_series_added" : [ // scrape_series_added
      {
        "type" : "gauge",
        "help" : "",
        "unit" : ""
      }
    ],
    "up" : [ // up
      {
        "type" : "gauge",
        "help" : "",
        "unit" : ""
      }
    ]
  }
}
時系列インデックスを作成するときに設定をカスタマイズする場合、アップロードするメトリックフィールドとディメンションフィールドのプレフィックスとサフィックスを指定する必要があります。そうしないと、Prometheus API を使用して時系列インデックスのデータをクエリすると、実際のデータが返されます。次のコードは、このようなプレフィックスとサフィックスを指定する方法の例を示しています。
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

リクエスト構文

POST /_time_stream/prom_write/{index}
---PB data---

使用方法

Prometheus をインストールするときに remote_write パラメータを設定すると、Prometheus を使用して Elasticsearch にデータを同期できます。次のコードは、設定例を示しています。
remote_write:
  - url: "http://127.0.0.1:9200/_time_stream/prom_write/prom_index"
    basic_auth:
     username: elastic
     password: xxxx

Prometheus は、リモート書き込み API を使用して、ディメンションフィールドのプレフィックスが labels. で、メトリックフィールドのプレフィックスが metrics. であるデフォルトの時系列データモデルのみに基づいて、時系列インデックスにデータを書き込みます。

インスタントクエリ API

リクエスト構文

GET  /_time_stream/prom/{index}/query
POST /_time_stream/prom/{index}/query

使用方法

Prometheus のインスタントクエリ API については、Prometheus インスタントクエリをご参照ください。

範囲クエリ API

リクエスト構文

GET  /_time_stream/prom/{index}/query_range
POST /_time_stream/prom/{index}/query_range

使用方法

Prometheus の範囲クエリ API については、Prometheus 範囲クエリをご参照ください。

シリーズメタデータ API

リクエスト構文

GET  /_time_stream/prom/{index}/series
POST /_time_stream/prom/{index}/series

使用方法

Prometheus のシリーズメタデータ API は、時系列のリストをクエリするために使用されます。この API の詳細については、Prometheus finding series by label matchersをご参照ください。

ラベルメタデータ API

リクエスト構文

GET  /_time_stream/prom/{index}/labels
POST /_time_stream/prom/{index}/labels

使用方法

Prometheus のラベルメタデータ API は、ディメンションのリストをクエリするために使用されます。この API の詳細については、Prometheus getting label namesをご参照ください。

ラベル値メタデータ API

リクエスト構文

GET /_time_stream/prom/{index}/label/<label_name>/values

使用方法

Prometheus のラベル値メタデータ API は、ディメンション値のリストをクエリするために使用されます。この API の詳細については、Prometheus querying label valuesをご参照ください。

メトリックメタデータ API

リクエスト構文

GET /_time_stream/prom/{index}/metadata

使用方法

Prometheus のメトリックメタデータ API は、メトリックのリストをクエリするために使用されます。この API の詳細については、Prometheus querying metric metadataをご参照ください。

aliyun-timestream による PromQL のサポート

式のサポート

タイプサポートされているかどうか説明
powOpbinaryOperatorはいべき乗
unaryOpbinaryOperatorはい正負
multOpbinaryOperatorはい乗算、除算、剰余
addOpbinaryOperatorはい加算、減算
compareOpbinaryOperatorはい比較(==、>=、>、<=、<、!=)
andUnlessOpbinaryOperatorはい集合演算(and、or、unless)
orOpbinaryOperatorはい集合演算(or)
functionvectorはい関数
aggregationvectorはい集計演算
instantSelectorvectorはいインスタントセレクタ
matrixSelectorvectorはいベクトルセレクタ
offsetvectorはいオフセット
literalvectorはい定数
labelMatchervectorはいラベルマッチング
groupinggroupいいえグループ化集計。on、ignoring、group_left、group_right など

集計演算子のサポート

集計演算子サポートされているかどうか
sum(ディメンション全体の合計を計算)はい
min(ディメンション全体の最小値を選択)はい
max(ディメンション全体の最大値を選択)はい
avg(ディメンション全体の平均を計算)はい
group(結果のベクトル内のすべての値は 1)いいえ
stddev(ディメンション全体の母集団標準偏差を計算)いいえ
stdvar(ディメンション全体の母集団分散を計算)いいえ
count(ベクトル内の要素数をカウント)はい
count_values(同じ値を持つ要素数をカウント)はい
bottomk(サンプル値で最も小さい k 個の要素)はい
topk(サンプル値で最も大きい k 個の要素)はい
quantile(ディメンション全体の φ 分位数(0 ≤ φ ≤ 1)を計算)はい

関数のサポート

関数サポートされているかどうか
abs(v instant-vector)はい
absent(v instant-vector)いいえ
absent_over_time(v range-vector)いいえ
ceil(v instant-vector)はい
changes(v range-vector)いいえ
clamp(v instant-vector, min scalar, max scalar)はい
clamp_max(v instant-vector, max scalar)はい
clamp_min(v instant-vector, min scalar)はい
day_of_month(v=vector(time()) instant-vector)はい
day_of_week(v=vector(time()) instant-vector)はい
days_in_month(v=vector(time()) instant-vector)いいえ
delta(v range-vector)はい
deriv(v range-vector)いいえ
exp(v instant-vector)はい
floor(v instant-vector)はい
histogram_quantile(φ scalar, b instant-vector)いいえ
holt_winters(v range-vector, sf scalar, tf scalar)いいえ
hour(v=vector(time()) instant-vector)はい
idelta(v range-vector)はい
increase(v range-vector)はい
irate(v range-vector)はい
label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...)いいえ
label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)いいえ
ln(v instant-vector)はい
log2(v instant-vector)いいえ
log10(v instant-vector)はい
minute(v=vector(time()) instant-vector)はい
month(v=vector(time()) instant-vector)はい
predict_linear(v range-vector, t scalar)いいえ
rate(v range-vector)はい
resets(v range-vector)いいえ
round(v instant-vector, to_nearest=1 scalar)いいえ
scalar(v instant-vector)いいえ
sgn(v instant-vector)はい
sort(v instant-vector)いいえ
sort_desc()いいえ
sqrt(v instant-vector)はい
time()いいえ
timestamp(v instant-vector)はい
vector(s scalar)いいえ
year(v=vector(time()) instant-vector)はい
avg_over_time(range-vector)はい
min_over_time(range-vector)はい
max_over_time(range-vector)はい
sum_over_time(range-vector)はい
count_over_time(range-vector)はい
quantile_over_time(scalar, range-vector)はい
stddev_over_time(range-vector)いいえ
stdvar_over_time(range-vector)いいえ
last_over_time(range-vector)はい
present_over_time(range-vector)いいえ
acos(v instant-vector)はい
acosh(v instant-vector)はい
asin(v instant-vector)はい
asinh(v instant-vector)いいえ
atan(v instant-vector)はい
atanh(v instant-vector)いいえ
cos(v instant-vector)はい
cosh(v instant-vector)はい
sin(v instant-vector)はい
sinh(v instant-vector)はい
tan(v instant-vector)はい
tanh(v instant-vector)はい
deg(v instant-vector)はい
pi()はい
rad(v instant-vector)はい