А как понять? Делаем аналитику для бота с нуля. Часть 2 — делаем дашборд в Redash

от автора

В предыдущей статье мы подготовили наше тестовое приложение — бота для обмена анонимными сообщениями в Telegram.

Пришло время отобразить все данные, которые мы собрали. Для этого мы будем использовать Redash.

Что лежит в базе

Данные в базе (MongoDB) у нас хранятся в следующем виде.

Пользователь:

{   "_id": {     "$oid": "64908ebc5a1d121b983e2406"   },   "user_id": 5784928745,   "username": "nickname",   "datetime": 1687195324.282187,   "status": "active" }

Сообщение:

{   "_id": {     "$oid": "64908ec65a1d121b983e2407"   },   "user_id_from": 5784928745,   "user_id_to": "5982379843",   "username_from": "nickname_from",   "username_to": "nickname_to",   "content": "Hi",   "message_type": "question",   "datetime": 1687195334.6866229 }

Пишем запросы

Запросы к MongoDB — это отдельный вид искусства, я считаю. Давайте попробуем им хоть немного овладеть.

Активные пользователи

Получим количество активных пользователей:

{ "collection": "users", "query": { "status": "active" }, "count": true }

Сразу создадим виджет на этот запрос (Counter):

Удалённые пользователи

Помните, мы не удаляли пользователей, а просто помечали их таковыми? Вот теперь это нам пригодится.

Запрос получается такой же, только меняем статус:

{ "collection": "users", "query": { "status": "deleted" }, "count": true }

Виджет создаётся точно так же, как в предыдущем запросе.

Все пользователи

Нам же интересно знать сумму всех пользователей бота? Думаю, да. Сделаем это:

{ "collection": "users", "count": true }

Запрос получился ещё проще, хех.

Сообщения

Количество элементов в коллекциях мы уже научились считать, давайте посчитаем сообщения:

{ "collection": "messages", "count": true }

Мы можем также захотеть видеть все наши сообщения в табличке, раз уж мы их сохраняем (а — анонимность):

{     "collection": "messages",     "aggregate": [         {             "$addFields": {                 "datetime": {                     "$toDate": {                         "$multiply": [                             "$datetime",                             1000                         ]                     }                 }             }         }     ] }

Тут запрос уже посложнее. Давайте разбираться.

$toDate ожидает миллисекунды, которые он преобразует в дату. Для этого мы должны сначала преобразовать наши секунды в виде Unix Timestamp в миллисекунды. Делаем это с помощью $multiply — умножаем на 1000. После этих манипуляций $toDate вернёт нам дату. Складываем её в столбец datetime, который у нас уже есть (перезаписываем). Всё это позволяет нам сделать $addFields (то же, что и $project, только не стирает все существующие столбцы). Оборачиваем в aggregate и запускаем.

Добавляем виджет таблички, где мы можем отключить ненужные нам столбцы, либо поменять их местами:

Ещё бы нам построить график, по которому будет видно, как изменяется активность по дням. Сделаем это:

{     "collection": "messages",     "aggregate": [         {             "$addFields": {                 "datetime": {                     "$toDate": {                         "$multiply": [                             "$datetime",                             1000                         ]                     }                 }             }         },         {             "$group": {                 "_id": {                     "$dateToString": {                         "format": "%Y-%m-%d",                         "date": "$datetime"                     }                 },                 "count": {                     "$sum": 1                 }             }         }     ] }

В этом запросе мы добавили группировку по столбцу datetime в столбец _id, в каждой группе хранится количество элементов благодаря count.

Создаём график, где _id — это ось Х, а count — Y:

График пользователей

Фух, теперь самое важное — это график количества пользователей по дням. Меняем название коллекции у предыдущего запроса и получаем результат:

{     "collection": "users",     "aggregate": [         {             "$addFields": {                 "datetime": {                     "$toDate": {                         "$multiply": [                             "$datetime",                             1000                         ]                     }                 }             }         },         {             "$group": {                 "_id": {                     "$dateToString": {                         "format": "%Y-%m-%d",                         "date": "$datetime"                     }                 },                 "count": {                     "$sum": 1                 }             }         }     ] }

С запросами разобрались, осталось самое приятное — собрать дашборд.

Собираем дашборд

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

На этом на сегодня всё 🙂


ссылка на оригинал статьи https://habr.com/ru/articles/742716/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *