I'm happy to introduce a Puppet module which is about three of five my favorite server products: Elasticsearch, Puppet and Zabbix. Just for your information I'll tell that remaining two are Cassandra with DataStax and Atlassian suite.
elastizabbix module installs elastizabbix Zabbix agent script and Zabbix template, allowing us to monitor Elasticsearch cluster in Zabbix. It is an open source module, published under Apache 2.0 license, and managed at Github (contributors are welcome). Talking about the license, it is important to say that the module itself is published under Apache 2.0 license (as already mentioned), while the original elastizabbix project is published under MIT License. One way or another, you are pretty much free to use the code in a way you want. The module is also published at puppet forge.
Requirements
The module requires presence of puppet/zabbix module on both server and client side. At the server side the module requires that zabbix
class is used (implemented), and at the client side it requires that zabbix::agent
class is used (implemented).
At the client side python 2 or 3 is also required. But since it usually comes preinstalled with the OS - there's nothing you need to do.
Up and Running
Server Side
The module is very simple to use. At the server side (Zabbix server) you should add the following:
class { 'elastizabbix::server': }
Actually, you don't have to add this class at all. The only thing that the class do is trying to install Zabbix template, so you can accomplish the same effect by manually importing the template through Zabbix interface. The name of the template file is templates_app_elasticsearch.xml
and you can find it in files
folder of the module (as well as in Github repositories of the original elastizabbix project and elastizabbix puppet module project).
You should know that if you are using zabbix
class with manage_resources
set to true
, elastizabbix::server
class will automatically install the template in Zabbix server. Before including this option please check the original puppet/zabbix module documentation, especially part that deals with exported resources. Personally, I think that you should not use this option. If this option is not used, then you'll have to manually import the template through Zabbix interface. In this case elastizabbix::server
class will prepare the template for you and store it in /tmp
folder on Zabbix server. But again, if you are not using manage_resources
option - elastizabbix::server
class is not too useful since you can find the same template at several other places mentioned above.
Client Side
At the client side (one node from Elasticsearch cluster) you should add the following:
class { 'elastizabbix': }
elastizabbix
class to only one node from the Elasticsearch cluster; not to all the nodes from the cluster. Zabbix will get all the info about the whole cluster from this single node.
Linking the Template
Of course, in Zabbix you should link the template with the host where elastizabbix
class is implemented.
That's it. You should be able to monitor Elasticsearch cluster in Zabbix.
Parameters
Usually you'll use both classes (elastizabbix
and elastizabbix::server
) without specifying any parameters. Nevertheless, here I'll explain available parameters, in case you ever need them.
elastizabbix::server
Class' Parameters
Parameter | Default Value | Description |
---|---|---|
install_template
|
true
|
Well, pretty much pointless parameter. If you set it to false - the class won't do anything; it will have the same effect as removing elastizabbix::server from manifest completely. Don't ask me why, just remember
|
zabbix_user
|
'zabbix'
|
Linux account Zabbix runs under. If you are using other account you should change this value. |
elastizabbix
Class' Parameters
Parameter | Default Value | Description |
---|---|---|
zabbix_user
|
'zabbix'
|
Linux account Zabbix runs under. If you are using other account you should change this value. |
elasticsearch_url
|
'http://localhost:9200'
|
Elasticsearch cluster URL. If changed, this value has to be specified without trailing slash. Please ensure that the URL is valid. |
zabbix_script_dir
|
'/etc/zabbix/externalscripts'
|
The directory where elastizabbix script will be installed. |
(Removed in v0.1.1) |
true
|
Whether to use patch described at https://github.com/mkhpalm/elastizabbix/issues/2 or not. If set to This parameter is removed in v0.1.1 of the module since the patch is accepted and embedded in the original code. |
Troubleshooting
If something does not work as expected, there are few things you should check, in the order described in this section.
1. Template Linking
The first thing to check is if the template is linked to the appropriate host in Zabbix. Again, the template should be linked to the host where elastizabbix
class is installed. You can check this in Zabbix by selecting Configuration -> Hosts -> the appropriate host (i.e. ESNODE01
). When the node is selected, click "Templates" tab and ensure that "Template App ElasticSearch" is among templates enumerated in "Linked templates" box.
When you've ensured that the template is linked correctly, you can go to Monitoring -> Latest data, and then filter to the host of interest (i.e. ESNODE01
). Below you should be able to find "Cluster" group, and "Cluster status" item among other items from the group. If you can see the item it means that the template is linked correctly. "Cluster status" item should have some value (green, yellow, red). If you can see any of these value, it means that everything is set correctly. If the value is blank, it means that the client script haven't sent the value, so you can check configuration at the node itself. Note that by default these values are updated once per minute, so give it enough time.
2. Checking elasticsearch_url
The next thing to check is if provided elasticsearch_url
value is valid. To check this login to monitored node and execute something like:
$ curl http://localhost:9200/_cluster/health
If the URL is OK you should get some JSON response like:
{"cluster_name":"IT-ES","status":"green","timed_out":false, ...
If the URL is not OK you'll get something like:
curl: (7) Failed to connect to localhost port 9200: Connection refused
So if URL is not OK you'll either change elasticsearch_url
appropriately, or change Elasticsearch cluster configuration.
3. Testing elastizabbix Script
The third thing to check is if the installed script works. Ensure that the script is installed in the first place - check if the following file exists: /etc/zabbix/externalscripts/elastizabbix
. If the file is not there, check if you've implemented elastizabbix
class for this host, and run puppet agent again.
Before checking if the script works you should delete cache files (if any). The cache files are stored in /tmp
directory, and they are named elastizabbix-[something].json
, for example /tmp/elastizabbix-health.json
. Delete these files. After the cache files are deleted execute the following:
$ /etc/zabbix/externalscripts/elastizabbix health status
If the script works as expected you should get "green" (or some other color). If not - you'll get some error message.
If the script does not work as expected check if python is installed by executing python --version
. If python is installed you should get something like Python 2.7.6
. If not, please install python version 2 or 3.
/tmp
directory between two runs while testing the script.
4. Nothing Helped
If neither of the above steps helped - give up. It simply isn't meant to be. It's not your destiny to use elastizabbix.
Just kidding! The next thing you can try is to describe your problem in comments below, and I'll jump in and help.
Add new comment
Anonymous comments require solving captcha, and waiting for administrator's approval.