Quand on est opérateur, il est bon de savoir comment vont nos infrastructures et pour cela, nous avons déjà une trousse à outils soit directement issue d’AWS (CloudWatch et ses sous services), soit proposée par des tiers (Datadog, Zabbix, Nagios, Prometheus, Exporters…).
Maintenant, quand on est DevOps, il est aussi bon de savoir comment se portent les applications qui tournent sur nos infrastructures. Il existe pour cela différents types d’outils : les Applications Performance Monitor (Dynatrace APM, Datadog APM, Logz.io, Sentry…) et les Websites Monitoring (site24x7, pingdom). Aujourd’hui, nous allons voir deux outils complémentaires sur ce besoin pour les DevOps :
Les deux permettent de superviser une facette de nos applications.
AWS CloudWatch Synthetics
AWS CloudWatch Synthetics est un service permettant de mettre en place des scripts planifiés de surveillances (canaries) pour vos endpoints et autres API, en effectuant les mêmes actions que les utilisateurs pourraient mener sur ces mêmes ressources. Il permet de voir les problèmes avant que les utilisateurs y soient confrontés, ou pire, qu’ils se manifestent à cause de ces dits problèmes. En résumé, Synthetics c’est :
- Python ou Node.js.
- HTTP ou HTTPS.
- Données non externalisées, tout reste dans votre compte AWS.
- Technos sous-jacentes : Puppeteer & Selenium.
- Peut remonter : disponibilité, latence, temps de chargement, capture d’écran.
- Peut vérifier : les changements non autorisés liés au phising, l’injection de code, le cross-site scripting.
- Intégration à :
- AWS CloudWatch Application Signals.
- AWS CloudWatch Metrics.
- AWS CloudWatch X-Ray Trace Map afin de pouvoir tracer les exécutions d’un canary.
- AWS VPC dans le but de lancer des exécutions dans un contexte réseau privé
- Déclenchement manuel ou planifié.
- Des droits IAM spécifiques pour les administrateurs (possibilité de permission fine-grained).
- Des droits IAM spécifiques pour les canaries (exécution des scripts).
Création d’un Canary
La création d’un canary implique la création d’un nombre non négligeable de ressources AWS :
- Un rôle IAM pour le canary.
- Une policy IAM pour le role du canary.
- Un bucket S3 pour les résultats du canary.
- Une alarme AWS CloudWatch.
- Une Lambda (avec ou sans layers).
- Un groupe AWS CloudWatch Logs.
La création et le lien entre ces ressources sont gérés de manière transparente quand vous créez un canary via la console Web AWS et les blueprint fournis (Heartbeat, API, Broken Link, Visual Monitoring, Canary recorder, ou à travers un parcours GUI). Cependant, on sait tous que la console AWS pour déployer des ressources, ce n'est pas “idéal”. On va donc privilégier le déploiement de ces ressources à travers des outils d’Infrastructure as Code. Pour vous y aider, il existe des exemples de projets traitant de ce sujet :
Dans le cas de l’Infrastructure as Code, il faudra s’assurer de fournir le bon code à la fonction lambda (qui est gérée à travers le blueprint dans le cas de la console Web AWS). Dans le cas où on ne passe pas par un blueprint, soit on simule un blueprint sans valider la création et on prend le code de la fonction générée, soit un part “from scratch” en suivant les recommandations évoquées par AWS et les fonctions fournies par les librairies Python ou Node.js. Des exemples simplistes sont aussi disponibles dans la documentation officielle.
Un canary à comme attribut principal son runtime. Une gestion de version spécifique est en place concernant ces runtimes qu’ils soient en Node.js ou en Python. Il est important de suivre les cycles de vie de ces runtimes, de faire des montées de versions pour profiter des corrections et d’avoir accès aux nouvelles features.
De plus, les canaries créés peuvent être réunis en groupe (par exemple par application, par projet, par équipe) à travers les groups.
Analyse des Canaries
La console AWS permet d’analyser les résultats de vos différents canaries. Vous aurez en premier lieu un dashboard général où vous retrouverez vos canaries rangés par groupe, si vous avez eu la bonne idée ou la nécessité de le faire.
Ensuite, chaque canary est analysable individuellement et par itération si le tracing a été activé.
Si le tracing est activé, vous pourrez aller jusqu’à observer quels sont les délais de chaque segment dans le parcours du canary.
AWS Cloudwatch Synthetics est d’abord fait pour superviser la santé d’une application web (disponibilité, anomalies visuelles, erreurs de parcours). Il n’est pas là pour étudier et surveiller le ressenti des utilisateurs. Il peut juste donner une impression dans le temps vécu par ce processus automatisé. Ni plus, ni moins.
Concernant les coûts directement imputables à l’utilisation de ce service, ils sont simples puisque la seule valeur de facturation est un coût (de 0,0014$ en Irlande) par exécution d’un canary. Mais là, et comme tous les principes de facturation sur AWS, il faut voir l’intégralité des coûts au-delà des simples canaries, car des frais liés à Lambda, CloudWatch Logs et S3 seront imputables.
Les exemples sur la page de pricing AWS CloudWatch sont en revanche très parlants. Dans un des exemples présentés, cinq canaries tournant toutes les cinq minutes sur un mois vont générer approximativement 75$ en Irlande (il existe un free trail de 100 exécutions par mois).
AWS CloudWatch RUM
AWS CloudWatch RUM (Real User Monitoring) va nous permettre d’avoir une vision utilisateur sur les aspects de performance, d’erreur côté client, de comportement et d’habitude client.
C’est un outil qui s’appuie sur un bloc de code JavaScript à intégrer dans les pages web de nos applications que l’on souhaite surveiller.
L’impact du RUM sur vos applications est quasiment nul. Il ne bloquera jamais vos applications au chargement par exemple. Le code RUM pour votre application peut être soit directement fourni par votre code applicatif, soit à travers un déport sur CDN (AWS Cloudfront par exemple).
Ce service fait partie de la suite d’outils AWS CloudWatch Application Signals et peut s’intégrer avec les sous-services de ce dernier ainsi que AWS X-Ray.
Voyons maintenant la création d’une App Monitor.
Création d’une App Monitor
Deux moyens de création vus de ma fenêtre, soit à travers la console web AWS, soit à travers les ressources proposées via Terraform.
Dans le cadre de cet article, j’ai déroulé le workshop One Observability Workshop, et la création de l’App Monitor se passe via la console web d’AWS.
Quelques paramètres sont disponibles pour peaufiner la configuration de l’App Monitor comme :
- Son nom, le domaine (FQDN) de l’application web.
- Si l’on doit ou non inclure les sous-domaines.
- La liste des plugins que l’on souhaite activer (performance, erreurs JavaScript, erreur HTTP ou encore des évènements customisés).
- L’activation des cookies ou non (pour capter les sessions utilisateurs).
- L’échantillonnage.
- Le stockage de la donnée, si on souhaite pouvoir dépasser les 30 jours de rétention fournie par AWS CloudWatch RUM par défaut (on parle ici d’un groupe CloudWatch Logs dédié).
- La gestion des autorisations (pool d’identité Cognito).
- Le choix des pages à inclure ou exclure des remontées RUM.
- Activer ou non le tracing et avoir un diagramme du parcours sous AWS X-Ray.
- L’utilisation (évidemment) des TAG.
Analyse via RUM
Une fois l’App Monitor créée, il faudra attendre que vos utilisateurs naviguent sur votre application web et que des informations remontent vers votre App Monitor.
Vous pourrez voir les premières informations centralisées sur le tableau de bord général via la page d’accueil RUM Overview en choisissant votre App Monitor dans la liste déroulante.
Ce tableau de bord remonte, sur la plage configurée, la synthèse des métriques et informations suivantes :
- Le nombre de pages chargées.
- Le temps de chargement moyen des pages.
- Le score Apdex.
- La remontée ou non d’alarmes.
- Le pourcentage d’erreur par device.
- Le nombre de sessions initiées.
- Les canaries associés.
Ce tableau de bord générique est téléchargeable en pdf pour envoyer à qui de droit.
De plus amples détails peuvent être observés à travers les informations d’une App Monitor en allant dans List View et en cliquant sur l’App Monitor souhaitée.
Un ensemble d’onglets permettent de naviguer à travers la quantité de données remontées (soit en globalité, soit par page).
Chaque onglet ci-dessus permet d’avoir des détails spécifiques sur une catégorie précise.
Performance
Page loads
Page loads
Load time
Errors
Average load time by time of day
Web vitals
Largest contentful paint
First input delay
Cumulative layout shift
Page load steps over time
Request
Number of resource requests
Resource requests per hour
Resource requests over time
Resource requests
Response time by type
Frequency by type
Location
Highest load time
Most sessions
Apdex score
Locations
Errors
Most seen error message
Device with most errors
Browser with most errors
Errors
HTTP request
Request url with most errors
Device with most errors
Browser with most errors
Requets
Sessions
Average session length
Error free sessions
Average errors per session
Session starts
Events
Events
Browsers & Devices
Top browser by use
Slowest browser by page load
Browser with most errors
Browser breakdown
Errors by browser
Average page load time by browser
Browser throughput
User journey
Configuration
- Affiche l’ensemble de la configuration relative à l’App Monitor. J’en profite d’ailleurs pour vous indiquer que vous pourrez observer un large choix d’élément de configuration disponible pour le client web CloudWatch RUM à mettre dans vos pages Web.
Une vision intéressante des parcours utilisateurs :
Cela fait pas mal d’informations intéressantes pour les développeurs qui pourront s’en servir pour nourrir leur backlog de bug fixes ou d’amélioration de code sur des segments applicatifs particulièrement lents par exemple, ou permettre aux opérateurs de la plateforme d’envisager des resizing d’infrastructure, ou encore revoir la méthode de mise à l’échelle si des lenteurs sont identifiées mais relatives au matériel sous-jacent.
Cependant, vous vous doutez bien que ce genre d’outil (efficace, pertinent, et waouh !) a un prix non négligeable. Le free trial associé à ce service est de 1 million d’évènements RUM par compte AWS. Autant vous dire que ça va partir assez vite si vous activez toutes les fonctionnalités sur toutes les pages web. Puis le pricing passe à 1$ pour 100 000 évènements (pages vues, erreurs JavaScript, erreurs HTTP). Des coûts additionnels s’appliquent ou peuvent s’appliquer sur AWS CloudWatch, AWS Cognito et AWS X-Ray.
L’exemple de la page de pricing est intéressant. Pour un site ayant 500 000 visites par mois et remontant 20 évènements RUM par visite, le tout avec un échantillonnage à 100%, cela amène à une facture uniquement AWS Cloudwatch RUM de 100$ sur un mois.
Sur ce service, des stratégies différentes peuvent être observées quant à son usage :
- On a de l’argent et on l’active partout avec un échantillonnage à 100% et tout le temps.
- On a moins d’argent mais on veut avoir une idée globale de l’état de santé de l’application, alors on active tout mais sur un échantillonnage plus faible (50%) en laissant actif tout le temps.
- On a moins d’argent mais on veut simplement activer le client web CloudWatch RUM à 100% du temps et de l’échantillonnage mais simplement sur quelques segments de l’application web.
- On a beaucoup moins d’argent, alors on créer une App Monitor uniquement quand on a des remontées d’anomalies externes (clients) ou quand on fait des grosses mises à jour. Ce n’est pas foufou, mais ça a le mérite d’être possible.
Ressources Utiles
https://catalog.workshops.aws/observability/en-US/aws-native/app-monitoring/synthetics
https://catalog.workshops.aws/observability/en-US/aws-native/app-monitoring/rum
https://aws.amazon.com/blogs/mt/multi-step-api-monitoring-using-amazon-cloudwatch-synthetics/
Article issu de notre participation à AWS Summit
Merci pour votre lecture. Cet article vous a plu, partagez sur vos réseaux 😉
Philippe Vidal - 30 avril 2024
VOUS AVEZ UN PROJET ?
Audit, migration, infogérance ?
Skale-5 vous écoute : contact@skale-5.com
Nous suivre :