[{"data":1,"prerenderedAt":312},["ShallowReactive",2],{"\u002Fnext\u002Fadministrer\u002Fperformance\u002Fanalyse-des-hooks-dans-les-performances":3,"section:\u002Fnext\u002Fadministrer\u002Fperformance\u002Fanalyse-des-hooks-dans-les-performances":311},{"id":4,"title":5,"body":6,"description":298,"extension":299,"meta":300,"navigation":301,"path":307,"seo":308,"stem":309,"__hash__":310},"docs\u002F2.next\u002F5.administrer\u002F06.performance\u002Fanalyse-des-hooks-dans-les-performances.md","Analyser les hooks Python dans les performances",{"type":7,"value":8,"toc":285},"minimark",[9,13,18,41,48,52,62,89,96,100,103,128,133,136,206,210,251,255,259],[10,11,5],"h1",{"id":12},"analyser-les-hooks-python-dans-les-performances",[14,15,17],"h2",{"id":16},"aperçu","Aperçu",[19,20,21,22,26,27,31,32,35,36,40],"p",{},"L'",[23,24,25],"strong",{},"Enregistreur"," de Dodock (",[28,29,30],"em",{},"Recorder",") capture la trace d'une requête HTTP ou d'une tâche de fond. Dans la version en développement, chaque appel à un ",[28,33,34],{},"hook"," déclaré dans le fichier ",[37,38,39],"code",{},"hooks.py"," d'une application apparaît sur la timeline. La ligne indique le hook, l'application d'origine, la durée et le nombre de requêtes SQL déclenchées.",[19,42,43,44,47],{},"Cette page s'adresse aux développeurs et aux administrateurs qui cherchent la cause d'une lenteur. En v5, seuls les ",[37,45,46],{},"doc_events"," sont tracés : pour les autres hooks, seule leur activité SQL apparaît.",[14,49,51],{"id":50},"pourquoi-les-hooks-napparaissaient-pas","Pourquoi les hooks n'apparaissaient pas",[19,53,54,55,58,59,61],{},"Les ",[28,56,57],{},"hooks"," définis dans ",[37,60,39],{}," sont invoqués à différents moments du cycle de vie d'une requête :",[63,64,65,71,76,81,86],"ul",{},[66,67,68],"li",{},[37,69,70],{},"additional_timeline_content",[66,72,73],{},[37,74,75],{},"has_permission",[66,77,78],{},[37,79,80],{},"permission_query_conditions",[66,82,83],{},[37,84,85],{},"extend_bootinfo",[66,87,88],{},"et bien d'autres",[19,90,91,92,95],{},"Ces appels se produisent souvent en dehors du traçage des méthodes de documents (",[37,93,94],{},"Document.run_method","). Sans traçage dédié, seules leurs requêtes SQL apparaissent : la source d'une lenteur reste difficile à trouver.",[14,97,99],{"id":98},"fonctionnement","Fonctionnement",[19,101,102],{},"Lorsqu'une session d'enregistrement est active, avec l'option « Capture document lifecycle timeline » cochée :",[104,105,106,116,119,125],"ol",{},[66,107,108,109,112,113,115],{},"Le Recorder enveloppe la résolution d'attributs via ",[37,110,111],{},"frappe.get_attr"," pour intercepter les fonctions définies comme ",[28,114,57],{},".",[66,117,118],{},"Chaque fonction résolue est instrumentée individuellement et enregistrée comme une ligne sur la timeline.",[66,120,121,122,124],{},"La ligne indique le nom du ",[28,123,34],{},", l'application qui l'a fourni, le temps écoulé et le nombre de requêtes SQL exécutées pendant l'appel.",[66,126,127],{},"L'instrumentation s'applique uniquement à l'enregistreur actif ; aucune autre requête concurrente n'est affectée.",[129,130,132],"h3",{"id":131},"exclusions","Exclusions",[19,134,135],{},"Ces hooks ne sont pas tracés individuellement :",[137,138,139,152],"table",{},[140,141,142],"thead",{},[143,144,145,149],"tr",{},[146,147,148],"th",{},"Hook",[146,150,151],{},"Raison",[153,154,155,169,179,196],"tbody",{},[143,156,157,162],{},[158,159,160],"td",{},[37,161,46],{},[158,163,164,165,168],{},"Déjà tracé avec les méthodes du document (",[37,166,167],{},"run_method",")",[143,170,171,176],{},[158,172,173],{},[37,174,175],{},"filters_config",[158,177,178],{},"Lu à chaque analyse de filtre",[143,180,181,193],{},[158,182,183,186,187,186,190],{},[37,184,185],{},"override_doctype_class",", ",[37,188,189],{},"override_doctype_dashboards",[37,191,192],{},"override_whitelisted_methods",[158,194,195],{},"Résolus au chargement, pas appelés pendant la requête",[143,197,198,203],{},[158,199,200],{},[37,201,202],{},"scheduler_events",[158,204,205],{},"Exécutés par le planificateur, hors requête",[14,207,209],{"id":208},"où-consulter-les-résultats","Où consulter les résultats",[104,211,212,222,236,242,245],{},[66,213,214,215,217,218,221],{},"Ouvrez la liste ",[23,216,25],{}," (",[37,219,220],{},"\u002Fdesk\u002Frecorder",").",[66,223,224,225,228,229,232,233,115],{},"Cliquez sur ",[23,226,227],{},"Démarrer",". Dans la fenêtre ",[23,230,231],{},"Configurer l'enregistreur",", laissez cochée l'option « Capture document lifecycle timeline » (libellé non traduit), puis cliquez sur ",[23,234,235],{},"Commencer à enregistrer",[66,237,238,239,115],{},"Reproduisez votre scénario, puis cliquez sur ",[23,240,241],{},"Arrêter",[66,243,244],{},"Ouvrez le détail d'une requête enregistrée.",[66,246,247,248,250],{},"Sur la timeline, les lignes correspondant aux ",[28,249,57],{}," apparaissent au même niveau que les appels de méthodes et les requêtes SQL.",[252,253,254],"mermaid",{},"\nflowchart LR\n    A[Démarrage Recorder] --> B[Résolution hook via frappe.get_attr]\n    B --> C{Hook instrumenté?}\n    C -- Oui --> D[Exécution tracée]\n    D --> E[Ligne timeline: hook, app, durée, SQL]\n    C -- Exclusions --> F[Pas de trace dédiée]\n    C -- doc_events --> G[Trace via run_method]\n",[14,256,258],{"id":257},"bonnes-pratiques","Bonnes pratiques",[63,260,261,270,279],{},[66,262,263,266,267,269],{},[23,264,265],{},"Profitez des détails temporels"," : comparez la durée d'un ",[28,268,34],{}," au nombre de requêtes SQL qu'il génère pour détecter les inefficiences.",[66,271,272,275,276,278],{},[23,273,274],{},"Repérez les hooks chronophages"," : un ",[28,277,34],{}," consommant la majorité du temps d'une requête peut être optimisé ou désactivé temporairement pour confirmer son impact.",[66,280,281,284],{},[23,282,283],{},"Évitez le sur-enregistrement"," : arrêtez le Recorder dès que votre scénario est reproduit pour ne pas saturer la timeline.",{"title":286,"searchDepth":287,"depth":288,"links":289},"",1,2,[290,291,292,296,297],{"id":16,"depth":288,"text":17},{"id":50,"depth":288,"text":51},{"id":98,"depth":288,"text":99,"children":293},[294],{"id":131,"depth":295,"text":132},3,{"id":208,"depth":288,"text":209},{"id":257,"depth":288,"text":258},"Visualiser les appels de hooks personnalisés sur la timeline de l'enregistreur de performances.","md",{"reviewed":301,"last_verified":302,"sources":303},true,"2026-11-03",[304,305,306],"frappe:frappe\u002Frecorder.py","frappe:frappe\u002Fcore\u002Fdoctype\u002Frecorder\u002Frecorder_list.js","frappe:frappe\u002Flocale\u002Ffr.po","\u002Fnext\u002Fadministrer\u002Fperformance\u002Fanalyse-des-hooks-dans-les-performances",{"title":5,"description":298},"2.next\u002F5.administrer\u002F06.performance\u002Fanalyse-des-hooks-dans-les-performances","5To04tCXHuI4a56BS9Jqf5ZOdVrmfg41GRy_ULID_9M",{},1793871720111]