使用Elasticsearch作为Zabbix历史数据存储位置

从Zabbix的3.4.5版本开始,可以直接选择Elasticsearch作为Zabbix监视结果的存储位置。
之前需要使用fluentd等工具,将监视结果和日志结果分开处理和管理,现在可以通过Zabbix功能与Elasticsearch进行有效的协同工作。

由于Zabbix在日志监控和分析方面曾经稍显不足,因此通过这个新功能,对监控结果数据的利用变得更加容易了,不是吗?

你可以在Zabbix官方文档中详细了解。

现在我们来解释一下如何使用方法。

Zabbix和Elasticsearch的安装

不提供导入步骤,但一般情况下需要分别安装。
需要允许通信才能从Zabbix调用Elasticsearch的Web API。(ES的默认是http://elasticsearch的主机:9200)

顺便一提,本次所试验的各个版本如下。

    • Zabbix: 4.0.0 α3

 

    Elasticsearch: 5.6.7

Zabbix服务器的设置更改。

zabbix_server.conf文件中新增了HistoryStorageURL和HistoryStorageTypes两个设置项。

HistoryStorageURL=http://Elasticsearchのホスト名orIP:9200
HistoryStorageTypes=str,log,text

在HistoryStorageURL中指定Elasticsearch API的URL,在HistoryStorageTypes中指定想要用Elasticsearch管理的数据类型。
以上设置是关于将”字符串、日志、文本”数据存储到Elasticsearch中的示例。
如果还想将数字类型的”整数、浮点数”数据注册到Elasticsearch,需要添加”uint,dbl”。

似乎可以根据数据类型将存储位置更改为Elasticsearch。目前似乎不能更改每个个体项目的存储位置。

修改Zabbix Web的设置

因为还需要从Web管理界面访问Elasticsearch的数据,所以需要进行更改。

// global $DB;
global $DB, $HISTORY;
・・・
$HISTORY['url']   = 'http://Elasticsearchのホスト名orIP:9200';
$HISTORY['types'] = ['str', 'text', 'log'];

Elasticsearch的映射定义

以上是Zabbix方面的设置已经完成。
接下来需要在Elasticsearch方面进行预先的映射定义。

创建一个名为”text”的索引,并定义其映射。
它应该具有字段”itemid”、”clock”和”value”。

curl -X PUT http://Elasticsearchのホスト名orIP:9200/text -H 'content-type:application/json' -d '{
 "settings" : {
    "index" : {
       "number_of_replicas" : 1,
       "number_of_shards" : 5
    }
 },
 "mappings" : {
    "values" : {
       "properties" : {
          "itemid" : {
             "type" : "long"
          },
          "clock" : {
             "format" : "epoch_second",
             "type" : "date"
          },
          "value" : {
             "fields" : {
                "analyzed" : {
                   "index" : true,
                   "type" : "text",
                   "analyzer" : "standard"
                }
             },
             "index" : false,
             "type" : "text"
          }
       }
    }
 }
}'

我们也可以为log和str进行定义。
根据analyzer的设置部分或用途的不同,可以进行各种调整和应用。先暂时使用standard的analyzer进行注册。

curl -X PUT http://Elasticsearchのホスト名orIP:9200/log -H 'content-type:application/json' -d '
{
 "settings" : {
    "index" : {
       "number_of_replicas" : 1,
       "number_of_shards" : 5
    }
 },
 "mappings" : {
    "values" : {
       "properties" : {
          "itemid" : {
             "type" : "long"
          },
          "clock" : {
             "format" : "epoch_second",
             "type" : "date"
          },
          "value" : {
             "fields" : {
                "analyzed" : {
                   "index" : true,
                   "type" : "text",
                   "analyzer" : "standard"
                }
             },
             "index" : false,
             "type" : "text"
          }
       }
    }
 }
}'
curl -X PUT http://Elasticsearchのホスト名orIP:9200/str -H 'content-type:application/json' -d '
{
 "settings" : {
    "index" : {
       "number_of_replicas" : 1,
       "number_of_shards" : 5
    }
 },
 "mappings" : {
    "values" : {
       "properties" : {
          "itemid" : {
             "type" : "long"
          },
          "clock" : {
             "format" : "epoch_second",
             "type" : "date"
          },
          "value" : {
             "fields" : {
                "analyzed" : {
                   "index" : true,
                   "type" : "text",
                   "analyzer" : "standard"
                }
             },
             "index" : false,
             "type" : "text"
          }
       }
    }
 }
}'

重启Zabbix服务器和Apache。

在完成上述设置后,重新启动Zabbix服务器和Apache。

$ sudo systemctl restart zabbix-server.service
$ sudo systemctl restart httpd.service

这样,基本设置就完成了。

将日志数据添加到Zabbix项中。

为了尝试一下,我将创建一个日志型项目并尝试使用zabbix_sender进行注册。

监视物品的制作方式如下图所示。

zabbix_log_item.png

对于这个项目,可以使用以下命令来注册数据。

$ zabbix_sender -z localhost -s test-server01 -k log.test -o 'This is log test'
info from server: "processed: 1; failed: 0; total: 1; seconds spent: 0.001055"

查看已在Elasticsearch注册的数据

如果已经安装了Kibana,可以从Kibana界面上进行确认。
可以看到数据已经注册到名为log的索引上。

kibana_testlog.png

为了确认,我将从Elasticsearch的API中搜索数据。

curl -XGET 'http://Elasticsearchのホスト名orIP:9200/log/_search?q=*&pretty=true'
{
  "took" : 42,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "log",
        "_type" : "values",
        "_id" : "AWGOw-q5993wWmv8Di8Z",
        "_score" : 1.0,
        "_source" : {
          "itemid" : 28250,
          "value" : "This is log test",
          "timestamp" : 0,
          "source" : "",
          "severity" : 0,
          "logeventid" : 0,
          "clock" : 1518518659,
          "ns" : 18404355,
          "ttl" : 0
        }
      }
    ]
  }
}

已经顺利注册。

在Zabbix上查看数据

接下来,我们将确认Zabbix系统中如何显示以及在RDBMS中的具体情况。

从Web管理页面来看,没有任何问题,已经成功注册。

zabbix_log_web_dashboard.png

通常情况下,DB的数据会保存在history_log中,但根据以下情况,我们发现没有记录,数据只存储在Elasticsearch上。

MariaDB [zabbix]> select * from history_log;
Empty set (0.00 sec)

总结

我简单地介绍了Zabbix的新功能——与Elasticsearch的集成功能。也许,这个功能将来不仅仅局限于Elasticsearch,可能会进一步提供各种不同的历史数据存储方式。(不仅限于Elasticsearch的定义方法,而是可以通过设置HistoryStorage来实现)
这样做不仅仅是为了监控,还可以方便地分析日志和文本数据。随着Zabbix 4.0的即将发布,我相信很快就能在正式的长期支持版本(LTS版)中使用这个功能。真是令人期待。

bannerAds