Seleccione sus preferencias de cookies

Usamos cookies esenciales y herramientas similares que son necesarias para proporcionar nuestro sitio y nuestros servicios. Usamos cookies de rendimiento para recopilar estadísticas anónimas para que podamos entender cómo los clientes usan nuestro sitio y hacer mejoras. Las cookies esenciales no se pueden desactivar, pero puede hacer clic en “Personalizar” o “Rechazar” para rechazar las cookies de rendimiento.

Si está de acuerdo, AWS y los terceros aprobados también utilizarán cookies para proporcionar características útiles del sitio, recordar sus preferencias y mostrar contenido relevante, incluida publicidad relevante. Para aceptar o rechazar todas las cookies no esenciales, haga clic en “Aceptar” o “Rechazar”. Para elegir opciones más detalladas, haga clic en “Personalizar”.

Acceso a datos de telemetría en tiempo real para extensiones mediante la API de telemetría

Modo de enfoque
Acceso a datos de telemetría en tiempo real para extensiones mediante la API de telemetría - AWS Lambda

La API de telemetría de Lambda les permite a sus extensiones recibir datos de telemetría directamente de Lambda. Durante la inicialización e invocación de la función, Lambda captura automáticamente la telemetría, como los registros, las métricas de la plataforma y los seguimientos de la plataforma. La API de telemetría les permite a las extensiones obtener estos datos de telemetría directamente de Lambda casi en tiempo real.

Dentro del entorno de ejecución de Lambda, puede suscribir las extensiones de Lambda a flujos de telemetría. Tras suscribirse, Lambda envía automáticamente todos los datos de telemetría a sus extensiones. A continuación, tiene flexibilidad para procesar, filtrar y despachar los datos a su destino preferido, como un bucket de Amazon Simple Storage Service (Amazon S3) o un proveedor de herramientas de observabilidad de terceros.

El siguiente diagrama muestra cómo la API de extensiones y la API de telemetría enlazan las extensiones a Lambda desde el entorno de ejecución. Además, la API de tiempo de ejecución conecta el tiempo de ejecución y la función a Lambda.

Las API de extensiones, telemetría y tiempo de ejecución que conectan con los procesos del entorno de ejecución.
importante

La API de telemetría de Lambda reemplaza a la API de registros de Lambda. Si bien la API de registros sigue siendo completamente funcional, recomendamos utilizar solo la API de telemetría en el futuro. Puede suscribir su extensión a una transmisión de telemetría mediante la API de telemetría o la API de registros. Tras suscribirse mediante una de estas API, cualquier intento de suscribirse mediante la otra API volverá a causar un error.

Las extensiones pueden utilizar la API de telemetría para suscribirse a tres flujos de telemetría diferentes:

  • Telemetría de plataforma: registros, métricas y seguimientos, que describen los eventos y errores relacionados con el ciclo de vida del tiempo de ejecución del entorno de ejecución, el ciclo de vida de las extensiones y las invocaciones de funciones.

  • Registros de funciones: registros personalizados que genera el código de la función de Lambda.

  • Registros de extensiones: registros personalizados generados por el código de extensión de Lambda.

nota

Lambda envía registros y métricas a CloudWatch y seguimientos a X-Ray (si lo tiene activado), incluso si una extensión se suscribe a los flujos de telemetría.

Creación de extensiones mediante la API de telemetría

Las extensiones de Lambda se ejecutan como un proceso independiente en el entorno de ejecución. Las extensiones se pueden seguir ejecutando una vez que finaliza la invocación de la función. Dado que las extensiones son procesos separados, puede escribirlas en un idioma diferente al del código de la función. Recomendamos al usuario que escriba extensiones mediante un lenguaje compilado como Golang o Rust. De esta manera, la extensión es un binario autónomo compatible con cualquier tiempo de ejecución admitido.

El siguiente diagrama ilustra un proceso de cuatro pasos para crear una extensión que reciba y procese datos de telemetría mediante la API de telemetría.

Registre su extensión, cree un oyente, suscríbase a un flujo y, a continuación, obtenga telemetría.

A continuación, se muestra cada paso en mayor profundidad:

  1. Registre su extensión mediante Utilice la API de las extensiones de Lambda para crear extensiones. Esto le proporciona un Lambda-Extension-Identifier, que necesitará en los siguientes pasos. Para obtener más información sobre cómo registrar su extensión, consulte Registro de sus extensiones.

  2. Cree un oyente de telemetría. Puede ser un servidor HTTP o TCP básico. Lambda usa el URI del oyente de telemetría para enviar datos de telemetría a su extensión. Para obtener más información, consulte Creación de un oyente de telemetría.

  3. Mediante la API de suscripción de la API de telemetría, suscriba su extensión a los flujos de telemetría deseados. Necesitará el URI de su oyente de telemetría para este paso. Para obtener más información, consulte Envío de una solicitud de suscripción a la API de telemetría.

  4. Obtenga datos de telemetría de Lambda a través del oyente de telemetría. Puede realizar cualquier procesamiento personalizado de estos datos, como enviar los datos a Amazon S3 o a un servicio de observabilidad externo.

nota

El entorno de ejecución de una función de Lambda puede iniciarse y detenerse varias veces como parte de su ciclo de vida. En general, el código de extensión se ejecuta durante las invocaciones de funciones y también hasta dos segundos durante la fase de apagado. Se recomienda agrupar la telemetría en lotes a medida que llegue al oyente. A continuación, utilice los eventos del ciclo de vida Invoke y Shutdown para enviar cada lote a los destinos que desee.

Registro de sus extensiones

Antes de poder suscribirse para recibir datos de telemetría, debe registrar su extensión de Lambda. El registro se produce durante la fase de inicialización de la extensión. En el siguiente ejemplo se muestra una solicitud HTTP para registrar una extensión.

POST http://${AWS_LAMBDA_RUNTIME_API}/2020-01-01/extension/register Lambda-Extension-Name: lambda_extension_name { 'events': [ 'INVOKE', 'SHUTDOWN'] }

Si la solicitud se realiza correctamente, el suscriptor recibe una respuesta correcta HTTP 200. El encabezado de la respuesta contiene el Lambda-Extension-Identifier. El cuerpo de respuesta contiene otras propiedades de la función.

HTTP/1.1 200 OK Lambda-Extension-Identifier: a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 { "functionName": "lambda_function", "functionVersion": "$LATEST", "handler": "lambda_handler", "accountId": "123456789012" }

Para obtener más información, consulte Referencia de la API de extensiones.

Creación de un oyente de telemetría

La extensión de Lambda debe tener un oyente que gestione las solicitudes entrantes de la API de telemetría. En el siguiente código se muestra un ejemplo de implementación de un oyente de telemetría en Golang:

// Starts the server in a goroutine where the log events will be sent func (s *TelemetryApiListener) Start() (string, error) { address := listenOnAddress() l.Info("[listener:Start] Starting on address", address) s.httpServer = &http.Server{Addr: address} http.HandleFunc("/", s.http_handler) go func() { err := s.httpServer.ListenAndServe() if err != http.ErrServerClosed { l.Error("[listener:goroutine] Unexpected stop on Http Server:", err) s.Shutdown() } else { l.Info("[listener:goroutine] Http Server closed:", err) } }() return fmt.Sprintf("http://%s/", address), nil } // http_handler handles the requests coming from the Telemetry API. // Everytime Telemetry API sends log events, this function will read them from the response body // and put into a synchronous queue to be dispatched later. // Logging or printing besides the error cases below is not recommended if you have subscribed to // receive extension logs. Otherwise, logging here will cause Telemetry API to send new logs for // the printed lines which may create an infinite loop. func (s *TelemetryApiListener) http_handler(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { l.Error("[listener:http_handler] Error reading body:", err) return } // Parse and put the log messages into the queue var slice []interface{} _ = json.Unmarshal(body, &slice) for _, el := range slice { s.LogEventsQueue.Put(el) } l.Info("[listener:http_handler] logEvents received:", len(slice), " LogEventsQueue length:", s.LogEventsQueue.Len()) slice = nil }

Especificación de un protocolo de destino

Al suscribirse para recibir telemetría mediante la API de telemetría, puede especificar un protocolo de destino además del URI de destino:

{ "destination": { "protocol": "HTTP", "URI": "http://sandbox.localdomain:8080" } }

Lambda acepta dos protocolos para recibir telemetría:

  • HTTP (recomendado): Lambda entrega telemetría a un punto de conexión HTTP local (http://sandbox.localdomain:${PORT}/${PATH}) como una matriz de registros en formato JSON. El parámetro $PATH es opcional. Lambda solo admite HTTP, no HTTPS. Lambda ofrece telemetría a través de solicitudes POST.

  • TCP: Lambda entrega telemetría a un puerto TCP en formato JSON delimitado por línea nueva (NDJSON).

nota

Recomendamos encarecidamente utilizar HTTP en lugar de TCP. Con TCP, la plataforma de Lambda no puede reconocer cuando la telemetría se entrega a la capa de aplicación. Por lo tanto, si su extensión se bloquea, puede perder la telemetría. HTTP no tiene esta limitación.

Antes de suscribirse para recibir telemetría, establezca el oyente HTTP local o el puerto TCP. Durante la instalación, tenga en cuenta lo siguiente:

  • Lambda envía telemetría solo a destinos que se encuentran dentro del entorno de ejecución.

  • Lambda vuelve a intentar enviar telemetría (con retroceso) si no hay ningún oyente o si la solicitud POST encuentra un error. Si el oyente de telemetría se bloquea, continuará recibiendo telemetría después de que Lambda reinicie el entorno de ejecución.

  • Lambda reserva el puerto 9001. No hay otras restricciones ni recomendaciones sobre el número de puerto.

Configuración del uso de memoria y el almacenamiento en búfer

El uso de memoria en un entorno de ejecución aumenta de forma lineal con el número de suscriptores. Las suscripciones consumen recursos de memoria porque cada una abre un nuevo búfer de memoria para almacenar datos de telemetría. El uso de memoria del búfer cuenta para el consumo general de memoria en el entorno de ejecución.

Al suscribirse para recibir telemetría mediante la API de telemetría, tiene la opción de almacenar en búfer los datos de telemetría y entregarlos a los suscriptores en lotes. Para optimizar el uso de memoria, puede especificar la configuración de almacenamiento en búfer:

{ "buffering": { "maxBytes": 256*1024, "maxItems": 1000, "timeoutMs": 100 } }
Parámetro Descripción Valores predeterminados y límites

maxBytes

El volumen máximo de telemetría (en bytes) que se debe almacenar en memoria.

Predeterminado: 262 144

Mínimo: 262 144

Máximo: 1 048 576

maxItems

El número máximo de eventos que se deben almacenar en memoria.

Predeterminado: 10 000

Mínimo: 1000

Máximo: 10 000

timeoutMs

Tiempo máximo (en milisegundos) para almacenar en búfer un lote.

Predeterminado: 1000

Mínimo: 25

Máximo: 30 000

Cuando configure el almacenamiento en búfer, tenga en cuenta lo siguiente:

  • Si alguno de los flujos de entrada está cerrado, Lambda vacía los registros. Esto puede suceder si, por ejemplo, se bloquea el tiempo de ejecución.

  • Cada suscriptor puede personalizar su configuración de almacenamiento en búfer en la solicitud de suscripción.

  • Cuando determine el tamaño del búfer para leer los datos, prevea recibir cargas tan grandes como 2 * maxBytes + metadataBytes, donde maxBytes es un componente de su configuración de almacenamiento en búfer. Para calcular la cantidad de metadataBytes a tener en cuenta, revise los siguientes metadatos. Lambda agrega apéndices de metadatos similares a este a cada registro:

    { "time": "2022-08-20T12:31:32.123Z", "type": "function", "record": "Hello World" }
  • Si el suscriptor no puede procesar la telemetría entrante con la suficiente rapidez o su código de función genera un volumen muy alto de registro, Lambda podría soltar registros para mantener limitada la utilización de la memoria. Cuando esto ocurre, Lambda envía un evento platform.logsDropped.

Envío de una solicitud de suscripción a la API de telemetría

Las extensiones de Lambda pueden suscribirse para recibir datos de telemetría enviando una solicitud de suscripción a la API de telemetría. La solicitud de suscripción debe contener información sobre los tipos de eventos a los que quiere que se suscriba la extensión. Además, la solicitud puede contener información sobre el destino de la entrega y una configuración de almacenamiento en búfer.

Antes de enviar una solicitud de suscripción, debe tener un ID de extensión (Lambda-Extension-Identifier). Cuando registra su extensión con la API de extensiones, obtiene un ID de extensión de la respuesta de la API.

La suscripción se produce durante la fase de inicialización de la extensión. El siguiente ejemplo muestra una solicitud HTTP para suscribirse a los tres flujos de telemetría: telemetría de plataforma, registros de funciones y registros de extensiones.

PUT http://${AWS_LAMBDA_RUNTIME_API}/2022-07-01/telemetry HTTP/1.1 { "schemaVersion": "2022-12-13", "types": [ "platform", "function", "extension" ], "buffering": { "maxItems": 1000, "maxBytes": 256*1024, "timeoutMs": 100 }, "destination": { "protocol": "HTTP", "URI": "http://sandbox.localdomain:8080" } }

Si la solicitud se realiza correctamente, entonces el suscriptor recibe una respuesta correcta HTTP 200.

HTTP/1.1 200 OK "OK"

Mensajes entrantes de la API de telemetría

Tras suscribirse mediante la API de telemetría, una extensión comienza a recibir automáticamente la telemetría de Lambda mediante solicitudes POST. El cuerpo de cada solicitud POST contiene una matriz de objetos Event. Cada Event tiene el siguiente esquema:

{ time: String, type: String, record: Object }
  • La propiedad time define cuándo la plataforma Lambda generó el evento. Esto difiere de cuando ocurrió realmente el evento. El valor de la cadena de time es una marca de tiempo en formato ISO 8601.

  • La propiedad type define el tipo de evento. En la siguiente table se describen todos los posibles valores.

  • La propiedad record define un objeto JSON que contiene los datos de telemetría. El esquema de este objeto JSON depende del type.

La siguiente tabla resume todos los tipos de objetos de Event y se enlaza con la referencia del Event del esquema de la API de telemetría para cada tipo de evento.

Categoría Tipo de evento Descripción Esquema de registro de eventos

Evento de plataforma

platform.initStart

Se inició la inicialización de la función.

esquema platform.initStart

Evento de plataforma

platform.initRuntimeDone

Se completó la inicialización de la función.

esquema platform.initRuntimeDone

Evento de plataforma

platform.initReport

Un informe de inicialización de la función.

esquema platform.initReport

Evento de plataforma

platform.start

Se inició la invocación de la función.

esquema platform.start

Evento de plataforma

platform.runtimeDone

El tiempo de ejecución terminó de procesar un evento con éxito o con falla.

esquema platform.runtimeDone

Evento de plataforma

platform.report

Un informe de la invocación de funciones.

esquema platform.report

Evento de plataforma

platform.restoreStart

Se inició la restauración en tiempo de ejecución.

esquema platform.restoreStart

Evento de plataforma

platform.restoreRuntimeDone

Se completó la restauración en tiempo de ejecución.

esquema platform.restoreRuntimeDone

Evento de plataforma

platform.restoreReport

Informe de restauración en tiempo de ejecución.

esquema platform.restoreReport

Evento de plataforma

platform.telemetrySubscription

La extensión suscrita a la API de telemetría.

esquema platform.telemetrySubscription

Evento de plataforma

platform.logsDropped

Lambda ha eliminado las entradas de registro.

esquema platform.logsDropped

Registros de funciones

function

Una línea de registro del código de la función.

esquema function

Registros de extensión

extension

Una línea de registro del código de extensión.

esquema extension

PrivacidadTérminos del sitioPreferencias de cookies
© 2025, Amazon Web Services, Inc o sus afiliados. Todos los derechos reservados.