IT & Engineering
Comment l’application Cloud Monitoring sous Node.js utilise l’API de Mailgun pour automatiser le flux de travail des emails
Cet article a été rédigé par Dan Di Spaltro, directeur de produit pour Rackspace Cloud Monitoring. Cloud Monitoring vous permet de surveiller n’importe quel serveur dans n’importe quel centre de données afin de toujours vous assurer que l’infrastructure de votre application est en parfait état. Avant de diriger l’équipe d’ingénierie de Cloud Monitoring, Dan a cofondé Cloudkick, une start-up du Y Combinator spécialisée dans la surveillance de l’infrastructure cloud, acquise par Rackspace en 2010.
L’équipe d’ingénierie de Rackspace cherche toujours de nouvelles façons d’utiliser les produits Rackspace dans les solutions que nous concevons pour les clients. Nous sommes convaincus qu’en utilisant nos propres produits, nous développons de meilleurs logiciels pour nos clients, car nous pouvons faire remonter nos commentaires directement à l’équipe située de l’autre côté du couloir. Lors de l’acquisition de Mailgun par Rackspace, nous avons eu une occasion unique de tester le tout nouvel ensemble de services de Rackspace dans notre produit Cloud Monitoring. Lorsqu’une erreur se produit, l’une des tâches principales de Cloud Monitoring consiste à envoyer un email au client. Ces emails peuvent être déclenchés lorsque le site Web surveillé a expiré, renvoie une erreur 404, ou lorsqu’une autre condition que vous avez définie dans votre Alarm Language est remplie. En étudiant Mailgun, notre objectif était d’activer de manière fiable les notifications par email pour nos clients, et non de maîtriser les détails de la création, de la livraison et des statistiques des emails, trois composants essentiels de l’automatisation des emails à notre échelle. Lorsque nous avons testé Mailgun, nous avons été très impressionnés. Nous en avons tiré les avantages attendus, et même d’autres auxquels nous ne nous attendions pas. Par exemple :
- Gestion saine des rebonds : Mailgun offre une approche rationnelle basée sur l’API pour gérer les rebonds, qui se produisent fréquemment pour de nombreuses raisons.
- Statistiques et balisage : nous testons constamment des scénarios de défaillance dans notre environnement de production, nous avions donc besoin d’un moyen d’isoler certains comptes que nous avons marqués comme « spéciaux ». Mailgun peut segmenter tous les rapports en fonction des balises, ce qui facilite les tests.
- Responsabilité : pour nous, il ne suffit pas d’envoyer un email. Les journaux de Mailgun fournissent une vue de bout en bout de ce qui est arrivé exactement à chaque email.
Avant de voir comment nous avons implémenté et déployé Mailgun, examinons l’architecture de Cloud Monitoring
Pipeline de Cloud Monitoring
Le système Rackspace Cloud Monitoring est divisé en un pipeline de différents services. À titre de rappel, jetons un coup d’œil à une vue d’ensemble de l’architecture.

Chaque étape représente un ou plusieurs services distribués, connectés par un flux de données. Nous utilisons le logiciel Scribe de Facebook pour la distribution de point à point, le routage et la mise en mémoire tampon. Avec ce flux de données, nous pouvons découper, analyser et distribuer les données dans n’importe quel coin de notre infrastructure. Pouvoir expérimenter facilement avec le flux de données est essentiel à notre vélocité. Cela nous permet d’envoyer des données n’importe où, et c’est un élément central de la conception qui assure notre haute disponibilité ainsi que l’accélération et le développement du produit (pour l’anecdote, c’est la raison pour laquelle le produit porte le nom de code ELE.).
Préparation du test
Pour un système en production, un changement radical n’est jamais une bonne idée. Nous avons donc décidé d’adopter une approche différente. Nous avons d’abord intégré progressivement Mailgun sur les comptes que nous utilisons pour nos tests. Cela nous a permis d’aller au-delà des simples micro-validations et validations de tests unitaires pour nous familiariser avec le système. Grâce à la prise en charge facile du HTTP dans Node.js, nous avons pu réaliser cette intégration très rapidement.
Simulation de l’API de Mailgun
Chaque fois que nous ajoutons une dépendance externe, nous essayons de simuler l’API si cela est possible. Simuler une API externe peut être très simple ou très complexe, mais cela reste néanmoins important. Notre objectif n’est pas d’ajouter du travail supplémentaire à l’équipe de développement, mais de rester confiants dans nos interactions avec un service externe et dans la façon dont il est censé fonctionner. De nos jours, la plupart des API sont versionnées, de sorte que les changements majeurs s’accompagnent d’un changement de version. Cela nous permet de simuler rapidement et en toute confiance des API afin de créer des tests de bout en bout plus élaborés dans un environnement contrôlé. Après avoir déterminé comment nous voulions déployer le test sur notre compte de test, nous avons créé notre propre API de Mailgun, ce qui nous a permis de nous familiariser avec la nouvelle intégration. Ce processus a été d’une simplicité enfantine. L’API de Mailgun proposée pour toutes les opérations sortantes et de statistiques était simple et directe à implémenter. Ce n’est qu’après la simulation que nous nous sommes rendu compte qu’il existait un mode test pour envoyer des emails dans un bac à sable, mais ce fut néanmoins une expérience d’apprentissage très enrichissante.
Remplacement chirurgical
Une fois les préparatifs du test terminés, nous avons commencé à implémenter et à surveiller les performances des emails pour nous assurer que Mailgun était une solution que nous pouvions déployer plus largement auprès de nos utilisateurs. Dans l’application Cloud Monitoring, le composant chargé d’assurer la livraison d’une alerte est un logiciel complexe judicieusement nommé messenger. Il effectue diverses tâches pour accroître la fiabilité de nos notifications par email. En interne, messenger est un pipeline d’exécution par étapes. Il comprend les étapes suivantes :
- Recevoir le message
- Verrouiller sur l’atome du message
- Effectuer des recherches de compte/entité/vérification/alarme
- Trouver l’abonnement de notification
- Livrer les alertes
- Créer un email
- Délivrer
- Suivre
Pendant le test, nous avons ajouté du code pour surveiller le compte spécial lors de l’étape de livraison de l’alerte afin de commencer le routage des messages vers Mailgun. Ce processus a été simple, car il impliquait très peu de code. Voici à quoi ressemble un extrait de code :
if (tenantId === 'XXX') {rn emailUtil.sendMailgunEmail(address, subject, body, { headers: headers }, function (err, res) {rn var delta = (Date.now() - startTime);rnrn accessLog.logAccess(ctx, 'mailgun', misc.getUnixTimestamp(), delta, err);rnrn if (err) {rn log.error('error performing email notification', { ctx: ctx, err: err });rn callback(err);rn return;rn }rnrn callback(null, 'Email successfully sent', body);rn });rn} else {rn // ...rn}
Que se passe-t-il ci-dessus ? Tout d’abord, nous appelons la fonction sendMailgunEmail pour livrer l’email de notification de surveillance. Dans notre volonté de TOUT mesurer, nous mesurons également le temps nécessaire pour utiliser l’API de Mailgun. De plus, une série de tentatives enveloppe ce code avec une option de repli, l’une des bonnes pratiques lorsqu’on s’appuie sur un système tiers dans une application. Vous voulez voir à quel point la fonction sendMailgunEmail est simple ?
exports.sendMailGunEmail = function(address, subject, body, options, callback) {rn options = options || {};rn options.headers = options.headers || {};rn options.apiUrl = options.apiUrl || settings.MAILGUN_API_URL;rn options.domain = options.domain || settings.MAILGUN_DOMAIN;rn options.apiKey = options.apiKey || settings.MAILGUN_API_KEY;rn options.fromAddress = options.fromAddress || settings.MAILGUN_FROM_ADDRESS;rn options.testMode = options.testMode || settings.MAILGUN_TEST_MODE;rnrn var url = options.apiUrl + options.domain + '/messages',rn bodyObj, k, httpOptions;rnrn httpOptions = { // 1) set up some defaultsrn 'expected_status_codes': [200],rn 'return_response': true,rn 'parse_json': true,rn 'username': 'api',rn 'password': options.apiKey,rn 'headers': { 'Content-Type': 'application/x-www-form-urlencoded' }rn };rnrn bodyObj = {rn 'to': address,rn 'subject': subject,rn 'from': options.fromAddressrn };rnrn if (options.isHTML) { // 2) switch based on the content type we want to sendrn bodyObj.html = body;rn } else {rn bodyObj.text = body;rn }rnrn for (k in options.headers) { // 3) merge in the headers so we can provide id’s as headers in the emailsrn if (options.headers.hasOwnProperty(k)) {rn bodyObj['h:' + k] = options.headers[k];rn }rn }rnrn if (options.testMode) { // 4) enable sandbox testingrn bodyObj['o:testmode'] = true;rn }rnrn if (options.tags) { rn // 5) set some tags to automatically pivot analytics for visibility.rn // (we view reporting in the Mailgun control panel but data is also available via API or webhook)rn bodyObj['o:tag'] = options.tags;rn }rnrn body = querystring.stringify(bodyObj);rn request(url, 'POST', body, httpOptions, callback);rn};
1) La fonction de requête abstrait certaines interactions avec les requêtes HTTP complexes et la gestion des codes de réponse, de sorte que les codes de réponse attendus sont utilisés pour cela.
2) Gérer facilement l’envoi de contenu HTML, ce qui est généralement une corvée.
3) Fusionner les en-têtes, ce qui offre un moyen facile d’enrichir les emails. Ces en-têtes nous permettent de créer des emails personnalisés pour chaque utilisateur avec des détails sur son alerte tels que alarmId, checkId et tenantId. Dans ces en-têtes, vous pouvez faire passer presque tout ce qui permet de personnaliser vos emails et qui encombrerait normalement le corps de l’email.
4) Basculer facilement un paramètre pour l’envoi d’emails de test.
5) Les balises définies par vos soins permettent le suivi et le facettage analytique utilisés dans nos scénarios de test en production.
Regardez à quel point cela a été facile. Nous avons entièrement automatisé la création, la livraison et le suivi des emails à l’aide de Mailgun, ce qui est difficile avec une configuration personnalisée traditionnelle.
Résumé
Passer à une offre hébergée est une décision importante pour toute application, en particulier pour un aspect aussi critique que les notifications par email. Grâce à un abonnement de test rigoureux et au support exceptionnel de l’équipe Mailgun sur tous les aspects, de la configuration des enregistrements DKIM à l’intégration API, nous avons pu transférer avec succès toutes nos notifications par email pour Cloud Monitoring vers Mailgun. Petit bonus, l’équipe de Mailgun est assise juste à côté de moi ;). PS : Nous sommes en plein recrutement!