Monitorização de uma arquitetura de microsserviços no Azure Kubernetes Service (AKS)Monitoring a microservices architecture in Azure Kubernetes Service (AKS)

Este artigo descreve as melhores práticas para monitorizar uma aplicação de microsserviços que executa no Azure Kubernetes Service (AKS).This article describes best practices for monitoring a microservices application that runs on Azure Kubernetes Service (AKS).

Em qualquer aplicativo complexo, em algum momento algo dê errado.In any complex application, at some point something will go wrong. Num aplicativo de microsserviços, precisa controlar o que está acontecendo em dezenas ou até mesmo centenas de serviços.In a microservices application, you need to track what's happening across dozens or even hundreds of services. Para fazer sentido do que está acontecendo, tem de recolher telemetria da aplicação.To make sense of what's happening, you must collect telemetry from the application. Telemetria pode ser dividida em logs e métricas.Telemetry can be divided into logs and metrics.

Registos são baseados em texto registos de eventos que ocorrem enquanto a aplicação está em execução.Logs are text-based records of events that occur while the application is running. Eles incluem coisas como registos de aplicações (declarações de rastreio) ou de registos do servidor web.They include things like application logs (trace statements) or web server logs. Os registos são úteis principalmente para analisar a causa forense e de raiz.Logs are primarily useful for forensics and root cause analysis.

Métricas são valores numéricos que podem ser analisados.Metrics are numerical values that can be analyzed. Pode usá-los para observar o sistema em tempo real (ou quase em tempo real) ou para analisar as tendências de desempenho ao longo do tempo.You can use them to observe the system in real time (or close to real time), or to analyze performance trends over time. Para compreender o sistema holística, tem de recolher métricas de vários níveis da arquitetura, da infraestrutura física para o aplicativo, incluindo:To understand the system holistically, you must collect metrics at various levels of the architecture, from the physical infrastructure to the application, including:

  • Ao nível do nó métricas, como CPU, memória, rede, disco e utilização do sistema de ficheiros.Node-level metrics, including CPU, memory, network, disk, and file system usage. As métricas do sistema ajudá-lo a compreender a alocação de recursos para cada nó do cluster e resolver problemas de valores atípicos.System metrics help you to understand resource allocation for each node in the cluster, and troubleshoot outliers.

  • Contentor métricas.Container metrics. Para aplicações em contentores, terá de recolher as métricas ao nível do contentor, não apenas no nível da VM.For containerized applications, you need to collect metrics at the container level, not just at the VM level.

  • Aplicação métricas.Application metrics. Isto inclui qualquer métricas que são relevantes para compreender o comportamento de um serviço.This includes any metrics that are relevant to understanding the behavior of a service. Os exemplos incluem o número de pedidos de HTTP de entrada em fila, a latência de pedidos ou o comprimento da fila de mensagens.Examples include the number of queued inbound HTTP requests, request latency, or message queue length. Aplicativos também podem criar métricas personalizadas que são específicas para o domínio, como o número de transações comerciais processados por minuto.Applications can also create custom metrics that are specific to the domain, such as the number of business transactions processed per minute.

  • Serviço dependente métricas.Dependent service metrics. Os serviços podem chamar serviços externos ou pontos de extremidade, como os serviços PaaS geridos ou serviços SaaS.Services may call external services or endpoints, such as managed PaaS services or SaaS services. Serviços de terceiros podem ou não fornecer todas as métricas.Third-party services may or may not provide any metrics. Caso contrário, terá que se baseiam nas suas próprias métricas de aplicação para controlar as estatísticas de latência e a taxa de erros.If not, you'll have to rely on your own application metrics to track statistics for latency and error rate.

Monitorização do Estado do clusterMonitoring cluster status

Uso [do Azure Monitor] azure-monitor para monitorizar o estado de funcionamento geral dos seus clusters.Use Azure Monitor to monitor the overall health of your clusters. Captura de ecrã seguinte mostra um cluster com os erros críticos de pods implementadas no utilizador.The following screenshot shows a cluster with critical errors in user-deployed pods.

Dashboard de captura de ecrã do Azure Monitor

A partir daqui, pode explorar mais localizar o problema.From here, you can drill in further to find the issue. Por exemplo, se o estado de pod é ImagePullBackoff, significa que o Kubernetes não foi possível solicitar a imagem de contentor do registo.For example, if the pod status is ImagePullBackoff, it means that Kubernetes could not pull the container image from the registry. Isto pode ser causado por uma marca de contentor inválido ou um erro de autenticação que tentar solicitar do registo.This could be caused by an invalid container tag or an authentication error trying to pull from the registry.

Tenha em atenção que um contentor que falham irá colocar o estado do contentor para o State = Waiting, com Reason = CrashLoopBackOff.Note that a container crashing will put the container state into State = Waiting,with Reason = CrashLoopBackOff. Para um cenário típico em que um pod é parte de uma réplica conjunto e a política de repetição é Always, isso não mostrará como um erro no estado do cluster.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. No entanto, pode executar consultas ou configurar alertas para esta condição.However, you can run queries or set up alerts for this condition. Para obter mais informações, consulte desempenho com o Azure Monitor para contentores de cluster do AKS compreender.For more information, see Understand AKS cluster performance with Azure Monitor for containers.

MétricasMetrics

Recomendamos que utilize [do Azure Monitor] azure-monitor para recolher e visualizar as métricas para os clusters do AKS e quaisquer outros serviços do Azure dependentes.We recommend using Azure Monitor to collect and view metrics for your AKS clusters and any other dependent Azure services.

  • Para métricas de cluster e contentores, ative Monitor do Azure para contentores.For cluster and container metrics, enable Azure Monitor for containers. Quando esta funcionalidade está ativada, o Monitor do Azure recolhe métricas de memória e processador de controladores, nós e contentores através da API de métricas do Kubernetes.When this feature is enabled, Azure Monitor collects memory and processor metrics from controllers, nodes, and containers via the Kubernetes metrics API. Para obter mais informações sobre as métricas que estão disponíveis através do Azure Monitor para contentores, consulte desempenho com o Azure Monitor para contentores de cluster do AKS compreender.For more information about the metrics that are available through Azure Monitor for containers, see Understand AKS cluster performance with Azure Monitor for containers.

  • Uso Application Insights para recolher métricas de aplicação.Use Application Insights to collect application metrics. O Application Insights é um serviço de gestão de desempenho de aplicações (APM) extensível.Application Insights is an extensible Application Performance Management (APM) service. Para usá-lo, instalar um pacote de instrumentação na sua aplicação.To use it, you install an instrumentation package in your application. Este pacote monitoriza a aplicação e envia dados de telemetria para o serviço do Application Insights.This package monitors the app and sends telemetry data to the Application Insights service. Ele também pode extrair dados de telemetria a partir do ambiente anfitrião.It can also pull telemetry data from the host environment. Os dados, em seguida, são enviados para o Azure Monitor.The data is then sent to Azure Monitor. O Application Insights também fornece correlação incorporada e rastreamento de dependências (consulte rastreio distribuído, abaixo).Application Insights also provides built-in correlation and dependency tracking (see Distributed tracing, below).

O Application Insights tem um débito máximo medido em eventos/segundo e limita-se a taxa de dados exceder o limite.Application Insights has a maximum throughput measured in events/second, and it throttles if the data rate exceeds the limit. Para obter detalhes, consulte limita do Application Insights.For details, see Application Insights limits. Crie instâncias diferentes do Application Insights por ambiente, para que os ambientes de desenvolvimento/teste não competem contra a telemetria de produção de quota.Create different Application Insights instances per environment, so that dev/test environments don't compete against the production telemetry for quota.

Uma única operação pode gerar vários eventos de telemetria, portanto, se a aplicação apresentar um grande volume de tráfego, é provável que são limitados.A single operation may generate several telemetry events, so if the application experiences a high volume of traffic, it is likely to get throttled. Para atenuar este problema, pode executar a amostragem para reduzir o tráfego de telemetria.To mitigate this problem, you can perform sampling to reduce the telemetry traffic. A desvantagem é que as suas métricas serão menos precisas.The tradeoff is that your metrics will be less precise. Para obter mais informações, consulte amostragem no Application Insights.For more information, see Sampling in Application Insights. Também pode reduzir o volume de dados, as métricas de pré-agregar — ou seja, o cálculo estatísticos valores como média e o desvio-padrão e enviar esses valores em vez da telemetria não processada.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. A seguinte mensagem de blogue descreve uma abordagem para usar o Application Insights à escala: Monitorização do Azure e análises em escala.The following blog post describes an approach to using Application Insights at scale: Azure Monitoring and Analytics at Scale.

Se a taxa de dados for suficientemente elevada a limitação de Acionador e amostragem ou agregação não são aceitáveis, considerar a exportação de métricas para uma base de dados de séries de tempo, tal como Prometheus ou InfluxDB em execução no o cluster.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 é um sistema baseado em push.InfluxDB is a push-based system. Precisa de um agente enviar por push as métricas.An agent needs to push the metrics. Pode usar Heapster, que é um serviço que recolhe métricas de todo o cluster de kubelet, agrega os dados e envia-o para InfluxDB ou outra solução de armazenamento da série de tempo.You can use Heapster, which is a service that collects cluster-wide metrics from kubelet, aggregates the data, and pushes it to InfluxDB or other time-series storage solution. O Azure Container Service implementa Heapster como parte da configuração do cluster.Azure Container Service deploys Heapster as part of the cluster setup. Outra opção é Telegraf, que é um agente para recolher e métricas de relatórios.Another option is Telegraf, which is an agent for collecting and reporting metrics.

  • Prometheus é um sistema baseado em extração.Prometheus is a pull-based system. Ele scrapes periodicamente as métricas de localizações configuradas.It periodically scrapes metrics from configured locations. Prometheus pode extrair métricas geradas por cAdvisor ou métricas de estado do kube.Prometheus can scrape metrics generated by cAdvisor or kube-state-metrics. [métricas de estado de kube] kube-state-metrics é um serviço que recolhe métricas do servidor de API do Kubernetes e disponibiliza-os para Prometheus (ou um scraper compatível com um ponto de extremidade do cliente de Prometheus).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). Ao passo que Heapster agrega as métricas que o Kubernetes gera e reencaminha-os para um sink, métricas de estado de kube gera seu próprio métricas e disponibiliza-os através de um ponto final para captura.Whereas Heapster aggregates metrics that Kubernetes generates and forwards them to a sink, kube-state-metrics generates its own metrics and makes them available through an endpoint for scraping. Para as métricas do sistema, utilize principal exportadora de nó, que é uma principal exportadora de Prometheus para as métricas do sistema.For system metrics, use Node exporter, which is a Prometheus exporter for system metrics. Suporta a Prometheus ponto de dados, mas não os dados de cadeia de caracteres de vírgula flutuante, portanto, é adequada para as métricas do sistema, mas não os.Prometheus supports floating point data, but not string data, so it is appropriate for system metrics but not logs.

RegistoLogging

Aqui estão alguns dos desafios gerais do início de sessão numa aplicação de microsserviços:Here are some of the general challenges of logging in a microservices application:

  • Noções básicas sobre o processamento de ponto-a-ponto de um pedido de cliente, onde vários serviços podem ser invocados para lidar com um único pedido.Understanding the end-to-end processing of a client request, where multiple services might be invoked to handle a single request.
  • A consolidação de registos a partir de vários serviços numa única exibição agregada.Consolidating logs from multiple services into a single aggregated view.
  • Análise de registos provenientes de várias origens, que utilizam os seus próprios esquemas de Registro em log ou não ter nenhum esquema específica.Parsing logs that come from multiple sources, which use their own logging schemas or have no particular schema. Os registos podem ser gerados pelos componentes de terceiros que não controla.Logs may be generated by third-party components that you don't control.
  • Arquiteturas de Microsserviços, muitas vezes, geram um volume maior de registos que monolitos tradicionais, uma vez que existem mais serviços, chamadas de rede e etapas numa transação.Microservices architectures often generate a larger volume of logs than traditional monoliths, because there are more services, network calls, and steps in a transaction. Isso significa que o registo em si pode ser um desempenho ou um estrangulamento de recursos para a aplicação.That means logging itself can be a performance or resource bottleneck for the application.

Existem alguns desafios adicionais para uma arquitetura baseada em Kubernetes:There are some additional challenges for a Kubernetes-based architecture:

  • Os contentores podem mover-se e ser reagendados.Containers can move around and be rescheduled.
  • Kubernetes tem uma abstração de rede que utiliza endereços IP virtuais e os mapeamentos de porta.Kubernetes has a networking abstraction that uses virtual IP addresses and port mappings.

No Kubernetes, a abordagem padrão para o registo é para um contentor escrever registos de stdout e stderr.In Kubernetes, the standard approach to logging is for a container to write logs to stdout and stderr. O mecanismo de contentor redireciona estes fluxos de para um controlador de registo.The container engine redirects these streams to a logging driver. Para facilitar a da consulta e para evitar possíveis perdas de dados de registo no caso de falha de um nó, a abordagem comum é recolher os registos de cada nó e enviá-los para uma localização de armazenamento central.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.

O Azure Monitor integra-se com o AKS para suportar essa abordagem.Azure Monitor integrates with AKS to support this approach. Monitor do Azure recolhe registos de contentor e envia-os para uma área de trabalho do Log Analytics.Azure Monitor collects container logs and sends them to a Log Analytics workspace. A partir daí, pode utilizar o linguagem de consulta de Kusto escrever consultas entre os registos agregados.From there, you can use the Kusto query language to write queries across the aggregated logs. Por exemplo, eis uma consulta de Kusto para mostrar os registos de contentor para um pod especificado: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)

O Azure Monitor é um serviço gerido e configurar um cluster do AKS para utilizar o Azure Monitor é uma simples alteração de configuração no modelo de CLI ou do Resource Manager.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. (Para obter mais informações, consulte como ativar o Azure Monitor para contentores.) Outra vantagem de utilizar a monitorização do Azure é que ele consolida os registos do AKS com outros registos de plataforma do Azure, fornecendo uma experiência unificada de monitorização.(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.

Monitor do Azure é cobrado por gigabyte (GB) de dados ingeridos no serviço (consulte preços do Azure Monitor).Azure Monitor is billed per gigabyte (GB) of data ingested into the service (see Azure Monitor pricing). Em volumes muito elevados, custo pode se tornar uma consideração.At very high volumes, cost may become a consideration. Há diversas alternativas de código aberto disponíveis para o ecossistema de Kubernetes.There are many open-source alternatives available for the Kubernetes ecosystem. Por exemplo, muitas organizações utilizam Fluentd com Elasticsearch.For example, many organizations use Fluentd with Elasticsearch. Fluentd é um recoletor de dados de código-fonte aberto e Elasticsearch é um banco de dados de documento para a pesquisa.Fluentd is an open-source data collector, and Elasticsearch is a document database that is for search. Um desafio com estas opções é que exigem configuração adicional e gestão do cluster.A challenge with these options is that they require additional configuration and management of the cluster. Para uma carga de trabalho de produção, terá de fazer experiências com as definições de configuração.For a production workload, you may need to experiment with configuration settings. Também terá de monitorizar o desempenho da infraestrutura do registo.You'll also need to monitor the performance of the logging infrastructure.

Application InsightsApplication Insights

Para dados de registo mais avançados, recomendamos que instrumentar o seu código com o Application Insights.For richer log data, we recommend instrumenting your code with Application Insights. Isto requer a adição de um pacote do Application Insights ao seu código e configurar o seu código para enviar instruções de Registro para o Application Insights.This requires adding an Application Insights package to your code and configuring your code to send logging statements to Application Insights. Os detalhes dependem da plataforma, como .NET, Java ou node. js.The details depend on the platform, such as .NET, Java, or Node.js. O pacote do Application Insights envia dados de telemetria para o Azure Monitor.The Application Insights package sends telemetry data to Azure Monitor.

Se estiver a utilizar o .NET Core, recomendamos também utilizar o Application Insights para Kubernetes biblioteca.If you are using .NET Core, we recommend also using the Application Insights for Kubernetes library. Esta biblioteca otimiza rastreios do Application Insights com informações adicionais, como o conjunto de contentor, nó, pod, etiquetas e réplica.This library enriches Application Insights traces with additional information such as the container, node, pod, labels, and replica set.

As vantagens desta abordagem incluem:Advantages of this approach include:

  • O Application Insights regista pedidos HTTP, incluindo o código de latência e o resultado.Application Insights logs HTTP requests, including latency and result code.
  • Rastreio distribuído está ativado por predefinição.Distributed tracing is enabled by default.
  • Rastreios de incluem um ID de operação, para que a pode corresponder a todos os rastreios para uma determinada operação.Traces include an operation ID, so you can match all traces for a particular operation.
  • Rastreios gerados pelo Application Insights, muitas vezes, tem informações contextuais adicionais.Traces generated by Application Insights often have additional contextual information. Por exemplo, em que os rastreamentos do ASP.NET são decorados, tal como com o nome da ação e uma categoria ControllerActionInvoker, que lhe mostrarão o pipeline de solicitação do ASP.NET.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 recolhe métricas de desempenho para a resolução de problemas de desempenho e otimização.Application Insights collects performance metrics for performance troubleshooting and optimization.

Considerações:Considerations:

  • O Application Insights regula a telemetria se a taxa de dados exceder um limite máximo; Para obter detalhes, consulte limita do Application Insights.Application Insights throttles the telemetry if the data rate exceeds a maximum limit; for details, see Application Insights limits. Uma única operação pode gerar vários eventos de telemetria, portanto, se a aplicação apresentar um grande volume de tráfego, é provável que são limitados.A single operation may generate several telemetry events, so if the application experiences a high volume of traffic, it is likely to get throttled.
  • Como o Application Insights lotes de dados, é possível perder um lote, no caso de falha de um processo com uma exceção não processada.Because Application Insights batches data, it's possible to lose a batch if a process crashes with an unhandled exception.
  • Application Insights é faturado com base no volume de dados.Application Insights is billed based on data volume. Para obter mais informações, consulte gerir preços e volumes de dados no Application Insights.For more information, see Manage pricing and data volume in Application Insights.

Registo estruturadoStructured logging

Para facilitar os registos analisar, utilize registos estruturados sempre que possível.To make logs easier to parse, use structured logging where possible. Registo estruturado é a abordagem em que a aplicação escreve registos num formato estruturado, como JSON, em vez de saída de cadeias de caracteres de texto não estruturado.Structured logging is approach where the application writes logs in a structured format, such as JSON, rather than outputting unstructured text strings. Muitas bibliotecas de registo estruturado estão disponíveis.There are many structured logging libraries available. Por exemplo, aqui está uma instrução de registo que utiliza a Serilog biblioteca para .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());

    ...
}

Aqui, a chamada para LogInformation inclui uma Id parâmetro e DeliveryInfo parâmetro.Here, the call to LogInformation includes an Id parameter and DeliveryInfo parameter. Com o registo estruturado, estes valores não são interpolados para a cadeia de caracteres de mensagem.With structured logging, these values are not interpolated into the message string. Em vez disso, a saída de registo será algo parecido com isto: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":{...

Esta é uma cadeia de caracteres do JSON, onde a "@t"é o campo de um período de tempo"@mt" é a cadeia de caracteres de mensagem e os restantes pares de chave/valor são os parâmetros.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. Saída JSON formato torna mais fácil de consultar os dados de uma forma estruturada.Outputting JSON format makes it easier to query the data in a structured way. Por exemplo, a seguinte consulta do Log Analytics, escrita no linguagem de consulta de Kusto, procura instâncias desta mensagem específica de todos os contentores com o nome 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"]

Ver o resultado no portal do Azure mostra que DeliveryInfo é um registo estruturado que contém a representação serializada do DeliveryInfo modelo:Viewing the result in the Azure portal shows that DeliveryInfo is a structured record that contains the serialized representation of the DeliveryInfo model:

Área de trabalho de captura de ecrã do Log Analytics

Este é o JSON deste exemplo: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"
}

O trecho de código anterior utilizado a biblioteca de Serilog, mas as bibliotecas de registo estruturado estão disponíveis para outros idiomas também.The previous code snippet used the Serilog library, but structured logging libraries are available for other languages as well. Por exemplo, eis um exemplo com o SLF4J biblioteca para 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());

Rastreio distribuídoDistributed tracing

Um desafio significativo dos microsserviços é compreender o fluxo de eventos entre serviços.A significant challenge of microservices is to understand the flow of events across services. Uma única transação pode envolver chamadas para vários serviços.A single transaction may involve calls to multiple services. Para reconstruir a sequência inteira de passos, cada serviço deve propagar uma ID de correlação que age como um identificador exclusivo para essa operação.To reconstruct the entire sequence of steps, each service should propagate a correlation ID that acts as a unique identifier for that operation. O ID de correlação permite que distribuído rastreio em todos os serviços.The correlation ID enables distributed tracing across services.

O primeiro serviço que recebe um pedido de cliente deve gerar o ID de correlação.The first service that receives a client request should generate the correlation ID. Se o serviço faz uma chamada HTTP para outro serviço, ele coloca o ID de correlação num cabeçalho de pedido.If the service makes an HTTP call to another service, it puts the correlation ID in a request header. Se o serviço envia uma mensagem assíncrona, coloca o ID de correlação na mensagem.If the service sends an asynchronous message, it puts the correlation ID into the message. Serviços Downstream continuam propagar o ID de correlação, para que fluem através de todo o sistema.Downstream services continue to propagate the correlation ID, so that it flows through the entire system. Além disso, todo o código que escreve eventos de métricas ou de registo de aplicação deve incluir o ID de correlação.In addition, all code that writes application metrics or log events should include the correlation ID.

Quando são correlacionadas chamadas de serviço, pode calcular a métricas operacionais, como a latência de ponto-a-ponto para uma transação completa, o número de transações com êxito por segundo e a percentagem de transações falhadas.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. Incluindo IDs de correlação de registos de aplicações torna possível realizar a análise da causa raiz.Including correlation IDs in application logs makes it possible to perform root cause analysis. Se uma operação falhar, pode encontrar instruções do log de todas as chamadas de serviço que faziam parte da mesma operação.If an operation fails, you can find the log statements for all of the service calls that were part of the same operation.

Recomendamos que utilize o Application Insights para rastreio distribuído.We recommend using Application Insights for distributed tracing. O Application Insights SDK injeta o contexto de correlação no cabeçalhos HTTP automaticamente e inclui o ID de correlação de registos do Application Insights.The Application Insights SDK automatically injects correlation context into HTTP headers, and includes the correlation ID in Application Insights logs. Alguns serviços ainda poderão ter de propagar explicitamente os cabeçalhos de correlação, consoante a estruturas e bibliotecas que está a ser utilizadas.Some services may still need to explicitly propagate the correlation headers, depending on the frameworks and libraries being used. Para obter mais informações, consulte correlação de telemetria no Application Insights.For more information, see Telemetry correlation in Application Insights.

Algumas considerações adicionais durante a implementação de rastreio distribuído:Some additional considerations when implementing distributed tracing:

  • Não existe atualmente nenhum cabeçalho HTTP padrão para a correlação de IDs, embora um W3C proposta existe.There is currently no standard HTTP header for correlation IDs, although a W3C proposal exists. Sua equipe deve padronizar num valor de cabeçalho personalizado.Your team should standardize on a custom header value. A opção poderá ser decidida por sua arquitetura de registo, como o Application Insights ou escolha de malha do serviço.The choice may be decided by your logging framework, such as Application Insights, or choice of service mesh.

  • Para mensagens assíncronas, se sua infra-estrutura de mensagens oferece suporte a adição de metadados para mensagens, deve incluir o ID de correlação de como metadados.For asynchronous messages, if your messaging infrastructure supports adding metadata to messages, you should include the correlation ID as metadata. Caso contrário, incluí-lo como parte do esquema de mensagem.Otherwise, include it as part of the message schema. Por exemplo, veja distribuído correlação por meio de mensagens do Service Bus e de rastreio.For example, see Distributed tracing and correlation through Service Bus messaging.

  • Em vez de um identificador opaco único, pode enviar um contexto de correlação que inclui informações mais detalhadas, como relações de chamador receptor.Rather than a single opaque identifier, you might send a correlation context that includes richer information, such as caller-callee relationships.

  • Se estiver a utilizar Istio ou linkerd como uma malha de serviço, essas tecnologias geram automaticamente cabeçalhos de correlação quando chamadas HTTP são encaminhadas por meio de proxies de malha do serviço.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. Serviços devem encaminhar os cabeçalhos relevantes.Services should forward the relevant headers.

Exemplo de rastreio distribuídoExample of distributed tracing

Este exemplo segue uma transação distribuída por meio de um conjunto de microsserviços.This example follows a distributed transaction through a set of microservices. O exemplo é obtido a partir de uma implementação de referência descrita aqui.The example is taken from a reference implementation described here.

Aplicação de entrega por drone

Neste cenário, a transação distribuída tem os seguintes passos:In this scenario, the distributed transaction has the following steps:

  1. O serviço de ingestão coloca uma mensagem numa fila do Service Bus.The Ingestion service puts a message on a Service Bus queue.
  2. O serviço de fluxo de trabalho obtém a mensagem da fila.The Workflow service pulls the message from the queue.
  3. O serviço de fluxo de trabalho chama três serviços de back-end para processar o pedido (Drone agendador, pacote e entrega).The Workflow service calls three backend services to process the request (Drone Scheduler, Package, and Delivery).

A captura de ecrã a seguir mostra a mapa da aplicação para a aplicação de entrega por Drone.The following screenshot shows the application map for the Drone Delivery application. Este mapa mostra chamadas para o ponto de final de API pública que resultam num fluxo de trabalho que envolve a cinco microsserviços.This map shows calls to the public API endpoint that result in a workflow that involves five microservices.

Mapeamento de aplicações

As setas partir fabrikam-workflow e fabrikam-ingestion para um show de fila do Service Bus em que as mensagens são enviadas e recebidas.The arrows from fabrikam-workflow and fabrikam-ingestion to a Service Bus queue show where the messages are sent and received. Não é possível dizer do diagrama qual serviço está enviando mensagens e que está a receber — as setas mostram apenas que ambos os serviços são chamar do Service Bus — , mas essas informações estão disponíveis nos detalhes do: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:

Mapeamento de aplicações

Uma vez que todas as chamadas incluem um ID de operação, também pode ver os passos de ponto-a-ponto numa única transação, incluindo informações de tempo e as chamadas HTTP em cada passo.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. Segue-se a visualização de um desse transação:Here is the visualization of one such transaction:

Transação de ponta a ponta

Esta visualização mostra os passos do serviço de ingestão para a fila, da fila para o serviço de fluxo de trabalho e do serviço de fluxo de trabalho para os outros serviços de back-end.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. A última etapa é o serviço de fluxo de trabalho, a mensagem do Service Bus a marcar como concluído.The last step is the Workflow service marking the Service Bus message as completed.

Agora aqui está um exemplo quando ocorreram falhas em chamadas para um serviço de back-end:Now here is an example when calls to a backend service were failing:

Erros da aplicação mapa que mostra

Isto mostra que uma grande parte (36%) de chamadas para o serviço de Scheduler de Drones falhado durante o período ser consultado.This shows that a large fraction (36%) of calls to the Drone Scheduler service failed during the period being queried. Na vista de transação de ponto-a-ponto, ele mostra que ocorre uma exceção ao enviar um pedido HTTP PUT enviado ao serviço.In the end-to-end transaction view, it shows that an exception occurs when sending an HTTP PUT request to the service.

Transação de ponta a ponta

Ainda mais a desagregação, a exceção acaba por ser uma exceção de socket, "não existe esse dispositivo ou endereço."Further drilling in, the exception turns out to be a socket exception, "No such device or address."

Fabrikam.Workflow.Service.Services.BackendServiceCallFailedException: Não existe esse endereço---u003e System.Net.Http.HttpRequestException ou dispositivo: Não existe esse endereço---u003e System.Net.Sockets.SocketException ou dispositivo: Não existe esse endereço ou o dispositivoFabrikam.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

Esta é uma sugestão de que o serviço de back-end não está acessível.This is a hint that the backend service is not reachable. Neste momento, pode utilizar o kubectl para ver a configuração de implementação.At this point, you might use kubectl to view the deployment configuration. Neste exemplo, acontece o serviço de nome de anfitrião não foi resolver, devido a um erro nos arquivos de configuração Kubernetes.In this example, it turned out the service hostname was not resolving, due to an error in the Kubernetes configuration files. O artigo depurar serviços documentação do Kubernetes tem sugestões para este tipo de erro de diagnóstico.The article Debug Services in the Kubernetes documentation has tips for diagnosing this sort of error.

Seguem-se algumas causas comuns de erros:Here are some common causes of errors:

  • Erros de código.Code bugs. Estes podem manifestam como:These might manifest as:
    • Exceções.Exceptions. Consultar os registos para ver os detalhes da exceção do Application Insights.Look in the Application Insights logs to view the exception details.
    • Processo falhar.Process crashing. Examinar o contentor e estado de pod e ver registos de contentor ou rastreios do Application Insights.Look at container and pod status, and view container logs or Application Insights traces.
    • Erros de HTTP 5xxHTTP 5xx errors
  • Esgotamento de recursos:Resource exhaustion:
    • Procure limitação (HTTP 429) ou tempos limite do pedido.Look for throttling (HTTP 429) or request timeouts.
    • Examine as métricas de contentor de CPU, memória e discoExamine container metrics for CPU, memory, and disk
    • Examinar as configurações para o contentor e os limites de recursos de pod.Look at the configurations for container and pod resource limits.
  • Deteção do serviço.Service discovery. Examine os mapeamentos de configuração e a porta de serviço do Kubernetes.Examine the Kubernetes service configuration and port mappings.
  • Erro de correspondência de API.API mismatch. Procure os erros de HTTP 400.Look for HTTP 400 errors. Se as APIs com a versão, examine qual é a versão que está a ser chamada.If APIs are versioned, look at which version is being called.
  • Erro ao extrair uma imagem de contentor.Error pulling a container image. Ver a especificação de pod.Look at the pod specification. Além disso, certifique-se de que o cluster está autorizado a efetuar pull do container registry.Also make sure the cluster is authorized to pull from the container registry.
  • Problemas RBAC.RBAC issues.

Passos SeguintesNext steps

Saiba mais sobre os recursos do Azure Monitor que suportam a monitorização de aplicações no AKS:Learn more about features in Azure Monitor that support monitoring of applications on AKS: