Балансировка монитора среды с использованием SQL - PullRequest
1 голос
/ 28 июня 2019

Я работаю над чем-то очень конкретным, поэтому я надеюсь, что у других есть представление о том, какой подход может сработать.

Я пытаюсь сделать так, чтобы скрипт мониторинга, который запускался раз в 5 минут, невзорвать всех с избыточными уведомлениями.Я пытаюсь использовать SQL для балансировки нагрузки, но я пытаюсь определить, какие запросы мне нужны.

Я настроил эту таблицу:

Create Table MonitorDetails (
    MonitorID int IDENTITY(1,1) PRIMARY KEY,
    IssueType nvarchar(255) Not Null,
    IssueDetails Nvarchar(max) not null,
    Hostname nvarchar(255),
    Criticality int not null,
    ReportedTime Datetime not null,
    ResolvedTime Datetime,
    NotificationSent bit Default 0
)

И все сбоивыкидываете в эту таблицу.

Вот пример:

  • Выдается ошибка
  • Ошибка записывается в таблицу
  • Через 5 минут ошибка снова записывается, потому что она не была устранена

Запускаемый мной скрипт будет смотреть на записи в таблице, и я хочу, чтобы в первый раз была зарегистрирована ошибкаотправить уведомление и установить флаг уведомления, но если ошибка появляется снова и уведомление уже отправлено, оно не будет отправлять другое уведомление.

Поиск дубликатов - это простая часть, но как мне исключить дубликаты (или дубликаты массового обновления), когда ОДНА из записей имеет установленный флаг уведомления?

SELECT
    IssueType, IssueDetails, Hostname, Criticality, ReportedTime, COUNT(*)
FROM
    MonitorDetails
Where ResolvedTime is null
GROUP BY
    IssueType, IssueDetails, Hostname, Criticality, ReportedTime
HAVING 
    COUNT(*) > 1

Возможно, я закончилЯ думаю об этом, но я стараюсь облегчить запросы, чтобы они не были обременительными для самого SQL-сервера.У кого-нибудь есть предложения?

1 Ответ

1 голос
/ 28 июня 2019

Добавить MAX (NotificationSent) в список выбора. Если значение равно 1, уведомление уже отправлено.

Если вы хотите вернуть только те, которые не отправлены уведомления, обновите условие HAVING:

HAVING COUNT(*) > 1 AND MAX(NotificationSent)=0

...