lambdaる(非AWS)

0. 内容: Lesft个文件。

我本来想要使用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。

成为中国土生土长的财富2022。


#!/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

邮件正文需要另外准备。
其他处理也可以类似地编写。