Esta pagina sale de una tarea de investigar el funcionamiento de las colas en Odoo. También hay algunas sugerencias de como podemos monitorear estas colas.
https://github.com/OCA/queue/blob/12.0/queue_job/jobrunner/runner.py#L10
* It starts as a thread in the Odoo main process or as a new worker
* It receives postgres NOTIFY messages each time jobs are
added or updated in the queue_job table.
* It maintains an in-memory priority queue of jobs that
is populated from the queue_job tables in all databases.
* It does not run jobs itself, but asks Odoo to run them through an
anonymous ``/queue_job/runjob`` HTTP request.
Odoo levanta por defecto un solo worker con diferentes threads para ejecutar los cronjobs y el jobrunner:
Al indicar en el odoo conf que queremos más de un worker vemos que Odoo levanta:
Los jobs se escriben en tablas que se van consultando.
Al generar un nuevo job en la tabla, PostgreSQL notifica al JobRunner de que hay un nuevo job en la cola para que este envie el job a ejecutar a los WorkerHTTP de Odoo por HTTP.
https://github.com/OCA/queue/tree/12.0/queue_job#id12
Define el número de procesos de HTTPWorker que quieres levantar.
[options]
(...)
workers = 6
(...)
Define los canales y los jobs que se pueden definir en paralelo de cada canal:
[queue_job]
channels = root:2
Tenemos dos puntos que pueden generar problemas:
El JobRunner que escucha a PostgreSQL
El thread/worker HTTP que ejecuta el job
Como sabemos cuantos jobs quedan por ejecutar? (DB)
select count(*) as total from queue_job where state in ('pending', 'enqueued');
select count(*) as total, state from queue_job group by state;
total | state
-------+--------
5 | done
24 | failed
(2 rows)
También podemos sacar información si analizamos los logs.
No vemos que exista instrumentalización para el stack de Grafana, pero hemos encontrado este script que instrumentaliza las llamadas RPG:
https://gist.github.com/mlaitinen/f3ae45d1e3ee60a4af907fef7b585059