0.内容
lambdaを使いたかったけど、使いどころがわからず悶々としていたが、ちょっとした監視を追加するときに利用してみた。
lambdaは監視のような処理に向いているが、まあとはいえ別にメソッドを作るなり他にやりようは幾らでもある。
ユニークな監視をちょこっとする時に、動かすスクリプト。
cronやデーモン化するなり、動かし方はその時々。
1.前提
監視対象と監視項目は "yaml"ファイルで管理
*監視項目はSNMPで取得
例(監視対象=mib.yml)
MYSQL:
error:
aborted_connects: 1.3.6.1.4.1.2021.8.1.101.1
aborted_clients: 1.3.6.1.4.1.2021.8.1.101.2
down:
uptime: 1.3.6.1.4.1.2021.8.1.101.3
iodrive:
InfoStatus1: 1.3.6.1.4.1.30018.1.2.1.1.1.12.12
InfoStatus2: 1.3.6.1.4.1.30018.1.2.1.1.1.12.17
例(監視項目=host.yml)
DB:
db001: 192.168.1.10
db002: 192.168.1.11
db003: 192.168.1.12
データストア
閾値を越えた値と復旧した現在値を比較できるように"障害時の値"を保持
そのため別にRDBを使用せずともKey/Valueストアで十分
⇒今回はMemcacheを利用
2.コード
#!/usr/bin/ruby
# coding: utf-8
require 'snmp'
require 'yaml'
require_relative 'tool'
### current directory yaml file load
### Target Host
common_list = YAML.load_file('host.yml')
list_db = common_list["DB"]
### Target Parameter
common_oid = YAML.load_file('mib.yml')
oid_mysql_ab = common_oid["MYSQL"]["error"]
### Backup Info
bkserver = "db002"
bkstart = '03:30'
bkend = '03:35'
### aborted_clients
### aborted_connectss
lwmark2 = 500
### Check LogFile
error_files = "general_mysql.log"
### common procedure
cking_ab = lambda do | targetlist, targetoid ,logs|
targetlist.each do |target|
begin
SNMP::Manager.open(:host => target[1], :Community => 'public', :timeout => 1) do |manager|
targetoid.each do |mib|
response = manager.get([mib[1]])
response.each_varbind do |vb|
if ( vb.value.to_i - MemGet.instance.mem_get(target[0],mib[0]).to_i ) >= lwmark2
### send alert mail
Tool.new( target[0].to_s + "\s MySQL abort status problem ?\s" + mib[0],"../mail_bady/body_mysql_abort.txt").alert_mail
MemSet.instance.mem_set(target[0],mib[0],vb.value.to_i)
else
### checking log
time = Time.new
file = File.open(logs, "a")
file.write("#{time}\t#{target[0]}\t#{mib[0]}\tMySQL abort status No problem!\n")
MemSet.instance.mem_set(target[0],mib[0],vb.value.to_i)
end
end
end
end
rescue => ex
### send alert mail
ToolKit.new( target[0].to_s + "\s#{ex}","../mail_bady/body_connect.txt").alert_mail
next
end
end
end
## Checkin MySQL connection
checking_ab.call(list_db, oid_mysql_ab, error_files)
メールを送る所とMemcacheで利用するSet/Getの所は、"tool"に定義してあるメソッドを使用。
class MemGet
include Singleton
attr_accessor :x, :y
def initialize
@x = x
@y = y
end
def mem_get(x,y)
cache = MemCache.new('127.0.0.1:11211')
cache.get(x+y)
end
end
class MemSet
include Singleton
attr_accessor :x, :y, :z
def initialize
@x = x
@y = y
@z = z
end
def mem_set(x,y,z)
cache = MemCache.new('127.0.0.1:11211')
cache[x+y] = z
end
end
メール本文は別に用意。
他の処理も似たように書く。