TL; DR; Мы разделили часть библиотеки с открытым исходным кодом Analytics.js и переписали ее для наших собственных целей, чтобы мы могли отправлять данные напрямую сторонним службам. , не отправляя его через конвейер ETL Segment.com (для вопросов конфиденциальности, соответствия и стоимости). Это очень помогло нам, и теперь мы хотим поделиться этим с сообществом открытого исходного кода, чтобы другие люди также могли адаптировать это к своим потребностям. Получите ранний выпуск здесь и поделитесь со мной своими мыслями.

Признание: мы любим сегмент

Мы пользуемся этим инструментом уже много лет, и он избавил нас от многих страданий. Большое спасибо команде Segment.com за создание первой версии Analytics.js. Если у вас есть команда данных, вы создаете хранилище данных и вам нужно централизовать данные в Redshift, у меня есть для вас потрясающий продукт.

Но мы не были хорошими клиентами сегмента.

Несмотря на то, что в прошлом сегмент был великолепен, мы столкнулись с ситуацией, когда нам пришлось придумать другой инструмент для решения нашей проблемы.

1. Наши потребности только на стороне клиента (Javascript).

Мы маленькие. У нас нет группы по обработке данных, и, хотя я управлял реальной аналитической инфраструктурой, компании Pre-Series-A не имеют бизнеса, делающего здесь огромные инвестиции (пока они покрывают свои базы). Я не создаю мобильное приложение, и мне действительно нужно просто отправить данные отслеживания в три места: Google Analytics, Intercom.io, Hotjar , и Mixpanel, в чистом виде. Я также хотел бы поэкспериментировать с несколькими другими направлениями, такими как Keen.io и Heap. И я хочу, чтобы затраты на переключение оставались низкими, если в будущем я все же решу перенести все на Drift или Keen.io.

2. Мы превысили наш бесплатный ежемесячный лимит в 1000 отслеживаемых пользователей, но большинство из них были посетителями.

И хотя модель ценообразования Segment.com является разумной (10 долларов США за 1000 MTU), существует минимальная плата в размере 100 долларов США в месяц за 10 000 MTU, что, по понятным причинам, очень много для сегмента, но не для нас. .

3. Наш клиент был обеспокоен последствиями хранения данных с помощью сегмента.

Наш клиент был очень обеспокоен раскрытием информации о том, что для реализации Analytics.js нам потребуется отправлять его данные через стороннюю организацию, Сегмент, и что данные будут храниться (бесконечно?) в ведре s3.

Кроме того, любой, кто получил доступ к сегменту, потенциально может иметь доступ к этим данным (и возможность воспроизвести предыдущие наборы данных в новом месте назначения с ограниченным окном доступа).

Хотя мы чувствуем, что могли бы отступить и преодолеть это препятствие, для других это может быть не так.

Итак, мы разделили его, а затем переписали.

Мы начали с уровня абстракции между службами, которые мы хотели реализовать, и нашей существующей реализацией Analytics.js. Затем мы рассмотрели сам форк Analytics.js, который оказался довольно большим (~ 300 КБ), и нам нужно всего несколько его частей.

В итоге мы получили совместимую с синтаксисом замену для Analytics.js, которая позволила нам отказаться от сегмента и выполнить легкие преобразования, необходимые для выполнения наших данных на стороне клиента. Это позволяет нам один раз написать код отслеживания и отправлять данные туда, где они нам нужны.

Где взять

Вы можете найти репозиторий с причудливым именем здесь:



Ограничения

Это не полная замена Segment.com (и не должно быть). Он обрабатывает только данные на стороне клиента и в настоящее время отправляет их только ограниченному числу пунктов назначения. Но он легко расширяется, и если вам это нужно, я помогу вам интегрировать его и реализовать новые направления.

Присоединяйтесь к нам в Slack

Https://slack.gumshoeanalytics.com/ (дайте этой странице несколько секунд для загрузки, она отключается при простое).

Я помогу написать любые интеграции, которые вы сможете придумать. Если имеется документация или уже существует эталонная реализация Analytics.js, отправьте ее нам и сообщите нам, что вы хотели бы ее использовать.

Спасибо!