Скрипт автоматизации: запланированные PM с результатами Data Explorer не отправляются

Мы используем размещенный экземпляр Discourse и задействуем предоставляемый плагин Automation с набором скриптов и триггеров, однако у нас возникают проблемы с получением личных сообщений от скрипта «Schedule PM with data explorer results».

Похоже, что триггер Automation работает, и запрос Data Explorer выполняется (этот запрос работает и выдаёт результаты при ручном запуске), но после этого мы не получаем никаких личных сообщений. Я пробовал указаться в качестве получателя сам, а также группу «Admin», но в обоих случаях личные сообщения не приходят.

Не уверен, что упускаю что-то очевидное, но любая помощь будет очень кстати.

1 лайк

Привет, Кристиан :wave:

Ты видишь что-то связанное в /logs?

2 лайка

Кажется, я наблюдаю нечто похожее:

Запрос в исследовании данных, похоже, выполнился:

Но личное сообщение не отправлено.

В логах я вижу следующую ошибку:

Сообщение (5 повторений)

Исключение в задаче: undefined method `to_sym' for nil:NilClass


Трассировка стека

/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:20:in `block (2 levels) in convert'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `each'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `each_with_index'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `block in convert'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:15:in `each'
/var/www/discourse/plugins/discourse-data-explorer/lib/result_to_markdown.rb:15:in `convert'
/var/www/discourse/plugins/discourse-data-explorer/lib/report_generator.rb:20:in `generate'
/var/www/discourse/plugins/discourse-data-explorer/plugin.rb:117:in `block (4 levels) in activate!'
/var/www/discourse/plugins/discourse-automation/app/models/discourse_automation/automation.rb:83:in `trigger!'
/var/www/discourse/plugins/discourse-automation/app/jobs/scheduled/discourse_automation_tracker.rb:36:in `run_pending_automation'

Также при попытке запустить автоматизацию вручную я получаю ошибку «500», а в логах появляется следующее (немного отличающееся) сообщение об ошибке:

Сообщение (4 повторения)

NoMethodError (undefined method `to_sym' for nil:NilClass)
app/controllers/application_controller.rb:418:in `block in with_resolved_locale'
app/controllers/application_controller.rb:418:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:74:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:369:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:228:in `call'

Трассировка стека

plugins/discourse-data-explorer/lib/result_to_markdown.rb:20:in `block (2 levels) in convert'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `each'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `each_with_index'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:18:in `block in convert'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:15:in `each'
plugins/discourse-data-explorer/lib/result_to_markdown.rb:15:in `convert'
plugins/discourse-data-explorer/lib/report_generator.rb:20:in `generate'
plugins/discourse-data-explorer/plugin.rb:117:in `block (4 levels) in activate!'
plugins/discourse-automation/app/models/discourse_automation/automation.rb:83:in `trigger!'
plugins/discourse-automation/app/controllers/discourse_automation/automations_controller.rb:10:in `trigger'

Давайте перенесём это в канал bug и посмотрим, удастся ли найти того, кто сможет разобраться. :+1:

2 лайка

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

1 лайк

Спасибо за проверку.
Запрос не совсем простой и выглядит так:

WITH
ua AS (
  SELECT target_topic_id, COUNT(id) FROM user_actions
  WHERE action_type = 15
  GROUP BY target_topic_id
)
SELECT 
  t.id, 
  t.title, 
  t.created_at, 
  t.last_posted_at, 
  t.views, 
  t.posts_count, 
  t.user_id, 
  t.last_post_user_id
FROM topics t
INNER JOIN users us ON us.id = t.user_id
LEFT JOIN ua ON ua.target_topic_id = t.id
WHERE t.deleted_at IS NULL
  AND t.closed = false
  AND t.archived = false
  AND t.visible = true
  AND ua.target_topic_id IS NULL
  AND us.username_lower != 'system'
  AND t.created_at > now() - INTERVAL '7' DAY
ORDER BY created_at DESC

Как я уже говорил, он запускается вручную и выдаёт результаты.

1 лайк

Под «вручную» вы имеете в виду запуск запроса из Data Explorer или запуск скрипта из плагина автоматизации?

1 лайк

Из обозревателя данных.

1 лайк

Думаю, это связано с «магией» user_id, которую Data Explorer применяет при преобразовании обычных идентификаторов в рабочие ссылки. Если запустить ваш отчет как есть, возникнет ошибка, точно такая же, как у вас, но если убрать из SELECT оба поля t.user_id и t.last_post_user_id, всё работает.

Если же заменить их на обычные имена пользователей, автоматизация тоже работает корректно:


WITH
ua AS (
  SELECT target_topic_id, COUNT(id) FROM user_actions
  WHERE action_type = 15
  GROUP BY target_topic_id
)
SELECT 
  t.id, 
  t.title, 
  t.created_at, 
  t.last_posted_at, 
  t.views, 
  t.posts_count, 
  us.username, 
  u2.username
FROM topics t
INNER JOIN users us ON us.id = t.user_id
LEFT JOIN ua ON ua.target_topic_id = t.id
JOIN users u2 ON u2.id = t.last_post_user_id
WHERE t.deleted_at IS NULL
  AND t.closed = false
  AND t.archived = false
  AND t.visible = true
  AND ua.target_topic_id IS NULL
  AND us.username_lower != 'system'
  AND t.created_at > now() - INTERVAL '7' DAY
ORDER BY created_at DESC

Кроме того, мы уже обратились к более опытному специалисту, чтобы он подробнее разобрался в ситуации. :+1: :slight_smile:


Отдельно отмечу: не уверен, что ваш запрос делает именно то, что вы задумали. Это как-то связано с решением (Solution), поскольку в результатах я вижу много личных сообщений (PM)?

3 лайка

Спасибо, я попробую с изменениями в идентификаторе пользователя.

Я изначально не писал этот запрос, поэтому ещё не определил, даёт ли он нам то, что нужно, так что, скорее всего, я его переделаю.

2 лайка

Вот эта строка: https://github.com/discourse/discourse-data-explorer/blob/705753216cc632b4f6505d2000926ab3b73d8628/lib/result_to_markdown.rb#L20

related = relations.dig(colrender[col_index].to_sym) if col_index < colrender.size

Условие if в конце неверно: colrender должен быть разреженным массивом, а не упакованным. В нём будут присутствовать значения null, если дополнительные данные для рендеринга предоставлены не для всех столбцов.

Правильная проверка, вероятно, должна выглядеть так: unless colrender[col_index].nil?

Кроме того, этот код, похоже, игнорирует типы рендеринга url, reltime и html, поскольку они не являются классами ActiveRecord.

6 лайков

Что касается меня, похоже, что мне не удается успешно запустить этот скрипт автоматизации, независимо от запроса в Data Explorer. Например:

SELECT username from users
LIMIT 10

Ошибка 500 при ручном запуске через Автоматизацию:

Сообщение (3 копии)

TypeError (Nil is not a valid JSON source.)
app/controllers/application_controller.rb:418:in `block in with_resolved_locale'
app/controllers/application_controller.rb:418:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:74:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:369:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:228:in `call'

Backtrace

plugins/discourse-data-explorer/lib/report_generator.rb:42:in `parse'
plugins/discourse-data-explorer/lib/report_generator.rb:42:in `params_to_hash'
plugins/discourse-data-explorer/lib/report_generator.rb:15:in `generate'
plugins/discourse-data-explorer/plugin.rb:117:in `block (4 levels) in activate!'
plugins/discourse-automation/app/models/discourse_automation/automation.rb:83:in `trigger!'
plugins/discourse-automation/app/controllers/discourse_automation/automations_controller.rb:10:in `trigger'
actionpack (7.0.4.3) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (7.0.4.3) lib/abstract_controller/base.rb:215:in `process_action'
actionpack (7.0.4.3) lib/action_controller/metal/rendering.rb:53:in `process_action'
actionpack (7.0.4.3) lib/abstract_controller/callbacks.rb:234:in `block in process_action'

Env

HTTP HOSTS: discourse.canapin.dev

Эти проблемы должны быть исправлены в этом PR:

4 лайка

Эта тема была автоматически закрыта через 2 дня. Новые ответы больше не принимаются.