Blogue

FM Culprit : trouve ce qui ralentit une solution FileMaker

Un outil gratuit et libre qui lit les journaux de FileMaker Server et se sert de Genie pour vérifier chaque constat dans le fichier en direct : la rubrique, la formule, le script et la ligne.

L’onglet Overview de FM Culprit : la charge du serveur sur une semaine, un résumé et les onglets du rapport.

Quelqu’un dit que la solution est lente. Bien souvent, FileMaker Server note pourquoi depuis des semaines : TopCallStats garde les appels les plus lents, Access.log chaque session lancée par Exécuter script sur serveur, Event.log chaque erreur de script et chaque exécution de programme. Le problème, c’est que les journaux parlent en identifiants. « table(129)::field definitions(790) », ça ne s’ouvre pas et ça ne se corrige pas.

FM Culprit est un outil gratuit et libre (licence MIT) qui lit ces journaux, puis demande à Genie ce que chaque identifiant représente dans ton fichier en direct : quelle rubrique, mémorisée ou non, quelle formule, quel script a tourné et à quelle ligne. Tu obtiens un rapport sur lequel agir, pas un classement à interpréter.

Une commande, trois fichiers

Donne-lui un dossier ou un zip de journaux de FileMaker Server. TopCallStats.log est obligatoire (active la journalisation Top Call Statistics dans l’Admin Console). Les journaux ClientStats, Stats, Event, Access et fmdapi sont recommandés : chacun ajoute des preuves. Ensuite :

git clone https://github.com/Geniewave/FMCulprit FMCulprit
cd FMCulprit
bin/fmculprit auto --logs ~/Downloads/Logs --hours 168

Avec --hours 168, l’analyse couvre la dernière semaine. Des options laissent de côté les fins de semaine ou un programme de nuit connu, ou lisent la structure dans une copie de développement quand la production n’est pas ouverte. La commande écrit trois fichiers :

  • SUMMARY.md: la version courte, quelques puces à coller dans une demande de soutien.
  • REPORT.md: tous les constats, avec leurs chiffres et leur base de calcul.
  • report.html: une seule page autonome, avec les onglets Overview, Investigate, Incidents, Operations, Users & sessions, Schedules & scripts, Server et Log explorer. Glisse sur n’importe quelle ligne du temps pour ramener tous les onglets à cette période.

L’onglet Overview : charge échantillonnée du serveur, incidents, utilisateur le plus lourd et résumé de la semaine.

L’onglet Overview sur une semaine de journaux réels. Les noms de fichiers, de produit, de comptes et de machines ainsi que les adresses ont tous été remplacés par des noms fictifs.

Ce que Genie vérifie dans le fichier en direct

FM Culprit parle au serveur MCP local de Genie, sur ton propre ordinateur. Le forfait gratuit suffit, parce que tout ce qu’il demande est une lecture. Pour les opérations qui comptent, Genie :

  • transforme les identifiants de table et de rubrique en noms, en type de stockage (mémorisée, indexée, calcul non mémorisé) et en formules;
  • lit le texte actuel des scripts en cause;
  • trouve les scripts qui les appellent;
  • lit le script OnFirstWindowOpen du fichier.

Rien n’est préparé, appliqué ni exécuté, et rien ne quitte ta machine : la seule connexion réseau va vers Genie, sur 127.0.0.1. Si Genie ne tourne pas, tu obtiens quand même le rapport à partir des journaux seuls, et il dit ce qu’il n’a pas pu vérifier.

Des pistes avec leurs preuves, un coût et la suite

L’onglet Investigate transforme les tendances des journaux en pistes. Chacune montre ses preuves, un coût estimé avec sa base de calcul, un niveau de confiance et quoi vérifier ensuite. Le coût indique où regarder; ce n’est pas un gain mesuré. Pour l’instant, FM Culprit cherche :

  • l’attente sur Exécuter script sur serveur, remontée jusqu’au script serveur et à l’appel Data API qui l’a lancé;
  • les scripts de démarrage qui tournent dans chaque session serveur;
  • une recherche par enregistrement dans une boucle;
  • les recherches et les tris sur des calculs non mémorisés;
  • les conflits de verrouillage d’enregistrements;
  • les pas de fenêtre ou de dialogue exécutés sur le serveur;
  • une nouvelle version d’un script jamais programmée, pendant que l’ancienne tourne encore;
  • les programmes interrompus.

Vient ensuite la revue de conception des scripts. Les scripts derrière chaque piste sont lus en direct et signalés ligne par ligne : recherches ou validations dans une boucle, pauses fixes, recherches et tris sur des calculs non mémorisés, pas du script de démarrage qui tournent sur le serveur.

L’onglet Investigate : deux pistes de confiance élevée, avec leurs preuves, leur coût estimé et les prochaines étapes.

Chaque piste montre ses preuves, un coût estimé avec sa base et quoi vérifier ensuite.

Un cas réel : 2,9 secondes par appel d’API

Chez un client, une API qui enregistre les présences prenait environ 2,9 secondes par appel, plus de 2 000 fois dans la semaine. Le temps des scripts serveur était le plus gros poste des journaux, et le rapport l’a remonté jusqu’au script serveur que lançait l’appel Data API.

La surprise n’était pas dans ce script. Dans presque chaque session, le premier pas noté appartenait au script de démarrage du fichier. Environ 2,2 secondes de chaque appel y passaient, parce qu’OnFirstWindowOpen tourne dans chaque session lancée par Exécuter script sur serveur, et celui-ci faisait du travail utile seulement à quelqu’un devant un écran. La correction est petite : quitter le script de démarrage tôt quand il tourne sur le serveur, et garder seulement ce dont les sessions serveur ont besoin.

Le même rapport a trouvé des recherches de nuit lentes sur un calcul de date non mémorisé. Dig deeper a listé les 25 scripts qui cherchent ou trient sur cette rubrique, et les 6 que les journaux montrent en exécution. C’est par là qu’on commence, pas par les 25.

Creuser, une rubrique à la fois

Quand une rubrique semble coûteuse, demande quels scripts s’en servent. Pour une rubrique, Genie liste chaque script qui fait une recherche ou un tri dessus (requêtes de recherche, restreindre et étendre, ordres de tri), avec les numéros de ligne, et le rapport marque ceux qui ont tourné pendant la période des journaux. La page a un bouton qui copie la commande :

bin/fmculprit dig --out fm-culprit-2026-10-20-0930 --field "Invoices::balance_due"

L’analyse couvre seulement les scripts. Sur un fichier d’environ 2 000 scripts, elle prend une à deux minutes, et FileMaker reste utilisable pendant ce temps. La même demande dans les 30 minutes suivantes répond tout de suite.

Le volet Dig deeper d’une rubrique : 25 scripts qui y cherchent ou trient, avec leurs lignes et ceux vus dans les journaux.

Dig deeper sur une rubrique : chaque recherche ou tri qui l’utilise, et les scripts vus dans les journaux.

Un outil de performance ne doit pas ralentir FileMaker

Genie cherche une seule chose à la fois : une rubrique, un script, une formule. Ces lectures sont rapides. Les questions qui demanderaient de parcourir tout le fichier, comme « où cette rubrique est-elle utilisée, partout? », ne tournent que quand tu les poses, une rubrique à la fois, et seulement dans les scripts. Les modèles sont laissés de côté exprès : FileMaker les lit sur son fil principal, et parcourir tous les modèles d’un gros fichier le figerait plusieurs secondes d’affilée, pour les gens mêmes que tu essaies d’aider.

S’il te faut aussi les modèles, passe un rapport de conception de la base (DDR) avec --ddr, et le rapport ajoute toutes les autres utilisations des rubriques lentes.

Ou laisse ton agent s’en charger

Le dépôt est aussi un skill d’agent pour Claude Code, Codex et les autres. Relie le dossier au répertoire des skills de ton agent et demande « qu’est-ce qui est lent dans ces journaux? ». L’agent lance une commande et répond à partir de SUMMARY.md. Le skill est assez court pour que de petits modèles locaux le suivent.

Pour commencer

  1. Installe Genie. Demande-le à ton agent :

    Install Genie for FileMaker on this computer. Read https://www.geniewave.com/install.md and follow it exactly.

    Ou installe-le à la main à partir de docs.geniewave.com.

  2. Dans Genie, ouvre Settings > Local MCP et active-le. Si un de tes clients IA est déjà connecté à Genie, FM Culprit trouve le jeton tout seul.
  3. Ouvre le fichier hébergé dans FileMaker Pro. L’ordre des fenêtres n’a pas d’importance.
  4. Lance bin/fmculprit auto avec tes journaux, puis ouvre le report.html indiqué.

Il te faut Python 3.9 ou plus récent (bibliothèque standard seulement) et FileMaker Pro 19 à 26. La page contient les noms de comptes, de machines et les adresses IP de tes journaux : traite-la comme les journaux. Claris recommande de désactiver Top Call Statistics une fois les mesures terminées.

Essaie-le sur une semaine de tes journaux

Télécharge une semaine de journaux dans l’Admin Console, ouvre le fichier, lance une commande. Commence par l’onglet Investigate. Si une piste se trompe ou qu’un motif manque, ouvre une issue sur GitHub : les règles sont du Python simple, faciles à étendre.