2012-04-23 10 views
10

Tôi muốn theo dõi elasticsearch bằng nagios. Cơ bản, tôi muốn biết nếu elasticsearch là lên.Cách theo dõi elasticsearch bằng nagios

Tôi nghĩ rằng tôi có thể sử dụng API elasticsearch Cụm Sức khỏe (see here)

và sử dụng 'tình trạng' mà tôi có được trở lại (màu xanh lá cây, màu vàng hoặc màu đỏ), nhưng tôi vẫn không biết làm thế nào để sử dụng Nagios cho rằng vấn đề (Nagios là trên một máy chủ và elasticsearc là trên một máy chủ).

Có cách nào khác để làm điều đó không?

EDIT: Tôi chỉ thấy rằng - check_http_json. Tôi nghĩ tôi sẽ thử.

Trả lời

12

Sau một thời gian - Tôi đã quản lý để theo dõi elasticsearch bằng cách sử dụng nrpe. Tôi muốn sử dụng API Elasticsearch Cluster Health - nhưng tôi không thể sử dụng nó từ một máy khác - do vấn đề bảo mật ... Vì vậy, trong máy chủ giám sát, tôi đã tạo một dịch vụ mới - mà check_command là check_command check_nrpe!check_elastic. Và bây giờ trong máy chủ từ xa, nơi elasticsearch là, tôi đã biên tập lại các tập tin nrpe.cfg như sau:

command[check_elastic]=/usr/local/nagios/libexec/check_http -H localhost -u /_cluster/health -p 9200 -w 2 -c 3 -s green 

nào được cho phép, kể từ khi lệnh này được chạy từ máy chủ từ xa - vì vậy không có vấn đề an ninh ở đây ...

Nó hoạt động !!! Tôi vẫn sẽ thử lệnh check_http_json này mà tôi đã đăng trong qeustion của mình - nhưng hiện tại, giải pháp của tôi là đủ tốt.

+0

Cảm ơn bạn đã tìm hiểu điều này! Ngoài việc làm việc trên các hệ thống để giải quyết các vấn đề an ninh, nó là rất tốt cho việc giám sát các cụm trên máy với cấu trúc thư mục khác nhau. Plugin check_http nằm trong 3 thư mục khác nhau trên các máy chủ khác nhau của chúng tôi. Phương pháp này cho phép tôi chạy kiểm tra, nhưng hãy để máy cục bộ quản lý đường dẫn plugin. Cảm ơn một lần nữa! –

6

Sau khi phát xung quanh với các đề xuất trong bài đăng này, tôi đã viết một tập lệnh check_elasticsearch đơn giản. Nó trả về trạng thái là OK, WARNINGCRITICAL tương ứng với thông số "trạng thái" trong phản hồi sức khỏe cụm ("xanh", "vàng" và "đỏ" tương ứng).

Nó cũng lấy tất cả các thông số khác từ trang y tế và loại bỏ chúng ra ở định dạng Nagios chuẩn.

Tận hưởng!

+1

hoạt động tốt và không có phụ thuộc ngu ngốc. cảm ơn! –

2

Shameless plug: https://github.com/jersten/check-es

Bạn có thể sử dụng nó với Zenoss/Nagios để theo dõi sức khỏe cụm, chỉ số dữ liệu, và sử dụng nút đống cá nhân.

+0

Tôi có thể kiểm tra unassigned_shards bằng điều này không? – flickerfly

1

Bạn có thể sử dụng tập lệnh Python thú vị này để theo dõi cụm Elasticsearch của mình. Tập lệnh này kiểm tra cổng IP: của bạn cho trạng thái Elasticsearch. Một kịch bản Python này để theo dõi Elasticsearch có thể được tìm thấy here.

#!/usr/bin/python 
from nagioscheck import NagiosCheck, UsageError 
from nagioscheck import PerformanceMetric, Status 
import urllib2 
import optparse 

try: 
    import json 
except ImportError: 
    import simplejson as json 


class ESClusterHealthCheck(NagiosCheck): 

    def __init__(self): 

     NagiosCheck.__init__(self) 

     self.add_option('H', 'host', 'host', 'The cluster to check') 
     self.add_option('P', 'port', 'port', 'The ES port - defaults to 9200') 

    def check(self, opts, args): 
     host = opts.host 
     port = int(opts.port or '9200') 

     try: 
      response = urllib2.urlopen(r'http://%s:%d/_cluster/health' 
             % (host, port)) 
     except urllib2.HTTPError, e: 
      raise Status('unknown', ("API failure", None, 
         "API failure:\n\n%s" % str(e))) 
     except urllib2.URLError, e: 
      raise Status('critical', (e.reason)) 

     response_body = response.read() 

     try: 
      es_cluster_health = json.loads(response_body) 
     except ValueError: 
      raise Status('unknown', ("API returned nonsense",)) 

     cluster_status = es_cluster_health['status'].lower() 

     if cluster_status == 'red': 
      raise Status("CRITICAL", "Cluster status is currently reporting as " 
         "Red") 
     elif cluster_status == 'yellow': 
      raise Status("WARNING", "Cluster status is currently reporting as " 
         "Yellow") 
     else: 
      raise Status("OK", 
         "Cluster status is currently reporting as Green") 

if __name__ == "__main__": 
    ESClusterHealthCheck().run()