Иногда при построении графика (например Bar chart) на основании запроса в PostreSQL, дата отображается не верно, а именно, примерно так:
Для того чтобы сиё поправить, нужно привести дату строго в формат YYYY-MM-DD. Например так:
select to_char(date_trunc('day', dt), 'YYYY-MM-DD'),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
Продолжаю попытки нормально пометить на графике дневное и ночное время. Описание предыдущих попыток можно почитать здесь. На этот раз, попробуем при помощи аннотаций. Основная идея: при помощи аннтотаций, на графике возможно помечать и подписывать определенные промежутки данных на графике. Аннотации можно добавлять из вне при помощи специального 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 для этого есть штатный функционал.
Заходим в меню «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»)
К сожалению так и не смог докопаться до истины, почему при отображении графика на панели, время сбивается в непонятные значения +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