7 méthodes de traçage et de débogage des scripts Redis Lua

7 méthodes de traçage et de débogage des scripts Redis Lua

redis lua art

Ou : L’erreur est humaine, Pour corriger le débogage.

Mère de toutes les mises à jour : Redis v3.2 dispose de son propre Débogueur Lua.

Mise à jour 1 : J’ai suivi le sujet avec une méthode de débogage largement supérieure, alors consultez la partie 2 – débogueur redis-lua et son poste d’accompagnement <- mini-mise à jour : rld n’est plus maintenu car il n’est pas compatible avec la v3+.

Si vous avez déjà écrit ne serait-ce qu’une seule ligne de code, vous savez que la célèbre citation de Benjamin Franklin devrait être modifiée en :

“Dans ce monde rien n’est certain, sauf la mort, les impôts… et BOGUES.”

Les défauts logiciels sont une réalité de la vie car les logiciels sont créés par des logiciels chair et les humains se trompent. Même si vous êtes un bon programmeur qui écrit du bon code (ou un excellent programmeur qui le vole), utilisez des méthodologies et des modèles de conception éprouvés, n’utilisez que les meilleurs outils et soumettez-vous à des revues de code par des pairs… malgré tous vos efforts, vous risquez de vous retrouver maintes et maintes fois à vous cogner la tête contre le mur à cause d’un gremlin insaisissable.

Traquer ces problèmes n’est pas une tâche facile. Il faut de la patience, des efforts et dans de nombreux cas une touche d’inspiration pour identifier correctement la cause première d’une panne. Lors du développement de scripts Lua pour Redis (une fonctionnalité disponible à partir de la version 2.6), cela peut devenir encore plus délicat. C’est parce que votre code s’exécute dans le serveur lui-même, ce qui rend beaucoup plus difficile la visibilité des entrailles du code. Pour rendre cela un peu plus facile (et peut-être sauver votre mur de quelques détonations), voici cinq façons d’obtenir une vision X-Ray de type Superman dans votre script Lua.

1. Utilisez le journal Redis

Le moteur Lua intégré de Redis fournit une fonction qui imprime dans son fichier journal (configuré avec le niveau de log et fichier journal directives dans votre redis.conf). Cette fonction, commodément nommée redis.logest extrêmement simple à utiliser – appelez-le simplement à partir de votre script comme suit :

La redis.log La fonction accepte deux arguments : le premier est le niveau de journalisation du message (choisissez entre LOG_DEBUG, LOG_VERBOSE, LOG_NOTICE et LOG_WARNING), et le deuxième argument est la valeur à enregistrer. Pour plus d’informations, voir ÉVALla documentation.

Avantages: L’utilisation du fichier journal est souvent le moyen le plus simple de tracer votre flux de travail. De plus, vous pouvez afficher le message consigné en temps quasi réel (c’est-à-dire en suivant le fichier journal).

Les inconvénients: Il y a des cas dans lesquels cette approche n’est pas une option viable (par exemple, lorsque vous n’avez pas accès à l’hôte Redis ou lorsque le journal est trop bruyant pour travailler confortablement). Ne désespérez pas, cependant, car il y a plus d’une façon d’écorcher un chat (meeeeeow !?!).

2. Utilisez une table Lua

Les tables de Lua sont des tableaux associatifs et sont les seules structures de données « conteneurs » du langage. Vous pouvez facilement les utiliser pour stocker des messages à la manière d’un journal et renvoyer le tableau résultant une fois que votre code a fini de s’exécuter. Voici un exemple :

L’exécution de l’exemple ci-dessus donne ce qui suit :

Avantages: Fonctionne partout et nécessite très peu de configuration.

Les inconvénients: Le renvoi de la table de journal en tant que réponse de votre code l’empêche de renvoyer quoi que ce soit de significatif. Cette approche consomme de la mémoire pour stocker la table de journal intermédiaire et vous devez attendre la fin du script avant de pouvoir obtenir les messages du journal.

3. Utilisez une liste Redis

Si vous avez besoin que votre code Lua renvoie une réponse significative une fois son exécution terminée et conservez toujours un mécanisme de journalisation, vous pouvez utiliser la structure de données List de Redis pour stocker et récupérer vos messages. Voici un extrait qui montre cette approche :

Notez que la 2ème ligne du script supprime la clé du journal pour la maintenance. L’exécution de ce script suivi d’un LRANGE pour obtenir les résultats « log » dans les cas suivants :

Avantages: Comme les tables Lua, c’est simple et ça marche.

Les inconvénients: Semblable à l’approche des tables, plus il y a une limite de taille arbitraire (2 ^ 32) sur la longueur de la liste. Vous devez également transmettre le nom de clé de la liste pour garantir la compatibilité du cluster et, plus important encore, puisque vous effectuerez une opération d’écriture sur Redis, cela ne peut pas être utilisé avec des commandes non déterministes.

4. Utilisez le Pub/Sub de Redis

Pub/sous-marin a de nombreuses utilisations merveilleuses, mais saviez-vous qu’il peut également être utilisé pour le débogage ? En demandant à votre script de publier des messages de journal sur un canal et en vous abonnant à ce canal, vous pouvez suivre ce qui se passe. Voici comment procéder :

Avant d’exécuter ce script, ouvrez une autre fenêtre de terminal et abonnez-vous à votre Journal canaliser. Pendant l’exécution du script, vous devriez obtenir la sortie suivante dans votre terminal d’abonné :

Avantages: Peu de frais généraux, affichage en temps réel des messages.

Les inconvénients: La livraison de Pub/Sub n’est pas garantie, il est donc possible que vous manquiez un message de journal révélateur (mais c’est vraiment long).

5. Utilisez un débogueur Lua

L’ajout de traçage à votre code ne peut vous mener que si loin lorsque vous essayez de groker un morceau de code, car parfois vous avez vraiment besoin/voulez d’un débogueur à part entière à votre disposition. Cette astuce astucieuse fourni par Marijan Šuflaj de @Trikoder vous donne exactement cela – un débogueur pour vos scripts Lua avec Redis.

L’essentiel de l’idée de Marijan consiste à utiliser un débogueur Lua disponible gratuitement pour déboguer votre code Lua et à ajouter des commandes spécifiques à Redis avec du code d’emballage léger. Son article de blog vous guide à travers les étapes pour accomplir cet exploit, et inclut même un exemple de code pour le wrapper de commandes spécifiques à Redis. Bien que cela ne vous permette pas exactement de déboguer le code in vivo, c’est le plus proche que vous puissiez obtenir et, à toutes fins pratiques, c’est aussi bon.

Avantages: Utilisez un débogueur complet pour votre code Lua.

Les inconvénients: Nécessite un degré de configuration non trivial.

Mise à jour 2 : Méthode bonus – Utilisation

MONITOR et ECHOJe suis tombé sur un autre moyen utile de tracer qui est très similaire à l’utilisation du journal, mais qui présente un avantage supplémentaire. L’idée est d’ouvrir une connexion dédiée à votre serveur et d’exécuter le MONITOR commande (notez que cela renverra un flux de toutes les commandes exécuté par Redis afin que vous ne vouliez pas le faire sur un serveur occupé). Une fois que vous avez configuré le moniteur, vous pouvez appeler ECHO du script pour tracer des choses (par exemple redis.call('ECHO', 'the value of foo is' .. foo)). L’avantage supplémentaire est que votre flux de moniteur s’affiche également sur tous les autres redis.call que votre script s’exécute en ligne avec vos traces – chouette !

Mise à jour 3: Une autre méthode bonus – Utilisez Lua imprimer

de Lua imprimer La commande fonctionne très bien dans le script de Redis et vous pouvez l’appeler à volonté et suivre le contenu de votre cœur. Le seul problème avec cela, cependant, est qu’il sort tout directement sur stdout, donc à moins que vous ne regardiez la sortie du serveur, vous risquez de la manquer.

Conclusion

Il existe de nombreuses façons dont votre code peut (et échouera) échouer, et rechercher la cause peut être une tâche ardue. En ce qui concerne le développement de scripts Lua pour Redis, j’espère que vous trouverez ces méthodes utiles pour écraser les créatures embêtantes qui empêchent votre code de s’exécuter comme prévu. Des questions? Retour d’information? D’autres trucs, astuces ou sujets que vous aimeriez voir abordés ? E-mail ou tweeter moi – je suis très disponible 🙂

Development Source

Related Posts

RLEC 4.2.1 apporte des contrôles granulaires à la haute disponibilité et aux performances

RLEC 4.2.1 apporte des contrôles granulaires à la haute disponibilité et aux performances

Comment HolidayMe utilise Redis Enterprise comme base de données principale

Comment HolidayMe utilise Redis Enterprise comme base de données principale

Annonce de RedisGears 1.0 : un moteur sans serveur pour Redis

Annonce de RedisGears 1.0 : un moteur sans serveur pour Redis

Clés Redis dans la RAM |  Redis

Clés Redis dans la RAM | Redis

No Comment

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *