Хранимая процедура

USE [msdb]
GO

/****** Object:  StoredProcedure [dbo].[alertjob_test]    Script Date: 04/25/2018 08:59:24 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[alertjob_test]
zakupki NVARCHAR(max)
AS
BEGIN
set nocount ON
DECLARE @job_id VARCHAR(50)
SET @job_id = (SELECT job_id FROM msdb.dbo.sysjobs WHERE [name] = zakupki)
IF (not object_id('tempdb..#x') is null) drop table #x 
SELECT  TOP 2 s.instance_id INTO #x FROM msdb.dbo.sysjobhistory s WHERE s.job_id = @job_id AND s.step_name LIKE '(Job outcome)'  ORDER BY s.instance_id DESC
IF EXISTS (SELECT * FROM msdb.dbo.sysjobs WHERE [name] = zakupki)
BEGIN
	IF (not object_id('tempdb..#z') is null) drop table #z 
	SELECT ja.job_id, j.name as job_name, ja.start_execution_date, isNull(last_executed_step_id,0) + 1 as current_executed_step_id,	js.step_name INTO #z 
		FROM msdb.dbo.sysjobactivity ja left join msdb.dbo.sysjobhistory jh on ja.job_history_id = jh.instance_id inner join msdb.dbo.sysjobs j on ja.job_id = j.job_id inner join msdb.dbo.sysjobsteps js on ja.job_id = js.job_id and isNull(ja.last_executed_step_id,0) + 1 = js.step_id
			WHERE ja.session_id = (select top 1 session_id from msdb.dbo.syssessions order by agent_start_date desc) and start_execution_date is not null and stop_execution_date is NULL
	IF EXISTS ( select job_name from #z where job_name = zakupki )
		BEGIN
    		SELECT 1
		END
	ELSE
		BEGIN
			IF EXISTS (SELECT s.run_status FROM msdb.dbo.sysjobhistory s WHERE s.job_id = @job_id AND s.instance_id > (SELECT MIN(instance_id) FROM #x) AND s.run_status = 0) 
				BEGIN
					SELECT 2
				END
			IF ((SELECT  TOP 1 s.run_status FROM msdb.dbo.sysjobhistory s WHERE s.job_id = @job_id AND s.step_name LIKE '(Job outcome)' ORDER BY s.instance_id DESC) = 3)
				BEGIN
					SELECT 2
				END
			ELSE
				BEGIN
					SELECT 0
				END
		END
	DROP TABLE #x
	DROP TABLE #z
END
ELSE 
	BEGIN
		SELECT 2
	END
END


--DROP PROCEDURE dbo.alertjob_test

--EXEC msdb.dbo.alertjob_test zakupki = N'test' 



				

GO


Настройка в prtg:

Была задача создать хранимую процедуру что бы мониторить разные задания(джобы, job) в MSSQL. Это доробатаная процедура посравнению с Сенсор для prtg. Сенсор для задания sql

USE [msdb]
GO

/****** Object:  StoredProcedure [dbo].[alertjob]    Script Date: 05/24/2017 10:24:34 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[alertjob]
@name VARCHAR(max)
AS
BEGIN
SELECT TOP 100
	    
	    b.[message], b.run_date,  b.run_time

into #t	        
--SELECT *
FROM   
 dbo.sysjobs a
       FULL OUTER JOIN dbo.sysjobhistory b
            ON  a.job_id = b.job_id
                AND a.[enabled] = '1'
WHERE
--CONVERT(VARCHAR(20),b.run_date,5)  = (select CONVERT (date, SYSDATETIME())) and
a.name IN ('LSRestore_s0085_ZUP_MOLL') and
run_date=(SELECT MAX(run_date) FROM dbo.sysjobs a

       FULL OUTER JOIN dbo.sysjobhistory b
            ON  a.job_id = b.job_id
                AND a.[enabled] = '1')



--b.run_status  IN ('0')

     ORDER BY
       b.run_date   DESC,
       b.run_time  DESC
     SELECT       
      COUNT(
      	run_date   
      	  	) AS rezult  
      FROM #t 
    WHERE 
          run_time=(SELECT MAX(run_time) FROM #t) AND   [message] LIKE '%failed%' 
END

GO


EXEC dbo.alertjob  @name='имя задания'

Сам сенсор в PRTG

Возникла проблема что ключи на егаис умирают. Но перед этим они спамят в eventlog windows. Сделали сенсор в prtg WMI Event Log

Что бы сенсор краснел нужно в канале сделать настройки

ну и напоследок оповещение

Создать скрипт который будет слать алерты в TELEGRAM.

  1.  Создаём бота https://tlgrm.ru/docs/bots/api
  2. создаем скрипт на powershel который будет слать сообщения от бота в групповой чат что бы все видели алерты
    #param ($text) - думал как перенапривть сюда значения с prtg
    
    $secPasswd=ConvertTo-SecureString "password" -AsPlainText -Force
    $myCreds=New-Object System.Management.Automation.PSCredential -ArgumentList "head_office\k.moskvichev"
    #$Site="http://www.computerperformance.co.uk"
    
    $botkey = "bot244166770:**********************FoB5rvY"
    $chat = "-172891647"
    $text = "любой текс"
    $sendText = "https://api.telegram.org/$botkey/sendMessage" 
    Invoke-WebRequest -Uri $sendText  -Proxy 'http://192.168.0.97:8080' -ProxyUseDefaultCredentials -Method Post  -ContentType "application/json;charset=utf-8" -Body (ConvertTo-Json -Compress -InputObject @{chat_id=$chat; text=$text})
  3. нужно узнать ид группы. Для этого создаем группу и пишем в нее. потом запускаем скрипт
    (Invoke-WebRequest -Uri 'https://api.telegram.org/Заменить на своё из первого пункта/getUpdates').Content

  4. Не смог придумать как переправить инфу из пртг в скрипт , а так скрипт работает и отправляет сообщения

Но сделал на основе EXECUTE HTTP ACTION

Бэкап конфигурации PRTG. Файл с настройками PRTG лежит C:\ProgramData\Paessler\PRTG Network Monitor\PRTG Configuration.dat

Bat файл для копирование конфигурации

net stop "PRTGProbeService"
ping -n 20 127.0.0.1 > nul
net stop "PRTGCoreService"
ping -n 20 127.0.0.1 > nul
mkdir \\192.168.0.38\Backup\s0082\Configuration.%date:~0,2%.%date:~3,2%.%date:~6,4%
xcopy "C:\ProgramData\Paessler\PRTG Network Monitor\PRTG Configuration.dat" \\192.168.0.38\Backup\s0082\Configuration.%date:~0,2%.%date:~3,2%.%date:~6,4%\ /R /K /Y
ping -n 20 127.0.0.1 > nul
net start "PRTGCoreService"
ping -n 20 127.0.0.1 > nul
net start "PRTGProbeService"
pause

Архивация и копирования конфигурации

net stop "PRTGProbeService"
ping -n 20 127.0.0.1 > nul
net stop "PRTGCoreService"
ping -n 20 127.0.0.1 > nul
set now=%TIME:~0,-3%
set now=%now::=.%
set now=%now: =0%
set now=%DATE:~-4%.%DATE:~3,2%.%DATE:~0,2%_%now% 
"C:\Program Files\7-Zip\7z.exe" a "\\192.168.0.38\Backup\s0082\config%now%.zip" "C:\ProgramData\Paessler\PRTG Network Monitor\PRTG Configuration.dat"
ping -n 20 127.0.0.1 > nul
net start "PRTGCoreService"
ping -n 20 127.0.0.1 > nul
net start "PRTGProbeService"
pause

Удаление архива старше 30 дней

net use u: \\192.168.0.38\Backup\s0082
forfiles.exe /p U:\configuration\ /s /d -30 /m *.* /c "cmd /c del /q @file"
net use u: /delete
paus
SELECT
--CONVERT(float(
	
	((dbsize + logsize)    * 8192 / 1048576 ) РазмерБазы
FROM
(
 SELECT SUM(CONVERT(real ,CASE WHEN status & 64 = 0 THEN size ELSE 0 END)) dbsize
 , SUM(CONVERT(REAL ,CASE WHEN status & 64 <> 0 THEN size ELSE 0 END)) logsize
 FROM dbo.sysfiles
)
big

Настройка сенсора в ptrg.

Как выглядит сенсор

Создание сенсора в пртг для мониторинга выполнения заданий по резервному копированию в Symantec Backup Exec. Хоть и семантек сам умеет отправлять оповещение по email но у нас в пртг настроено смс оповещение да и более наглядно получается.Настройки сенсора Microsoft SQL:

Код запроса:

USE BEDB
SELECT 
	  TOP 1
	 -- JobName,
 FinalJobStatus=
  CASE  FinalJobStatus
  WHEN '6' THEN N'0' --'сбой'
  WHEN '16' THEN N'1'--'отменено'
  WHEN '19' THEN N'2' --Выполнено успешно
  WHEN '3' THEN N'3' --Выполнено с исключениями

  -- Бэкап выполнен с исключениями
  --Cбой
  END
FROM   
       dbo.JobHistorySummary
WHERE         Jobid IN (N'3A0BFD73-CEEF-414C-B0AB-2FC56FFA4105') and IsJobActive not IN ('1')
ORDER BY
       EndTime
       DESC

Запрос что бы узнать JobId в Symantec Backup Exec:

USE BEDB
SELECT 
	  TOP 1
	  JobName,
	  Jobid,
  FinalJobStatus

FROM   
       dbo.JobHistorySummary
WHERE         Jobid IN (N'3A0BFD73-CEEF-414C-B0AB-2FC56FFA4105')
ORDER BY
       EndTime
       DESC

Что бы пртг писал при down и warning нужно прописать инфу в каналах :

И прописать все что необходимо :

На сервере  настроена программа для оповещения через смс. Смс отправляются через модем zte mf180.
Идея была взята из статьи  prtg http://www.paessler.com/blog/2012/02/16/prtg-9/sending-out-prtg-sms-gsm-modem-mwconn
Программа для отправки смс используется http://nhutils.ru/blog/nhsms/download/

Настройка nhsms

Читать далее →

USE msdb

SELECT 
	  TOP 1
	  	/* a.job_id       AS Id
	  ,a.name  AS NAME_job
	 	  , b.run_date
	  , b.run_time ,
	  b.step_id,*/

	  b.run_status
	  
	  --SELECT *
FROM   
       dbo.sysjobs a
       FULL OUTER JOIN dbo.sysjobhistory b
            ON  a.job_id = b.job_id
                AND a.[enabled] = '1'
                    --AND b.run_date = @@servername
WHERE  
       a.name IN ('LSRestore_s0030_ax_molniya_DB') AND b.run_status NOT IN ('4') AND b.step_id IN ('0')
       /*GROUP BY a.name
       ,a.job_id 
       ,b.step_id
       ,b.run_date*/
ORDER BY
       b.run_date   DESC,
       b.run_time  DESC

Настройка самого сенсора в prtg

LSRestore_s0030_ax_molniya_DB _ Sensor Details _ PRTG Network Monitor (S0061) - Mozilla Firefox 2015-12-14 14.02.07