Para un cliente gestionamos un panel de Power BI que lleva más de un año funcionando sin problemas y que obtiene datos a través de la API de Teamleader. Sin embargo, desde hace unos días recibimos repetidamente el mensaje «Too many requests» desde Invantive, por lo que el panel ya no se actualiza.
Ayer desactivamos temporalmente la actualización automática para evitar que hoy volviéramos a topar de inmediato con el límite de actualización. Mediante la monitorización en vivo determinamos que la tabla Teamleader.V2Flat.InvoiceLinesAll es la causa de los problemas. En esta tabla observamos tiempos de carga de varios millones de milisegundos, mientras que la tabla contiene solo unas 5.000 filas.
Esta mañana investigamos qué provoca este retraso extremo. Iniciamos únicamente la llamada a la tabla Teamleader.V2Flat.InvoiceLinesAll sin ninguna transformación en la tabla, para ver si ahí residía el problema. Tras esperar mucho tiempo, la tabla no llegó a cargarse. Esto resulta llamativo, ya que no se realiza ninguna operación compleja que pudiera explicar este comportamiento.
Además, Power Query ejecuta automáticamente una consulta de «top 1000» filas. Esta consulta también mostró en la monitorización un tiempo de carga de más de un millón de milisegundos, incluso antes de que la tabla se hubiera cargado por completo. Por esta razón, interrumpimos las actualizaciones antes de que finalizaran.
¿Podrían ayudarnos con esto?
itgenboe161
La descarga de datos se canceló después de 15 minutos y 23 segundos, probablemente por el usuario.
La vista InvoiceLinesAll realiza operaciones bastante complejas, pero eso no se nota desde fuera. Primero obtiene todas las facturas (Invoices). A continuación, obtiene por cada Invoice las InvoiceLines correspondientes (mediante la función de tabla InvoiceLinesById). Dependiendo del número de facturas, esto puede significar que se necesiten miles de solicitudes API para obtener toda la información.
Como no existe una API independiente para obtener todas las líneas de factura, lamentablemente es muy ineficiente recuperar todos los datos, lo que puede llevar bastante tiempo.
La velocidad máxima es de 200 filas por minuto. En la práctica, el rendimiento es peor y rápidamente se alcanzan los límites de uso razonable (fair use) de Invantive Cloud. En la imagen se puede ver que se recuperaron 3.490 filas; esto costó (si la caché estaba vacía) 3.490 llamadas a la API y, por lo tanto, un mínimo de 17,5 minutos (1.047.000 milisegundos).
Se recomienda indicar un rango de fechas como paso de filtrado.
Las llamadas a la API utilizadas se pueden consultar a través del botón «Sesión I/O’s».
Para volúmenes más grandes, se recomienda ponerse en contacto con el soporte de Teamleader para proponer optimizaciones, o en caso contrario, cambiar a otro producto distinto de Teamleader Focus. Una alternativa habitual a Teamleader Focus es Odoo.
Véase también:
Gracias por la explicación.
Tengo otra pregunta sobre la vista InvoicesLinesAll. ¿Las operaciones complejas dentro de esta tabla las realiza Invantive o se proporcionan así directamente desde Teamleader? Una solución posible también sería que nosotros llamemos a estas tablas por separado y realicemos las transformaciones nosotros mismos.
La definición de la vista describe la transformación:
select p.*
, l.* prefix with 'invoice_'
from Teamleader.V2.Invoices l
join Teamleader.V2.InvoiceLinesById(l.id) p
Si se filtra como se describe más arriba en un campo de Invoices, la función de tabla solo se ejecutará DESPUÉS del filtrado.
Esta pregunta se cerró automáticamente tras 1 semana de inactividad. La última respuesta dada se ha marcado como solución.
Si el problema vuelve a presentarse, por favor plantea una nueva pregunta mediante un tema aparte. En la nueva pregunta, incluye un enlace a este tema pegando su URL en el texto.