Elasticsearch8小记

场景

ELK版本: 8.2.2

列出索引

GET _cat/indices

获取当前生命周期策略

GET _ilm/policy

写入一条数据到logs-login-test数据流中

POST /logs-login-test/_doc/
{
    "@timestamp": 1663567005424,
    "username": "Jack",
    "title": "ops",
    "level": "info",
    "log_type": "access_log",
    "logger": "http.log.access.access_logger",
    "start_time": 1663567005
}

日志中时间戳转换为ISO日期, 并调整为Date字段类型

需求是把已有str类型的start_time字段转换为ISO日期类型另存为新字段start_time_timestamp,并且调整为date类型字段

一. 新增Ingest Pipelines

Kibana UI -> Stack Management -> Ingest Pipelines -> Create pipeline -> New Pipeline -> Import Processor

{
  "processors": [
    {
      "date": {
        "field": "start_time",
        "formats": [
          "UNIX"
        ],
        "target_field": "start_time_timestamp"
      }
    }
  ]
}

二. 对已存日志执行Pipelines

POST logs-login-test/_update_by_query?pipeline=logs-login-test&wait_for_completion=false
{
  "query": {
    "match_all": {}
  }
}

可以看到已经添加上了新的字段”start_time_timestamp”, 但是还是keyword类型

三. 转换字段类型为data

上面转换后的”start_time_timestamp”字段类型还是text,需要转换为时间类型后才可以在Dashboard等地方使用字段作为日期轴, 这就要说到es的template, 我们创建的索引是logs-login-test, 其实是符合es自带的”logs”模板的匹配, 这个模板并没有对任何字段进行mapping设置.
参考Change mappings and settings for a data stream

知道了数据流字段类型是通过模板设置的, 那么修改字段类型就的思路就可以是:

  1. 新增模板logs-login-test,优先级高于自带的”logs”, mapping设置”start_time_timestamp”字段类型为”date_nanos”
PUT _index_template/logs-login
{
  "version": 2,
  "priority": 101,
  "template": {
    "mappings": {
      "properties": {
        "start_time_timestamp": {
          "index": true,
          "ignore_malformed": false,
          "store": false,
          "type": "date_nanos",
          "doc_values": true
        }
      }
    }
  },
  "index_patterns": [
    "logs-login-*",
    "logs-login-test"
  ],
  "data_stream": {
    "hidden": false,
    "allow_custom_routing": false
  },
  "composed_of": [
    "logs-mappings",
    "data-streams-mappings",
    "logs-settings"
  ],
  "_meta": {
    "managed": true,
    "description": "default logs template installed by x-pack"
  }
}
  1. 新增符合自建template匹配规则的数据流
PUT /_data_stream/logs-login-new
  1. 获取当前数据流中的索引
GET /_resolve/index/logs-login-test

  1. 执行reindex,复制老数据流中数据到新的数据流中
POST /_reindex?wait_for_completion=true
{
  "source": {
    "index": "logs-login-test"
  },
  "dest": {
    "index": "logs-login-new",
    "op_type": "create"
  }
}

这个时候可以看到已经有两条一模一样的数据在两个数据流中,但是新的数据流中”start_time_timestamp”字段已经是”date_nanos”日期格式了.

?wait_for_completion=true参数异步执行,会返回一个taskid, 可以通过以下获取任务进度,数据量非常庞大的时候可以用
GET _tasks/{taskid}

GET logs-login-new/_mapping

Data view中看到”start_time_timestamp”字段感叹号,是因为旧的数据流中字段类型冲突

  1. 删除旧的数据流
DELETE /_data_stream/logs-login-test

可以看到字段已经改为时间类型了

  1. 测试新数据写入, 还是用logs-login-test数据流,这次应该会使用我们自定义的template ,默认mapping了字段的.
POST /logs-login-test/_doc/
{
    "@timestamp": 1663581020000,
    "username": "Jack",
    "title": "ops",
    "level": "info",
    "log_type": "access_log",
    "logger": "http.log.access.access_logger",
    "start_time": 1663581020,
    "start_time_timestamp": "2022-09-19T09:50:20.000Z"
}

  1. 这个时候去kibana创建图表,可以看到日期已经可以选择我们的自定义字段”start_time_timestamp”了

other


转载请注明来源, 欢迎对文章中的引用来源进行考证, 欢迎指出任何有错误或不够清晰的表达, 可以邮件至 chinaops666@gmail.com
相册