По роду моей деятельности я всегда нахожусь между различными подразделениями - у меня в 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.