Le Blog Amazon Web Services

Améliorez la qualité et la performance de votre code avec Amazon CodeGuru

Il peut être difficile de détecter certains types de problèmes de code et d’identifier les lignes de code les plus coûteuses sans une expertise en Performance Engineering, même pour les développeurs plus expérimentés. Amazon CodeGuru est un service qui vous permet de découvrir rapidement les problèmes de code et d’améliorer les performances des applications.

C’est un service basé sur le machine learning pour la revue automatisée de code et les recommandations pour améliorer la performance des applications. CodeGuru fournit aux équipes de développement les outils nécessaires pour maintenir une qualité de code élevée tout au long du processus de développement d’une application Java ou Python (à ce jour).

Ce service s’appuie sur deux fonctionnalités majeures :

Vue d’ensemble

Le diagramme suivant illustre la façon dont CodeGuru s’intègre dans les phases de développement de votre projet. Que ce soit durant vos revues de code ou le suivi des performances de votre application en production, le service vous permettra de garder un œil attentif et d’améliorer en continu sa qualité.

 

 

Amazon CodeGuru Reviewer

CodeGuru Reviewer aide les développeurs en leur évitant d’introduire des problèmes difficiles à détecter, à dépanner, à reproduire, et à en trouver la cause principale. Il leur permet également d’améliorer les performances des applications. Cela permet non seulement d’améliorer la fiabilité du logiciel, de votre code, mais aussi de réduire le temps passé à résoudre des problèmes liés au développement comme les problèmes d’accès concurrents, les fuites de ressources, les problèmes de sécurité lors de communication entre des threads, l’utilisation d’entrées non validées, la manipulation inappropriée de données sensibles et l’impact sur les performances de l’application, pour n’en citer que quelques-uns.

CodeGuru est alimenté par le Machine Learning, par les meilleures pratiques et par les leçons durement apprises au travers de millions de revues de code et de milliers d’applications issues de projets open source ou internes chez Amazon.

Regardons sous le capot !

CodeGuru Reviewer utilise un programme d’analyse de code combinée à des modèles de Machine Learning entraînés sur des millions de lignes de code provenant de la base de code Amazon et d’autres sources. Lorsque vous associez CodeGuru Reviewer à un dépôt Git, il peut trouver et signaler les défauts et suggérer des recommandations pour améliorer votre code. CodeGuru Reviewer fournit des recommandations pratiques avec un faible taux de faux positifs et peut améliorer sa capacité à analyser le code au fil du temps en fonction des commentaires des utilisateurs.

Vous pouvez associer CodeGuru Reviewer à un dépôt (Github, Github Enterprise, AWS CodeCommit, ou Bitbucket)  pour lui permettre de fournir des recommandations. Une fois qu’un dépôt est associé, CodeGuru Reviewer analyse automatiquement les Pull Request que vous faites, ou vous pouvez choisir d’exécuter des analyses sur le code d’une branche spécifique pour analyser tout le code et ce à tout moment. Les recommandations issues des analyses des Pull Request et des dépôts peuvent être consultées directement dans la console de CodeGuru Reviewer. Les recommandations issues des Pull Request peuvent également être consultées directement au sein du dépôt sous forme de commentaires.

Les développeurs peuvent décider comment intégrer les recommandations de CodeGuru Reviewer et fournir en retour des informations sur l’utilité de ces recommandations. Cela permet à votre équipe de développement de garantir la qualité du code et d’améliorer ses pratiques de manière organique et interactive. Et par la même occasion cela améliorera la qualité des recommandations du service, ce qui rendra CodeGuru Reviewer de plus en plus efficace pour les analyses futures.

Les recommandations d’Amazon CodeGuru

CodeGuru Reviewer ne signale pas les erreurs de syntaxe, car celles-ci sont relativement faciles à trouver. Au contraire, il identifiera les problèmes plus complexes et suggérera des améliorations liées aux points suivants :

  • Les meilleures pratiques d’AWS
  • La gestion des accès concurrent
  • La prévention de fuites de ressources
  • La prévention de fuites d’informations sensibles
  • Les meilleures pratiques de codage
  • Le refactoring de code
  • La validation des entrées

Les meilleures pratiques d’AWS

Les API AWS contiennent un riche ensemble de fonctionnalités pour assurer la performance et la stabilité des logiciels. Par exemple, l’utilisation de patterns tels que Batching et Waiters permettent d’améliorer les performances et d’obtenir un code plus efficace et plus facile à maintenir. Les développeurs peuvent ne pas utiliser les bons constructeurs lorsqu’ils utilisent les API AWS, ce qui entraîne des problèmes en production. Les meilleures pratiques AWS fournissent des recommandations sur l’utilisation correcte des API AWS, ce qui conduit à des gains de disponibilité et de performance.

Gestion des accès concurrents

CodeGuru Reviewer identifie les problèmes d’accès concurrents dans les portions de code s’exécutant sur plusieurs threads. Les défauts de concurrence sont souvent subtils et échappent même aux programmeurs plus experts. Des implémentations incorrectes de la concurrence peuvent conduire à un code incorrect ou à des problèmes de performance. Le service identifie les violations de l’atomicité qui pourraient entraîner des problèmes d’exactitude des données et il identifie les synchronisations excessives qui pourraient entraîner des problèmes de performance.

Prévention des fuites de ressources

CodeGuru Reviewer recherche les lignes de code où des fuites de ressources pourraient se produire. Les fuites de ressources peuvent provoquer des problèmes de latence et des pannes et le service peut indiquer les portions de code où cela pourrait se produire et suggérer de gérer les ressources d’une manière alternative.

Prévention des fuites d’informations sensibles

Les informations sensibles codées ne doivent pas être partagées avec des parties non autorisées. CodeGuru Reviewer recherche les lignes de code où des informations sensibles pourraient fuir, et suggère différentes façons de traiter les données.

Meilleures pratiques de codage

CodeGuru Reviewer vérifie les paramètres et recherche les lignes de code qui pourraient créer des bugs. Il existe de nombreuses erreurs de code courantes qui provoquent des bugs, comme oublier de vérifier si un objet est nul avant de le définir, réassigner un objet synchronisé ou oublier d’initialiser une variable le long d’un chemin d’exception. Il peut indiquer l’emplacement de ces erreurs et d’autres sources de problèmes dans le code.

Refactoring

CodeGuru Reviewer recherche les lignes de code qui semblent être dupliquées ou suffisamment similaires pour être retraitées. La refonte peut contribuer à améliorer la maintenabilité du code.

Validation des entrées

Il est important de détecter les entrées inattendues qui arrivent sur une fonction, et d’appliquer une validation appropriée avant que le calcul ne commence. La validation des entrées est une couche de défense efficace contre les erreurs involontaires, telles que les changements de composants du client, et les attaques malveillantes, supprimer l’injection de code ou le déni de service. CodeGuru Reviewer recherche les lignes de code qui traitent les paramètres d’entrée et suggère une validation supplémentaire là où elle est nécessaire.

Qualité du code

L’analyseur de code de CodeGuru Reviewer vous suggère comment vous pouvez améliorer la qualité de votre code. Voici quelques-uns des problèmes qui peuvent être remontés.

Nombre de ligne de code d’une méthode (Source LOC – Lines Of Code)

CodeGuru Reviewer détecte le nombre de lignes de code (Source LOC) d’une méthode. Les méthodes avec un nombre élevé de lignes peuvent être difficiles à lire et avoir une logique difficile à comprendre et à tester.

Complexité cyclomatique des méthodes

La complexité cyclique indique le nombre de décisions qui sont prises dans une méthode. Une méthode à forte complexité cyclomatique peut rendre sa logique difficile à comprendre et à tester.

Ventilation d’une méthode

La ventilation d’une méthode indique combien de méthodes sont appelées par une méthode donnée. Les méthodes avec une forte ventilation sont fortement couplées avec d’autres méthodes. Cela peut les rendre difficiles à comprendre et vulnérables à des changements de comportement inattendus lorsqu’une de leurs méthodes de référence est mise à jour.

Ventilation des classes

La Ventilation des classes indique combien d’autres classes sont référencées par une classe donnée. Plus le nombre de classes référencées est élevé, plus il est couplé avec d’autres classes et plus la ventilation est importante. Les classes avec une ventilation élevé peuvent être complexes, difficiles à comprendre, et peuvent changer de manière inattendue lorsqu’une classe référencée est mise à jour.

Cohésion des classes

CodeGuru Reviewer remarque si une classe contient des groupes de méthodes d’instance qui n’ont aucun membre de la classe en commun. Par exemple, un groupe de deux méthodes peut accéder uniquement aux champs de classe x et y, et un autre groupe de méthodes de la même classe peut accéder uniquement aux champs de classe a et b. Un nombre élevé de ces groupes indique une faible cohésion de classe. Les classes à faible cohésion contenant des opérations sans rapport, peuvent être difficiles à comprendre et sont souvent moins susceptibles d’être utilisées.

Comment utiliser CodeGuru Reviewer ?

Projetons-nous dorénavant sur un cas réel en utilisant l’un de nos dépôts aws-lambda-powertools-java, il s’agit ici d’une suite d’outils Java Open-Source pour AWS Lambda afin de faciliter l’intégration des fonctions avec nos services d’observabilité.

Tout d’abord, il vous faut disposer d’un compte AWS. Si vous n’en avez pas encore, vous pouvez en créer un gratuitement à partir de la page d’inscription AWS. Une fois connecté à votre console AWS, rendez-vous sur la console du service Amazon CodeGuru. Vous pouvez y accéder en sélectionnant Amazon CodeGuru dans le menu Services en haut de la page ou en saisissant CodeGuru dans la barre de recherche des Services AWS.

Associer un répertoire Git

Suivez les étapes suivantes :

  • Choisissez Examinateur dans le panneau de gauche et choisissez Dépôt associé.
  • Choisissez GitHub, puis choisissez Connexion à GitHub.
  • Une fois authentifié et la connexion établie, nous sélectionnons le dépôt aws-lambda-powertools-java dans la liste déroulante puis nous cliquons sur Associer, comme indiqué dans la capture d’écran suivante

Cette action associe CodeGuru Reviewer au dépôt spécifié et va écouter tout événement de type Pull Request liés à celui-ci.

Utilisation du tableau de bord des revues de code

AWS met à disposition un tableau de bord basé sur les premiers retours d’information, centralisant en un endroit l’historique des revues de code de l’ensemble des dépôts sur une période de 90 jours. Cette page répertorie l’ensemble des revues de code avec des informations complémentaires telles que le statut de la revue de code, le référentiel, le nombre de recommandations, et plus encore.

Exemple de recommandations

Ci-dessous un exemple de recommandations faites sur le dépôt :

Comme vous pouvez le voir dans les recommandations, non seulement les problèmes de code sont détectés, mais une recommandation détaillée est également fournie sur la manière de résoudre les problèmes, avec le cas échéant des exemples et de la documentation. Pour chacune des recommandations, un développeur peut donner son avis sur l’utilité ou non de la recommandation en sélectionnant simplement un émoji dans la rubrique « Cela vous a-t-il été utile ? ».

Veuillez noter que le service CodeGuru est utilisé pour identifier les défauts fonctionnels difficiles à trouver et non les erreurs syntaxiques. Les erreurs syntaxiques doivent être signalées par l’IDE et traitées à un stade précoce du développement voire au travers d’une étape dédiée de normalisation de votre code selon votre style. CodeGuru est introduit à un stade ultérieur dans le workflow des développeurs, lorsque le code est déjà développé, testé unitairement et prêt à être revu.

Amazon CodeGuru Profiler

CodeGuru Profiler recherche constamment à optimiser les performances de l’application, en identifiant vos lignes de code les plus « onéreuses » et en recommandant des manières de les corriger en vue de réduire l’utilisation CPU, de diminuer les coûts de calcul et d’améliorer les performances de l’application.

Comprendre le comportement d’exécution des applications

CodeGuru Profiler analyse en permanence l’utilisation du CPU par l’application et les caractéristiques de latence pour vous montrer où vous passez le plus de temps dans votre application. Cette analyse est présentée dans un graphique de type flamme interactif qui vous aide à comprendre facilement graphiquement quels chemins de code consomment le plus de ressources, à vérifier que votre application fonctionne normalement et à découvrir les domaines qui peuvent être optimisés davantage.

Recommandations intelligentes

CodeGuru Profiler identifie automatiquement les problèmes de performance dans votre application et fournit des recommandations intelligentes concernant la façon d’y remédier. Ces recommandations vous aident à identifier et à optimiser les méthodes les plus onéreuses ou les plus gourmandes en ressources au sein du code sans devoir être un expert de l’ingénierie de performance. Ces optimisations vous aident à réduire le coût de votre infrastructure, à réduire la latence et à améliorer votre l’expérience utilisateur. CodeGuru Profiler permet de trier quelles sont les recommendations qui ont le plus d’impact en terme de coût CPU. En effet un code exécuté très peu souvent a moins d’impact qu’un code exécuté plus fréquemment. On peut donc se concentrer sur les optimisations qui ont le meilleur retour sur investissement.

Détection des anomalies

CodeGuru Profiler analyse en permanence les profils de votre application en temps réel et détecte les anomalies dans son comportement et de ses méthodes. Chaque anomalie est suivie dans le rapport de recommandation, et vous pouvez voir les séries chronologiques du comportement de la latence de la méthode au fil du temps, les anomalies étant clairement mises en évidence. Si cela est configuré, une notification Amazon Simple Notification Service (Amazon SNS) est également envoyée lorsqu’une nouvelle anomalie est détectée.

Profilage permanent d’applications en production

L’agent CodeGuru Profiler est conçu pour s’exécuter de manière continue en production avec un impact minimal sur la consommation du CPU et de la mémoire, ce qui signifie que vous pouvez le maintenir activé en n’ayant que très peu d’impact sur les performances de votre application. Cela vous permet d’établir le profil et de dépanner votre application à l’aide de véritables modèles de trafic client et de facilement détecter les problèmes de performance qui ne seraient pas détectés dans votre environnement de test.

 Sécurité

Comme pour tous les services d’AWS la sécurité est primordiale. Il faut donc que l’application qui utilise le profiler ait les permissions requises. Pour s’authentifier depuis le cloud AWS, il vaut mieux passer par un rôle créé à travers le service AWS Identity and Access Management (IAM), nommé rôle IAM. Un rôle IAM est une identité dans le service AWS IAM que vous pouvez créer dans votre compte et qui dispose d’autorisations spécifiques. Un rôle IAM est similaire à un utilisateur IAM, car il s’agit d’une identité AWS avec des stratégies d’autorisation qui déterminent ce que l’identité peut et ne peut pas faire dans AWS. Par contre si vous voulez utiliser le profiler dans votre application qui se lance sur votre ordinateur ou dans votre datacenter il faut passer par un utilisateur et son ID de clé d’accès et une clé d’accès secrète. Il faut aussi que votre application puisse communiquer avec le endpoint de CodeGuru Profiler que ce soit par internet ou par un VPC Endpoint.

Comment utiliser CodeGuru Profiler ?

CodeGuru Profiler est compatible avec tous les languages de la JVM et notamment Java, Scala, Kotlin, Groovy, Jython, JRuby et Clojure,  prenant en charge aussi Python. Nous allons maintenant voir les recommandations pour utiliser CodeGuru Profiler avec Java.

Vous pouvez charger le profiler de deux manières dans votre application qui tourne sur une JVM.

Soit par la ligne de commande avec l’option -javaagent :

  1. Télécharger le fichier sur ce lien ;
  2. Le mettre à un endroit accessible à l’application JVM ;
  3. Le seul paramètre obligatoire est le nom du groupe de profilage. Il peut etre défini par une variable d’environnement AWS_CODEGURU_PROFILER_GROUP_NAME ou dans la ligne de commande profilingGroupName comme dans l’exemple suivant ;
  4. Lancer votre application java -javaagent:/path/to/codeguru-profiler-1.0.3.jar=profilingGroupName:MyGroup
    -jar MyApplication.jar

Soit avec du code dans votre application. Le code permet de contrôler quand on veut démarrer le Profiler mais nécessite un changement de code et un ajout d’une dépendance. Avec Maven on peut le faire en modifiant le fichier de configuration pom.xml et en relançant la création de l’artifact.

<dependencies>
        ...
        <dependency>
            <groupId>software.amazon.codeguruprofiler</groupId>
            <artifactId>codeguru-profiler-java-agent</artifactId>
            <version>1.0.3</version>
        </dependency>
 </dependencies>

Ensuite il suffit de démarrer le profiler à l’endroit que vous voulez. Cela peut être dans la méthode main par example.

Profiler.builder()
    .profilingGroupName(“MyProfilingGroup”)
    .build()
    .start();

Une fois l’application lancée par une des 2 méthodes et après avoir attendu une dizaine de minute, vous allez voir le graphe flamme et les recommendations intelligentes apparaitre dans le service CloudGuru de la console Amazon. Félicitations, vous avez accès à une meilleure compréhension de la performance et aux optimisations.

CodeGuru Profiler permet de visualiser une application de démonstration qui contient du code non-optimal et de la comparer avec la même application optimisée. Le code de l’application est disponible sur ce lien. Cette application lance en continue des traitements d’images qui utilisent fortement le CPU et une autre tâche qui écrit dans une queue créé avec le service Amazon Simple Queue Service (SQS). CoduGuru Profiler nous propose les recommendations afin de passer de la version sub optimale à la version optimisée. Comme par exemple cette recommendation sur la recréation des instances de journalisation.

Conclusion

En 2008, nous voyions l’apparition du Software Craftmanship en tant que mouvement mais aussi directement comme la cinquième valeur du manifeste Agile « Craftsmanship over Execution » (En français: « l’artisanat plus que l’exécution »). Ce mouvement prône le côté artisanal du développement logiciel, autrement dit, d’après le manifeste de l’artisanat du logiciel, il ne suffit pas qu’un logiciel soit fonctionnel, mais il faut qu’il soit bien conçu. L’idée principale est de garantir la fiabilité et la maintenabilité des applications d’où l’importance de professionnels aptes à concevoir des logiciels dans le respect d’indicateurs de qualité logicielle. Amazon CodeGuru va venir s’intercaler dans ces phases de développement et apporter une sécurisation du respect des bonnes pratiques et ce de façon automatisée. La culture d’amélioration continue et de transmission du savoir se fera par le biais des retours utilisateurs qui serviront à améliorer son moteur d’apprentissage machine et à en faire bénéficier directement l’intégralité des utilisateurs du service.

Article rédigé par Steve Houël et Florent Brosse, Solutions Architects au sein des équipes AWS France.