AWS X-Ray mit Lambda: Verteiltes Tracing für den Sieg

AWS X-Ray mit Lambda ist der einfachste Weg, um mit dem Tracing einer einfachen Funktion oder verteilten Services zu beginnen. Warum? Weil es direkt integriert und kostenlos* ist! Shaq Shimmy

Ich werde Ihnen erläutern, warum wir X-Ray mit unseren Lambdas bei FloQast verwenden. Danach zeige ich Ihnen, wie wir die X-Ray-Konsole verwenden, um wertvolle Informationen zu erhalten und Probleme zu beheben. Zum Schluss werde ich auf einige Dinge hinweisen, auf die man achten sollte, und Ressourcen nennen, die ich als hilfreich empfunden habe.

*AWS X-Ray hat eine unbefristete kostenlose Stufe. Die ersten 100.000 aufgezeichneten Traces und 1.000.000 abgerufenen oder gescannten Traces pro Monat sind kostenlos. Sie können Stichprobenregeln verwenden, um die Anzahl der von AWS aufgezeichneten Spuren zu steuern. Die Trace-Daten werden 30 Tage lang gespeichert.

Warum sich mit Röntgenstrahlen beschäftigen?

Wir wissen, dass die Nutzung der "Cloud" für Ihre Anwendung Zeit, Geld und Kopfschmerzen sparen kann. Bei dieser Strategie geben Sie jedoch einen Teil der Kontrolle auf, wenn es darum geht, den gesamten Anfragezyklus zu sehen und zu erfahren, wie eine Anfrage zwischen den verschiedenen Diensten in Ihrer Anwendung übermittelt wird. Infolgedessen kann es schwierig sein, Probleme aufzuspüren, wenn sie auftreten.

Würden Sie gerne den Zustand Ihrer Anwendung auf einen Blick sehen? Vielleicht möchten Sie die Fehler, die Sie ausgeben, aufspüren und beheben. Oder vielleicht geht es Ihnen mehr um die Feinabstimmung Ihrer Anwendung im Hinblick auf die Leistung. Ich mag es nicht, mich durch mehrere Serverprotokolle zu wühlen. Sie auch nicht? Stattdessen können Sie AWS X-Ray mit Ihren Lambdas verwenden, um die Komponenten Ihrer Anwendung zu visualisieren, Leistungsengpässe zu identifizieren und Anfragen zu beheben, die zu einem Fehler geführt haben.

Unsere Teams haben auf die harte Tour gelernt, dass der Zeitpunkt für die Implementierung dieser Art von Überwachung NICHT dann ist, wenn Sie feststellen, dass Sie Daten benötigen, um eine geschäftskritische Entscheidung zu treffen oder einen heiklen Fehler aufzuspüren. Richten Sie X-Ray ein, bevor Sie denken, dass Sie es brauchen. Sie werden froh sein, dass Sie es getan haben. Mein Kollege Trung hat darüber geschrieben, wie sein Team X-Ray von AWS in unserer Hauptanwendung implementiert hat und es zur Lösung einiger der oben genannten Probleme verwendet. Er geht detailliert auf den Code ein, den sein Team geschrieben hat, um das Beste aus X-Ray herauszuholen. Darüber hinaus hebt er hervor, wie es ihnen hilft, bessere Entscheidungen zu treffen, die datengesteuert und nachvollziehbar sind.

Wie kann man die Röntgenspurdaten zum Fließen bringen?

Lassen Sie uns mit der Einrichtung beginnen.

1. Gehen Sie zu der Seite, auf der Ihre Lambda-Funktionen aufgelistet sind.

2. Wählen Sie die Funktion, für die Sie X-Ray aktivieren möchten.

3. Scrollen Sie über Ihren Funktionscode hinaus zum Feld AWS X-Ray und klicken Sie auf das Feld "Active tracing".

4. Speichern Sie

DAS IST ES! 

Bumm. So einfach ist das.

Die oben genannten Schritte sind für ein persönliches Projekt ideal. In einem professionellen Umfeld jedoch, wenn Sie in großem Umfang mit mehreren Umgebungen arbeiten, ist das letzte, was Sie tun sollten, auf eine Reihe von Tasten in AWS zu klicken. FloQast hat ein großartiges DevOps-Team, das sich um diese Effizienz und die Einrichtung von Infrastruktur als Code (IsaC) kümmert. Wir verwenden Terraform, um die Erstellung unserer AWS-Services und die Aktivierung von Optionen wie Active Tracing zu verwalten. Wenn Sie die Eigenschaft `tracing_config` in Ihrem Terraform auf "Active" setzen, sollten die oben genannten Schritte ohne einen einzigen Klick erledigt sein. Schauen Sie sich ein Beispiel für eine unserer Lambda-Terraformen an oder lesen Sie die Terraform-Dokumente.

Ressource "aws_lambda_function" "gl_core" {
  function_name = "gl_core-${var.environment}"
  filename = "beispiel.zip"
  Rolle = "${aws_iam_role.lambda_role.arn}"
  handler = "index.handler"
  laufzeit = "nodejs10.x"
  speicher_größe = "1024"
  timeout = "900"

  description = "GL Core Lambda - Verwaltet von Terraform"

  vpc_config = {
    subnet_ids = ["${data.terraform_remote_state.core-base.private_subnets}"]
    security_group_ids = ["${aws_security_group.gl-service_lambda.id}"]
  }

  environment {
    variables = {
      AWS_ACCOUNT = "${var.aws_account}"
      RUN_ENV = "${var.environment}"
      NODE_ENV = "${var.environment}"
    }
  }

  layers = ["${data.terraform_remote_state.gl_service_layer.layer_arn}"]

  tags {
    Name = "fq-gl_core-lambda-${var.environment}"
  }

  Lebenszyklus {
    ignore_changes = [
      "filename"
    ]
  }

  tracing_config {
    Modus = "Aktiv"
  }

}

Wenn Sie neugierig geworden sind und mehr über IsaC erfahren möchten, haben wir für Sie das Richtige.

Sie haben nun X-Ray für Ihre Lambda-Funktion aktiviert. (Möglicherweise wird eine Meldung angezeigt, dass die Ausführungsrolle Ihrer Funktion nicht über die Berechtigung verfügt, Trace-Daten an X-Ray zu senden, aber AWS wird versuchen, diese Berechtigung der Rolle automatisch für Sie hinzuzufügen). Wenn Sie auf die Schaltfläche "View traces in X-Ray" klicken, gelangen Sie zur X-Ray-Konsole.

Sie können hier aufhören, wenn Sie möchten. Wenn Sie nichts weiter tun, haben Sie dennoch die Möglichkeit, über die X-Ray-Konsole wertvolle Einblicke in Ihre Anwendung zu erhalten. X-Ray setzt diese Spuren auch über andere AWS-Services fort, mit denen Ihr Lambda interagiert und die X-Ray-Unterstützung haben. 

Sie möchten X-Ray und Lambda noch weiter ausbauen? 

Es ist zwar hilfreich zu wissen, wann Ihre App Fehler ausgibt, aber es kann trotzdem schwierig sein, herauszufinden, was los ist, wenn die Probleme nur sporadisch auftreten. X-Ray mit Lambda bietet Ihnen von Haus aus die Grundlagen, ist aber erweiterbar, sodass Sie es an Ihre Bedürfnisse anpassen können. In Ihrem Lambda können Sie beispielsweise das X-Ray SDK verwenden, um das Haupt-Subsegment Invocation, das für Sie eingerichtet wurde, mit zusätzlichen Subsegmenten für nachgelagerte Aufrufe, Anmerkungen und Metadaten zu erweitern.

Mit anderen Worten: Sie können X-Ray anweisen, die von Ihnen gewünschten Daten zu verfolgen. Möchten Sie wissen, wie lange eine Reihe von Aufrufen dauert? Wickeln Sie sie in ein Subsegment ein, und X-Ray informiert Sie darüber. Möchten Sie sehen, ob all diese Fehler mit demselben Kunden zusammenhängen? Erstellen Sie ein Subsegment, das eine Kunden-ID als Anmerkung enthält, die in der X-Ray-Konsole durchsuchbar ist und zur Gruppierung Ihrer Traces verwendet werden kann. Sie möchten allgemeine Informationen zu einer Anfrage festhalten, die in X-Ray nicht durchsuchbar sein müssen? Fügen Sie ein Subsegment mit einigen Metadaten hinzu. Erlauben Sie mir, Ihnen einige Beispiele zu zeigen, wie mein Team X-Ray mit unseren Lambdas verwendet.

Jetzt, wo Sie es haben, wie verwenden Sie es?

Unten sehen Sie die X-Ray-Konsole und zwei Lambda-basierte Dienste, die wir mit aktivierter Ablaufverfolgung haben. Einer sieht gut aus. Der andere nicht so sehr. Schauen wir uns beide an.Vollständiger Röntgendienstplan

Der erste Service lebt fast vollständig in der Welt von AWS und nutzt Lambdas, SSM und DynamoBD. Der zweite Service verwendet einen Lambda, um Anfragen von einer einzigen API eines Drittanbieters zu stellen. Beginnen wir mit dem gesunden Service. Wenn Sie einen Knoten auf der Servicekarte auswählen, erhalten Sie ein Popup mit einem Diagramm und einigen Optionen.

Hier sieht alles gut aus

AWS X-Ray Service Map mit ausgewähltem Knoten

Das Diagramm zeigt die Latenzzeit. Das ist die Zeitspanne zwischen dem Start einer Anfrage und ihrer Beendigung. Die meisten Anfragen an diesen bestimmten Lambda benötigen etwa 5,7 Sekunden bis zur Fertigstellung. Von hier aus können wir auf die Schaltfläche "Traces anzeigen" klicken, um einzelne Traces zu sehen. AWS X-Ray-Liste der Spuren

Auf der Seite "Traces" finden Sie eine Liste mit Stichproben von Anfragen und eine Reihe von Zusatzinformationen. Sie fragen sich vielleicht, warum die durchschnittliche Antwortzeit hier 45 ms beträgt, wenn ich Ihnen gerade gesagt habe, dass der erste Lambda-Knoten etwa fünfeinhalb Sekunden benötigt. Die kürzere Antwortzeit stammt vom Lambda-Service-Knoten und zeigt, wie lange der Lambda-Service brauchte, um zu antworten und unsere Lambda-Funktion zu starten. Lambda fügt immer zwei Knoten zu Ihrer Service-Map hinzu. Der erste zeigt an, wie lange es dauerte, den Dienst zu starten, wie lange er gewartet hat (Verweildauer) und wie lange Ihre Lambda-Funktion zur Ausführung brauchte. Hier sehen Sie auch die Anzahl der Versuche, die Ihr Lambda unternommen hat, da die Wiederholung eingebaut ist.

Lambda-Dienst-Knoten Trace-Abschnitt

Darüber hinaus können wir, wenn wir weiter unten in dieser Aufzeichnung nachschauen, jeden Schritt im Anfragezyklus sehen, von dem Sie unten ein kleines Beispiel sehen.

Einzelne Trace-Informationen

Wie ich bereits erwähnt habe, können wir die Interaktionen zwischen den meisten AWS-Services kostenlos nachverfolgen, aber was ist mit Dingen, die nicht AWS sind? Wir wollten eine bessere Vorstellung davon bekommen, wie lange unsere API-Aufrufe von Drittanbietern dauerten und für welche Kunden sie erfolgten, ohne unsere Protokolle zu durchforsten. Zu diesem Zweck haben wir das AWS SDK und Untersegmente verwendet. Unmittelbar vor dem API-Aufruf richten wir ein Subsegment ein, benennen es und fügen dann eine Kunden-ID als Anmerkung hinzu.

module.exports.getFilesInTable = async (tableId, ****Token, tlcId) => {
    const subSegment = Xray.getSegment().addNewSubsegment('sending **** Request: getFilesInTable');
    subSegment.addAnnotation('tlcId', tlcId);
...

Wenn wir diesen Abschnitt der Ablaufverfolgung auswählen, können wir weitere Informationen dazu sehen, einschließlich unserer ID-Anmerkung. Das ist sehr praktisch, wenn wir Probleme feststellen.

Der rote Ring der Verzweiflung

Bugs, Defekte, Randfälle, Benutzerfehler... all das wird irgendwann in Ihrer Anwendung auftauchen, also seien Sie darauf vorbereitet. X-Ray kann Ihnen helfen, Probleme zu lokalisieren und schneller zu beheben. Werfen wir einen Blick auf den zweiten, nicht so gesunden Dienst. Sie können sofort sehen, dass hier etwas nicht stimmt. Die farbigen Ringe zeigen die Häufigkeit der Fehler an jedem Knoten an. In den Dienstdetails können Sie einen Antwortstatus auswählen, nach dem Sie filtern können, bevor Sie auf "View Traces" klicken, so dass Sie die Problemstellen genau eingrenzen können.

AWS X-Ray ungesunde Anwendung mit Fehlern

Wenn wir einen dieser Traces untersuchen, können wir sehen, dass der Fehler von einem Aufruf unserer Drittanbieter-API kommt, die einen Fehler in unserem Lambda auslöst. Wenn wir den Mauszeiger über das Fehlersymbol bewegen, sehen wir die Fehlermeldung "Error Unauthorized". Der Abschnitt mit der Bezeichnung Accounts ist ein weiteres benutzerdefiniertes Untersegment, das eingerichtet wurde, um nicht nur den API-Aufruf und den daraus resultierenden Datenabruf, sondern auch die Verarbeitung der Daten nach dem Abruf zu verfolgen. Wenn wir darauf klicken, können wir weitere Details über den Fehler erhalten.

AWS X-Ray-Fehlersuche

Die Übersichtsregisterkarte von X-Ray gibt uns einige allgemeine Informationen über den ausgewählten Knoten, von denen wir die meisten bereits aus den Trace-Details ersehen können. Es lohnt sich, die Segment- und Parent-IDs zu notieren. Mit ihnen verfolgt X-Ray alle Aufrufe zwischen den Diensten und erstellt Traces und Service Maps. Die Informationen, die wir benötigen, befinden sich jedoch auf der Registerkarte "Ausnahmen".

Registerkarte Röntgenübersicht

Die Registerkarte "Ausnahmen" von X-Ray zeigt uns den gesamten Stack-Trace an, und wir mussten nicht ein einziges Serverprotokoll durchsuchen! Bei so vielen Fehlern wäre unser nächster Schritt, die Anmerkungen und Metadaten auf hilfreiche Informationen zu überprüfen, die dem Untersegment hinzugefügt wurden, wie z. B. eine Kunden-ID. Darüber hinaus könnten wir auf der Hauptseite für diesen Dienst die Spuren sogar nach einer Kunden-ID gruppieren. Dann können wir sehen, ob alle unsere Probleme aus derselben Quelle stammen.

Registerkarte AWS X-Ray Ausnahmen

Was ist zu beachten und worauf ist zu achten?

Möglicherweise müssen Sie X-Ray für Ihr Lambda nicht aktivieren. Wenn Sie das X-Ray-Tracing in einem AWS-Service aktiviert haben, der Ihre Funktion aufruft, sendet Lambda automatisch Trace-Daten an X-Ray. Der vorgelagerte Service, wie z. B. API Gateway oder eine auf EC2 gehostete Anwendung, die mit dem X-Ray SDK instrumentiert ist, tastet eingehende Anforderungen ab und fügt einen Tracing-Header hinzu, der Lambda anweist, Traces zu senden oder nicht. Wenn Sie jedoch etwas, das spezifisch für Ihr Lambda ist, über ein Subsegment verfolgen möchten, müssen Sie immer noch das X-Ray SDK verwenden. Ebenso ist das X-Ray SDK für AWS-Services erforderlich, die keine native Unterstützung für X-Ray bieten, wie CloudWatch und S3. Um dies zu erreichen, verwenden Sie das captureAWS Methode, um alle AWS-Services zu verfolgen.

const AWSXRay = require('aws-xray-sdk-core');
AWSXRay.captureAWS(require('aws-sdk'));

ODER

const AWS = require('aws-sdk');
const AWSXRay = require('aws-xray-sdk-core');
AWSXRay.captureAWS(AWS);

Umgekehrt haben Sie auch die Möglichkeit, einen einzelnen AWS-Service zu erfassen, indem Sie die captureAWSClient Methode, wenn Sie darauf achten wollen, wie viele Trace-Daten Sie erzeugen.

const s3 = AWSXRay.captureAWSClient(new S3());

AWS hat die Unterstützung für X-Ray auf viele seiner Services ausgeweitet. Wenn also, wie oben erwähnt, Ihre Anforderung in einem Service startet, für den X-Ray-Tracing aktiviert ist, werden auch Trace-Daten für die anderen von X-Ray unterstützten Services gesendet, die Ihre Anforderung berührt. Mit den zusätzlichen Erfassungsmethoden können Sie Ihre Traces auf alle AWS-Services ausweiten. Allerdings können Sie keine Anmerkungen und Metadaten aus diesen erfassten Services hinzufügen. Bei einigen Funktionen von S3 gibt es jedoch Ausnahmen von dieser Unterstützung. Aufgrund der Art und Weise, wie das S3 SDK geschrieben ist, gibt es einige Methoden und Verbindungen, die nicht aufgezeichnet werden (siehe interessante Probleme unten).

Weitergehen

Zusätzliche Ressourcen

Wenn Sie daran interessiert sind, weiter in das AWS X-Ray mit Lambda-Kaninchenloch hinabzusteigen, oder es vorziehen, auf eine andere Art und Weise zu lernen, habe ich viele der Ressourcen aufgenommen, die ich als hilfreich empfunden habe.

Videos
Artikel
Dokumente
Interessante Themen
Jessica Perina

Ein Software-Ingenieur, der meine Neugierde und meinen Wunsch zu lernen täglich nährt.



Zurück zu Blog