12/08/2018, 13:11

Cloudwatch vs Zabbix (Phần 2)

1. So sánh zabbix và cloudwatch 1.1. Định nghĩa Zabbix : là giải pháp giám sát mã nguồn mở cho doanh nghiệp. Tất cả các tham số đều được truy cập thông qua trang web Cloud watch : giám sát tài nguyên AWS và ứng dụng chạy trên AWS thời gian thực. Tất cả tham số có thể được truy cập thông qua ...

1. So sánh zabbix và cloudwatch

1.1. Định nghĩa

Zabbix: là giải pháp giám sát mã nguồn mở cho doanh nghiệp. Tất cả các tham số đều được truy cập thông qua trang web

Cloud watch: giám sát tài nguyên AWS và ứng dụng chạy trên AWS thời gian thực. Tất cả tham số có thể được truy cập thông qua trang web

1.2. Thành phần giám sát

Zabbix:

  • CPU usage
  • CPU load average
  • Memory usage
  • Disk usage
  • Disk read/write
  • NIC Send/Received
  • Port web (80,443)
  • Port 1433

Cloud watch:

  • CPU utilization
  • Disk read/write & operation
  • Network IN/OUT
  • Kiểm tra trạng thái của server bằng Health checks

1.3. Truy nhập qua

Zabbix: console, cli, API

Cloud watch: Console, cli, awscli, cloudwatch API, aws sdk

1.4. Giới hạn

Zabbix:

  • Có thể tạo ra hơn 5000 cảnh báo
  • Hơn 5 action có thể được gán cho mỗi cảnh báo

Cloud watch:

  • Thời gian tối đa là 1 ngày
  • Có thể gán 10 dimensions mỗi metric
  • Tạo 5000 cảnh báo mỗi tài khoản aws
  • Có thể gán 5 action mỗi cảnh báo
  • Metric data được giữ lại trong 2 tuần

1.5. Load balancer Metrics

Zabbix: không có option cho load balancer metrics từ console

Cloud watch: có option để show Load balancer metrics

1.6. Log file monitor

Zabbix: Không có option để view log file từ console

Cloud watch: log file có thể lưu trực tiếp từ console

2. Dùng amazon cloudwatch để query cho Zabbix

Nếu bạn cần, ta có thể tích hợp Zabbix với 1 số dịch vụ của Amazon AWS sử dụng dữ liệu từ Amazon Cloudwatch. Sử dụng tool được cung cấp bởi Amazon (viết bằng Java) sẽ dẫn tới ngốn rất nhiều tải server. Vì vậy cách tốt nhất là dùng Script sử dụng AWS API. Ngôn ngữ được dùng là Python cùng với thư viện Boto.

  • Để chắc chắn trước hết phải check xem server đã cài python hay chưa (ở đây dùng python 2.7)

#readlink -f $(which python) | xargs -I % sh -c 'echo -n "%: "; % -V'

/usr/bin/python2.7: Python 2.7.6

  • Ta tiếp tục cài thư viện Boto

#apt-get install python-boto hoặc nếu đã cài python-pip thì có thể install bằng cách #pip install boto

  • Tool này cần metric, function, dimension, region và access key để làm parameter. Nó truy vấn tới Cloudwatch server để lấy giá trị mỗi 20 phút gần nhất. #!/usr/bin/python
#!/usr/bin/env python
import argparse
import os, time, datetime, subprocess
import boto, boto.ec2.elb, boto.ec2.cloudwatch
import json
import math

sender = '/usr/bin/zabbix_sender'       # path zabbix_sender
cfg = '/etc/zabbix/zabbix_agentd.conf'  # path to zabbix-agent config
aws_key='INSERT KEY'                    # AWS API key id
aws_secret='INSERT SECRET'              # AWS API key

parser = argparse.ArgumentParser(description='Zabbix CloudWatch client')
parser.add_argument('-e', '--elb', metavar='NAME', help='ELB name')
parser.add_argument('-i', '--interval', type=int, default=60, metavar='N', help='Interval to get data back (Default: 60)')
parser.add_argument('-s', '--srv', metavar='NAME', default='-', help='Hostname in zabbix to receive traps')
parser.add_argument('-r', '--region', metavar='NAME', default='eu-west-1', help='AWS region (Default: eu-west-1)')
parser.add_argument('-d', '--discover', choices=['elb'], help='Discover items (Only discover for ELB supported now)')
parser.add_argument('-v', '--verbose', action='store_true', help='Print debug info')
args = parser.parse_args()
if not args.elb and not args.discover:
  parser.print_help()
  os._exit(0)

def exe(cmd, stdin=None):
  p=subprocess.Popen(cmd , shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=os.getcwd())
  return p.communicate(stdin) + (p.returncode,)

if args.discover:
  if 'elb' in args.discover:
    c = boto.ec2.elb.connect_to_region(args.region, aws_access_key_id=aws_key, aws_secret_access_key=aws_secret, debug=args.verbose)
    elbRetData = { "data": [ ] }
    for elb in c.get_all_load_balancers():
      elbRetData['data'].append( { '{#LOADBALANCERNAME}': elb.name } )
    print json.dumps(elbRetData, indent=2)

if args.elb:
  c=boto.ec2.cloudwatch.connect_to_region(args.region, aws_access_key_id=aws_key, aws_secret_access_key=aws_secret, debug=args.verbose)

  #amazon uses UTC at cloudwatch
  os.environ['TZ'] = 'UTC'
  time.tzset()
  out=[]
  metrics={
  'RequestCount':'Sum',
  'BackendConnectionErrors':'Sum',
  'HTTPCode_Backend_2XX':'Sum',
  'HTTPCode_Backend_3XX':'Sum',
  'HTTPCode_Backend_4XX':'Sum',
  'HTTPCode_ELB_5XX':'Sum',
  'Latency':'Average',
  'SurgeQueueLength':'Maximum',
  'HealthyHostCount':'Average',
  'UnHealthyHostCount':'Average'
  }
  now = datetime.datetime.now()
  start_time = now - datetime.timedelta(seconds=args.interval)

  while start_time < now:
    end_time = min(now, start_time + datetime.timedelta(seconds=3600))
    for m in metrics:
      data=c.get_metric_statistics(60, start_time, end_time, m, 'AWS/ELB', metrics[m], {'LoadBalancerName': args.elb})
      # for periodic chech no data = 0
      if len(data)==0 and end_time == now:
        data = [{'Timestamp': now, metrics[m]: 0}]
      for d in data:
        out.append( "{0:s} cw[{1:s},{2:s}] {3:.0f} {4:f}".format(args.srv, args.elb, m, time.mktime(d['Timestamp'].timetuple()), d[metrics[m]]) )
    start_time = start_time + datetime.timedelta(seconds=3600)
  out.sort()
  out="
".join(out)
  res, err, code = exe("{} -c {} -T -i -".format(sender,cfg) , stdin=out)
  if args.verbose: print "
".join([out, res])
  print code

Trong đó các tham số:

{ACCESS_KEY} - the access key từ AWS {SECRET_KEY} - the secret key từ AWS

Check path tới zabbix_sender và zabbix-agent:

sender = '/usr/bin/zabbix_sender' # path zabbix_sender
cfg = '/etc/zabbix/zabbix_agentd.conf' # path to zabbix-agent config

  • Mở zabbix web và tạo server "ELB"
  • Import template từ https://github.com/sepich/zabbix/raw/master/templates/template_elb.xml và asign cho server vừa tạo. Tới discovery và để refresh time for only active check prototype
  • Discovery tạo item cho tất cả các ELB tìm thấy. Tên ELB sẽ được chuyển qua Filter và được cấu hình trong Filter tab của Discovery rule.

1.png

Trong trường hợp này nó được trỏ tới Global Regex có tên là "ELB discovery" được cấu hình trong Administration > General > Regular Expressions

2.png

Điều này sẽ bỏ qua tất cả ELB chứa "test".

0