Blog

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

Jessica Perina
June 10, 2020

AWS X-Ray mit Lambda ist der einfachste Weg, um mit der Verfolgung einer einfachen Funktion oder verteilter Dienste zu beginnen. Warum? Weil es direkt eingebaut ist und kostenlos* ist!

Shaq Shimmy

Ich werde Ihnen erklären, 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 debuggen. Abschließend möchte ich auf einige Dinge hinweisen, auf die Sie achten sollten, und Ressourcen teilen, die ich als hilfreich empfunden habe.*Für AWS X-Ray gibt es ein unbefristetes kostenloses Kontingent. Die ersten 100.000 aufgezeichneten Spuren und die 1.000.000 Spuren, die jeden Monat abgerufen oder gescannt werden, sind kostenlos. Sie können Stichprobenregeln verwenden, um die Anzahl der AWS-Datensätze für Traces zu kontrollieren. Trace-Daten werden 30 Tage lang gespeichert.

Warum sollten Sie sich mit X-Ray beschäftigen?

Wir wissen, dass die Nutzung der „Cloud“ für Ihre Anwendung Ihnen Zeit, Geld und Kopfschmerzen ersparen kann. Wenn Sie diese Strategie verwenden, geben Sie jedoch eine gewisse Kontrolle darüber auf, wie der gesamte Anforderungszyklus angezeigt wird und wie eine Anfrage zwischen den verschiedenen Diensten in Ihrer App übertragen wird. Daher kann es schwierig sein, Probleme aufzuspüren, wenn sie auftreten.

Möchten Sie den Zustand Ihrer Bewerbung auf einen Blick sehen können? Vielleicht möchten Sie die Fehler, die Sie bereitstellen, aufspüren und beheben. Oder vielleicht sind Sie eher daran interessiert, Ihre App im Hinblick auf die Leistung zu optimieren. Ich mag es nicht, mehrere Serverprotokolle zu durchsuchen. Tun Sie das? 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 die Zeit für die Implementierung dieser Art der Überwachung NICHT der Zeitpunkt ist, an dem Sie erkennen, dass Sie Daten benötigen, um eine geschäftskritische Entscheidung zu treffen oder einen kniffligen Fehler aufzuspüren. Richten Sie X-Ray ein, bevor Sie denken, dass Sie es benötigen. Du wirst froh sein, dass du es getan hast. Mein Kollege Trung hat darüber geschrieben, wie sein Team AWS-X-Ray in unserer Haupt-App implementiert hat und es verwendet, um löse einige der Probleme oben erwähnt. 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 nachverfolgbar sind.

Wie bringt man die Röntgen-Trace-Daten zum Fließen?

Lassen Sie uns zum Aufbau kommen.

1. Gehen Sie zu der Seite, auf der Ihre Lambda-Funktionen aufgeführt sind.

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

3. Scrollen Sie an Ihrem Funktionscode vorbei zum Feld mit der Bezeichnung AWS X-Ray und klicken Sie auf das Feld „Active Tracing“.

4. Speichern

DAS IST ES!

Boom. Easy as that.

Die oben genannten Schritte eignen sich hervorragend für ein persönliches Projekt. In einer professionellen Umgebung, wenn Sie in großem Maßstab mit mehreren Umgebungen arbeiten, sollten Sie jedoch als letztes auf eine Reihe von Schaltflächen in AWS klicken. FloQast hat ein großartiges DevOps-Team, das sich ausschließlich um diese Effizienz und die Einrichtung von Infrastructure as Code (iSAC) kümmert. Wir verwenden Terraform, um die Erstellung unserer AWS-Services und die Aktivierung von Optionen wie Active Tracing abzuwickeln. Wenn Sie die Eigenschaft `tracing_config` in Ihrer Terraform auf „Aktiv“ setzen, sollten Sie die obigen Schritte ohne einen einzigen Klick ausführen. Schauen Sie sich ein Beispiel für eines unserer Lambda-Terraforms an oder Sie können Schauen Sie sich die Terraform-Dokumente an.

resource "aws_lambda_function" "gl_core" {
  function_name = "gl_core-${var.environment}"
  filename      = "example.zip"
  role          = "${aws_iam_role.lambda_role.arn}"
  handler       = "index.handler"
  runtime       = "nodejs10.x"
  memory_size   = "1024"
  timeout       = "900"

  description = "GL Core Lambda - Managed by 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}"
  }

  lifecycle {
    ignore_changes = [
      "filename"
    ]
  }

  tracing_config {
    mode = "Active"
  }

}

Wenn Sie neugierig sind und mehr über iSAC erfahren möchten, haben wir für Sie abgedeckt.

Sie haben X-Ray jetzt für Ihre Lambda-Funktion aktiviert. (Möglicherweise wird eine Meldung angezeigt, dass die Ausführungsrolle Ihrer Funktion nicht berechtigt ist, Trace-Daten an X-Ray zu senden, aber AWS wird versuchen, diese Berechtigung automatisch für Sie der Rolle hinzuzufügen.) Wenn Sie auf die Schaltfläche „Spuren in X-Ray anzeigen“ klicken, gelangen Sie zur X-Ray-Konsole.

Du kannst hier aufhören, wenn du willst. Wenn Sie nichts anderes tun, haben Sie immer noch die Möglichkeit, über die X-Ray-Konsole wertvolle Einblicke in Ihre Anwendung zu gewinnen. X-Ray setzt diese Traces auch über andere AWS-Services fort, mit denen Ihr Lambda interagiert und die über X-Ray verfügen Unterstützung.

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

Es ist zwar hilfreich zu wissen, wann Ihre App Fehler ausgibt, aber es kann dennoch schwierig sein, herauszufinden, was vor sich geht, wenn die Probleme nur sporadisch auftreten. X-Ray mit Lambda bietet Ihnen sofort die Grundlagen, ist jedoch 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 für Sie eingerichtete Hauptuntersegment Invocation um zusätzliche Untersegmente für Downstream-Aufrufe, Anmerkungen und Metadaten zu erweitern.

Mit anderen Worten, Sie können X-Ray anweisen, alle gewünschten Daten zu verfolgen und zu verfolgen. Neugierig, wie lange eine Reihe von Anrufen dauert? Wickeln Sie es in ein Untersegment ein und X-Ray wird Sie darüber informieren. Möchten Sie sehen, ob sich all diese Fehler auf denselben Kunden beziehen? Erstellen Sie ein Untersegment, das eine Kunden-ID als Anmerkung enthält, die in der X-Ray-Konsole durchsucht werden können und zum Gruppieren Ihrer Spuren verwendet werden können. Möchten Sie den Überblick über einige allgemeine Anforderungsinformationen behalten, die Sie nicht benötigen, um in X-Ray durchsucht werden zu können? Fügen Sie ein Untersegment mit einigen Metadaten hinzu. Gestatten Sie mir, Ihnen einige Beispiele dafür zu zeigen, wie mein Team X-Ray mit unseren Lambdas verwendet.

Jetzt, wo du es hast, wie benutzt du es?

Unten sehen Sie die X-Ray-Konsole und zwei Lambda-basierte Dienste, die Tracing aktiviert haben. Einer sieht gesund aus. Die andere, nicht so sehr. Gehen wir beide durch.

Full X-Ray service map

Der Top-Service ist fast ausschließlich in der AWS-Welt angesiedelt und nutzt Lambdas, SSM und DynamoBD. Der zweite Dienst verwendet ein Lambda, um Anfragen von einer einzigen Drittanbieter-API zu stellen. Fangen wir mit dem gesunden Service an. Wenn Sie einen Knoten auf der Servicekarte auswählen, wird ein Popup mit einem Diagramm und einigen Optionen angezeigt.

Hier sieht alles gut aus

AWS X-Ray Service Map with node selected

Die Grafik zeigt die Latenz. Die Zeitspanne zwischen dem Start einer Anfrage und ihrem Abschluss. Die meisten Anfragen an dieses spezielle Lambda benötigen etwa 5,7 Sekunden, um abgeschlossen zu sein. Von hier aus können wir auf die Schaltfläche „Spuren anzeigen“ klicken, um einzelne Spuren anzuzeigen.

AWS X-Ray list of traces

Auf der Seite „Traces“ finden Sie eine Liste mit ausgewählten Anfragen mit einer Reihe zusätzlicher Informationen. Sie fragen sich vielleicht, warum die durchschnittliche Reaktionszeit hier 45 ms beträgt, als ich Ihnen gerade sagte, dass der erste Lambda-Knoten etwa fünfeinhalb Sekunden dauert. Die kürzere Antwortzeit stammt vom Lambda-Serviceknoten und zeigt, wie lange der Lambda-Service gebraucht hat, um zu antworten und unsere Lambda-Funktion zu starten. Lambda fügt Ihrer Service Map immer zwei Knoten hinzu. Die erste zeigt, wie lange es gedauert hat, den Dienst zu starten, wie lange er gewartet hat (Verweilzeit) und wie lange die Ausführung Ihrer Lambda-Funktion gedauert hat. Hier sehen Sie auch die Anzahl der Versuche, die Ihr Lambda unternommen hat, da Wiederholungsversuche eingebaut sind.

Lambda Service Node Trace Section

Wenn wir diesen Trace weiter unten betrachten, können wir außerdem jeden Schritt im Anforderungszyklus sehen, von dem Sie unten eine kleine Auswahl sehen können.

Individual trace info

Wie ich bereits erwähnt habe, können wir die Interaktionen zwischen den meisten AWS-Services kostenlos verfolgen, 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 bestimmt waren, ohne unsere Logs zu durchsuchen. Um dies zu erreichen, haben wir das AWS-SDK und Untersegmente verwendet. Kurz bevor wir den API-Aufruf tätigen, richten wir ein Untersegment 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 des Traces auswählen, werden weitere Informationen dazu angezeigt, einschließlich unserer ID-Anmerkung. Sehr praktisch, wenn wir irgendwelche Probleme sehen.

Der rote Ring der Verzweiflung

Bugs, Defekte, Randfälle, Benutzerfehler... all dies wird irgendwann in Ihrer App auftauchen, also seien Sie darauf vorbereitet. X-Ray kann Ihnen helfen, Probleme zu lokalisieren und schneller zu debuggen. Schauen wir uns den zweiten, nicht so gesunden Service an. Sie können sofort sehen, dass hier etwas nicht stimmt. Die farbigen Ringe geben die Fehler- oder Störungsrate an jedem Knoten an. In den Servicedetails können Sie einen Antwortstatus auswählen, nach dem gefiltert werden soll, bevor Sie auf „Traces anzeigen“ klicken, sodass Sie sich auf die Problemstellen konzentrieren können.

AWS X-Ray unhealthy app with errors

Wenn wir eine dieser Spuren untersuchen, können wir feststellen, dass der Fehler von einem Aufruf unserer Drittanbieter-API herrührt, der einen Fehler in unserem Lambda auslöst. Wenn wir den Mauszeiger über das Fehlersymbol bewegen, wird die Fehlermeldung „Error Unauthorized“ angezeigt. Der Abschnitt mit der Bezeichnung Konten ist ein weiteres benutzerdefiniertes Untersegment, das eingerichtet wurde, um uns dabei zu helfen, nicht nur den API-Aufruf und den daraus resultierenden Datenabruf zu planen, sondern auch die Verarbeitung der Daten, wenn wir sie erhalten. Wenn wir darauf klicken, erhalten wir weitere Informationen zu dem Fehler.

AWS X-Ray fault trace

Der Übersichts-Tab von X-Ray gibt uns einige allgemeine Informationen über den ausgewählten Knoten, von denen wir die meisten bereits anhand der Trace-Details sehen können. Es lohnt sich, die Segment- und Eltern-IDs zu notieren. Auf diese Weise verfolgt X-Ray alle Anrufe zwischen Diensten und erstellt Traces und Service-Maps. Die Informationen, die wir benötigen, befinden sich jedoch auf der Registerkarte Ausnahmen.

X-Ray Overview Tab

Der Ausnahmen-Tab von X-Ray zeigt uns den gesamten Stack-Trace und wir mussten kein einziges Serverprotokoll durchsuchen! Angesichts der vielen Fehler, die auftreten, besteht unser nächster Schritt darin, die Anmerkungen und Metadaten auf hilfreiche Informationen zu überprüfen, die dem Untersegment hinzugefügt wurden, z. B. eine Kundennummer. Darüber hinaus könnten wir die Traces auf der Hauptverfolgungsseite für diesen Service sogar nach einer Kunden-ID-Anmerkung gruppieren. Dann können wir sehen, ob alle unsere Probleme aus derselben Quelle stammen.

AWS X-Ray exceptions tab

Dinge, die Sie beachten und auf die Sie achten sollten

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 Ablaufverfolgungsdaten an X-Ray. Der Upstream-Dienst, wie API Gateway, oder eine auf EC2 gehostete Anwendung, die mit dem X-Ray SDK instrumentiert ist, tastet eingehende Anfragen ab und fügt einen Tracing-Header hinzu, der Lambda anweist, Traces zu senden oder nicht. Wenn Sie jedoch etwas Spezifisches für Ihr Lambda über ein Subsegment verfolgen möchten, müssen Sie dennoch das X-Ray SDK verwenden. In ähnlicher Weise ist das X-Ray SDK auch für AWS-Services erforderlich, die keine native Unterstützung für X-Ray bieten, wie CloudWatch und S3. Um dies zu erreichen, nutzen Sie die AWS erfassen Methode zur Verfolgung aller AWS-Services.

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

OR

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 den AWS-Client erfassen Methode, wenn Sie darauf achten möchten, wie viele Trace-Daten Sie generieren.

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

AWS hat die Unterstützung für X-Ray auf viele seiner Dienste ausgeweitet. Wenn Ihre Anfrage also, wie oben erwähnt, in einem Dienst gestartet wird, für den X-Ray Tracing aktiviert ist, werden Trace-Daten auch für die anderen von X-Ray unterstützten Dienste gesendet, die Ihre Anfrage berührt. Durch Hinzufügen der Erfassungsmethoden können Sie Ihre Traces auf alle AWS-Services ausdehnen. Sie können jedoch keine Anmerkungen und Metadaten von diesen erfassten Diensten hinzufügen. Insbesondere gibt es in einigen Funktionen von S3 Ausnahmen von dieser Unterstützung. Aufgrund der Art und Weise, wie das S3 SDK geschrieben ist, gibt es einige Methoden und Verbindungen, die nicht verfolgt werden können (siehe interessante Probleme unten).

Keep Goin

Zusätzliche Ressourcen

Wenn Sie daran interessiert sind, AWS X-Ray mit Lambda Rabbit Hole weiter zu entwickeln, oder wenn Sie es vorziehen, auf andere Weise zu lernen, habe ich viele der Ressourcen aufgenommen, die ich als hilfreich empfunden habe.

Videos
Artikel
Dokumente
Interessante Themen