From 74b3ba5928952410332aef40b2c7592cf24e9663 Mon Sep 17 00:00:00 2001 From: Daniel Berteaud Date: Mon, 18 Oct 2021 11:34:53 +0200 Subject: [PATCH] Add Elasticsearch monitoring scripts --- zabbix_conf/elasticsearch.conf | 2 + zabbix_scripts/check_elasticsearch | 86 ++++++++++++++++++++++++++++ zabbix_scripts/disco_elasticsearch | 91 ++++++++++++++++++++++++++++++ 3 files changed, 179 insertions(+) create mode 100644 zabbix_conf/elasticsearch.conf create mode 100644 zabbix_scripts/check_elasticsearch create mode 100644 zabbix_scripts/disco_elasticsearch diff --git a/zabbix_conf/elasticsearch.conf b/zabbix_conf/elasticsearch.conf new file mode 100644 index 0000000..645c99d --- /dev/null +++ b/zabbix_conf/elasticsearch.conf @@ -0,0 +1,2 @@ +UserParameter=elasticsearch.discovery[*],/var/lib/zabbix/bin/disco_elasticsearch --url=$1 --user=$2 --pass=$3 --$4 +UserParameter=elasticsearch.check[*],/var/lib/zabbix/bin/check_elasticsearch --url=$1 --user=$2 --pass=$3 --$4 $5 diff --git a/zabbix_scripts/check_elasticsearch b/zabbix_scripts/check_elasticsearch new file mode 100644 index 0000000..6f28b04 --- /dev/null +++ b/zabbix_scripts/check_elasticsearch @@ -0,0 +1,86 @@ +#!/usr/bin/perl + +use warnings; +use strict; + +use JSON; +use Getopt::Long; +use LWP::UserAgent; +use HTTP::Request::Common; +use URI; +use Data::Dumper; + +my $user = undef; +my $pass = undef; +my $url = 'http://localhost:9200'; +my $certcheck = 1; +my $cluster = 0; +my $node = undef; +my $index = undef; +my $pretty = 0; + +my $json = {}; + +GetOptions ( + 'user=s' => \$user, + 'password|p=s' => \$pass, + 'url=s' => \$url, + 'cert-check!' => \$certcheck, + 'cluster' => \$cluster, + 'node=s' => \$node, + 'index=s' => \$index, + 'pretty' => \$pretty +); + +# If no option is given, default to fetch the cluster status +if (not defined $cluster and not defined $node and not defined $index){ + $cluster = 1; +} + +my $uri = URI->new($url); + +if (not defined $uri){ + die "COuldn't parse $url as a valid url\n"; +} + +# If connecting over http or is host is localhost +# there's no need to check certificate +if ($uri->scheme eq 'http' or $uri->host =~ m/^localhost|127\.0\.0/){ + $certcheck = 0; +} + +my $resp; +my $sslopts = {}; +if (not $certcheck){ + $sslopts = { + verify_hostname => 0, + SSL_verify_mode => 0 + } +} + +my $ua = LWP::UserAgent->new( + ssl_opts => $sslopts +); + +if ($cluster){ + $json = make_request('/_cluster/stats'); +} elsif (defined $node){ + $json = make_request('/_nodes/' . $node); +} elsif (defined $index){ + $json = make_request('/_cluster/health/' . $index . '?level=indices')->{'indices'}->{$index}; +} + +print to_json($json, { pretty => $pretty }); + +sub make_request { + my $path = shift; + my $req_url = $url . $path; + my $req = GET $req_url; + if (defined $user and defined $pass){ + $req->authorization_basic($user, $pass); + } + my $resp = $ua->request($req); + die "Request to $req_url failed : " . $resp->message . "\n" if $resp->is_error; + return from_json($resp->decoded_content); +} + diff --git a/zabbix_scripts/disco_elasticsearch b/zabbix_scripts/disco_elasticsearch new file mode 100644 index 0000000..e4ef2f1 --- /dev/null +++ b/zabbix_scripts/disco_elasticsearch @@ -0,0 +1,91 @@ +#!/usr/bin/perl + +use warnings; +use strict; + +use JSON; +use Getopt::Long; +use LWP::UserAgent; +use HTTP::Request::Common; +use URI; +use Data::Dumper; + +my $user = undef; +my $pass = undef; +my $url = 'http://localhost:9200'; +my $certcheck = 1; +my $nodes = 0; +my $indices = 0; +my $pretty = 0; + +my $json = []; + +GetOptions ( + 'user=s' => \$user, + 'password|p=s' => \$pass, + 'url=s' => \$url, + 'cert-check!' => \$certcheck, + 'nodes' => \$nodes, + 'indices' => \$indices, + 'pretty' => \$pretty +); + +if ($nodes and $indices){ + die "--nodes and --indices are mutually exclusive\n"; +} + +my $uri = URI->new($url); + +if (not defined $uri){ + die "$url is not a valid URL\n"; +} + +# If connecting over http or is host is localhost +# there's no need to check certificate +if ($uri->scheme eq 'http' or $uri->host =~ m/^localhost|127\.0\.0/){ + $certcheck = 0; +} + +my $sslopts = {}; +if (not $certcheck){ + $sslopts = { + verify_hostname => 0, + SSL_verify_mode => 0 + } +} + +my $ua = LWP::UserAgent->new( + ssl_opts => $sslopts +); + +if ($nodes){ + foreach (@{make_request('/_cat/nodes?format=json')}){ + push @{$json}, { + '{#ES_NODE_NAME}' => $_->{name}, + '{#ES_NODE_ROLE}' => $_->{'node.role'} + }; + } +} elsif ($indices){ + foreach (@{make_request('/_cat/indices?format=json')}){ + push @{$json}, { + '{#ES_INDICE_NAME}' => $_->{index}, + '{#ES_INDICE_STATUS}' => $_->{status}, + '{#ES_INDICE_UUID}' => $_->{uuid} + }; + } +} + +print to_json($json, { pretty => $pretty }); + +sub make_request { + my $path = shift; + my $req_url = $url . $path; + my $req = GET $req_url; + if (defined $user and defined $pass){ + $req->authorization_basic($user, $pass); + } + my $resp = $ua->request($req); + die "Request to $req_url failed : " . $resp->message . "\n" if $resp->is_error; + return from_json($resp->decoded_content); +} +