Suivre autre chose que le simple résultat d’une tâche
Dans cet article, nous appelons Nuit Applicative (NA) une chaîne de traitements Qlik exécutés automatiquement, généralement en dehors des heures d’utilisation, afin d’extraire, transformer et préparer les données nécessaires aux applications.
La QMC indique l’état d’une tâche, mais on peut souhaiter disposer, dans les données elles-mêmes, d’un suivi complémentaire : le traitement a-t-il réellement démarré ? Est-il arrivé jusqu’à son terme ? Combien de temps a-t-il duré ? Quels volumes a-t-il produits ?
Le principe retenu est volontairement simple :
CALL SuiviNaDebut(...);
// Traitement normal de l'application
CALL SuiviNaFin(...);Petit clin d’œil à Serge DESTRAZ pour l’idée simple et efficace qui est au cœur du mécanisme : poser le KO dès le départ. Tant que la fin du traitement n’a pas été constatée, on ne considère pas l’exécution comme terminée.
SuiviNaDebut : poser le KO avant de commencer
Dès le début du script, SuiviNaDebut enregistre une trace contenant notamment l’application, la date et l’heure de démarrage, avec un statut provisoire KO.
Ce KO ne signifie pas qu’une erreur vient déjà de se produire. À cet instant, nous savons seulement que le traitement a commencé : rien ne garantit encore qu’il atteindra sa fin.
Avec un statut EN_COURS, un traitement interrompu resterait indéfiniment « en cours » et il faudrait définir un délai à partir duquel le considérer comme perdu. Le KO évite cette règle supplémentaire : si une véritable erreur provoque une sortie du script avant SuiviNaFin, le KO reste présent et signale une exécution commencée mais non clôturée.
SuiviNaFin : l’OK se mérite à la fin
Lorsque les traitements sont terminés et que les QVD ont été produits, l’application atteint SuiviNaFin. La routine peut alors enregistrer l’heure de fin, calculer la durée et clôturer l’exécution.
CALL SuiviNaFin(...);Lorsque SuiviNaFin est atteinte, le suivi de cette exécution est clôturé en OK avec ses informations de fin. Si la routine n’est jamais atteinte, le KO posé au démarrage reste présent.
SuiviNaFin n’a jamais été atteinte.
SuiviNaFin clôture normalement l’exécution.
| Application | Début | Fin | Durée | Statut |
|---|---|---|---|---|
| CHARGEMENT_VENTES | 01:15 | 01:27 | 00:12 | OK |
Un traitement terminé peut quand même mériter notre attention
Arriver jusqu’à la fin du script confirme que le traitement s’est exécuté. Cela ne garantit pas, à lui seul, que la volumétrie produite est celle attendue. On peut donc profiter de SuiviNaFin pour ajouter un contrôle complémentaire.
Qlik fournit la fonction QvdNoOfRecords(), qui retourne le nombre d’enregistrements présents dans un QVD.
// Nombre de lignes du QVD produit
LET vNbLignesQvd =
QvdNoOfRecords('lib://QVD/COMMANDES.qvd');Côté SGBD source, le même principe peut être obtenu par un comptage sur la table homonyme :
SELECT COUNT(*)
FROM ERP.COMMANDES;| Contrôle | Volume |
|---|---|
| COMMANDES.qvd | 1 249 850 |
| ERP.COMMANDES | 1 250 000 |
| Écart | -150 |
Le statut OK/KO décrit l’exécution du traitement. L’écart de volumétrie décrit la cohérence des données produites. Un traitement peut donc être OK tout en présentant un écart qui devra être signalé dans la restitution de la NA.
Le script n’a pas atteint SuiviNaFin.
Le traitement est terminé, mais les données sont à contrôler.
Une égalité stricte entre un QVD et une table source n’est pertinente que si les deux représentent le même périmètre. Un chargement filtré, agrégé, transformé ou incrémental peut légitimement produire une volumétrie différente. Le contrôle doit donc être adapté à la logique du traitement.
Le nom du QVD fournit déjà le nom de la table
Une application peut produire plusieurs QVD provenant de différents schémas du SGBD. Si l’on adopte la convention un QVD = une table source homonyme, inutile de déclarer chaque table individuellement : le nom du QVD fournit déjà le nom de la table.
Il reste simplement à indiquer les schémas sources à contrôler :
SET vTablesSuiviFinNa =
'ERP|REFERENTIEL|CRM';Le caractère | n’a ici aucune signification particulière dans Qlik : c’est simplement le séparateur choisi pour stocker plusieurs schémas dans une même variable.
| QVD produit | Schéma | Table source déduite |
|---|---|---|
| COMMANDES.qvd | ERP | ERP.COMMANDES |
| CLIENTS.qvd | ERP | ERP.CLIENTS |
| ARTICLES.qvd | REFERENTIEL | REFERENTIEL.ARTICLES |
| CONTACTS.qvd | CRM | CRM.CONTACTS |
Le schéma vient de la configuration ; le nom de la table vient du QVD.
Quelques lignes suffisent à illustrer le parcours de cette liste :
IF Len(Trim('$(vTablesSuiviFinNa)')) > 0 THEN
FOR vIndex = 1 TO
SubStringCount('$(vTablesSuiviFinNa)', '|') + 1
LET vSchema =
Trim(
SubField(
'$(vTablesSuiviFinNa)',
'|',
$(vIndex)
)
);
IF Len('$(vSchema)') > 0 THEN
// Contrôle des QVD associés au schéma...
END IF
NEXT vIndex
END IFLe premier test évite de lancer la boucle si aucune liste n’a été définie. Le second ignore un élément vide, par exemple après un séparateur final ou en présence d’espaces parasites.
Faire ressortir immédiatement ce qui mérite l’attention
Le QVD de suivi peut alimenter une application de restitution de la Nuit Applicative. L’objectif n’est pas de mélanger les contrôles, mais au contraire de rendre leur lecture immédiate.
| Application | Durée | Volume QVD | Volume source | Écart | Statut |
|---|---|---|---|---|---|
| CHARGEMENT_VENTES | 00:12 | 1 250 000 | 1 250 000 | 0 | OK |
| CHARGEMENT_CLIENTS | 00:08 | 499 850 | 500 000 | -150 | OK |
| CHARGEMENT_STOCKS | — | — | — | — | KO |
Ici, CHARGEMENT_CLIENTS a bien atteint sa fin : son statut reste donc OK. L’écart de -150 est néanmoins mis en évidence par un indicateur rouge dans le rapport.
À l’inverse, CHARGEMENT_STOCKS est resté en KO : son traitement n’a jamais atteint SuiviNaFin. Le même suivi peut naturellement servir de base à d’autres mécanismes d’alerte.
Cette approche complète la supervision native de Qlik Sense par des contrôles liés au déroulement des traitements et aux données produites.
Référence technique :documentation Qlik — QvdNoOfRecords().