Grafana: использование выпадающего меню на дашборде

Задача: необходимо строить график в зависимости от выбранного значения в выпадающем списке.

Решение: в Grafana для этого есть штатный функционал.

Заходим в меню «Dashboard Settings» (шестренка) -> Variables (переменные). Создаём новую переменную:

  • name — имя переменной, для использования в дальнейших запросах
  • label — заголовок перед выпадающим меню
  • Query — запрос из которого идёт выборка в поле выбора. Причем поле обозначенное как __text будет использоваться как наименование поля выбора, а __value как его значение.

После сохранения, идём в редактирования панели дашборда и меняем запрос на вида:

select (dt),count(*) as "${division:text}" from (
                    select 
                            date_trunc('month', agreements_dt)::date as dt
                    from 
                            ls 
                    where agreements_dt>'2018-01-01' and
							owner in ('$division') and
                            agreements_dt is not null
                    ) as agr
            group by dt
            order by dt	desc

, где:

  • ${division:text} — текст выбранного (Например «Кудыкинский муниципыальный район»
  • $division — значение выбранного (Например «13432»)

В результате получаем чудную картину:

Grafana: выделения времени суток на шкале TimeScale

В одном из проектов (умный дом) у меня мониторится температура окружающего воздуха. Но график… ну так себе если честно..

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

Просто наложив поверх еще один запрос, где вывожу в зависимости от часа суток предопределенные значения.

SELECT
  $__time(m_data.dt),
  CASE
    WHEN hour(dt)>=21 and hour(dt)<=23 THEN -35
    WHEN hour(dt)>=0 and hour(dt)<=2 THEN -35
    WHEN hour(dt)>=3 and hour(dt)<=8 THEN -17
    WHEN hour(dt)>=9 and hour(dt)<=14 THEN 35
    WHEN hour(dt)>=15 and hour(dt)<=20 THEN 17
  END  as 'Время суток'
FROM
  m_data.m_data  
WHERE
  m_data.place=10 and m_data.source=17 and m_data.value_type=1  and $__timeFilter(m_data.dt)

Исправление распространённых ошибок при тестировании конфигурации Bitrix

Всё ниже перечисленное применимо к Битрикс «Управление сайтом»

Ошибка! Время отличается на 10800 секунд

Прежде чем применять предложенное исправление, необходимо проверить что в консоли терминала и консоли БД время установлено верно.

Исправление: в файле /bitrix/php_interface/after_connect.php нужно добавить строчку:

$DB->Query("SET LOCAL time_zone='".date('P')."'");

Ошибка! Не настроен запуск cron_events.php на cron, последний агент отработал больше суток назад.

Исправление: в /etc/crontab добавить строчку вида:

* * * * *       sleep $((RANDOM\%3)); flock -x -n /tmp/cron_site.lock -c "[ -f /var/www/www-root/data/www/erfwerf.ru/bitrix/php_interface/cron_events.php ] && { sleep $((RANDOM\%50)); timeout 3600 php -f /var/www/www-root/data/www/erfwerf.ru/bitrix/php_interface/cron_events.php; }" >/dev/null 2>&1

Работа с сокетами: Ошибка! Не работает

Исправление:

  • добавить в /etc/hosts имя домена
  • обновить корневые сертификаты:
yum install ca-certificates
update-ca-trust
  • проверить нет ли проблем с сертификатом при выполнении в терминале на сервере
wget https://adiuoe.ru

Если выведет ошибку — установить корректные ssl сертификаты

Недоступны для чтения или записи

При проверке ругается, что часть файлов/папок не доступны для чтения/записи. Для начала выполним команды в корневой папке сайта:

find . -type d -exec chmod 775 {} \;
find . -type f -exec chmod 664 {} \; 

И выставим владельцев (у вас могут быть свои):

find . -type d -exec chown nginx:apache {} \;
find . -type f -exec chown nginx:apache {} \;

Работа с файлами кеша: Ошибка! Не работает

Сервер apache не имеет доступа в папку /bitrix/cache

chmod 777 bitrix/cache/

Yandex map: динамическая загрузка содержимого балуна

Задача: динамически загружать контент по клику на метку, в т.ч. и при кластеризации

Решение:

Добавим события открытия балуна по клике на метку из карты и кластера:

                objectManager.objects.events.add('balloonopen', function (e) {
                    console.log("Открыт балун вне кластера");
                    var id = e.get('objectId'),
                    geoObject = objectManager.objects.getById(id);
                    downloadContent([geoObject], id);
                });          

                objectManager.clusters.events.add('balloonopen', function (e) {
                    var id = e.get('objectId'),
                        cluster = objectManager.clusters.getById(id),
                        geoObjects = cluster.properties.geoObjects;
                        console.log("Открыт балун из кластера..");
                        downloadContent(geoObjects, id, true);
                });   
....
function downloadContent(obj,id,isCluster){    
    console.log("Загружаем объект:");
    aids = obj.map(function (geoObject) {return geoObject.id;});
    if ((obj.length)<200) {
        $("#global").addClass("loading");   
            $.post("?r=inications/get_points_content", {  
            ids:aids,
        }).done(function(data) {            
            obj.forEach(function (geoObject) {
              //console.log("--присваиваем новое тело балуна");                
              if (geoObject.properties.balloonContentBody.includes("<l></l>")){
                //console.log("-подменяю содержимое балуна!");  
                //console.log(geoObject);
                geoObject.properties.balloonContentBody =geoObject.properties.balloonContentBody.replace("<l></l>",data.result[geoObject.id].content);      
                if (isCluster!==true){
                    objectManager.objects.balloon.setData(objectManager.objects.balloon.getData());
                } else {
                    objectManager.clusters.balloon.setData(objectManager.clusters.balloon.getData());
                };
                //setNewData();
              }            
            });                   
            $("#global").removeClass("loading");                    
        });
    } else {
     ToastMessage("error","Кластер слишком велик","Кластер слишком велик для того чтобы его раскрыть. Увеличьте масштаб и попробуйте снова!",6000);   
    };
} 

К сожалению, если в кластере собрано очень много меток (более 200), то обновление идёт довольно долго, потому пришлось немножко ограничить загрузку. В хорошем варианте, нужно бы отслеживать клик по заголовку списка в кластере, но это пока не удалось

WordPress грузит ресурсы по http вместо https

После переноса одного из сайтов на wordpress с одного сервера на другой, столкнулся с проблемой, что все ресурсы (css, js и т.п.) грузятся по протоколу http, хотя основной сайт грузится по https (загрузка http вместо https). Изменение и проверка всего и вся в БД результата не дало. Помог рецепт добавить в wp-config.php строчку:

$_SERVER['HTTPS'] = 'on';

Заработало. Что такое было, не понятно.. Точнее понятно что это настройки apache, но вот какие, так обнаружить и не удалось.

P.S. Кроме того, естественно была проведена работа по замене всех ссылок вида http на https внутри БД wordpress. Однако это не помогло в моём случае.

1 4 5 6 7 8 55