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?
fonte
Respostas:
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.FlushPresumo 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.
fonte
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:
Observe que as bibliotecas de rastreamento geralmente fornecem amostras de solicitações para rastreamento, elas raramente rastreiam 100% das solicitações.
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.
fonte