LoginSignup
1
2

More than 5 years have passed since last update.

lambdaる(Not AWS)

Posted at

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

メール本文は別に用意。
他の処理も似たように書く。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2