sparkline

График, который наполняется одной строчкой curl, и SVG, который кладётся в README.

Заставка Sparkline: заголовок «Charts with a URL you can curl» над строкой curl и оранжевой линией графика, на почти чёрном фоне.

Sparkline — это график, который заводится за минуту и наполняется одной строчкой curl. Ни клиентской библиотеки, ни демона на машине, ни заголовка с токеном: приватный ключ лежит прямо в пути, так что отправка измерения — это GET, влезающий в одну строку Makefile, шага CI или записи в cron.

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

Один запрос — одно измерение, сколько бы всего оно ни несло: имя и число на каждую серию, причём имя, которого график ещё не видел, заводит серию само, так что объявлять заранее ничего не нужно. Ответ приходит одинаковой формы независимо от того, получилось или нет, — именно поэтому jq -e .ok оказывается законченной проверкой, — и в нём перечислено, какие серии изобрёл этот конкретный запрос: это та строчка, за которой стоит следить, когда график обрастает дорожкой, которой никто не планировал.

На чтение — один адрес и четыре представления, выбираемые расширением. SVG рисуется в тот момент, когда его попросили, поэтому идёт куда угодно, куда пускают картинку: в README, на страницу статуса, в пул-реквест, в раскрытую ссылку в Slack — и вчерашним не бывает никогда. .json — те же числа таблицей, для программы. .js — живая вставка с подробностями при наведении и автообновлением, нарисованная в shadow root, так что ни один из двух стилевых миров не дотягивается до другого. А без расширения это просто страница, которую можно кому-нибудь отправить.

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

Два кода, две работы. Адрес в картинке публичный и умеет только читать. Ключ на запись — отдельный, не умеет ничего, кроме как дописывать измерения в этот один график, и меняется в один клик: ключ, попавший не в тот канал в Slack, — проблема на минуту, а не на вечер. То, что он едет в пути, а не в заголовке, — сознательный размен: именно это делает строчку достаточно короткой, чтобы её в самом деле написали, а график времени сборки не стоит того, чтобы разводить вокруг него OAuth.

Чего он не умеет. Нет загрузки задним числом: ось времени идёт по часам сервиса — ровно это и позволяет запросу состоять из одних чисел, — и платой за это оказывается невозможность залить вчерашние данные. Нет истории за пределами окна: 256 измерений на график бесплатно, 4096 на платном тарифе. Три серии на график бесплатно и двенадцать платно; три графика и сто. И 120 запросов в минуту на ключ, считаются запросы, а не числа, так что один с шестью сериями стоит ровно столько же, сколько один с единственным значением.