Elasticsearch — Utilizando ILM com Downsampling

João Neto
3 min readJan 28, 2023

--

INTRODUÇÃO

Em um artigo anterior eu expliquei os beneficios de se utilizar o Downsampling e neste artigo de hoje eu demonstrarei como implementá-lo em um índice e utilizá-lo em uma política de ILM.

Apenas para recaptular sua estrutura de logs precisa ter os seguintes atributos para que faça sentido utilizar este recurso:

Image2. https://www.elastic.co/guide/en/elasticsearch/reference/8.5/downsampling.html

Mas basicamente todo cenário de coleta de métricas segue essa estrutura.

HANDS ON

Primeiramente precisamos criar nossa política de ILM. Podemos usar o exemplo abaixo:

PUT _ilm/policy/poc_downsampling
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_primary_shard_docs": 3
},
"set_priority": {
"priority": 100
},
"downsample": {
"fixed_interval": "1d"
}
},
"min_age": "0ms"
},
"delete": {
"min_age": "10d",
"actions": {
"delete": {}
}
}
}
}
}

Basicamente essa política faz rollover fará com que o índice seja rotacionado a cada 3 documentos no shard primário, feito a ação de downsampe levando em consideração 1d e deletando os índices após 10 dias.

Depois de criar o ILM vamos criar o mapeamento do nosso índice:

PUT temperatura-000001
{
"settings": {
"index": {
"lifecycle": {
"name": "poc_downsampling",
"rollover_alias": "temperatura"
},
"mode": "time_series",
"routing": {
"allocation": {
"include": {
"_tier_preference": "data_hot"
}
}
},
"routing_path": [
"sensor_id"
]
}
},
"mappings": {
"dynamic_templates": [],
"properties": {
"@timestamp": {
"type": "date",
"format": "strict_date_optional_time"
},
"sensor_id": {
"type": "keyword",
"time_series_dimension": true
},
"temperatura": {
"type": "half_float",
"time_series_metric": "gauge"
}
}
}
}

Olha a imagem da estrutura proposta e compare com o mapping acima, teremos o seguinte relacionamento:

  • timestamp: @timestamp
  • demension: sensor_id
  • metric name and value: temperatura

Vamos criar um alias para não dar erro no ILM rsrs

POST _aliases
{
"actions": [
{
"add": {
"index": "temperatura-000001",
"alias": "temperatura",
"is_write_index": true
}
}
]
}

Agora vamos adicionar um pequeno dataset:

POST temperatura/_doc/
{"@timestamp": "2023-01-18T14:08:00-03","sensor_id": "abc","temperatura": 25}
POST temperatura/_doc/
{"@timestamp": "2023-01-18T14:09:00-03","sensor_id": "abc","temperatura": 26}
POST temperatura/_doc/
{"@timestamp": "2023-01-18T14:10:00-03","sensor_id": "abc","temperatura": 27}

Ao fazer a busca teremos o seguinte retorno:

{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "temperatura-000001",
"_id": "2qUJvF1Rta_xjXt9AAABhcXb4kA",
"_score": 1,
"_source": {
"@timestamp": "2023-01-18T14:10:00-03",
"sensor_id": "abc",
"temperatura": 27
}
},
{
"_index": "temperatura-000001",
"_id": "2qUJvF1Rta_xjXt9AAABhcXa9-A",
"_score": 1,
"_source": {
"@timestamp": "2023-01-18T14:09:00-03",
"sensor_id": "abc",
"temperatura": 26
}
},
{
"_index": "temperatura-000001",
"_id": "2qUJvF1Rta_xjXt9AAABhcXaDYA",
"_score": 1,
"_source": {
"@timestamp": "2023-01-18T14:08:00-03",
"sensor_id": "abc",
"temperatura": 25
}
}
]
}
}

Agora é só esperar o ILM fazer a mágica e ao fazer a busca teremos…

{
"took": 3,
"timed_out": false,
"_shards": {
"total": 2,
"successful": 2,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "downsample-5yl6-temperatura-000001",
"_id": "2qUJvF1Rta_xjXt9AAABhcIs5AA",
"_score": 1,
"_source": {
"@timestamp": "2023-01-18T00:00:00.000Z",
"_doc_count": 3,
"sensor_id": "abc",
"temperatura": {
"min": 25,
"max": 27,
"sum": 78,
"value_count": 3
}
}
}
]
}
}

Agora temos os dados sumarizados conforme é possível ver! :)

Legal né? Espero que seja útil para você como é útil para mim!!

Essa era a dica que tinha para hoje, te vejo em breve!

Isso é tudo, pessoal ;)

REFERÊNCIA

Link da documentação oficial: https://www.elastic.co/guide/en/elasticsearch/reference/current/downsampling.html

--

--

João Neto

Especialista Elasticsearch, entusiasta na área de segurança da informação, cientista louco e acredita que melhor maneira de aprender é através do humor.