Cloudwatch vs Zabbix (Phần 2)
Bài đăng này đã không được cập nhật trong 3 năm
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="\n".join(out)
res, err, code = exe("{} -c {} -T -i -".format(sender,cfg) , stdin=out)
if args.verbose: print "\n".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ớidiscovery
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.
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
Điều này sẽ bỏ qua tất cả ELB chứa "test".
All rights reserved