IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

25.4. Traces dynamiques

PostgreSQL™ fournit un support pour les traces dynamiques du serveur de bases de données. Ceci permet l'appel à un outil externe à certains points du code pour tracer son exécution. Actuellement, cette fonctionnalité a pour cible les développeurs de bases de données car il requiert une certaine familiarité avec le code.

Un certain nombre de points de trace, souvent appelés sondes, sont déjà insérés dans le code source. Par défaut, les sondes sont désactivées et l'utilisateur doit explicitement demander au script configure de les rendre disponibles pour PostgreSQL™.

Actuellement, seul l'outil DTrace est supporté, outil qui est disponible uniquement sur Solaris Express et Solaris 10+. Il est attendu que DTrace soit disponible dans le futur sur FreeBSD et Mac OS X. Supporter des outils de traces dynamiques est théoriquement possible en modifiant les définitions des macros PG_TRACE dans src/include/pg_trace.h.

De nouvelles sondes peuvent être définies dans le code partout où le développeur le souhaite bien que cela nécessite une nouvelle compilation.

Une sonde peut être insérée en utilisant une des macros de trace. Elles sont choisies suivant le nombre de variables à mettre à disposition pour l'inspection de cette sonde. Tracer l'occurence d'un événement se fait en une seule ligne, en utilisant seulement le nom de la sonde, par exemple :

PG_TRACE (ma__nouvelle__sonde);

Des sondes plus complexes peuvent fournir une ou plusieurs variables à l'inspection de l'outil des traces dynamiques en utilisant la macro PG_TRACE n qui correspond au nombre de paramètres après le nom de la sonde :

PG_TRACE3 (mon__evenement__complexe, varX, varY, varZ);

La définition de la sonde transaction__start est montrée ci-dessous :

static void
StartTransaction(void)
{
    ...

    /*
     * génère un nouvel id de transaction
     */
    s->transactionId = GetNewTransactionId(false);

    XactLockTableInsert(s->transactionId);

    PG_TRACE1(transaction__start, s->transactionId);

    ...
}    

Notez comment l'ID de transaction est rendu disponible à l'outil de traces dynamiques.

L'outil de traces dynamiques peut nécessiter une définition plus complète de ces sondes. Par exemple, DTrace requiert que vous ajoutez de nouvelles sondes dans le fichier src/backend/utils/probes.d comme indiqué ici :

provider postgresql {
      ...
      probe transaction__start(int);
      ...
 };

Vous devez faire attention que les types de données spécifiés pour les arguments de la sonde correspondent aux types de données des variables utilisées dans la macro PG_TRACE. Ceci n'est pas vérifié au moment de la compilation. Vous pouvez vérifier que votre sonde nouvellement ajoutée est disponible en recompilant, puis en exécutant le nouveau binaire et, en tant que root, en exécutant une commande DTrace tel que :

dtrace -l -n transaction-start