Überwachen einer Microservicesarchitektur in Azure Kubernetes Service (AKS)Monitoring a microservices architecture in Azure Kubernetes Service (AKS)

Dieser Artikel beschreibt Best Practices für die Überwachung einer Microservicesanwendung, die auf Azure Kubernetes Service (AKS) ausgeführt wird.This article describes best practices for monitoring a microservices application that runs on Azure Kubernetes Service (AKS).

In jeder komplexen Anwendung geht irgendwann etwas schief.In any complex application, at some point something will go wrong. In einer Microserviceanwendung ist es erforderlich, dass Sie nachverfolgen, was für Dutzende oder sogar Hunderte von Diensten passiert.In a microservices application, you need to track what's happening across dozens or even hundreds of services. Damit ermittelt werden kann, was vor sich geht, müssen Sie Telemetriedaten aus der Anwendung erfassen.To make sense of what's happening, you must collect telemetry from the application. Telemetrie kann in Protokolle und Metriken unterteilt werden.Telemetry can be divided into logs and metrics.

Protokolle sind textbasierte Datensätze mit Ereignissen, die eintreten, während die Anwendung ausgeführt wird.Logs are text-based records of events that occur while the application is running. Sie enthalten Dinge wie Anwendungsprotokolle (Überwachungsanweisungen) oder Webserverprotokolle.They include things like application logs (trace statements) or web server logs. Protokolle sind hauptsächlich für forensische Zwecke und die Analyse der Grundursache hilfreich.Logs are primarily useful for forensics and root cause analysis.

Metriken sind numerische Werte, die analysiert werden können.Metrics are numerical values that can be analyzed. Sie können sie verwenden, um das System in Echtzeit (bzw. nahezu in Echtzeit) zu beobachten oder Leistungstrends im Zeitverlauf zu analysieren.You can use them to observe the system in real time (or close to real time), or to analyze performance trends over time. Um das System ganzheitlich zu verstehen, müssen Sie von der physischen Infrastruktur bis zur Anwendung Metriken auf verschiedenen Ebenen der Architektur sammeln, einschließlich:To understand the system holistically, you must collect metrics at various levels of the architecture, from the physical infrastructure to the application, including:

  • Metriken auf Knotenebene, z.B. Auslastung von CPU, Arbeitsspeicher, Netzwerk, Datenträger und Dateisystem.Node-level metrics, including CPU, memory, network, disk, and file system usage. Systemmetriken fördern das Verständnis der Ressourcenzuteilung für die einzelnen Knoten im Cluster und ermöglichen die Problembehandlung bei Ausreißern.System metrics help you to understand resource allocation for each node in the cluster, and troubleshoot outliers.

  • ContainermetrikenContainer metrics. Für Anwendungen in Containern müssen Sie auch auf der Containerebene Metriken sammeln, nicht nur auf der VM-Ebene.For containerized applications, you need to collect metrics at the container level, not just at the VM level.

  • Anwendungsmetriken.Application metrics. Hierzu gehören alle Metriken, die für das Verständnis des Verhaltens eines Diensts relevant sind.This includes any metrics that are relevant to understanding the behavior of a service. Beispiele hierfür sind die Anzahl von in die Warteschlange eingereihten eingehenden HTTP-Anforderungen, die Anforderungswartezeit oder die Länge der Nachrichtenwarteschlange.Examples include the number of queued inbound HTTP requests, request latency, or message queue length. Anwendungen können auch benutzerdefinierte Metriken für die jeweilige Domäne erstellen, z.B. die Anzahl der pro Minute verarbeiteten Geschäftstransaktionen.Applications can also create custom metrics that are specific to the domain, such as the number of business transactions processed per minute.

  • Metriken abhängiger Dienste.Dependent service metrics. Dienste können externe Dienste oder Endpunkte aufrufen, z.B. verwaltete PaaS-Dienste oder SaaS-Dienste.Services may call external services or endpoints, such as managed PaaS services or SaaS services. Von Drittanbieterdiensten werden Metriken bereitgestellt oder auch nicht.Third-party services may or may not provide any metrics. Falls nicht, müssen Sie Ihre eigenen Anwendungsmetriken verwenden, um Statistiken in Bezug auf die Wartezeit und Fehlerrate nachzuverfolgen.If not, you'll have to rely on your own application metrics to track statistics for latency and error rate.

Überwachen des ClusterstatusMonitoring cluster status

Überwachen Sie den allgemeinen Zustand Ihrer Cluster mit Azure Monitor.Use Azure Monitor to monitor the overall health of your clusters. Der folgende Screenshot zeigt einen Cluster mit kritischen Fehlern in vom Benutzer bereitgestellten Pods.The following screenshot shows a cluster with critical errors in user-deployed pods.

Screenshot des Azure Monitor-Dashboards

Von hier aus können Sie weiter vordringen, um das Problem zu finden.From here, you can drill in further to find the issue. Wenn der Podstatus beispielsweise ImagePullBackoff lautet, bedeutet dies, dass Kubernetes das Containerimage nicht aus der Registrierung pullen konnte.For example, if the pod status is ImagePullBackoff, it means that Kubernetes could not pull the container image from the registry. Ein ungültiges Containertag oder ein Authentifizierungsfehler bei dem Versuch des Pullens aus der Registrierung könnte die Ursache sein.This could be caused by an invalid container tag or an authentication error trying to pull from the registry.

Beachten Sie, dass ein abstürzender Container den Containerzustand State = Waiting mit Reason = CrashLoopBackOff auslöst.Note that a container crashing will put the container state into State = Waiting,with Reason = CrashLoopBackOff. In einem typischen Szenario, in dem ein Pod Teil einer Replikatgruppe ist und die Wiederholungsrichtlinie Always lautet, wird dies nicht als Fehler im Clusterstatus angezeigt.For a typical scenario where a pod is part of a replica set and the retry policy is Always, this won't show as an error in the cluster status. Sie können jedoch Abfragen ausführen oder Warnungen für diese Bedingung einrichten.However, you can run queries or set up alerts for this condition. Weitere Informationen finden Sie unter Verstehen der Leistung von AKS-Clustern mit Azure Monitor für Container.For more information, see Understand AKS cluster performance with Azure Monitor for containers.

MetrikenMetrics

Sie sollten Azure Monitor verwenden, um Metriken für Ihre AKS-Cluster und alle anderen abhängigen Azure-Dienste zu sammeln und anzuzeigen.We recommend using Azure Monitor to collect and view metrics for your AKS clusters and any other dependent Azure services.

  • Aktivieren Sie für Cluster- und Containermetriken Azure Monitor für Container.For cluster and container metrics, enable Azure Monitor for containers. Wenn dieses Feature aktiviert ist, sammelt Azure Monitor mit der Metriken-API in Kubernetes Speicher- und Prozessormetriken von Controllern, Knoten und Containern.When this feature is enabled, Azure Monitor collects memory and processor metrics from controllers, nodes, and containers via the Kubernetes metrics API. Weitere Informationen zu den Metriken, die über Azure Monitor für Container verfügbar sind, finden Sie unter Verstehen der Leistung von AKS-Clustern mit Azure Monitor für Container.For more information about the metrics that are available through Azure Monitor for containers, see Understand AKS cluster performance with Azure Monitor for containers.

  • Sammeln Sie Anwendungsmetriken mithilfe von Application Insights.Use Application Insights to collect application metrics. Application Insights ist ein erweiterbarer Dienst zur Verwaltung der Anwendungsleistung (Application Performance Management, APM).Application Insights is an extensible Application Performance Management (APM) service. Für die Nutzung von Application Insights installieren Sie in Ihrer Anwendung ein Instrumentierungspaket.To use it, you install an instrumentation package in your application. Dieses Paket überwacht die App und sendet Telemetriedaten an den Application Insights-Dienst.This package monitors the app and sends telemetry data to the Application Insights service. Außerdem können hiermit per Pullvorgang Telemetriedaten aus der Hostumgebung abgerufen werden.It can also pull telemetry data from the host environment. Die Daten werden dann an Azure Monitor gesendet.The data is then sent to Azure Monitor. Application Insights verfügt auch über eine integrierte Korrelations- und Abhängigkeitsnachverfolgung (siehe Verteilte Ablaufverfolgung).Application Insights also provides built-in correlation and dependency tracking (see Distributed tracing, below).

Application Insights hat einen in Ereignissen/Sekunde gemessenen maximalen Durchsatz und drosselt ihn, wenn die Datenrate den Grenzwert überschreitet.Application Insights has a maximum throughput measured in events/second, and it throttles if the data rate exceeds the limit. Weitere Informationen finden Sie unter Application Insights-Grenzwerte.For details, see Application Insights limits. Erstellen Sie verschiedene Application Insights-Instanzen pro Umgebung, sodass Entwicklungs-/Testumgebungen nicht mit der Produktionstelemetrie um Kontingente konkurrieren.Create different Application Insights instances per environment, so that dev/test environments don't compete against the production telemetry for quota.

Ein einzelner Vorgang kann mehrere Telemetrieereignisse generieren, sodass die Anwendung wahrscheinlich gedrosselt wird, wenn die Menge an Datenverkehr sehr hoch ist.A single operation may generate several telemetry events, so if the application experiences a high volume of traffic, it is likely to get throttled. Zur Lösung dieses Problems können Sie den Telemetriedatenverkehr durch die Erstellung von Stichproben reduzieren.To mitigate this problem, you can perform sampling to reduce the telemetry traffic. Der Nachteil hierbei ist, dass Ihre Metriken weniger genau sind.The tradeoff is that your metrics will be less precise. Weitere Informationen finden Sie unter Erstellen von Stichproben in Application Insights.For more information, see Sampling in Application Insights. Sie können das Datenvolumen auch reduzieren, indem Sie Metriken vorab aggregieren. Hierzu berechnen Sie statistische Werte, z.B. die mittlere und die Standardabweichung, und senden diese Werte anstelle der Telemetrie-Rohdaten.You can also reduce the data volume by pre-aggregating metrics — that is, calculating statistical values such as average and standard deviation, and sending those values instead of the raw telemetry. Im folgenden Blogbeitrag wird ein Ansatz für die bedarfsabhängige Nutzung von Application Insights beschrieben: Azure Monitoring and Analytics at Scale (Bedarfsabhängige Nutzung der Azure-Überwachung und von Analytics).The following blog post describes an approach to using Application Insights at scale: Azure Monitoring and Analytics at Scale.

Wenn Ihre Datenrate hoch genug ist, um eine Drosselung auszulösen, und Sampling oder Aggregation nicht akzeptabel sind, sollten Sie den Export von Metriken in eine Zeitreihendatenbank wie Prometheus oder InfluxDB in Betracht ziehen, die im Cluster ausgeführt wird.If your data rate is high enough to trigger throttling, and sampling or aggregation are not acceptable, consider exporting metrics to a time-series database such as Prometheus or InfluxDB running in the cluster.

  • InfluxDB ist ein Push-basiertes System.InfluxDB is a push-based system. Die Metriken müssen von einem Agent per Pushvorgang übertragen werden.An agent needs to push the metrics. Sie können den TICK-Stapel verwenden, um die Überwachung von Kubernetes einzurichten, und für die Pushübertragung an InfluxDB können Sie Telegraf nutzen. Hierbei handelt es sich um einen Agent zum Erfassen und Melden von Metriken.You can use TICK stack, to setup monitoring of Kubernetes, and push it to InfluxDB using Telegraf, which is an agent for collecting and reporting metrics. InfluxDB kann für unregelmäßige Ereignisse und Zeichenfolgen-Datentypen verwendet werden.InfluxDB can be used for irregular events and string data types.

  • Prometheus ist ein Pull-basiertes System.Prometheus is a pull-based system. Hierbei werden Metriken per „Scraping“ regelmäßig von konfigurierten Speicherorten abgerufen.It periodically scrapes metrics from configured locations. Mit Prometheus können Metriken abgerufen werden, die mit cAdvisor oder kube-state-metrics generiert werden.Prometheus can scrape metrics generated by cAdvisor or kube-state-metrics. kube-state-metrics ist ein Dienst, mit dem Metriken vom Kubernetes-API-Server gesammelt und für Prometheus (oder einen Scraper, der mit einem Prometheus-Clientendpunkt kompatibel ist) zur Verfügung gestellt werden.kube-state-metrics is a service that collects metrics from the Kubernetes API server and makes them available to Prometheus (or a scraper that is compatible with a Prometheus client endpoint). Verwenden Sie für Systemmetriken den Node Exporter. Dies ist ein Prometheus-Exportprogramm für Systemmetriken.For system metrics, use Node exporter, which is a Prometheus exporter for system metrics. Prometheus unterstützt Gleitkommadaten, aber keine Zeichenfolgendaten, und ist daher nicht für Protokolle geeignet, sondern nur für Systemmetriken.Prometheus supports floating point data, but not string data, so it is appropriate for system metrics but not logs. Kubernetes Metrics Server ist ein clusterweiter Aggregator zum Zusammenfassen der Daten zur Ressourcenverwendung.Kubernetes Metrics Server is a cluster-wide aggregator of resource usage data.

ProtokollierungLogging

Zu einigen der allgemeinen Herausforderungen bei der Protokollierung in einer Microservicesanwendung zählen:Here are some of the general challenges of logging in a microservices application:

  • Verstehen der End-to-End-Verarbeitung einer Clientanforderung, bei der mehrere Dienste aufgerufen werden könnten, um eine einzelne Anforderung zu bearbeiten.Understanding the end-to-end processing of a client request, where multiple services might be invoked to handle a single request.
  • Konsolidierung von Protokollen aus mehreren Diensten in einer einzigen aggregierten Ansicht.Consolidating logs from multiple services into a single aggregated view.
  • Analysieren von Protokollen, die aus mehreren Quellen stammen, die eigene Protokollschemata verwenden oder kein bestimmtes Schema haben.Parsing logs that come from multiple sources, which use their own logging schemas or have no particular schema. Protokolle können von Drittanbieterkomponenten generiert werden, die Sie nicht steuern.Logs may be generated by third-party components that you don't control.
  • Microservicesarchitekturen erzeugen oft ein größeres Volumen an Protokollen als herkömmliche Monolithe, da es mehr Dienste, Netzwerkaufrufe und Schritte in einer Transaktion gibt.Microservices architectures often generate a larger volume of logs than traditional monoliths, because there are more services, network calls, and steps in a transaction. Das bedeutet, dass die Protokollierung selbst ein Leistungs- oder Ressourcenengpass für die Anwendung sein kann.That means logging itself can be a performance or resource bottleneck for the application.

Es gibt einige zusätzlichen Herausforderungen für eine Kubernetes-basierte Architektur:There are some additional challenges for a Kubernetes-based architecture:

  • Container können verschoben und neu geplant werden.Containers can move around and be rescheduled.
  • Kubernetes ist eine Netzwerkabstraktion, die virtuelle IP-Adressen und Portzuordnungen verwendet.Kubernetes has a networking abstraction that uses virtual IP addresses and port mappings.

In Kubernetes ist der Standardansatz für die Protokollierung, dass ein Container Protokolle in „stdout“ und „stderr“ schreibt.In Kubernetes, the standard approach to logging is for a container to write logs to stdout and stderr. Das Containermodul leitet diese Streams an einen Protokollierungstreiber weiter.The container engine redirects these streams to a logging driver. Um Abfragen zu erleichtern und den möglichen Verlust von Protokolldaten bei einem Absturz eines Knotens zu vermeiden, ist es üblich, die Protokolle von jedem Knoten zu sammeln und an einen zentralen Speicherort zu senden.For ease of querying, and to prevent possible loss of log data if a node crashes, the usual approach is to collect the logs from each node and send them to a central storage location.

Die Integration von Azure Monitor in AKS unterstützt diesen Ansatz.Azure Monitor integrates with AKS to support this approach. Azure Monitor sammelt Containerprotokolle und sendet sie an den Log Analytics-Arbeitsbereich.Azure Monitor collects container logs and sends them to a Log Analytics workspace. Von dort aus können Sie mit der Kusto-Abfragesprache auf die aggregierten Protokolle bezogene Abfragen schreiben.From there, you can use the Kusto query language to write queries across the aggregated logs. Dieses Beispiel einer Kusto-Abfrage ruft die Anzeige der Containerprotokolle für einen bestimmten Pod ab:For example, here is a Kusto query to show the container logs for a specified pod:

let ContainerIdList = KubePodInventory
| where ClusterName =~ '<cluster-name>'
| where Name =~ '<pod-name>'
| distinct ContainerID;
ContainerLog
| where ContainerID in (ContainerIdList)

Azure Monitor ist ein verwalteter Dienst, und die Konfiguration eines AKS-Clusters zur Verwendung von Azure Monitor ist ein einfacher Konfigurationsschalter in der CLI- oder Resource Manager-Vorlage.Azure Monitor is a managed service, and configuring an AKS cluster to use Azure Monitor is a simple configuration switch in the CLI or Resource Manager template. (Weitere Informationen finden Sie unter Aktivieren von Azure Monitor für Container.) Ein weiterer Vorteil der Verwendung von Azure Monitor ist die Konsolidierung Ihrer AKS-Protokolle mit anderen Protokollen der Azure-Plattform, sodass eine einheitliche Überwachungserfahrung entsteht.(For more information, see How to enable Azure Monitor for containers.) Another advantage of using Azure Monitoring is that it consolidates your AKS logs with other Azure platform logs, providing a unified monitoring experience.

Azure Monitor wird pro Gigabyte (GB) der vom Dienst erfassten Daten abgerechnet (siehe Azure Monitor – Preise).Azure Monitor is billed per gigabyte (GB) of data ingested into the service (see Azure Monitor pricing). Bei sehr hohen Volumen können die Kosten eine Rolle spielen.At very high volumes, cost may become a consideration. Für das Kubernetes-Ökosystem gibt es viele Open-Source-Alternativen.There are many open-source alternatives available for the Kubernetes ecosystem. Viele Organisationen verwenden z.B. Fluentd mit Elasticsearch.For example, many organizations use Fluentd with Elasticsearch. Fluentd ist ein Open-Source-Datensammler, und Elasticsearch ist eine Dokumentdatenbank für die Suche.Fluentd is an open-source data collector, and Elasticsearch is a document database that is for search. Eine Herausforderung bei diesen Optionen ist, dass sie zusätzliche Konfiguration und Verwaltung des Clusters erfordern.A challenge with these options is that they require additional configuration and management of the cluster. Für eine Produktionsworkload müssen Sie möglicherweise mit Konfigurationseinstellungen experimentieren.For a production workload, you may need to experiment with configuration settings. Sie müssen auch die Leistung der Protokollierungsinfrastruktur überwachen.You'll also need to monitor the performance of the logging infrastructure.

Application InsightsApplication Insights

Für umfangreichere Protokolldaten sollten Sie Ihren Code mit Application Insights instrumentieren.For richer log data, we recommend instrumenting your code with Application Insights. Dazu müssen Sie Ihrem Code ein Application Insights-Paket hinzufügen und ihn so konfigurieren, dass er Protokollierungsanweisungen an Application Insights sendet.This requires adding an Application Insights package to your code and configuring your code to send logging statements to Application Insights. Die Details hängen von der Plattform wie .NET, Java oder Node.js ab.The details depend on the platform, such as .NET, Java, or Node.js. Das Application Insights-Paket sendet Telemetriedaten an Azure Monitor.The Application Insights package sends telemetry data to Azure Monitor.

Wenn Sie .NET Core verwenden, sollten Sie auch die Application Insights for Kubernetes-Bibliothek verwenden.If you are using .NET Core, we recommend also using the Application Insights for Kubernetes library. Diese Bibliothek erweitert Application Insights-Ablaufverfolgungen um zusätzliche Informationen wie Container, Knoten, Pod, Bezeichnungen und Replikatgruppe.This library enriches Application Insights traces with additional information such as the container, node, pod, labels, and replica set.

Vorteile dieses Ansatzes:Advantages of this approach include:

  • Application Insights protokolliert HTTP-Anforderungen einschließlich Latenz und Ergebniscode.Application Insights logs HTTP requests, including latency and result code.
  • Verteilte Ablaufverfolgung ist standardmäßig aktiviert.Distributed tracing is enabled by default.
  • Ablaufverfolgungen enthalten eine Vorgangs-ID, damit Sie alle Ablaufverfolgungen für einen bestimmten Vorgang zuordnen können.Traces include an operation ID, so you can match all traces for a particular operation.
  • Von Application Insights generierte Ablaufverfolgungen haben oft zusätzliche Kontextinformationen.Traces generated by Application Insights often have additional contextual information. Beispielsweise werden ASP.NET-Ablaufverfolgungen mit dem Aktionsnamen und einer Kategorie wie ControllerActionInvoker versehen, die Ihnen Einblicke in die ASP.NET-Anforderungspipeline geben.For example, ASP.NET traces are decorated with the action name and a category such as ControllerActionInvoker, which give you insights into the ASP.NET request pipeline.
  • Application Insights sammelt Leistungsmetriken für die Leistungsproblembehandlung und -optimierung.Application Insights collects performance metrics for performance troubleshooting and optimization.

Überlegungen:Considerations:

  • Application Insights drosselt die Telemetriedaten, wenn die Datenrate einen bestimmten Höchstwert überschreitet. Ausführliche Informationen hierzu finden Sie unter Application Insights-Grenzwerte.Application Insights throttles the telemetry if the data rate exceeds a maximum limit; for details, see Application Insights limits. Ein einzelner Vorgang kann mehrere Telemetrieereignisse generieren, sodass die Anwendung wahrscheinlich gedrosselt wird, wenn die Menge an Datenverkehr sehr hoch ist.A single operation may generate several telemetry events, so if the application experiences a high volume of traffic, it is likely to get throttled.
  • Da Application Insights Daten in Batches zusammenfasst, kann ein Batch verloren gehen, wenn ein Prozess mit einem Ausnahmefehler abstürzt.Because Application Insights batches data, it's possible to lose a batch if a process crashes with an unhandled exception.
  • Application Insights wird auf Basis des Datenvolumens abgerechnet.Application Insights is billed based on data volume. Weitere Informationen finden Sie unter Verwalten von Preisen und Datenvolumen in Application Insights.For more information, see Manage pricing and data volume in Application Insights.

Strukturierte ProtokollierungStructured logging

Um die Analyse von Protokollen zu erleichtern, verwenden Sie nach Möglichkeit die strukturierte Protokollierung.To make logs easier to parse, use structured logging where possible. Strukturierte Protokollierung ist ein Ansatz, bei dem die Anwendung Protokolle in einem strukturierten Format wie z.B. JSON schreibt, anstatt unstrukturierte Textelemente auszugeben.Structured logging is approach where the application writes logs in a structured format, such as JSON, rather than outputting unstructured text strings. Es sind viele Bibliotheken zur strukturierten Protokollierung verfügbar.There are many structured logging libraries available. Diese Protokollierungsanweisung verwendet z.B. die Serilog-Bibliothek für .NET Core :For example, here is a logging statement that uses the Serilog library for .NET Core:

public async Task<IActionResult> Put([FromBody]Delivery delivery, string id)
{
    logger.LogInformation("In Put action with delivery {Id}: {@DeliveryInfo}", id, delivery.ToLogInfo());

    ...
}

Hier enthält der Aufruf von LogInformation einen Id- und einen DeliveryInfo-Parameter.Here, the call to LogInformation includes an Id parameter and DeliveryInfo parameter. Mit der strukturierten Protokollierung werden diese Werte nicht in die Meldungszeichenfolge interpoliert.With structured logging, these values are not interpolated into the message string. Stattdessen sieht die Protokollausgabe in etwa wie folgt aus:Instead, the log output will look something like this:

{"@t":"2019-06-13T00:57:09.9932697Z","@mt":"In Put action with delivery {Id}: {@DeliveryInfo}","Id":"36585f2d-c1fa-4a3d-9e06-a7f40b7d04ef","DeliveryInfo":{...

In dieser JSON-Zeichenfolge ist das @t-Feld ein Zeitstempel, @mt die Meldungszeichenfolge und die restlichen Schlüssel/Wert-Paare sind die Parameter.This is a JSON string, where the "@t" field is a timestamp, "@mt" is the message string, and the remaining key/value pairs are the parameters. Die Ausgabe im JSON-Format erleichtert die strukturierte Abfrage der Daten.Outputting JSON format makes it easier to query the data in a structured way. Die in der Kusto-Abfragesprache geschriebene folgende Log Analytics-Abfrage sucht beispielsweise nach Instanzen dieser bestimmten Nachricht aus allen Containern mit dem Namen fabrikam-delivery:For example, the following Log Analytics query, written in the Kusto query language, searches for instances of this particular message from all containers named fabrikam-delivery:

traces
| where customDimensions.["Kubernetes.Container.Name"] == "fabrikam-delivery"
| where customDimensions.["{OriginalFormat}"] == "In Put action with delivery {Id}: {@DeliveryInfo}"
| project message, customDimensions["Id"], customDimensions["@DeliveryInfo"]

Die Anzeige des Ergebnisses im Azure-Portal zeigt, dass DeliveryInfo ein strukturierter Datensatz ist, der die serialisierte Darstellung des DeliveryInfo-Modells enthält:Viewing the result in the Azure portal shows that DeliveryInfo is a structured record that contains the serialized representation of the DeliveryInfo model:

Screenshot des Log Analytics-Arbeitsbereichs

Dies ist der JSON-Code dieses Beispiels:Here is the JSON from this example:

{
    "Id": "36585f2d-c1fa-4a3d-9e06-a7f40b7d04ef",
    "Owner": {
        "UserId": "user id for logging",
        "AccountId": "52dadf0c-0067-43e7-af76-86e32b48bc5e"
    },
    "Pickup": {
        "Altitude": 0.29295161612934972,
        "Latitude": 0.26815900219052985,
        "Longitude": 0.79841844309047727
    },
    "Dropoff": {
        "Altitude": 0.31507750848078986,
        "Latitude": 0.753494655598651,
        "Longitude": 0.89352830773849423
    },
    "Deadline": "string",
    "Expedited": true,
    "ConfirmationRequired": 0,
    "DroneId": "AssignedDroneId01ba4d0b-c01a-4369-ba75-51bde0e76cc9"
}

Der vorherige Codeausschnitt verwendete die Serilog-Bibliothek, aber Bibliotheken für strukturierte Protokollierung sind auch für andere Sprachen verfügbar.The previous code snippet used the Serilog library, but structured logging libraries are available for other languages as well. Hier ist ein Beispiel mit der SLF4J-Bibliothek für Java:For example, here's an example using the SLF4J library for Java:

MDC.put("DeliveryId", deliveryId);

log.info("In schedule delivery action with delivery request {}", externalDelivery.toString());

Verteilte AblaufverfolgungDistributed tracing

Bei Microservices ist es eine bedeutende Herausforderung, den Fluss der Ereignisse über Dienste hinweg zu verstehen.A significant challenge of microservices is to understand the flow of events across services. Eine einzelne Transaktion kann Aufrufe mehrerer Dienste umfassen.A single transaction may involve calls to multiple services. Um die gesamte Schrittsequenz neu zu erstellen, sollte jeder Dienst eine Korrelations-ID verteilen, die als eindeutiger Bezeichner für diesen Vorgang dient.To reconstruct the entire sequence of steps, each service should propagate a correlation ID that acts as a unique identifier for that operation. Die Korrelations-ID ermöglicht die verteilte Ablaufverfolgung über Dienste hinweg.The correlation ID enables distributed tracing across services.

Der erste Dienst, der eine Clientanforderung empfängt, sollte die Korrelations-ID generieren.The first service that receives a client request should generate the correlation ID. Wenn der Dienst einen HTTP-Aufruf eines anderen Diensts durchführt, wird die Korrelations-ID in einem Anforderungsheader angeordnet.If the service makes an HTTP call to another service, it puts the correlation ID in a request header. Die Korrelations-ID wird in die Nachricht eingefügt, falls der Dienst eine asynchrone Nachricht sendet.If the service sends an asynchronous message, it puts the correlation ID into the message. Nachgeschaltete Dienste setzen die Verteilung der Korrelations-ID fort, sodass diese im gesamten System weitergegeben wird.Downstream services continue to propagate the correlation ID, so that it flows through the entire system. Außerdem sollte der gesamte Code, mit dem Anwendungsmetriken oder Protokollereignisse geschrieben werden, die Korrelations-ID enthalten.In addition, all code that writes application metrics or log events should include the correlation ID.

Wenn Dienstaufrufe korreliert werden, können Sie betriebsbezogene Metriken berechnen, z.B. die End-to-End-Wartezeit bis zum Abschluss einer Transaktion, die Anzahl von erfolgreichen Transaktionen pro Sekunde und den Prozentsatz fehlgeschlagener Transaktionen.When service calls are correlated, you can calculate operational metrics such as the end-to-end latency for a complete transaction, the number of successful transactions per second, and the percentage of failed transactions. Das Einfügen von Korrelations-IDs in Anwendungsprotokolle ermöglicht die Durchführung einer Analyse der Grundursache.Including correlation IDs in application logs makes it possible to perform root cause analysis. Wenn ein Vorgang fehlschlägt, können Sie die Protokollanweisungen für alle Dienstaufrufe ermitteln, die Teil desselben Vorgangs waren.If an operation fails, you can find the log statements for all of the service calls that were part of the same operation.

Sie sollten Application Insights für die verteilte Ablaufverfolgung verwenden.We recommend using Application Insights for distributed tracing. Mit dem Application Insights-SDK wird automatisch Korrelationskontext in HTTP-Header und die Korrelations-ID in Application Insights-Protokolle eingefügt.The Application Insights SDK automatically injects correlation context into HTTP headers, and includes the correlation ID in Application Insights logs. Einige Dienste müssen die Korrelationsheader abhängig von den verwendeten Frameworks und Bibliotheken möglicherweise noch explizit weitergeben.Some services may still need to explicitly propagate the correlation headers, depending on the frameworks and libraries being used. Weitere Informationen finden Sie unter Telemetriekorrelation in Application Insights.For more information, see Telemetry correlation in Application Insights.

Einige zusätzliche Überlegungen zur Implementierung der verteilten Ablaufverfolgung:Some additional considerations when implementing distributed tracing:

  • Nun gibt es einen HTTP-Standardheader für Korrelations-IDs, und ein W3C-Vorschlag wurde vor Kurzem als offizielle Empfehlung angenommen.There is now a standard HTTP header for correlation IDs, a W3C proposal has been accepted as an official recommendation recently. Ihr Team sollte standardmäßig einen benutzerdefinierten Headerwert verwenden.Your team should standardize on a custom header value. Treffen Sie die Wahl basierend auf Ihrem Framework für die Protokollierung, z.B. Application Insights, oder anhand Ihres Dienstnetzes.The choice may be decided by your logging framework, such as Application Insights, or choice of service mesh.

  • Falls Ihre Messaginginfrastruktur das Hinzufügen von Metadaten zu Nachrichten unterstützt, sollten Sie die Korrelations-ID für asynchrone Nachrichten in Form von Metadaten einbinden.For asynchronous messages, if your messaging infrastructure supports adding metadata to messages, you should include the correlation ID as metadata. Fügen Sie sie andernfalls als Teil des Nachrichtenschemas ein.Otherwise, include it as part of the message schema. Ein Beispiel finden Sie unter Verteilte Ablaufverfolgung und Korrelation über Service Bus-Messaging.For example, see Distributed tracing and correlation through Service Bus messaging.

  • Anstelle eines einzelnen Opaque-Bezeichners können Sie auch einen Korrelationskontext mit umfassenderen Informationen senden, z.B. Beziehungen zwischen Aufrufer und Aufgerufenem.Rather than a single opaque identifier, you might send a correlation context that includes richer information, such as caller-callee relationships.

  • Wenn Sie Istio oder linkerd als Dienstnetz verwenden, generieren diese Technologien automatisch Korrelationsheader, wenn HTTP-Aufrufe über die Dienstnetzproxys weitergeleitet werden.If you are using Istio or linkerd as a service mesh, these technologies automatically generate correlation headers when HTTP calls are routed through the service mesh proxies. Von den Diensten sollten jeweils die relevanten Header weitergeleitet werden.Services should forward the relevant headers.

Beispiel zur verteilten AblaufverfolgungExample of distributed tracing

In diesem Beispiel wird eine verteilte Transaktion durch eine Reihe von Microservices verfolgt.This example follows a distributed transaction through a set of microservices. Das Beispiel stammt aus einer Referenzimplementierung, die hier beschrieben ist.The example is taken from a reference implementation described here.

Drohnenlieferungsanwendung

In diesem Szenario hat die verteilte Transaktion folgende Schritte:In this scenario, the distributed transaction has the following steps:

  1. Der Ingestion-Dienst platziert eine Nachricht in einer Service Bus-Warteschlange.The Ingestion service puts a message on a Service Bus queue.
  2. Der Workflow-Dienst pullt die Nachricht aus der Warteschlange.The Workflow service pulls the message from the queue.
  3. Der Workflow-Dienst ruft drei Back-End-Dienste (Drone Scheduler, Package und Delivery) zur Verarbeitung der Anforderung auf.The Workflow service calls three backend services to process the request (Drone Scheduler, Package, and Delivery).

Der folgende Screenshot zeigt die Anwendungsübersicht für die Drone Delivery-Anwendung.The following screenshot shows the application map for the Drone Delivery application. Diese Karte zeigt Aufrufe des öffentlichen API-Endpunkts, die zu einem Workflow mit fünf Microservices führen.This map shows calls to the public API endpoint that result in a workflow that involves five microservices.

Anwendungszuordnung

Die auf eine Service Bus-Warteschlange weisenden Pfeile von fabrikam-workflow und fabrikam-ingestion zeigen, wo die Nachrichten gesendet und empfangen werden.The arrows from fabrikam-workflow and fabrikam-ingestion to a Service Bus queue show where the messages are sent and received. Aus dem Diagramm geht nicht hervor, welcher Dienst Nachrichten sendet und welcher sie empfängt — die Pfeile zeigen nur, dass beide Dienste den Service Bus aufrufen — aber diese Informationen sind in den Details verfügbar:You can't tell from the diagram which service is sending messages and which is receiving — the arrows just show that both services are calling Service Bus — but this information is available in the details:

Anwendungszuordnung

Da jeder Aufruf eine Vorgangs-ID enthält, können Sie auch die End-to-End-Schritte in einer einzelnen Transaktion einschließlich Informationen zum Timing und der HTTP-Aufrufe bei jedem Schritt anzeigen.Because every call includes an operation ID, you can also view the end-to-end steps in a single transaction, including timing information and the HTTP calls at each step. Hier ist die Visualisierung einer solchen Transaktion:Here is the visualization of one such transaction:

End-to-End-Transaktion

Diese Visualisierung zeigt die Schritte vom Ingestion-Dienst zur Warteschlange, von der Warteschlange zum Workflow-Dienst und vom Workflow-Dienst zu den anderen Back-End-Diensten.This visualization shows the steps from the ingestion service to the queue, from the queue to the workflow service, and from the workflow service to the other backend services. Im letzten Schritt markiert der Workflow-Dienst die Service Bus-Nachricht als abgeschlossen.The last step is the Workflow service marking the Service Bus message as completed.

In diesem Beispiel sind bei Aufrufen eines Back-End-Diensts Fehler aufgetreten:Now here is an example when calls to a backend service were failing:

Anwendungsübersicht mit Fehlern

Hier ist zu erkennen, dass während des Abfragezeitraums bei einem großen Teil (36%) der Aufrufe des Drone Scheduler-Diensts Fehler aufgetreten sind.This shows that a large fraction (36%) of calls to the Drone Scheduler service failed during the period being queried. Die End-to-End-Transaktionsansicht zeigt, dass beim Senden einer HTTP-PUT-Anfrage an den Dienst ein Ausnahmefehler aufgetreten ist.In the end-to-end transaction view, it shows that an exception occurs when sending an HTTP PUT request to the service.

End-to-End-Transaktion

Bei weiterer Nachforschung wird der Ausnahmefehler als Socketausnahmefehler identifiziert: „Gerät oder Adresse nicht vorhanden“.Further drilling in, the exception turns out to be a socket exception, "No such device or address."

Fabrikam.Workflow.Service.Services.BackendServiceCallFailedException: Gerät oder Adresse nicht vorhanden ---u003e System.Net.Http.HttpRequestException: Gerät oder Adresse nicht vorhanden ---u003e System.Net.Sockets.SocketException: Gerät oder Adresse nicht vorhandenFabrikam.Workflow.Service.Services.BackendServiceCallFailedException: No such device or address ---u003e System.Net.Http.HttpRequestException: No such device or address ---u003e System.Net.Sockets.SocketException: No such device or address

Dies ist ein Hinweis darauf, dass der Back-End-Dienst nicht erreichbar ist.This is a hint that the backend service is not reachable. An diesem Punkt könnten Sie „kubectl“ verwenden, um die Bereitstellungskonfiguration anzuzeigen.At this point, you might use kubectl to view the deployment configuration. In diesem Beispiel stellte sich heraus, dass der Diensthostname aufgrund eines Fehlers in den Kubernetes-Konfigurationsdateien nicht aufgelöst wurde.In this example, it turned out the service hostname was not resolving, due to an error in the Kubernetes configuration files. Der Artikel Debug Services (Debugdienste) in der Kubernetes-Dokumentation enthält Tipps zum Diagnostizieren dieser Art von Fehlern.The article Debug Services in the Kubernetes documentation has tips for diagnosing this sort of error.

Im Folgenden finden Sie einige häufige Fehlerursachen:Here are some common causes of errors:

  • Fehler im Code.Code bugs. Diese könnten sich zeigen als:These might manifest as:
    • Ausnahmen.Exceptions. Untersuchen Sie die Details der Ausnahme in den Application Insights-Protokollen.Look in the Application Insights logs to view the exception details.
    • Prozessabstürze.Process crashing. Sehen Sie sich den Status von Containern und Pods an, und untersuchen Sie Containerprotokolle oder Application Insights-Ablaufverfolgungen.Look at container and pod status, and view container logs or Application Insights traces.
    • HTTP 5xx-FehlerHTTP 5xx errors
  • Ressourcenauslastung:Resource exhaustion:
    • Achten Sie auf Drosselung (HTTP 429) oder Timeoutanforderungen.Look for throttling (HTTP 429) or request timeouts.
    • Überprüfen Sie die Containermetriken für CPU, Arbeitsspeicher und Datenträger.Examine container metrics for CPU, memory, and disk
    • Achten Sie auf die Konfigurationen für Container- und Podressourcenlimits.Look at the configurations for container and pod resource limits.
  • Dienstermittlung:Service discovery. Überprüfen Sie die Kubernetes-Dienstkonfiguration und Portzuordnungen.Examine the Kubernetes service configuration and port mappings.
  • API-Konflikt.API mismatch. Suchen Sie nach HTTP 400-Fehlern.Look for HTTP 400 errors. Wenn die Versionen der APIs angegeben sind, überprüfen Sie, welche Version aufgerufen wird.If APIs are versioned, look at which version is being called.
  • Fehler beim Pullen eines Containerimages.Error pulling a container image. Sehen Sie sich die Podspezifikation an.Look at the pod specification. Stellen Sie außerdem sicher, dass der Cluster zum Pullen aus der Containerregistrierung autorisiert ist.Also make sure the cluster is authorized to pull from the container registry.
  • RBAC-Probleme.RBAC issues.

Nächste SchritteNext steps

Weitere Informationen zu den Features in Azure Monitor, die die Überwachung von Anwendungen in AKS unterstützen, finden Sie hier:Learn more about features in Azure Monitor that support monitoring of applications on AKS:

Weitere Informationen zur Verwendung von Metriken für die Leistungsoptimierung finden Sie unter Leistungsoptimierung für eine verteilte Anwendung.For more information about using metrics for performance tuning, see see Performance tuning a distributed application.