当事件不发生时,pipe理员如何概括提醒?

通常我的用户要求我负责了解事件是否发生。

我一直都必须用cron'ed shell脚本和大量的date边界案例testing来构build自定义和脆弱的解决scheme。

集中采伐应该允许有一个更好的,更易于维护的方法来掌握过去N小时内没有发生的事情。 像logstash注意和nagios警报。

更新

被推翻的回答非常有帮助。 O(Light。Bulb。)我现在有十几个批处理作业正在进行新鲜度检查。 我想彻底回答正义,并跟进我如何实现他的想法。

我configurationjenkins发出系统日志,logstash捕获它们并通过nsca发送状态更新给nagios。 我也使用check_mk保持一切干燥和组织在Nagios

Logstashfilter

:::ruby filter { if [type] == "syslog" { grok { match => [ "message", '%{SYSLOGBASE} job="%{DATA:job}"(?: repo="%{DATA:repo}")?$', "message", "%{SYSLOGLINE}" ] break_on_match => true } date { match => [ "timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ] } } } 

神奇的是grok的匹配参数中的双模式,以及break_on_match => true。 Logstash将依次尝试每个模式,直到其中一个匹配。

Logstash输出

我们使用logstash nagios_nsca输出插件让icinga知道我们在syslog中看到了jenkins作业。

 :::ruby output { if [type] == "syslog" and [program] == "jenkins" and [job] == "Install on Cluster" and "_grokparsefailure" not in [tags] { nagios_nsca { host => "icinga.example.com" port => 5667 send_nsca_config => "/etc/send_nsca.cfg" message_format => "%{job} %{repo}" nagios_host => "jenkins" nagios_service => "deployed %{repo}" nagios_status => "2" } } # if type=syslog, program=jenkins, job="Install on Cluster" } # output 

icinga(nagios)

最后,我们通过nsca的方式来到了icinga(nagios)。 现在我们需要被动的服务检查,为每一件我们想要注意的事情都没有按时发生。 这可能是很多工作,所以让我们使用check_mk将Python作业列表转换成nagios对象定义。

check_mk很酷。

/etc/check_mk/conf.d/freshness.mk

 # check_mk requires local variables be prefixed with '_' _dailies = [ 'newyork' ] _day_stale = 86400 * 1.5 _weeklies = [ 'atlanta', 'denver', ] _week_stale = 86400 * 8 _monthlies = [ 'stlouis' ] _month_stale = 86400 * 32 _service_opts = [ ("active_checks_enabled", "0"), ("passive_checks_enabled", "1"), ("check_freshness", "1"), ("notification_period", "workhours"), ("contacts", "root"), ("check_period", "workhours"), ] # Define a new command 'check-periodically' that sets the service to UKNOWN. # This is called after _week_stale seconds have passed since the service last checked in. extra_nagios_conf += """ define command { command_name check-periodicaly command_line $USER1$/check_dummy 3 $ARG1$ } """ # Loop through all passive checks and assign the new check-period command to them. for _repo in _dailies + _weeklies + _monthlies: _service_name = 'deployed %s' % _repo legacy_checks += [(('check-periodicaly', _service_name, False), ['lead'])] # Look before you leap - python needs the list defined before appending to it. # We can't assume it already exists because it may be defined earlier. if "freshness_threshold" not in extra_service_conf: extra_service_conf["freshness_threshold"] = [] # Some check_mk wizardry to set when the check has passed its expiration date. # Results in (659200, ALL_HOSTS, [ 'atlanta', 'denver' ]) for weeklies, etc. extra_service_conf["freshness_threshold"] += [ (_day_stale, ALL_HOSTS, ["deployed %s" % _x for _x in _dailies] ), (_week_stale, ALL_HOSTS, ["deployed %s" % _x for _x in _weeklies] ), (_month_stale, ALL_HOSTS, ["deployed %s" % _x for _x in _monthlies] ), ] # Now we assign all the other nagios directives listed in _service_opts for _k,_v in _service_opts: if _k not in extra_service_conf: extra_service_conf[_k] = [] extra_service_conf[_k] += [(_v, ALL_HOSTS, ["deployed "]) ] 

我在各种事件中设置了对Nagios的被动检查。 然后在事件结束时被动检查发送给nagios(通过包装脚本或内置到事件本身)。如果被动检查未在freshness_threshold秒内收到,它将在本地运行check_command。 check_command被设置为一个简单的shell脚本,它返回关键信息和服务描述的信息。

我没有代码示例方便,但如果我能如果兴趣显示。

编辑一个添加的代码示例:

假设你已经完成了NSCA和send_nsca的基本设置(确保客户端的send_nsca.cfg和nagios服务器上的nsca.cfg中的password和encryption_method相同,然后在nagios服务器上启动nsca守护程序。

首先我们定义一个其他被动检查可以使用的模板。 这进入services.cfg。

 define service { name standard-passive-service-template active_checks_enabled 0 passive_checks_enabled 1 check_freshness 1 max_check_attempts 1 normal_check_interval 10 retry_check_interval 5 contact_groups sysadmins notification_interval 0 notification_options w,u,c,r notification_period 24x7 check_period 24x7 check_command check_failed!$SERVICEDESC$ register 0 } 

这就是说,如果通知还没有进入,请以$ SERVICEDESC $作为参数运行check_failed。 让我们在commands.cfg中定义check_failed命令。

 define command { command_name check_failed command_line /usr/lib/nagios/plugins/check_failed $ARG1$ } 

这里是/usr/lib/nagios/plugins/check_failed脚本。

 #!/bin/bash /bin/echo "No update from $*. Is NSCA running?" exit 2 

如果退出2,则根据nagios(请参阅下面的所有nagios服务状态),此服务至关重要。采购/usr/lib/nagios/plugins/utils.sh是另一种方式,那么您可以exit $STATE_CRITICAL 。 但是,即使你没有这个,上面的工作。

这给出了“NSCA正在运行”的附加通知,因为可能是服务没有正确检入,或者NSCA失败。 这比人们想象的更普遍。 如果同时有多个被动检查,请检查NSCA的问题。

现在我们需要一个被动检查来接受结果。 在这个例子中,我有一个特制的cron作业,它知道我们环境中所有不同types的raid控制器。 运行时,发送通知给被动检查。 在这个例子中,我不想在半夜醒来(根据需要编辑notification_period)。

 define service { use standard-passive-service-template hostgroup_name all service_description raidcheck notification_period daytime flap_detection_enabled 1 freshness_threshold 7500 # 125 minutes notification_options c is_volatile 0 servicegroups raidcheck } 

现在有cronjob发送信息回到nagios服务器。 这是/etc/cron.d/raidcheck中的一行

 0 * * * * root /usr/local/bin/raidcheck --cron | /usr/sbin/send_nsca -H nagios -to 1000 >> /dev/null 2>&1 

有关选项,请参见man send_nsca ,但重要的部分是'nagios'是我的nagios服务器的名称以及在此脚本结尾处打印的string。 send_nsca需要在表单的标准input(这里是perl)

 print "$hostname\t$check\t$state\t$status_info\n"; 

$ hostname是显而易见的,$ check在这种情况下是'raidcheck',$ state是nagios服务状态(0 = OK,1 =警告,2 =严重,3 =未知,4 =依赖)$ status_info是可选的消息作为状态信息发送。

现在我们可以在客户端的命令行上testing一下这个检查:

 echo -e "$HOSTNAME\traidcheck\t2\tUh oh, raid degraded (just kidding..)" | /usr/sbin/send_nsca -H nagios 

这给了我们一个nagios被动检查,预计每更新一次thresholdthreshold秒。 如果检查没有更新,则运行check_command(在这种情况下为check_failed)。 上面的例子是为了安装nagios 2.X,但是对于nagios 3.X可能会起作用(可能稍作修改)。

不确定你所指的“事件没有发生”的types可以采取不同的forms,它可以是有条件的也可以是无条件的。 例子:

  • 用户身份validation失败后,login成功,表示用户忘记了自己的密码(或蛮力企图)
  • 白天没有用户authentication – 用户没有出现工作

如果你是在第一个案例之后,需要一个开源工具,那么在SEC中有一个Pairwithwindow规则,在nxlog中有一个缺席规则(注意,我与后者有联系)。

第二种types更简单,两种工具都可以处理。