Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Rastreamento unificado para aplicações dentro e fora da malha

Última atualização: Sep 21, 2026

O Alibaba Cloud Service Mesh (ASM) oferece recursos de rastreamento prontos para uso para aplicações na malha de services. No entanto, para obter um rastreamento de ponta a ponta que inclua aplicações externas se comunicando com services na malha, é necessário usar o Managed Service for OpenTelemetry para unificar os rastros de chamadas. Este guia mostra como usar o Managed Service for OpenTelemetry para rastrear uma requisição de uma aplicação externa para uma aplicação dentro de uma instância do ASM, criando um único rastro de chamada unificado.

Pré-requisitos

  • Crie uma instância do Service Mesh (ASM) e adicione o cluster do ACK à instância. Para mais informações, consulte {{XREF_0}} e {{XREF_1}}.

  • Implante um gateway de entrada na instância do ASM para permitir o acesso às aplicações na malha. Para mais informações, consulte {{XREF_2}}.

  • Instale o Python 2.7 e prepare um ambiente para executar a aplicação de exemplo fora da malha.

  • Ative o Managed Service for OpenTelemetry. Para mais informações, consulte {{XREF_3}}.

Observações

  • Este guia implanta uma aplicação Python chamada ExternalProxy. Essa aplicação executa um servidor HTTP. Acessar o caminho raiz do ExternalProxy chama o service productpage da aplicação Bookinfo em execução dentro da malha de services.

  • Este guia usa o Managed Service for OpenTelemetry como backend de rastreamento. Se você usar um sistema de rastreamento autogerenciado compatível com o Zipkin, exponha seu endpoint de relatórios para a aplicação externa. Em seguida, pule a seção {{XREF_4}} e vá diretamente para {{XREF_5}}, usando o endpoint do seu sistema como endereço de relatórios.

Etapa 1: Implantar a aplicação Bookinfo na malha

  1. Execute o comando a seguir para implantar a aplicação Bookinfo no cluster da sua instância do ASM.

    Baixe o arquivo YAML da aplicação Bookinfo no GitHub.

    kubectl --kubeconfig=${DATA_PLANE_KUBECONFIG} apply -f bookinfo.yaml
  2. Execute o comando a seguir para implantar o VirtualService da aplicação Bookinfo.

    Baixe o arquivo YAML do VirtualService no GitHub.

    kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f virtual-service-all-v1.yaml
  3. Execute o comando a seguir para implantar o DestinationRule da aplicação Bookinfo.

    Baixe o arquivo YAML do DestinationRule no Github.

    kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f destination-rule-all.yaml
  4. Execute o comando a seguir para implantar o Gateway da aplicação Bookinfo.

    Baixe o arquivo YAML do Gateway no GitHub.

    kubectl --kubeconfig=${ASM_KUBECONFIG} apply -f bookinfo-gateway.yaml

Etapa 2: Obter o endpoint do OpenTelemetry

  1. Faça login no Managed Service for OpenTelemetry console. No painel de navegação à esquerda, clique em Overview.

  2. Na página Overview, clique na aba Access process e, em seguida, clique em View access point information.

  3. Visualize o endpoint.

    1. Na parte superior da página, selecione a região de destino.

      Selecione a região onde o cluster do ACK para a aplicação Bookinfo está implantado. Caso contrário, os dados de rastreamento não poderão ser correlacionados.

    2. Na aba Access point information, ative a opção Show token. Escolha um endpoint de rede pública ou privada com base no local onde a sua aplicação ExternalProxy está implantada.

      Como o ExternalProxy relata dados usando a API v1 do Zipkin, é necessário um endpoint v1. Clique na aba Zipkin e encontre o endpoint apropriado na tabela. Normalmente, usa-se um endpoint v2. No entanto, para cenários específicos como integrações com Istio ou Molten, um endpoint v1 é obrigatório. Ao usar o componente Sleuth, a URL base não deve incluir /api/v2/spans.

Etapa 3: Implantar a aplicação ExternalProxy fora da malha

Importante
  • O proxy sidecar encaminha todas as partes de uma requisição recebida, incluindo os cabeçalhos HTTP e o corpo da requisição, para o service upstream. Isso significa que os cabeçalhos relacionados ao rastreamento também são encaminhados.

  • Para garantir a propagação do contexto de rastro, a sua aplicação deve encaminhar os cabeçalhos de rastreamento necessários em suas requisições de saída, seguindo as práticas padrão da comunidade.

  1. Salve o código a seguir como um arquivo chamado ExternalProxy.py no ambiente de execução da sua aplicação externa.

    • Substitua {XTRACE_ZIPKIN_V1_ENDPOINT} pelo endpoint da etapa anterior. Se você estiver relatando para um sistema de rastreamento autogerenciado, use o endpoint de relatórios dele.

    • Substitua {INGRESS_GATE_WAY_IP} pelo endereço IP do gateway de entrada do seu cluster do ACK.

      ExternalProxy.py

      import requests
      from flask import Flask
      from py_zipkin.zipkin import zipkin_span,create_http_headers_for_new_span
      from py_zipkin.util import generate_random_64bit_string
      from py_zipkin.util import ZipkinAttrs
      import time
      app = Flask(__name__)
      def do_stuff(trace_id, span_id, parent_span_id):
          time.sleep(2)
          headers = create_http_headers_for_new_span()
          headers["X-B3-TraceId"] = trace_id
          headers["X-B3-SpanId"] = span_id
          headers["X-B3-ParentSpanId"] = parent_span_id
          print "SEND TO INGRESS HEADERS : {0}".format(headers)
          r = requests.get('http://${INGRESS_GATE_WAY_IP}/productpage', headers=headers)
          return 'OK'
      def http_transport(encoded_span):
          # encoding prefix explained in https://github.com/Yelp/py_zipkin#transport
          body=encoded_span
          zipkin_url="${XTRACE_ZIPKIN_V1_ENDPOINT}"
          headers = {"Content-Type": "application/x-thrift"}
          # You'd probably want to wrap this in a try/except in case POSTing fails
          r=requests.post(zipkin_url, data=body, headers=headers)
          print(body)
      @app.route('/')
      def index():
          with zipkin_span(
              service_name='external-proxy',
              span_name='external-proxy/inbound',
              transport_handler=http_transport,
              port=5000,
              sample_rate=100, 
          ) as inbound_span:
          do_stuff(inbound_span.zipkin_attrs.trace_id, inbound_span.zipkin_attrs.span_id, inbound_span.zipkin_attrs.parent_span_id)
          return 'OK', 200
      if __name__=='__main__':
          app.run(host="0.0.0.0",port=5000,debug=True)
  2. Execute o comando a seguir para iniciar a aplicação ExternalProxy.

    python ExternalProxy.py
     * Serving Flask app "main" (lazy loading)
     * Environment: production
       WARNING: This is a development server. Do not use it in a production deployment.
       Use a production WSGI server instead.
     * Debug mode: on
     * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
     * Restarting with stat
     * Debugger is active!
     * Debugger PIN: 317-792-686
  3. Execute o comando a seguir para enviar uma requisição para a aplicação ExternalProxy.

    curl localhost:5000

    Saída esperada:

    OK

Etapa 4: Visualizar as informações de rastro

  1. Faça login no Managed Service for OpenTelemetry console.

  2. No painel de navegação à esquerda, clique em Applications. Selecione a região na parte superior da página e, em seguida, clique em ExternalProxy na lista de aplicações.

  3. No painel de navegação à esquerda, clique em Application details. Clique na aba Traces e, em seguida, clique em um Trace ID e visualize os detalhes do rastro da chamada.

    Um rastro de chamada completo é formado entre a aplicação externa, ExternalProxy, e a aplicação Bookinfo na malha. A parte superior da página de detalhes do rastro exibe informações de resumo, incluindo Start time, Duration, Services, Depth e Total spans. Abaixo do resumo, uma visualização em árvore mostra a relação hierárquica de cada span. As colunas incluem Span name, Timeline, Service name, Start time, IP address e Status. Neste exemplo, o rastro da chamada começa em external-proxy, passa por productpage e, em seguida, chama os services details, reviews e ratings em sequência. Alguns spans, como o span de limitação de taxa ahas_rate_limit_cluster, podem aparecer com um status de erro.