Ad Widget

Collapse

Фоновый рефреш карт.

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Horror777
    Member
    • Jun 2009
    • 36

    #1

    Фоновый рефреш карт.

    Доброго времени суток Уважаемые.

    Начальство поставило задачу развернуть карту сети на очень большой монитор.
    В связи с этим, возникла проблема - обновление с полным перестроением карты бьёт по глазам.

    Пробовал применить технологию ajax, для фоновой загрузки изображения, а потом её смене средствами браузера. Код для этого пытался вычленить из dashboard.php, но так как не специалист, то потерпел поражение.
    Попытка загружать страницу внешним ajax кодом, также не увенчалась успехом.

    Использую Zabbix 1.8.4

    Вопрос простой, как реализовать обновление карты без перезагрузки страницы?
  • turboon
    Member
    • Sep 2010
    • 93

    #2
    Вот мое решение

    Доброе время суток. Вопрос простой, но копался с его решением я пару дней точно.

    Вот мое решение ( далеко не идеальное, помощь в доработке приветствуется ):

    Мне понадобилось сделать более "гладким" обновление комплексного экрана с неколькими таблицами, картами и графиками:

    1. Модификация класса PageRefresh, описанного в main.js


    2. Модификация screens.php:
    Было:
    $screens_wdgt = new CWidget();
    Стало:
    $screens_wdgt = new CWidget("dReport");

    3. Добавлена функция getBase64Image в func.inc.php


    4. Модификация screens.inc.php в 2-х местах:
    Было:
    if($editmode == 2){
    insert_js('timeControl.addObject("'.$dom_graph_id. '",'.zbx_jsvalue($timeline).','.zbx_jsvalue($objDa ta).');');
    }
    else{
    zbx_add_post_js('timeControl.addObject("'.$dom_gra ph_id.'",'.zbx_jsvalue($timeline).','.zbx_jsvalue( $objData).');');
    }
    Стало:
    if($editmode == 2){
    $base = 'http://'.$_SERVER['SERVER_NAME'].'/';
    $base .= $src;
    $src = 'data:image/png;base64,'.getBase64Image( $base );
    $item = array( new CImg( $src ) );
    }
    else{
    $base = 'http://'.$_SERVER['SERVER_NAME'].'/';
    $base .= $src;
    $src = 'data:image/png;base64,'.getBase64Image( $base );
    $item = array( new CImg( $src ) );
    }


    Краткое описание механизма
    Изначально JS класс PageRefresh ( как понятно из названия ), занимается обновлением страницы с заданной периодичностью ( по умолчанию, по-моему секунд 30 ).
    Функцией setTimeout каждую секунду вызывается PageRefresh.check(), внутри которой происходит уменьшение счетчика, сравнение его с нулем, и если требуется,
    обновление страницы с вызовом location.reload().

    Модификация заключается в замене вызова location.reload() на функцию ajaxReload, которая делает следующее:
    1. Подгружает в фоне текущую страницу ( с помощью XMLHttpRequest )
    2. Достает из полученной страницы содержимое тега <div id="dReport">.
    3. Заменяет содержимое этого же тега на странице в браузере

    Кроме того, я добавил отображение состояния обновления:
    - время последнего обновления
    - секунд до следующего обновления
    - если обноление не удалось ( притормаживает веб-сервер, например ), то строка со временем подсвечивается красным

    В screens.inc.php раннее загружался JS объект, выводящий график с возможностью изменять временной период.
    Этой возможностью пришлось пожертвовать
    Однако теперь обновление экрана происходит практически незаметно для глаз.

    P.S. Если вы, как и я, не слишком большой знаток устройства web-интерфейса zabbix, php и js, то рекомендую не копировать слепо мои исправления. Ибо я мог что-то забыть, или где-то допустить ошибку

    P.P.S. Уфф, никогда еще не писал таких больших постов )))
    Last edited by turboon; 07-02-2012, 18:40. Reason: косметические изменения

    Comment

    • Horror777
      Member
      • Jun 2009
      • 36

      #3
      Большое спасибо за наставления в нужном направлении.
      Код попытался переложить для maps.php. Пока обновляется всё кроме самой карты =)
      Работаю, если получится выложу всё как есть.

      Comment

      • turboon
        Member
        • Sep 2010
        • 93

        #4
        Как у вас дела?
        Вот мои изменения в screens.inc.php для карт сети:



        Изображение карты успешно кодируется в base64, и отображается на странице.

        И, по-моему, можно не трогать maps.php, достаточно додбавить карту на комплексный экран..

        Comment

        • Horror777
          Member
          • Jun 2009
          • 36

          #5
          Попытался применить последнее.

          Браузер выдаёт "Изображение не может быть показано, так как содержит ошибки".
          Либо кодирование не правильно работает, либо у меня пакетов нужных не хватает.
          Проверял на Iceweasel и Chromium.

          Comment

          • prostrelov
            Senior Member
            • May 2012
            • 115

            #6
            Пытался применить решение под Zabbix v.2.0.0
            упёрся в файл screens.php
            там нет строки $screens_wdgt = new CWidget();

            есть что-то похожее в блоке //render view

            $screenView = new CView ('monitoring.screen', $data);
            $screenView->render();
            $screenView->show();

            но попытки подставить туда "dReport" никчему не привели.

            п.с.
            хотел уточнить требуется ли установка каких-то дополнительных библиотек и пр.

            p.p.s
            кстати натолкнулся на похожую тему https://support.zabbix.com/browse/ZBXNEXT-1253
            Last edited by prostrelov; 01-08-2012, 09:33.

            Comment

            • turboon
              Member
              • Sep 2010
              • 93

              #7
              Здравствуйте. Только что зашел на форум..
              Заббикс2 еще не ковырял, к сожалению.
              Но, судя по статусу тикета, проблема решена. Возможно, стоит немного подождать версии 2.0.3, в которую войдут исправления.

              Comment

              • Shurman
                Member
                • Mar 2014
                • 44

                #8
                Зашёл на форум - и через 4 года в версии 3 всё ещё не решена.

                Зачем возможность отмечать стрелочками/цветом проблемные узлы или связи, зачем вывод количества/текста красных триггеров рядом с узлом - если надо обновлять руками?

                Самая большая польза от этой карты - это вывести её на большой экран на стене. Что подразумевает, что должна обновляться автоматически. Да и почему всё остальное обновляется - а карта - нет?

                Comment

                Working...