gip-inclusion / immersion-facile

Service public numérique 🇫🇷 qui a pour objectif de faciliter les immersions professionnelles
https://immersion-facile.beta.gouv.fr
MIT License
14 stars 4 forks source link

ETQ acteur d'une convention, je peux télécharger un PDF sans erreur #1766

Closed JeromeBu closed 5 months ago

JeromeBu commented 5 months ago

:bug: Le problème

On a régulièrement des erreurs lors de la génération de PDF Il faut aller investiguer pour comprendre ce qu'il se passe et comment éviter ces erreurs

enguerranws commented 5 months ago

J'ai remis le nez dedans. Les logs qu'on avait ajouté aident un peu. Je mets le tout :

2024-06-10 15:52:45.870359275 +0200 CEST [router] method=POST path="/generate?request_id=1cf38120-a09a-4096-97ee-ecc6c3e1ec02" host=pdf-generator-prod.osc-secnum-fr1.scalingo.io request_id=5896b3c2-2ff6-438d-8528-b14eb23f2d84 container=web-2 from="10.0.0.244" protocol=https status=200 duration=0.264s bytes=70788 referer="-" user_agent="axios/1.6.0"
2024-06-10 15:52:56.175974838 +0200 CEST [web-2] [fb76b98a-c0cc-480e-872b-64195636e951] - reached POST /generate
2024-06-10 15:52:56.179809031 +0200 CEST [web-2] [fb76b98a-c0cc-480e-872b-64195636e951] - generatePdfFromHtml started
2024-06-10 15:52:58.752259122 +0200 CEST [web-2] [fb76b98a-c0cc-480e-872b-64195636e951] - TimeoutError: Navigation timeout of 2500 ms exceeded
2024-06-10 15:52:58.760926582 +0200 CEST [web-2] [fb76b98a-c0cc-480e-872b-64195636e951] - Error when generating pdf
2024-06-10 15:52:58.752247989 +0200 CEST [web-2] [fb76b98a-c0cc-480e-872b-64195636e951] - Pdf generation duration: 2.572s
2024-06-10 15:52:58.752019457 +0200 CEST [web-2] [fb76b98a-c0cc-480e-872b-64195636e951] - generatePdfFromHtml FAILED
2024-06-10 15:52:58.760932690 +0200 CEST [web-2] [fb76b98a-c0cc-480e-872b-64195636e951] - TimeoutError: Navigation timeout of 2500 ms exceeded
2024-06-10 15:52:58.767076213 +0200 CEST [web-2] ^
2024-06-10 15:52:58.767094149 +0200 CEST [web-2] at listOnTimeout (node:internal/timers:569:17)
2024-06-10 15:52:58.767064309 +0200 CEST [web-2] file:///app/node_modules/puppeteer-core/lib/esm/puppeteer/util/Deferred.js:24
2024-06-10 15:52:58.767074787 +0200 CEST [web-2] this.reject(new TimeoutError(opts.message));
2024-06-10 15:52:58.767094909 +0200 CEST [web-2] at process.processTimers (node:internal/timers:512:7)
2024-06-10 15:52:58.767089787 +0200 CEST [web-2] at Timeout.<anonymous> (file:///app/node_modules/puppeteer-core/lib/esm/puppeteer/util/Deferred.js:24:33)
2024-06-10 15:52:58.767076829 +0200 CEST [web-2] TimeoutError: Navigation timeout of 2500 ms exceeded
2024-06-10 15:52:58.767095270 +0200 CEST [web-2] Node.js v18.20.2
2024-06-10 15:52:58.778430522 +0200 CEST [web-2] npm notice
2024-06-10 15:52:58.778715236 +0200 CEST [web-2] npm notice New minor version of npm available! 10.5.2 -> 10.8.1
2024-06-10 15:52:58.778717703 +0200 CEST [web-2] npm notice Changelog: <https://github.com/npm/cli/releases/tag/v10.8.1>
2024-06-10 15:52:58.779011335 +0200 CEST [web-2] npm notice
2024-06-10 15:52:58.778914739 +0200 CEST [web-2] npm notice Run `npm install -g npm@10.8.1` to update!
2024-06-10 15:52:58.834716638 +0200 CEST [router] method=GET path="/generate?request_id=fb76b98a-c0cc-480e-872b-64195636e951" host=pdf-generator-prod.osc-secnum-fr1.scalingo.io request_id=f56c985c-7ab8-4122-940a-cda76f5595c7 container=web-2 from="10.0.0.200" protocol=https status=502 duration=2.609s bytes=315 referer="-" user_agent="axios/1.6.0"

Ce qu'on voit, c'est une erreur TimeoutError: Navigation timeout of 2500 ms exceeded. Le truc, c'est qu'on fait pas de navigation à proprement parlé.

Mon hypothèse, c'est qu'on demande à puppeteer de créer une nouvelle instance de page et d'y injecter du DOM : https://github.com/gip-inclusion/pdf-generator/blob/main/src/generatePdfFromHtml.js#L25C44-L25C65

Et surtout, on lui demande d'attendre l'événement load (Window.load). (qui peut prendre un bon moment, vu qu'on a pas mal de ressources associées.

Je pense que c'est ça qui coince, je ne vois plus de fuite mémoire etc.

On pourrait alléger le code liée à la page de document de convention, ou au moins filtrer un maximum de ressources à charger (genre, tout le JS déjà).

enguerranws commented 5 months ago

Je vais essayer de voir ce que peut lui donner comme code allégé, sans que ça nuise au rendu de la convention.