Grafana: Аннотации

Продолжаю попытки нормально пометить на графике дневное и ночное время. Описание предыдущих попыток можно почитать здесь. На этот раз, попробуем при помощи аннотаций. Основная идея: при помощи аннтотаций, на графике возможно помечать и подписывать определенные промежутки данных на графике. Аннотации можно добавлять из вне при помощи специального API.

Создадим ключ API:

Далее, необходимо узнать id дашборда (гаходится как orgId в url) и id панели дашборда, чтобы таргетировать аннотацию.

Далее наваяем небольшой скрипт на PHP, который положим в крон и будем выполнять ночью:

#!/usr/bin/php
<?php
    $geo=21; // Код можно узнать здесь: https://xn--90acbu5aj5f.xn--p1ai/?page_id=6661
    $api_key_grafana="Bearer eyJrIwedwediLCJpZCI6MX0=";
    $api_grafana_url="https://qwedqweai/api/annotations";
    $dash_id=1;
    $panel_id=30;
    $offset=3*60*60; // смещение времени

    $ch = curl_init("https://yandex.ru/time/sync.json?geo=21");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $res=curl_exec($ch);
    curl_close($ch);

    $js=json_decode($res);

    if ($js==null){die("Не удалось получить данные для обработки");};
    $DayFrom=$js->clocks->$geo->sunrise;
    $DayTo=$js->clocks->$geo->sunset;

    $dt=Date("Y-m-d");
    echo "День $dt с $DayFrom по $DayTo\n";
    $dtStart=(strtotime($dt." ".$DayFrom.":00")-$offset)."000";
    $dtEnd=(strtotime($dt." ".$DayTo.":00")-$offset)."000";


    $ch = curl_init($api_grafana_url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Authorization: $api_key_grafana",
        "Content-Type: application/json"
    ));
    curl_setopt($ch, CURLOPT_POST, 1);

    $postd=[];
    $postd["text"]="Дневное время";
    $postd["dashboardId"]=$dash_id;
    $postd["panelId"]=$panel_id;
    $postd["time"]=$dtStart+0;
    $postd["timeEnd"]=$dtEnd+0;
    $postd["tags"]=["daytime"];


    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postd));
    $res=curl_exec($ch);
    var_dump($res);

?>

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

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)

Grafana: правильное выставление времени на графике

К сожалению так и не смог докопаться до истины, почему при отображении графика на панели, время сбивается в непонятные значения +3 часа. Хотя и в настройках панели и в настройках отображения везде установлено руками UTC+3. Пришлось решать проблему кардинально, изменив время в запросе:

SELECT CONVERT_TZ(m_data.dt,'+00:00','-03:00') as dt ,CAST(m_data.value as int) as 'Mikrotik'  FROM m_data.m_data 
WHERE m_data.place=10 and m_data.source=12 and m_data.value_type=1 order by dt limit 500

Grafana: доступ к просмотру дашбоарда или панели без авторизации

Grafana после некоторой настройки позволяет «расшаривать» дашборды и панели для просмотра для не авторизированных пользователей. Для этого в файле настройки /etc/grafana/grafana.ini необходимо найти секцию auth.anonymous и установить enabled=true:

[auth.anonymous]
# enable anonymous access
enabled = true

После чего необходимо перезапустить сервер:

service grafana-server restart
1 2