Google Data Studio - это замечательный бесплатный инструмент, позволяющий любому быстро создавать красивые и простые панели управления на основе практически любых источников данных. Однако у него есть одно неприятное ограничение: отчеты не отображаются в режиме реального времени.

Первый читатель, загрузивший ваш отчет, получит самые свежие данные, но затем данные будут кэшироваться на срок до 12 часов, даже если в источнике данных доступны более новые данные, а последующие читатели не получат обновленные данные. Только редакторы отчетов могут обновлять кеш, вручную нажимая кнопку обновления на панели инструментов:

А вы встречали Кукловода? От команды Chrome DevTool это библиотека узлов, которая предоставляет высокоуровневый API для управления« безголовым Chrome». По сути, он позволяет делать большинство вещей, которые вы можете делать вручную в браузере из приложения Node.js, запущенного на автономном сервере. Что, если бы мы могли просто нажать эту придирчивую маленькую кнопку ручного обновления в каком-нибудь планировщике задач, чтобы избавиться от 12-часового ограничения кеша? Давай сделаем это!

HCaS (Безголовый Chrome как услуга)

Не гуглий, это я только что придумал 😆. Для размещения нашего небольшого приложения по обновлению обезьяны Data Studio нам нужна безгласная серверная среда, совместимая с Chromium, что не так уж и тривиально.

Мы могли бы настроить нашу собственную виртуальную машину и установить все вручную (удачи с зависимостями Chromium в автономной среде), ИЛИ мы можем использовать поставщика PaaS с автономной поддержкой Chromium, так что все уже настроено, и мы не делаем Не нужно самим управлять сервером. К счастью, GCP предлагает официальную поддержку Chrome без головы с августа 2018 года.

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

  • делать скриншоты веб-страниц
  • делать рендеринг на стороне сервера
  • создавать PDF-файлы из веб-страниц или JS
  • выполнять сквозное тестирование производительности и пользовательского интерфейса
  • разработать 🐒 скрипты, чтобы нажимать на придирчивые кнопки ручного обновления :)

Приложение Node.js

Мы начинаем с создания приложения Node.js, используя express для создания HTTP-сервера, прослушивающего запросы заданий, winston для ведения журнала и puppeteer для автоматизации Chrome. Поскольку мы будем использовать сервисы GCP PaaS для хостинга, я также добавляю @ google-cloud / loggin-winston для вывода журналов в сервис журналов GCP Stackdriver. Просто создайте package.json файл, подобный приведенному ниже, и запустите npm install.

Затем мы используем Puppeteer для автоматизации открытия страниц отчетов Data Studio и нажатия кнопки обновления. Одна из проблем на этом этапе - заставить безголовый Chromium войти в качестве пользователя в Data Studio с помощью единого входа Google.

Решение состоит в том, чтобы вручную войти на машину разработки с помощью флага запуска headless:false или скопировать userDataDir из локального экземпляра Chrome в userDataDir проекта. Файл cookie для входа будет использоваться для последующего запуска, чтобы Chrome без головы не проходил страницу входа. Вы также можете автоматизировать вход на страницу входа, но это потребует больше работы. Во всяком случае, тогда сценарий выглядит так:

Наконец, оберните все в HTTP-сервер и реализуйте правильную обработку ошибок в app.js (щелкните, чтобы увидеть суть).

Развернуть на GCP App Engine

Чтобы разместить наше приложение на GCP, мы определяем файл YAML для нашего приложения:

и чтобы запланировать выполнение с регулярным интервалом, cron.yaml:

Затем запустите gcloud app deploy data-studio-refresher.yaml --version dev && gcloud app deploy cron.yaml и вуаля! У нас есть автономное приложение для автоматизации Chrome, работающее без сервера, с удобным управлением жизненным циклом приложения, планировщиком задач и службами ведения журналов, доступными в консоли GCP.

ОБНОВЛЕНИЕ: как указал Джонатан Лин в комментариях, вы также можете развернуть функцию Google Cloud и сэкономить еще больше денег!

Спасибо за прочтение ! Если вам понравилось, не стесняйтесь поделиться им.

Я учусь каждый день и не считаю себя опытным разработчиком GCP или Node.js. Так что, если я допустил какую-либо ошибку, пожалуйста, исправьте меня и разместите свои предложения в разделе комментариев.