時系列データストリーム (TSDS) の設定
時系列データストリーム (TSDS) を設定するには、次の手順に従います:
- 1. 前提条件を確認します。
- 2. インデックスライフサイクルポリシーを作成します。
- 3. インデックステンプレートを作成します。
- 4. TSDSを作成します。
- 5. TSDSを保護します。
前提条件
インデックスライフサイクルポリシーの作成
オプションですが、TSDSのバックインデックスの管理を自動化するためにILMを使用することをお勧めします。ILMにはインデックスライフサイクルポリシーが必要です。
ポリシー内のmax_age
基準をrollover
アクションに指定することをお勧めします。これにより、TSDSのバックインデックスの@timestamp
範囲が一貫性を保ちます。たとえば、max_age
を1d
に設定することで、rollover
アクションが実行されると、バックインデックスには常に1日のデータが含まれることが保証されます。
Python
resp = client.ilm.put_lifecycle(
name="my-weather-sensor-lifecycle-policy",
policy={
"phases": {
"hot": {
"actions": {
"rollover": {
"max_age": "1d",
"max_primary_shard_size": "50gb"
}
}
},
"warm": {
"min_age": "30d",
"actions": {
"shrink": {
"number_of_shards": 1
},
"forcemerge": {
"max_num_segments": 1
}
}
},
"cold": {
"min_age": "60d",
"actions": {
"searchable_snapshot": {
"snapshot_repository": "found-snapshots"
}
}
},
"frozen": {
"min_age": "90d",
"actions": {
"searchable_snapshot": {
"snapshot_repository": "found-snapshots"
}
}
},
"delete": {
"min_age": "735d",
"actions": {
"delete": {}
}
}
}
},
)
print(resp)
Js
const response = await client.ilm.putLifecycle({
name: "my-weather-sensor-lifecycle-policy",
policy: {
phases: {
hot: {
actions: {
rollover: {
max_age: "1d",
max_primary_shard_size: "50gb",
},
},
},
warm: {
min_age: "30d",
actions: {
shrink: {
number_of_shards: 1,
},
forcemerge: {
max_num_segments: 1,
},
},
},
cold: {
min_age: "60d",
actions: {
searchable_snapshot: {
snapshot_repository: "found-snapshots",
},
},
},
frozen: {
min_age: "90d",
actions: {
searchable_snapshot: {
snapshot_repository: "found-snapshots",
},
},
},
delete: {
min_age: "735d",
actions: {
delete: {},
},
},
},
},
});
console.log(response);
コンソール
PUT _ilm/policy/my-weather-sensor-lifecycle-policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_age": "1d",
"max_primary_shard_size": "50gb"
}
}
},
"warm": {
"min_age": "30d",
"actions": {
"shrink": {
"number_of_shards": 1
},
"forcemerge": {
"max_num_segments": 1
}
}
},
"cold": {
"min_age": "60d",
"actions": {
"searchable_snapshot": {
"snapshot_repository": "found-snapshots"
}
}
},
"frozen": {
"min_age": "90d",
"actions": {
"searchable_snapshot": {
"snapshot_repository": "found-snapshots"
}
}
},
"delete": {
"min_age": "735d",
"actions": {
"delete": {}
}
}
}
}
}
インデックステンプレートの作成
TSDSを設定するには、次の詳細を持つインデックステンプレートを作成します:
- TSDSの名前に一致する1つ以上のインデックスパターン。私たちのデータストリーム命名スキームを使用することをお勧めします。
- データストリームを有効にします。
- 次のように、次元とメトリックを定義するマッピングを指定します:
time_series_dimension
の値がtrue
の1つ以上の次元フィールド。これらの次元のうち少なくとも1つは、通常のkeyword
フィールドである必要があります。time_series_metric
マッピングパラメータを使用してマークされた1つ以上のメトリックフィールド。- オプション:
date
またはdate_nanos
マッピングを@timestamp
フィールドに対して指定します。マッピングを指定しない場合、Elasticsearchは@timestamp
をdate
フィールドとしてデフォルトオプションでマッピングします。
- インデックス設定を定義します:
index.mode
設定をtime_series
に設定します。index.lifecycle.name
インデックス設定内のライフサイクルポリシー。- オプション: TSDSのバックインデックスに対する
index.number_of_replicas
などの他のインデックス設定。
- 組み込みテンプレートとの衝突を避けるために、
200
よりも高い優先度を設定します。インデックスパターンの衝突を避けるを参照してください。 - オプション: マッピングや他のインデックス設定を含むコンポーネントテンプレート。
Python
resp = client.indices.put_index_template(
name="my-weather-sensor-index-template",
index_patterns=[
"metrics-weather_sensors-*"
],
data_stream={},
template={
"settings": {
"index.mode": "time_series",
"index.lifecycle.name": "my-lifecycle-policy"
},
"mappings": {
"properties": {
"sensor_id": {
"type": "keyword",
"time_series_dimension": True
},
"location": {
"type": "keyword",
"time_series_dimension": True
},
"temperature": {
"type": "half_float",
"time_series_metric": "gauge"
},
"humidity": {
"type": "half_float",
"time_series_metric": "gauge"
},
"@timestamp": {
"type": "date"
}
}
}
},
priority=500,
meta={
"description": "Template for my weather sensor data"
},
)
print(resp)
Ruby
response = client.indices.put_index_template(
name: 'my-weather-sensor-index-template',
body: {
index_patterns: [
'metrics-weather_sensors-*'
],
data_stream: {},
template: {
settings: {
'index.mode' => 'time_series',
'index.lifecycle.name' => 'my-lifecycle-policy'
},
mappings: {
properties: {
sensor_id: {
type: 'keyword',
time_series_dimension: true
},
location: {
type: 'keyword',
time_series_dimension: true
},
temperature: {
type: 'half_float',
time_series_metric: 'gauge'
},
humidity: {
type: 'half_float',
time_series_metric: 'gauge'
},
"@timestamp": {
type: 'date'
}
}
}
},
priority: 500,
_meta: {
description: 'Template for my weather sensor data'
}
}
)
puts response
Js
const response = await client.indices.putIndexTemplate({
name: "my-weather-sensor-index-template",
index_patterns: ["metrics-weather_sensors-*"],
data_stream: {},
template: {
settings: {
"index.mode": "time_series",
"index.lifecycle.name": "my-lifecycle-policy",
},
mappings: {
properties: {
sensor_id: {
type: "keyword",
time_series_dimension: true,
},
location: {
type: "keyword",
time_series_dimension: true,
},
temperature: {
type: "half_float",
time_series_metric: "gauge",
},
humidity: {
type: "half_float",
time_series_metric: "gauge",
},
"@timestamp": {
type: "date",
},
},
},
},
priority: 500,
_meta: {
description: "Template for my weather sensor data",
},
});
console.log(response);
コンソール
PUT _index_template/my-weather-sensor-index-template
{
"index_patterns": ["metrics-weather_sensors-*"],
"data_stream": { },
"template": {
"settings": {
"index.mode": "time_series",
"index.lifecycle.name": "my-lifecycle-policy"
},
"mappings": {
"properties": {
"sensor_id": {
"type": "keyword",
"time_series_dimension": true
},
"location": {
"type": "keyword",
"time_series_dimension": true
},
"temperature": {
"type": "half_float",
"time_series_metric": "gauge"
},
"humidity": {
"type": "half_float",
"time_series_metric": "gauge"
},
"@timestamp": {
"type": "date"
}
}
}
},
"priority": 500,
"_meta": {
"description": "Template for my weather sensor data"
}
}
TSDSの作成
インデックスリクエストは、TSDSにドキュメントを追加します。TSDS内のドキュメントには次が含まれている必要があります:
@timestamp
フィールド- 1つ以上の次元フィールド。少なくとも1つの次元は、指定されている場合は
index.routing_path
インデックス設定に一致するkeyword
フィールドである必要があります。明示的に指定されていない場合、index.routing_path
はtrue
に設定されているマッピングに自動的に設定されます。
TSDSを自動的に作成するには、TSDSの名前をターゲットにしたインデックスリクエストを送信します。この名前は、インデックステンプレートのインデックスパターンの1つと一致する必要があります。
次の例をテストするには、タイムスタンプを現在の時間の3時間以内に更新します。TSDSに追加されるデータは常に受け入れられた時間範囲内に収まる必要があります。
Python
resp = client.bulk(
index="metrics-weather_sensors-dev",
operations=[
{
"create": {}
},
{
"@timestamp": "2099-05-06T16:21:15.000Z",
"sensor_id": "HAL-000001",
"location": "plains",
"temperature": 26.7,
"humidity": 49.9
},
{
"create": {}
},
{
"@timestamp": "2099-05-06T16:25:42.000Z",
"sensor_id": "SYKENET-000001",
"location": "swamp",
"temperature": 32.4,
"humidity": 88.9
}
],
)
print(resp)
resp1 = client.index(
index="metrics-weather_sensors-dev",
document={
"@timestamp": "2099-05-06T16:21:15.000Z",
"sensor_id": "SYKENET-000001",
"location": "swamp",
"temperature": 32.4,
"humidity": 88.9
},
)
print(resp1)
Js
const response = await client.bulk({
index: "metrics-weather_sensors-dev",
operations: [
{
create: {},
},
{
"@timestamp": "2099-05-06T16:21:15.000Z",
sensor_id: "HAL-000001",
location: "plains",
temperature: 26.7,
humidity: 49.9,
},
{
create: {},
},
{
"@timestamp": "2099-05-06T16:25:42.000Z",
sensor_id: "SYKENET-000001",
location: "swamp",
temperature: 32.4,
humidity: 88.9,
},
],
});
console.log(response);
const response1 = await client.index({
index: "metrics-weather_sensors-dev",
document: {
"@timestamp": "2099-05-06T16:21:15.000Z",
sensor_id: "SYKENET-000001",
location: "swamp",
temperature: 32.4,
humidity: 88.9,
},
});
console.log(response1);
コンソール
PUT metrics-weather_sensors-dev/_bulk
{ "create":{ } }
{ "@timestamp": "2099-05-06T16:21:15.000Z", "sensor_id": "HAL-000001", "location": "plains", "temperature": 26.7,"humidity": 49.9 }
{ "create":{ } }
{ "@timestamp": "2099-05-06T16:25:42.000Z", "sensor_id": "SYKENET-000001", "location": "swamp", "temperature": 32.4, "humidity": 88.9 }
POST metrics-weather_sensors-dev/_doc
{
"@timestamp": "2099-05-06T16:21:15.000Z",
"sensor_id": "SYKENET-000001",
"location": "swamp",
"temperature": 32.4,
"humidity": 88.9
}
データストリームAPIを使用して、TSDSを手動で作成することもできます。TSDSの名前は、テンプレートのインデックスパターンの1つと一致する必要があります。
Python
resp = client.indices.create_data_stream(
name="metrics-weather_sensors-dev",
)
print(resp)
Ruby
response = client.indices.create_data_stream(
name: 'metrics-weather_sensors-dev'
)
puts response
Js
const response = await client.indices.createDataStream({
name: "metrics-weather_sensors-dev",
});
console.log(response);
コンソール
PUT _data_stream/metrics-weather_sensors-dev
TSDSの保護
インデックス権限を使用して、TSDSへのアクセスを制御します。TSDSに権限を付与すると、そのバックインデックスにも同じ権限が付与されます。
例については、データストリーム権限を参照してください。
既存のデータストリームをTSDSに変換
上記の手順を使用して、既存の通常のデータストリームをTSDSに変換することもできます。この場合、次のことを行う必要があります:
- 新しいものを作成するのではなく、既存のインデックスライフサイクルポリシー、コンポーネントテンプレート、およびインデックステンプレートを編集します。
- TSDSを作成するのではなく、その書き込みインデックスを手動でロールオーバーします。これにより、現在の書き込みインデックスと新しいバックインデックスが
index.mode
がtime_series
の条件を満たすことが保証されます。
書き込みインデックスを手動でロールオーバーするには、ロールオーバーAPIを使用します。
Python
resp = client.indices.rollover(
alias="metrics-weather_sensors-dev",
)
print(resp)
Ruby
response = client.indices.rollover(
alias: 'metrics-weather_sensors-dev'
)
puts response
Js
const response = await client.indices.rollover({
alias: "metrics-weather_sensors-dev",
});
console.log(response);
コンソール
POST metrics-weather_sensors-dev/_rollover
コンポーネントテンプレートとインデックス.mode設定に関する注意
コンポーネントテンプレートを使用するインデックステンプレートを介してTSDSを構成するのは、少し複雑です。通常、コンポーネントテンプレートでは、マッピングと設定が複数のコンポーネントテンプレートに散らばります。コンポーネントテンプレート内でindex.mode
設定を構成する場合、index.routing_path
設定は同じコンポーネントテンプレート内で定義する必要があります。さらに、index.routing_path
で言及されているフィールドも、time_series_dimension
属性が有効になっている同じコンポーネントテンプレート内で定義する必要があります。
その理由は、各コンポーネントテンプレートが独自に有効である必要があり、時系列インデックスモードがindex.routing_path
設定を必要とするためです。インデックステンプレート内でindex.mode
設定を構成する場合、index.routing_path
設定は自動的に構成されます。これは、time_series_dimension
属性が有効になっているフィールドマッピングから派生します。
次は何ですか?
TSDSを設定したので、通常のデータストリームのように管理および使用できます。詳細については、次を参照してください: