Rastreamento de Stackdriver com o Google Cloud Run

8

Eu mergulhei na integração do Stackdriver Trace no Google Cloud Run. Posso fazê-lo funcionar com o agente, mas estou incomodado com algumas perguntas.

Dado que

  • O agente Stackdriver agrega traços em um pequeno buffer e os envia periodicamente.
  • O acesso à CPU é restrito quando um serviço Cloud Run não está manipulando uma solicitação.
  • Não há gancho de desligamento para os serviços Cloud Run; você não pode limpar o buffer antes do desligamento: o contêiner recebe apenas um SIGKILL . Este é um sinal que você não pode captar do seu aplicativo.
  • A execução de um processo em segundo plano que envia informações para fora do ciclo de solicitação-resposta parece violar o contrato do Knative Container Runtime
  • As coleções de dados de log estão documentadas e não exigem a execução de um agente, mas não existe uma solução para telemetria.
  • Encontrei um relatório de alguém com rastreamentos perdidos no Cloud Run usando a abordagem baseada em agente

Como o Google faz

Entrei no código-fonte do Cloud Endpoints ESP (a integração do Cloud Run está na versão beta) para ver se eles o resolvem de uma maneira diferente, mas o mesmo padrão é usado: há um buffer com rastreamentos (1s) e é limpo periodicamente.

Questão

Enquanto minha integração de rastreamento parece funcionar na minha configuração de teste, estou preocupado com rastreios incompletos e ausentes quando executo isso em um ambiente de produção.

  • Esse é um problema hipotético ou um problema real?

  • Parece que a maneira correta de abordar isso é escrever telemetria nos logs, em vez de usar um processo do agente. Isso é suportado pelo Stackdriver Trace?

Wietse Venema
fonte
2
Que pergunta bem escrita !!! Agradável! Obrigado por isso.
Kolban
1
Veja também: stackoverflow.com/questions/58261080/…
Grayside 5/12

Respostas:

1

Você está certo. Essa é uma preocupação justa, já que a maioria das bibliotecas de rastreamento costuma amostrar / fazer upload de períodos de rastreamento em segundo plano.

Como (1) sua CPU está quase dimensionada para zero quando o contêiner não está processando nenhuma solicitação e (2) a instância do contêiner pode ser interrompida a qualquer momento devido à inatividade, não é possível fazer o upload confiável dos trechos de rastreamento coletados em seu aplicativo. Como você disse, às vezes pode funcionar, pois não paramos completamente a CPU, mas nem sempre funciona.

Parece que algumas das bibliotecas Stackdriver (e / ou OpenTelemetry fka OpenCensus) permitem controlar o ciclo de vida do envio de traços.

Por exemplo, este pacote Go para exportador OpenCensus Stackdriver possui um Flush()método que você pode chamar antes de concluir sua solicitação, em vez de depender do tempo de execução para fazer upload periodicamente dos intervalos de rastreamento: https://godoc.org/contrib.go.opencensus.io/ exportador / stackdriver # Exporter.Flush

Presumo que outras bibliotecas de rastreamento em outros idiomas também exponham métodos Flush () semelhantes; caso contrário, informe-nos nos comentários e isso seria uma solicitação de recurso válida para essas bibliotecas.

AhmetB - Google
fonte
A biblioteca atual do agente de rastreamento node.js. não possui um método de liberação :( #
Daniel
1
Eu acho que isso seria uma solicitação de problema válida para o repositório do GitHub. Também é um caso de uso válido para nós do Google fazer uma pesquisa sobre o que está apoiando isso. Obrigado por trazer à tona.
AhmetB - Google
2

Esse é um problema hipotético ou um problema real?

Se você considerar que um serviço Cloud Run recebe uma única solicitação, é definitivamente um problema, pois a biblioteca não terá tempo para liberar os dados antes que a CPU da instância do contêiner seja estrangulada.

No entanto, na vida real, casos de uso:

  • Um serviço Cloud Run geralmente recebe solicitações de forma contínua ou frequente, o que significa que sua instância de contêiner terá: continuamente CPU ou CPU disponível de tempos em tempos.
  • Não há problema em descartar rastreamentos: se alguns rastreamentos não forem coletados porque a instância foi desativada, é provável que você tenha coletado um conjunto de amostras suficientemente diversificado antes que isso aconteça. Além disso, você pode estar interessado apenas nos relatórios agregados; nesse caso, coletar rastreamentos individuais não importa.

Observe que as bibliotecas de rastreamento geralmente fornecem amostras de solicitações para rastreamento, elas raramente rastreiam 100% das solicitações.

Parece que a maneira correta de abordar isso é escrever telemetria nos logs, em vez de usar um processo do agente. Isso é suportado pelo Stackdriver Trace?

Não, o Stackdriver Trace obtém seus dados das extensões enviadas para sua API. Observe que, para enviar dados ao Stackdriver Trace, você pode usar bibliotecas como OpenCenss e OpenTelemetry, as bibliotecas proprietárias Stackdriver Trace não são a maneira recomendada.

Steren
fonte
1
Eu acho que essa suposição cai em um caso de uso, como usar o Cloud Run para trabalhos em lote / cron (digamos, uma vez por dia ou uma vez a cada 2 horas). Você recebe uma solicitação, define a taxa de amostragem para 100%, mas após a conclusão da solicitação, há uma grande chance de você perder esses dados de rastreamento diários.
AhmetB - Google