qelphybox / hakeshonassybot

Fun telegram bot
MIT License
11 stars 5 forks source link

Оптимизация статистики #269

Closed qelphybox closed 3 years ago

qelphybox commented 3 years ago

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

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

План: 1) добавить pg в dev окружение 2) организовать миграции для такой схемы

    message_metrics
    -------
    id:serial
    tg_id:int
    timestamp:datetime
    users_chats_id:int
    photoCount:int
    videoCount:int
    questionCount: int
    stickerSetName:string
    textLength:int
    voiceCount:int
    lolReplyForUser:int

    users
    -----
    id:serial
    tg_id:int
    first_name:string
    last_name:string

    chats
    -----
    id:serial
    tg_id:int
    name:string

    users_chats
    -----------
    id:serial
    user_id:int
    chat_id:int

3) Организовать запись в бд этих данных Достаем метрики примерно так и записываем в бд

    const fetchMetrics = (message) => {
      return {
        user: {
          tg_id: 123,
          first_name: 'asdf',
          last_name: 'asdfsadf'
        },
        chat_id: {
          tg_id: 123,
          name: 123,
        },
        message_metrics: {
          tg_id: 123,
          photoCount: 0, // определяем наличие фото в сообщении как в contentSuppier
          videoCount: 0, // определяем наличие видео в сообщении как в contentSuppier
          questionCount: 0, // если в тексте есть вопрос, ставим 1 (осторожно urlы)
          stickerSetName: 0,
          textLength: 0,
          voiceCount: 0, // ставим 1 если сообщение это голосуха
          lolReplyForUser: 2, // humoristStat ищем в сообщениии реакцию смеха, и если она есть записываем сюда id юзера из реплая reply_to_message.from.id
        }
      };
    };

4) написать скрипт перегона данных из mongo в pg: кусками достаем сообщения из монги маппим их в метрики, целый батч инсертим в pg

Заметки: https://www.lightbase.io/freeforlife/ - 500 мб бесплатно

qelphybox commented 3 years ago

@qelphybox @Fulgrim_94 готово, бери

AlexanderMalikh commented 3 years ago

беру

qelphybox commented 3 years ago

Привет) У меня по этой задаче есть пара вопросов https://github.com/qelphybox/hakeshonassybot/issues/269

  1. Не описана таблица с сообщениями и мало полей в таблице с чатами и юзерами, это надо добавлять или делать только то, что в задаче?
  2. Таблицу metrics и модель для нее просто создать? Hе надо привязывать к ней никакой логики?
  3. Написать логику записи в таблицы users и chats после того как пришло новое сообщение?
  1. Таблица с сообщениями нам не нужна. У нас будет запись метрик. Как только присылают сообщение будем сразу матчить в нем все, что надо и складывать в талицу с метриками, все что насчитали. От хранения сообщений мы избавляемся
  2. Модель то нам вроде как не нужна. Нам нужен репозиторий, то есть некоторый объект который дает нам доступ к данным таблицы. например:

    metrics.insert([{ user_chats_id: 1,  photoCount: 1, timestamp: 1621284352 }]) 
    // INSERT INTO metrics(user_chats_id, photoCount, timestamp) 
    // VALUES (1, 1, "2021-05-17T20:45:52")
    
    metrics.fetchCounts({ chat_id: 1, from: new Date('2021-05-01T00:00:00Z'), to: new Date('2021-05-07T00:00:00Z')}) 
    // вернет [{ user_id: 1, photoCount: 2, ...}]
    // сделав такой запрос
    // SELECT user_id, SUM(photoCount), ... 
    // FROM metrics m JOIN users_chats uc ON m.users_chats_id = uc.id 
    // WHERE chat_id = 1 AND timestamp BETWEEN "2021-05-01T00:00:00Z" AND "2021-05-07T00:00:00Z"
    // GROUP BY user_id

    metrics - объект репозиторий, он умеет выдавать данные из бд если попросить. Нам не надо orm чтобы маппить модели, будем просто запросы в бд делать

  3. Тебе надо сначала сделать скрипты создания и миграции бд, это самое превое, сделай их запушь, а дальше поглядим.
qelphybox commented 3 years ago

В ветке https://github.com/qelphybox/hakeshonassybot/pull/410

1) Сбор метрик из пг, выпить сбор из монги, не выпиливая инсерт в монгу 2) Настроить ci: добавить пг 3) настроить тесты: в setupTeadown добавить пгклиент 4) Переделать dbClient c Pool на Client