Seguimiento de Stackdriver con Google Cloud Run

8

Me he sumergido en una integración de Stackdriver Trace en Google Cloud Run. Puedo hacer que funcione con el agente, pero me molestan algunas preguntas.

Dado que

  • El agente Stackdriver agrega trazas en un pequeño búfer y las envía periódicamente.
  • El acceso a la CPU está restringido cuando un servicio Cloud Run no maneja una solicitud.
  • No hay gancho de apagado para los servicios de Cloud Run; no puede borrar el búfer antes del apagado: el contenedor solo recibe un SIGKILL . Esta es una señal que no puede captar de su aplicación.
  • La ejecución de un proceso en segundo plano que envía información fuera del ciclo de solicitud-respuesta parece violar el contrato de Knative Container Runtime
  • Las colecciones de datos de registro están documentadas y no requieren que ejecute un agente, pero no existe tal solución para la telemetría.
  • Encontré un informe de alguien experimentando rastros perdidos en Cloud Run usando el enfoque basado en agentes

Cómo lo hace Google

Entré en el código fuente de Cloud Endpoints ESP (la integración de Cloud Run está en beta) para ver si lo resuelven de una manera diferente, pero se usa el mismo patrón: hay un búfer con trazas (1s) y Se borra periódicamente.

Pregunta

Si bien mi integración de rastreo parece funcionar en mi configuración de prueba, me preocupan los rastreos incompletos y faltantes cuando ejecuto esto en un entorno de producción.

  • ¿Es este un problema hipotético o un problema real?

  • Parece que la forma correcta de abordar esto es escribir telemetría en los registros, en lugar de utilizar un proceso de agente. ¿Es eso compatible con Stackdriver Trace?

Wietse Venema
fuente
2
¡Qué pregunta tan bien escrita! ¡Agradable! Gracias por esto.
Kolban

Respuestas:

1

Tienes razón. Esta es una preocupación justa ya que la mayoría de las bibliotecas de rastreo tienden a muestrear / cargar tramos de rastreo en segundo plano.

Dado que (1) su CPU está casi escalada casi a cero cuando el contenedor no está manejando ninguna solicitud y (2) la instancia del contenedor puede ser eliminada en cualquier momento debido a la inactividad, no puede cargar de manera confiable esos intervalos de rastreo recopilados en su aplicación. Como dijiste, a veces puede funcionar ya que no detenemos completamente la CPU, pero no siempre funcionará.

Parece que algunas de las bibliotecas Stackdriver (y / o OpenTelemetry fka OpenCensus) le permiten controlar el ciclo de vida de empujar trazos de traza.

Por ejemplo, este paquete Go para el exportador de OpenCensus Stackdriver tiene un Flush()método al que puede llamar antes de completar su solicitud en lugar de confiar en el tiempo de ejecución para cargar periódicamente los trazos de seguimiento: https://godoc.org/contrib.go.opencensus.io/ exporter / stackdriver # Exporter.Flush

Supongo que otras bibliotecas de rastreo en otros idiomas también exponen métodos Flush () similares, de lo contrario, hágamelo saber en los comentarios y esta sería una solicitud de función válida para esas bibliotecas.

AhmetB - Google
fuente
La biblioteca actual del agente de rastreo node.js no tiene un método de vaciado :(
Daniel Goldberg
1
Creo que esta sería una solicitud de problema válida para su repositorio de GitHub. También es un caso de uso válido para aquellos de nosotros en Google para hacer una encuesta de lo que está respaldando esto. Gracias por mencionarlo.
AhmetB - Google
2

¿Es este un problema hipotético o un problema real?

Si considera que un servicio de Cloud Run recibe una sola solicitud, definitivamente es un problema, ya que la biblioteca no tendrá tiempo para vaciar los datos antes de que la CPU de la instancia del contenedor se acelere.

Sin embargo, en casos de uso de la vida real:

  • Un servicio de Cloud Run a menudo recibe solicitudes de forma continua o frecuente, lo que significa que su instancia de contenedor va a tener: continuamente CPU o tener CPU disponible de vez en cuando.
  • Está bien soltar rastros: si algunos rastreos no se recopilan porque la instancia está rechazada, es probable que haya recopilado un conjunto lo suficientemente diverso de muestras antes de que esto suceda. Además, es posible que le interesen los informes agregados, en cuyo caso, la recopilación de rastreos individuales no importa.

Tenga en cuenta que las bibliotecas de rastreo suelen muestrear las solicitudes de rastreo, raramente rastrean el 100% de las solicitudes.

Parece que la forma correcta de abordar esto es escribir telemetría en los registros, en lugar de utilizar un proceso de agente. ¿Es eso compatible con Stackdriver Trace?

No, Stackdriver Trace toma sus datos de los tramos enviados a su API. Tenga en cuenta que para enviar datos a Stackdriver Trace, puede usar bibliotecas como OpenCenss y OpenTelemetry, las bibliotecas propietarias de Stackdriver Trace no son la forma recomendada de ninguna manera.

Steren
fuente
1
Creo que esta suposición cae en un caso de uso como el uso de Cloud Run para trabajos por lotes / cron (por ejemplo, una vez al día o una vez cada 2 horas). Obtiene una solicitud, establece la frecuencia de muestreo al 100%, pero una vez que se completa la solicitud, existe una alta probabilidad de que pierda esos datos de rastreo una vez al día.
AhmetB - Google