经常使用的告警方式大体有:短信、邮件、应用程序 (beep提示,图标提示,升窗提示等),但是不能一直坐在电脑前看着应用程序,或者用脚本部署监控,根本没有程序界面,因此一般用短信、邮件两种方式告警。html
一. 告警方式web
1. 短信shell
用程序发短信的方式通常有这两种:数据库
(1) 硬件api
须要1张SIM卡,1个SIM卡读卡设备 (好比:短信猫),而后把设备链接到电脑,应用程序根据设备的软件接口,传参并发送短信。记得把SIM卡设备放在信号好,无干扰的地方;服务器
若是有大量短信要发,1张SIM卡是不够用的,并且发送过分频繁,可能被运营商视为恶意短信,把SIM卡号加入黑名单,那么就须要多张SIM卡甚至多个读卡设备。并发
显示号码为当前SIM卡号码,大多供应商都支持DLL、HTTP等多种接口,固然也能够基于接口二次开发。工具
DLL接口方法参考:SmsManager.sendTextMessage(…)编码
(2) 第三方短信接口spa
有多种接口形式提供,好比:Web Service形式,HTTP形式,还有邮件接口:往1380013900@xxx.com发个短小的邮件,这个邮件会以短信的形式转发到手机上,等等。只要往接口传参数,告诉它发给谁,发什么内容,就能够了。
显示号码为某个SIM卡号码,或者为固定号码 (如:106开头的),这取决于短信平台和运营商的实现方式,由于运营商发短信是不要卡的,直接能够发给目标号码,并且能够显示为固定的某个号码。
Web Service接口地址参考:http://123.456.789.000/SmsManager.asmx?wsdl
Http接口地址参考:http://api.abc.xyz/sms/send.html
2. 邮件
凡是实现了SMTP协议的组件,均可以发送邮件。
在Windows环境下,有系统自带的组件CDO (Collaboration Data Objects,之前叫OLE Messaging 或者Active Messaging),是MAPI库的COM封装。无论是本身开发程序,使用VBS,仍是SQL Server的SQL Mail/Database Mail,一般都是调用的这个组件。
SMTP协议要求的参数大体以下:
SMTP Hostname: SMTP服务器名,如mail.test.com或者IP
SMTP Port: SMTP服务端口,25
SMTP Username: 经过SMTP发送邮件用来验证的用户名, 若是不要求身份验证,留空
SMTP Password: 经过SMTP发送邮件用来验证的密码, 若是不要求身份验证,留空
二. 选择告警方式并配置
1. 短信
无论是选择硬件,仍是第三方接口,都须要一个程序来调用,能够是监控工具、脚本、甚至数据库。
(1) 监控工具/应用程序中,一般都留有短信接口的配置,配置接口地址便可;
(2) 在脚本中配置,Windows环境一般要借助OLE Automation;
OLE Automation后来更名叫Automation,是Windows上基于COM,用于脚本语言实现进程间通信的机制,脚本如:VBS, SQL, Powershell,不包括BAT(BAT能够调用VBS)。
SQL Server中使用OLE Automation调用Web Service短信接口以下:
exec sp_configure 'show advanced options', 1; RECONFIGURE; exec sp_configure 'Ole Automation Procedures', 1; RECONFIGURE; declare @text_message nvarchar(180) ,@phone_number nvarchar(15) ,@soap_object int ,@status int ,@output nvarchar(255) set @text_message = N'Testing Mail' set @phone_number = N'138000139000' --Create MSSOAP.SoapClient object exec @status=sp_OACreate 'MSSOAP.SoapClient', @soap_object out --SmsManager is Web Service name exec @status = sp_OAMethod @object, 'mssoapinit', null, 'http://123.456.789.000/SmsManager.asmx?wsdl', 'SmsManager' --SendTextMessage is webservice method exec @status = sp_OAMethod @object, 'SendTextMessage', @output OUT, @phone_number, @text_message if @status <> 0 begin exec sp_OAGetErrorInfo @soap_object select @soap_object end else begin select @output end --Destroy MSSOAP.SoapClient object exec @status = sp_OADestroy @soap_object GO
对于HTTP, DLL接口,和SOAP接口相似,用OLE Automation也均可以调用,主要区别就是在CreateObject() 时。
以VBS为例,调用HTTP, DLL时CreateObject()以下:
Dim http Set http = CreateObject("Msxml2.XMLHTTP") Dim dll Set dll = CreateObject("工程名.类名")
2. 邮件
(1) 监控工具/应用程序中,一般都留有SMTP配置项,配置SMTP参数便可;
(2) 在脚本中配置,Windows环境一般要借助OLE Automation;
VBS发送邮件以下:
Dim ns ns = "http://schemas.microsoft.com/cdo/configuration/" Dim title, content title = "db_maint_alert" content = "" content = content&"Hi All," content = content&chr(13)&chr(10) content = content&" " content = content&chr(13)&chr(10) content = content&"----test mail----" Msgbox('~1~') Set cm = CreateObject("CDO.Message") cm.from = "from_user_name@abc.com" cm.to = "to_user_name@abc.com" cm.cc = "cc_user_name@abc.com" cm.subject = title cm.textbody = content 'cm.AddAttachment "" Msgbox('~2~') 'sendusing: 1 = pickup, 2 = port 'smtpauthenticate: 0 = anonymous,1 = common,2 = NTLM 'smtpusessl: 0 = no,1 = yes With cm.configuration.fields .item(ns & "sendusing") = 2 .item(ns & "smtpserver") = "xxx.xxx.xxx.xxx" .item(ns & "smtpserverport") = 25 .item(ns & "smtpauthenticate") = 1 .item(ns & "sendusername") = "user_name@abc.com" .item(ns & "sendpassword") = "*****************" .item(ns & "smtpconnectiontimeout") = 10 .item(ns & "smtpusessl") = 0 .update End With Msgbox('~3~') cm.send Set cm = nothing Msgbox('~success~')
SQL Server 2000发送邮件以下:
SQL Server 2000有SQL Mail,不过必需要同服务器上安装一个实现了MAPI的邮件程序,如:OUTLOOK,由于SQL Mail须要借用邮件应用程序的MAPI来发送邮件,配置起来不太方便,因此使用相似上面VBS的OLE Automation方法。
use master; if OBJECT_ID('sp_SendDatabaseMail') is not null drop proc sp_SendDatabaseMail go CREATE PROCEDURE sp_SendDatabaseMail @recipients varchar(8000), --'001@abc.com; 002@abc.com;' @Subject varchar(400) = '', @HtmlBody varchar(8000) = '' as Declare @From varchar(100) Declare @To varchar(100) Declare @Bcc varchar(500) Declare @AddAttachment varchar(100) Declare @object int Declare @hr int Declare @source varchar(255) Declare @description varchar(500) Declare @output varchar(1000) set @From = 'SqlAlert@abc.com' set @To = @recipients set @Bcc = '' set @AddAttachment = '' --set @HtmlBody= '<body><h1><font color=Red>' +@HtmlBody+'</font></h1></body>' EXEC @hr = sp_OACreate 'CDO.Message', @object OUT EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").Value','2' EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value', 'xxx.xxx.xxx.xxx' EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value','25' EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value','1' EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusername").Value','user_name@abc.com' EXEC @hr = sp_OASetProperty @object, 'Configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value','*****************' EXEC @hr = sp_OAMethod @object, 'Configuration.Fields.Update', null EXEC @hr = sp_OASetProperty @object, 'To', @To EXEC @hr = sp_OASetProperty @object, 'Bcc', @Bcc EXEC @hr = sp_OASetProperty @object, 'From', @From EXEC @hr = sp_OASetProperty @object, 'Subject', @Subject EXEC @hr = sp_OASetProperty @object, 'HtmlBody', @HtmlBody --add attachment if @AddAttachment<>'' EXEC @hr = sp_OAMethod @object, 'AddAttachment',NULL,@AddAttachment IF @hr <>0 select @hr BEGIN EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT IF @hr = 0 BEGIN SELECT @output = ' Source: ' + @source PRINT @output SELECT @output = ' Description: ' + @description PRINT @output END ELSE BEGIN PRINT ' sp_OAGetErrorInfo failed.' RETURN END END --send mail EXEC @hr = sp_OAMethod @object, 'Send', NULL IF @hr <>0 select @hr BEGIN EXEC @hr = sp_OAGetErrorInfo NULL, @source OUT, @description OUT IF @hr = 0 BEGIN SELECT @output = ' Source: ' + @source PRINT @output SELECT @output = ' Description: ' + @description PRINT @output END ELSE BEGIN PRINT ' sp_OAGetErrorInfo failed.' RETURN END end PRINT 'Send Success!!!' --destroy object EXEC @hr = sp_OADestroy @object
调用上面这个SP来发邮件:
EXEC sp_SendDatabaseMail @recipients = '001@test.com; 002@test.com;', @body = 'This is a testing mail', @HtmlBody = 'Testing Database Mail'
SQL Server 2005起,使用Database Mail,脚本以下:
--1. 启用database mail use master GO exec sp_configure 'show advanced options',1 reconfigure exec sp_configure 'Database mail XPs',1 reconfigure GO --2. 添加account exec msdb..sysmail_add_account_sp @account_name = 'SqlAlert' -- mail account ,@email_address = 'SqlAlert@test.com' -- sendmail address ,@display_name = 'SqlAlert' -- sendusername ,@replyto_address = null ,@description = null ,@mailserver_name = '***,***,***,***' -- SMTP Address ,@mailserver_type = 'SMTP' -- SQL 2005 only support SMTP ,@port = 25 -- port --,@username = '*********@test.com' -- account --,@password = '******************' -- pwd ,@use_default_credentials = 0 ,@enable_ssl = 0 --is ssl enabled on SMTP server ,@account_id = null --3. 添加profile exec msdb..sysmail_add_profile_sp @profile_name = 'SqlAlert' -- profile name ,@description = 'dba mail profile' -- profile description ,@profile_id = null --4. 关联account and profile exec msdb..sysmail_add_profileaccount_sp @profile_name = 'SqlAlert' -- profile name ,@account_name = 'SqlAlert' -- account name ,@sequence_number = 1 -- account order in profile --5. 发送database mail EXEC msdb.dbo.sp_send_dbmail @profile_name = 'SqlAlert', @recipients = '001@test.com; 002@test.com;', @body = 'This is a testing mail', @subject = 'Testing Database Mail'; GO
注意:SMTP服务器的配置,好比:是否使用smtp用户验证,SSL是否开启,必需要和服务端一致,不然没法发送邮件。
其余
(1) 告警的次数:被告警的问题也许正在处理中,告警还在反复频繁发送,尤为用脚本轮询时,注意设置次数和发送间隔;
(2) 告警的历史记录:短信或者邮件告警,最好都在数据库中留一份记录;
(3) 字符编码:若是应用程序/接口不支持中文,能够把中文转成UTF-8的字符编码发送,而后再解析回来。