По роду моей деятельности я всегда нахожусь между различными подразделениями — у меня в email даже нет подписи, кто я, потому что я сам не знаю, кем являюсь. Недавно я автоматизировал доставку performance metrics SQL server с PROD девелоперам.
Конкретная информация (SQL performance metrics) не важна, вы можете делать такое для любой информации, и даже рисовать графы. Графики отправляются по почте и выглядят примерно так в окне письма в outlook:
Но прежде чем я продолжу, давайте дадим слово моему воображаемому оппоненту, зумеру-хипстеру, вот он спешит высказаться:
Мужик! Графики по почте? Что, cерьезно? Web интерфейс, интерактивность, Grafana — «нет, не слышал»? Ты бы еще звездочками графики нарисовал бы в письме, ASCII art-ом.
Конечно, мой воображаемый оппонент абсолютно прав в идеальном, воображаемом мире. Это вам подтвердит любой пролетающий там розовый единорог. Однако, если мы не в стартапе, а в кровавом enterprise, то все не так розово.
Во-первых, доступ к серверам PRODUCTION в кровавом Enterprise варьируется от затрудненного до параноидального (например, CA PAM с возможностью зайти на сервер только если есть открытый инцидент на вас, при этом copy/paste блокирован). Есть еще более параноидальный вариант — через митинг и экран, когда можно говорить что делать, но набирает другой человек.
Во-вторых, что вы там хотели поставить, Grafana? На отдельном сервере, понятно. Давайте и напишем «прошу выделить сервер с доступом ко всем SQL серверам на PROD для таких то нужд». Опять-таки, в зависимости от параноидальности компании вы можете получить желаемый сервер примерно через месяц, два (если вам будет активно помогать менеджмент в борьбе против security team) или никогда.
Кроме того, если вы хоститесь on-prem, то вам могут дать виртуалочку, так уж и быть. Если же речь идет об AWS (а мы речь ведем о PROD), то это запрос на машинку, где будут поля Department и Billing Code, и потребуют реальные деньги. Нет, дело не в сумме. Выделить сотни тысяч долларов на какую нибудь фигню для Enterprise элементарно, а вот пару сотен в месяц для Васи Пупкина — извините.
Наконец, формат email очень совместим с менеджментом. Менеджер не будет думать, под каким логином заходить на Grafana и куда там кликать, а потом делать screenshots. То ли дело мыло — его легко отфорвардить или прикрепить к митингу. Вас даже могут попросить сделать отчет регулярным, чтобы он автоматически отправлялся менеджеру на почту раз в день или неделю (через три месяца мы можете это отключить — менеджер давно перенаправил надоевший отчет в Junk правилом и забыл про него)
В итоге приходится прососаться к серверу с максимально открытой connectivity к другим (такие, как правило, есть, но к ним сильно лимитирован доступ), как правило, такие сервера связаны с deploy (Jenkins, Octopus etc). Особо много там не развернешь — надо вести себя там скромно. Вряд ли кто смотрел старый мультик, но придется сослаться на Филиаса Фога:
«А теперь — слайды» (c) Итак, я зацепился за существующий Jenkins server, создав Job:
Jenkins используется просто как оболочка вызова powershell (да, powershell можно прекрасно использовать и под Linux!) и бесхитростно передает все параметры скрипту. Вся информация по performance у меня в одной плоской таблице, и выводится по колонкам. Графики рисуются примерно так:
makeChart $find @('3Read latency, microseconds','2Write Latency, microseconds') 'IO latency' 'Time' 'Times in microseconds' 'latency'
В $find находится data set, вычитанный на нужную дату и диапазон времени. Названия колонок предваряет код цвета. Смотрим процедуру makeChart:
# Xgraph colors # 2 = red, 3 = blue, 4 = green, 5 = violet, 6 = orange, 7 = yellow, 8 = pink, 9 = cyan function makeChart($ds, $cols, $title, $titleX, $titleY, $pngname) { Out-File -FilePath $workfile -Force -Encoding ascii "Title = $title" | Add-Content $workfile "title_x = $titleX" | Add-Content $workfile "title_y = $titleY" | Add-Content $workfile $maxval = 0 foreach ($c in $cols) { $colname = $c.Substring(1) $colch = $c[0] "color = $colch" | Add-Content $workfile $secf = -1 foreach ($r in $find) { $val = $r[$colname] if ($val -gt $maxval) { $maxval = $val } if ($secf -lt 0) { $secf = $r.sec } $secl = $r.sec "$secl $val" | Add-Content $workfile } "NEXT" | Add-Content $workfile } $maxval = $maxval * 1.03
Я там скрыл две последние строки — о них пойдет речь дальше. Что мы вообще делаем здесь? Мы составляем текстовое задание для пакетного рисовальщика картинок Xgraph. Утилитка старая и графики выглядят на уровне 90х годов, кроме того, она не понимает Unicode (-Encoding ascii). Неудивительно — развитие таких утилит остановилось, но иногда они очень полезны! Итак, файл готов. Вызываем Xgraph:
&D:\Apps\Xgraph\bin\xgraph.exe $workfile -pdf -hms -x_range $secf $secl -y_range 0 $maxval -out_file $pdf
Указываем входной файл, диапазон по y, по x (секунды как целое от начала суток), рисуем и время как время (-hms) и увы… вывод только в pdf и подобные форматы. Их можно приложить как attachment, но это некрасиво, нам хочется поместить картинку в тело письма. Придется скачать Poppler и конвертировать pdf в png.
&D:\Apps\poppler\bin\pdftoppm -png $pdf $pngname
Теперь тело письма будет выглядеть примерно так:
Здесь снова экстремальное программирование — у нас есть голый и чистый HTML почтового разлива — без CSS, javascript и вообще без всего. Обратите внимание, что png имеет в имени ‘-1’, это первая страница (она же в данном случае единственная).
Есть еще одна утилитка подобного плана, она позволяет рисовать графы по их текстовому описанию: graphviz. Она уже может непосредственно выводить в png и jpg:
Это пример, как уже в другой job я возвращаю пользователям lock graph.
ссылка на оригинал статьи https://habr.com/ru/post/549110/
Добавить комментарий