Beats:如何定制已经创建的 Beats template

在我之前的文章 “Beats:解密 Filebeat 中的 setup 命令” 中,我已经详述了当我们执行 setup 命令时,它会自动帮我们在 Elasticsearch 中创建一个 index template。这个 index template 的作用就是使得我们所有的索引都具有相同的字段属性,以便于我们分析数据。在实际的使用中,我们可以根据自己的使用来进行微调这个 index template。在今天的这篇文章中,我将使用一个具体的例子来详述如何进行定制。

 

准备工作

我们首先参阅之前的文章 “Beats 入门教程 (二)” 来启动 metricbeat。在默认的情况下,我们可以看到 system 模块被启动。我们可以通过如下的命令来启动 metricbeat:

./metricbeat setup
$ ./metricbeat setup
Overwriting ILM policy is disabled. Set `setup.ilm.overwrite: true` for enabling.

Index setup finished.
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards

我们接着运行 metricbeat:

./metricbeat -e

我们可以在 Kibana 中查看到新生成的 template:

GET _template/metricbeat-7.9.1

从上面,我们可以看出来:merticbeat-7.9.1 模板的 order 为 "1",表明它可以被任何比 1 高的 order 进行覆盖。

 

方法一:直接在 Kibana 中通过命令来定制

我可以在 Kibana 中使用如下的命令来定制 metricbeat 的 template:

PUT _template/my_metricbeat_template
{
  "order": 2,
  "index_patterns": [
    "metricbeat-*"
  ],
  "mappings": {
    "properties": {
      "my_custom_field": {
        "type": "text"
      }
    }
  }
}

在上面,我们的 order 为2。运行上面的指令,并同时停止 metricbeat 的运行。使用如下的命令来删除索引:

DELETE metricbeat-7.9.1*

我们再次运行 metricbeat。

./metricbeat -e

我们再次来重新查看 metricbeat 的 mapping:

GET metricbeat-7.9.1/_mapping

上面的命令显示:

从上面,我们可以看出来有一个新的叫做 my_custom_field 的字段,表明我们的 my_metricbeat_template 模板已经起作用了。我们也可以通过如下的命令来进行检查:

GET metricbeat-7.9.1/_mapping/field/my_custom_field

上面的命令显示的结果是:

{
  "metricbeat-7.9.1-2020.10.28-000001" : {
    "mappings" : {
      "my_custom_field" : {
        "full_name" : "my_custom_field",
        "mapping" : {
          "my_custom_field" : {
            "type" : "text"
          }
        }
      }
    }
  }
}

 

方法二:通过 metricbeat 的配置来进行修改

我们可以查看到 hostname 是一个 keyword 的数据类型。假如我们想把这个字段修改为 text 数据类型,那该怎么办呢?

我们首先找到 metricbeat.yml 配置文件。参照 Configure Elasticsearch index template loading, 在 metricbeat.yml 文件中添加如下的部分:

setup.template.json.enabled: true
setup.template.json.path: "my_custom_template.json"
setup.template.json.name: "my_custom_template"

我们在 metricbeat 的安装根目录下创建如下的一个文件:

my_custom_template.json

{
  "order": 2,
  "index_patterns": [
    "metricbeat-*"
  ],
  "mappings": {
    "properties": {
      "agent": {
        "properties": {
          "hostname": {
            "type": "text"
          }
        }
      }
    }
  }
}

接下来,我们停止 metricbeat 的运行,并删除 metricbeat-7.9.1 索引。同时也删除在上面步骤创建的 my_metricbeat_template 模板:

DELETE metricbeat-7.9.1*
DELETE _template/my_metricbeat_template

我们重新运行 metricbeat:

./metricbeat -e

我们再次检查最新运行的 metricbeat 的 mapping:

GET metricbeat-7.9.1/_mapping

上面运行的结果是:

我们可以看到上面的 hostname 现在变成了 text 数据类型了。我们也可以使用如下的命令来进行查看:

GET metricbeat-7.9.1/_mapping/field/agent.hostname

上面的命令显示:

{
  "metricbeat-7.9.1" : {
    "mappings" : {
      "agent.hostname" : {
        "full_name" : "agent.hostname",
        "mapping" : {
          "hostname" : {
            "type" : "text"
          }
        }
      }
    }
  }
}

我们可以看出来,我们定制的字段已经成功地变为我们想要的字段了。