Реализация мониторинга загрузки котировок в Хранилище

Пошаговое руководство

Для мониторинга предлагается: 

  1. Создать задание (Oracle scheduler), интервал задается на усмотрение администратора системы, рекомендуемое значение 15 минут (в случае, если котировки загружаются чаще чем раз в 5 минут)
  2. В качестве текста задания указать следующий скрипт: 

    declare
        vInfo               varchar2(4000);         -- текст действия,отправляем
        vMaxLstUpdate       date;                   -- Последнее изменение цены
        vMarketPlaceCode    varchar2(2000);         -- Имя площадки
        vNeedSend           boolean := false;       -- отправлять уведомление?
        vCNT                number  := 0;           -- технический, проверить, что мы в принципе зашли в курсор
        vDateforCheck       date    := resman.td;   -- Дата, с которой ищем котировки
        vIntervalMin        number  := 15;          -- Интервал, сколько мы можем подождать котировку, в минутах
    begin
        vInfo := 'Формируем курсор. Время последней котировки в разрезе торговых систем';
        for cur in (select nvl(max(vw.c$lastupdt),resman.td) as MaxLstUpdate, nvl(vw.market_place_code,'NO DATA FOUND') as MarketPlaceCode
                    from KIP.vw_quotations vw 
                    where 1=1
                        and vw.c$date >= vDateforCheck
                    group by vw.market_place_code)
            loop
                null;
                vCNT  := vCNT+1 ;
                vInfo := vInfo ||chr(10)||'Время последней котировки '||to_char(cur.MaxLstUpdate,'dd.mm.yyyy HH24:MI:SS')||' торговая площадка '||cur.MarketPlaceCode;
                IF sysdate-cur.MaxLstUpdate > (1/24/60)*15 THEN
                    vInfo := vInfo ||chr(10)||' Котировка не обновлялась более 15 минут. Площадка '||cur.MarketPlaceCode;
                    vNeedSend := true;
                END IF;
            end loop;
        IF vCNT = 0 and sysdate-vDateforCheck > (1/24/60)* NVL(vIntervalMin,1) THEN --проверим, что это не утро, не первые 15 минут нового дня
            vInfo := vInfo ||chr(10)||' Сегодня '|| to_char(vDateforCheck,'dd.mm.yyyy HH24:MI:SS')||' котировки еще не загружались';
            vNeedSend := true;
        END IF;
        IF vNeedSend then
            resman.pkg_monitoring.send_msg(ialias_msg=>'NAVXLV5_TRANSPORT_ERR',itext=>vInfo);
        end if;
        DBMS_OUTPUT.PUT_LINE(vInfo);
    end;
  3. В скрипте обратите внимание на значение параметра vIntervalMin – сколько в минутах, мы ожидаем котировку, если в течении указанного интервала котировка не поступит в Навигатор, через Систему сообщений будет отправлено сообщение;
  4. Установить в Администраторе Системы сообщений подписку на сообщения с алиасом NAVXLV5_TRANSPORT_ERR;
  5. При отсутствии котировок в Хранилище, более заданного в параметре vIntervalMin интервала, будет отправлено сообщение о том, что в Хранилище не загружаются котировки.

Пример скрипта создания задания:

DECLARE
	vSQL clob;
     vRepeat_interval varchar2(200) := 'FREQ=MINUTELY;INTERVAL=20';
BEGIN
	vSQL := 'declare
            vInfo               varchar2(4000);         -- текст действия,отправляем
            vMaxLstUpdate       date;                   -- Последнее изменение цены
            vMarketPlaceCode    varchar2(2000);         -- Имя площадки
            vNeedSend           boolean := false;       -- отправлять уведомление?
            vCNT                number  := 0;           -- технический, проверить, что мы в принципе зашли в курсор
            vDateforCheck       date    := resman.td;   -- Дата, с которой ищем котировки
            vIntervalMin        number  := 15;          -- Интервал, сколько мы можем подождать котировку, в минутах
        begin
            vInfo := ''Формируем курсор. Время последней котировки в разрезе торговых систем'';
            for cur in (select nvl(max(vw.c$lastupdt),resman.td) as MaxLstUpdate, nvl(vw.market_place_code,''NO DATA FOUND'') as MarketPlaceCode
                        from KIP.vw_quotations vw 
                        where 1=1
                            and vw.c$date >= vDateforCheck
                        group by vw.market_place_code)
                loop
                    null;
                    vCNT  := vCNT+1 ;
                    vInfo := vInfo ||chr(10)||''Время последней котировки ''||to_char(cur.MaxLstUpdate,''dd.mm.yyyy HH24:MI:SS'')||'' торговая площадка ''||cur.MarketPlaceCode;
                    IF sysdate-cur.MaxLstUpdate > (1/24/60)*15 THEN
                        vInfo := vInfo ||chr(10)||'' Котировка не обновлялась более 15 минут. Площадка ''||cur.MarketPlaceCode;
                        vNeedSend := true;
                    END IF;
                end loop;
            IF vCNT = 0 and sysdate-vDateforCheck > (1/24/60)* NVL(vIntervalMin,1) THEN --проверим, что это не утро, не первые 15 минут нового дня
                vInfo := vInfo ||chr(10)||'' Сегодня ''|| to_char(vDateforCheck,''dd.mm.yyyy HH24:MI:SS'')||'' котировки еще не загружались'';
                vNeedSend := true;
            END IF;
            IF vNeedSend then
                resman.pkg_monitoring.send_msg(ialias_msg=>''NAVXLV5_TRANSPORT_ERR'',itext=>vInfo);
            end if;
            DBMS_OUTPUT.PUT_LINE(vInfo);
        end;';
            DBMS_SCHEDULER.CREATE_JOB (
                    job_name => '"RESMAN"."JOB_PKG_MONITORING"',
                    job_type => 'PLSQL_BLOCK',
                    job_action => vSQL,
                    number_of_arguments => 0,
                    start_date => sysdate,
                    repeat_interval => vRepeat_interval,
                    end_date => NULL,
                    enabled => FALSE,
                    auto_drop => FALSE,
                    comments => 'Мониторинг работы загрузки котировок в Хранилище, раз в 20 минут');     
            DBMS_SCHEDULER.SET_ATTRIBUTE( 
                     name => '"RESMAN"."JOB_KIP_EH_MONITORING"', 
                     attribute => 'logging_level', value => DBMS_SCHEDULER.LOGGING_OFF);   
            DBMS_SCHEDULER.enable(
                     name => '"RESMAN"."JOB_KIP_EH_MONITORING"');
        END;
/


Похожие статьи