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.

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.
Secciones
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.

A continuación, se muestra cada paso en mayor profundidad:
-
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. -
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.
-
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.
-
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 |
---|---|---|
|
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 |
|
El número máximo de eventos que se deben almacenar en memoria. |
Predeterminado: 10 000 Mínimo: 1000 Máximo: 10 000 |
|
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
, dondemaxBytes
es un componente de su configuración de almacenamiento en búfer. Para calcular la cantidad demetadataBytes
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 detime
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 deltype
.
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 |
|
Se inició la inicialización de la función. |
esquema platform.initStart |
Evento de plataforma |
|
Se completó la inicialización de la función. |
esquema platform.initRuntimeDone |
Evento de plataforma |
|
Un informe de inicialización de la función. |
esquema platform.initReport |
Evento de plataforma |
|
Se inició la invocación de la función. |
esquema platform.start |
Evento de plataforma |
|
El tiempo de ejecución terminó de procesar un evento con éxito o con falla. |
esquema platform.runtimeDone |
Evento de plataforma |
|
Un informe de la invocación de funciones. |
esquema platform.report |
Evento de plataforma |
|
Se inició la restauración en tiempo de ejecución. |
esquema platform.restoreStart |
Evento de plataforma |
|
Se completó la restauración en tiempo de ejecución. |
esquema platform.restoreRuntimeDone |
Evento de plataforma |
|
Informe de restauración en tiempo de ejecución. |
esquema platform.restoreReport |
Evento de plataforma |
|
La extensión suscrita a la API de telemetría. |
esquema platform.telemetrySubscription |
Evento de plataforma |
|
Lambda ha eliminado las entradas de registro. |
esquema platform.logsDropped |
Registros de funciones |
|
Una línea de registro del código de la función. |
esquema function |
Registros de extensión |
|
Una línea de registro del código de extensión. |
esquema extension |