Accès aux données de télémétrie en temps réel pour les extensions à l'aide de la télémétrie API - AWS Lambda

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Accès aux données de télémétrie en temps réel pour les extensions à l'aide de la télémétrie API

La télémétrie API permet à vos extensions de recevoir des données de télémétrie directement depuis Lambda. Pendant l'initialisation et l'invocation des fonctions, Lambda capture automatiquement la télémétrie, notamment les journaux, les métriques de la plateforme et les traces de la plateforme. La télémétrie API permet aux extensions d'accéder à ces données de télémétrie directement depuis Lambda en temps quasi réel.

Dans l'environnement d'exécution Lambda, vous pouvez abonner vos extensions Lambda à des flux de télémétrie. Après la souscription, Lambda envoie automatiquement toutes les données de télémétrie à vos extensions. Vous pouvez ensuite traiter, filtrer et distribuer les données à votre destination préférée, telle qu'un compartiment Amazon Simple Storage Service (Amazon S3) ou un fournisseur d'outils d'observabilité tiers.

Le schéma suivant montre comment les extensions API et la télémétrie API relient les extensions à Lambda depuis l'environnement d'exécution. De plus, le Runtime API connecte votre environnement d'exécution et votre fonction à Lambda.

Les extensions, la télémétrie et le runtime APIs se connectent aux processus de l'environnement d'exécution.
Important

La télémétrie Lambda remplace API les journaux Lambda. API Bien que les journaux API restent entièrement fonctionnels, nous vous recommandons de n'utiliser que la télémétrie à l'APIavenir. Vous pouvez abonner votre extension à un flux de télémétrie à l'aide de la télémétrie API ou des journaux. API Après vous être abonné à l'aide de l'un d'entre euxAPIs, toute tentative de souscription à l'aide de l'autre API renvoie une erreur.

Les extensions peuvent utiliser la télémétrie API pour s'abonner à trois flux de télémétrie différents :

  • Télémétrie de plateforme – Journaux, métriques et traces, qui décrivent les événements et les erreurs liés au cycle de vie de l’environnement d’exécution, au cycle de vie des extensions et aux appels de fonctions

  • Journaux de fonction – Journaux personnalisés que le code de la fonction Lambda génère.

  • Journaux d’extension – Journaux personnalisés générés par le code d’extension Lambda.

Note

Lambda envoie des journaux CloudWatch, des métriques et des traces à X-Ray (si vous avez activé le suivi), même si une extension s'abonne à des flux de télémétrie.

Création d'extensions à l'aide de la télémétrie API

Les extensions Lambda s'exécutent comme des processus indépendants dans l'environnement d'exécution. Les extensions peuvent continuer à s'exécuter une fois l'invocation des fonctions terminée. Comme les extensions sont des processus séparés, vous pouvez les écrire dans un langage différent du code de la fonction. Nous recommandons d'écrire les extensions en utilisant un langage compilé tel que Golang ou Rust. De cette façon, l’extension est un binaire autonome qui peut être compatible avec tout environnement d’exécution pris en charge.

Le schéma suivant illustre un processus en quatre étapes pour créer une extension qui reçoit et traite les données de télémétrie à l'aide de la télémétrie. API

Enregistrez votre extension, créez un écouteur, abonnez-vous à un flux, puis obtenez la télémétrie.

Voici chaque étape plus en détail :

  1. Enregistrez votre extension à l’aide du Utilisation des extensions Lambda API pour créer des extensions. Cela vous fournit un Lambda-Extension-Identifier, dont vous aurez besoin dans les étapes suivantes. Pour plus d’informations sur la façon d’enregistrer votre extension, consultez Enregistrement de votre extension.

  2. Créez un écouteur de télémétrie. Il peut s'agir d'un serveur de base HTTP ou d'un TCP serveur. Lambda utilise le récepteur URI de télémétrie pour envoyer des données de télémétrie à votre extension. Pour de plus amples informations, veuillez consulter Création d’un écouteur de télémétrie.

  3. À l'aide du bouton S'abonner API à la télémétrieAPI, abonnez votre extension aux flux de télémétrie souhaités. Vous aurez besoin URI de votre écouteur de télémétrie pour cette étape. Pour de plus amples informations, veuillez consulter Envoi d'une demande d'abonnement à la télémétrie API.

  4. Obtenez les données de télémétrie de Lambda via l’écouteur de télémétrie. Vous pouvez effectuer tout traitement personnalisé de ces données, par exemple en les envoyant vers Amazon S3 ou vers un service d’observabilité externe.

Note

L’environnement d’exécution d’une fonction Lambda peut démarrer et s’arrêter plusieurs fois dans le cadre de son cycle de vie. En général, votre code d’extension s’exécute pendant les appels de la fonction, et aussi jusqu’à 2 secondes pendant la phase d’arrêt. Nous vous recommandons de regrouper la télémétrie au fur et à mesure qu'elle parvient à votre écouteur. Utilisez ensuite les événements du cycle de vie Invoke et Shutdown pour envoyer chaque lot vers les destinations souhaitées.

Enregistrement de votre extension

Avant de pouvoir vous abonner aux données de télémétrie, vous devez enregistrer votre extension Lambda. L’enregistrement a lieu pendant la phase d’initialisation de l’extension. L'exemple suivant montre une HTTP demande d'enregistrement d'une extension.

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

Si la demande aboutit, l'abonné reçoit une réponse positive de HTTP 200. L’en-tête de réponse contient le Lambda-Extension-Identifier. Le corps de la réponse contient d’autres propriétés de la fonction.

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

Pour plus d’informations, consultez le APIRéférence des extensions.

Création d’un écouteur de télémétrie

Votre extension Lambda doit disposer d'un écouteur qui gère les demandes entrantes provenant de la télémétrie. API Le code suivant présente un exemple de mise en œuvre d’un écouteur de télémétrie 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 }

Spécification d’un protocole de destination

Lorsque vous vous abonnez pour recevoir de la télémétrie à l'aide de la télémétrieAPI, vous pouvez spécifier un protocole de destination en plus de la destination : URI

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

Lambda accepte deux protocoles pour recevoir des télémétries :

  • HTTP(recommandé) — Lambda fournit la télémétrie à un point de HTTP terminaison local (http://sandbox.localdomain:${PORT}/${PATH}) sous forme de tableau d'enregistrements au format. JSON Le paramètre $PATH est facultatif. Lambda prend uniquement en chargeHTTP, pas. HTTPS Lambda fournit des services de télémétrie par le biais de demandes. POST

  • TCP— Lambda fournit la télémétrie à un TCP port au format Newline Delimited (). JSON NDJSON

Note

Nous vous recommandons vivement d'utiliser HTTP plutôt queTCP. AinsiTCP, la plateforme Lambda ne peut pas accuser réception lorsqu'elle fournit de la télémétrie à la couche application. Par conséquent, si votre extension se bloque, vous risquez de perdre la télémétrie. HTTPn'a pas cette limitation.

Avant de vous abonner pour recevoir des données de télémétrie, définissez le port ou l'HTTPécouteur local. TCP Au cours de l’installation, notez ce qui suit :

  • Lambda n’envoie la télémétrie qu’à des destinations au sein de l’environnement d’exécution.

  • Lambda essaie à nouveau d'envoyer des données télémétriques (avec interruption) en l'absence d'écouteur ou si la demande rencontre une erreur. POST Si l'écouteur de télémétrie se bloque, il reprend la réception de la télémétrie après que Lambda a redémarré l'environnement d'exécution.

  • Lambda réserve le port 9001. Il n’y a pas d’autres restrictions ou recommandations relatives au numéro de port.

Configuration de l’utilisation de la mémoire et de la mise en mémoire tampon

L'utilisation de la mémoire dans un environnement d'exécution augmente de façon linéaire avec le nombre d'abonnés. Les abonnements consomment des ressources de mémoire, car chacun d’eux ouvre un nouveau tampon mémoire pour stocker les données de télémétrie. L'utilisation de la mémoire tampon contribue à la consommation globale de mémoire dans l'environnement d'exécution.

Lorsque vous vous abonnez pour recevoir de la télémétrie par le biais de la télémétrieAPI, vous avez la possibilité de mettre en mémoire tampon les données de télémétrie et de les transmettre aux abonnés par lots. Pour optimiser l'utilisation de la mémoire, vous pouvez spécifier une configuration de mise en mémoire tampon :

{ "buffering": { "maxBytes": 256*1024, "maxItems": 1000, "timeoutMs": 100 } }
Paramètre Description Valeurs par défaut et limites

maxBytes

Le volume maximal de télémétrie (en octets) à mettre en mémoire tampon.

Par défaut : 262 144

Minimum : 262 144

Maximum : 1 048 576

maxItems

Le nombre maximal d’événements à mettre en mémoire tampon.

Par défaut : 10 000

Minimum : 1 000

Maximum : 10 000.

timeoutMs

La durée maximale (en millisecondes) pour la mise en mémoire tampon d’un lot.

Par défaut : 1 000

Minimum : 25

Maximum : 30 000

Lorsque vous configurez la mise en mémoire tampon, tenez compte des points suivants :

  • Si l'un des flux d'entrée est fermé, Lambda vide les journaux. Cela peut se produire si, par exemple, l'environnement d'exécution se bloque.

  • Chaque abonné peut spécifier une configuration de mise en mémoire tampon différente dans sa demande d'abonnement.

  • Lorsque vous déterminez la taille de la mémoire tampon pour la lecture des données, attendez-vous à recevoir des charges utiles aussi importantes que 2 * maxBytes + metadataBytes, maxBytes étant un composant de votre configuration de mise en mémoire tampon. Pour évaluer la quantité de metadataBytes à prendre en compte, consultez les métadonnées suivantes. Lambda adjoint des métadonnées similaires à celles-ci à chaque enregistrement :

    { "time": "2022-08-20T12:31:32.123Z", "type": "function", "record": "Hello World" }
  • Si l’abonné ne peut pas traiter la télémétrie entrante assez rapidement, ou si votre code de fonction génère un volume de journal très élevé, Lambda peut abandonner des enregistrements pour limiter l’utilisation de la mémoire. Lorsque cela se produit, Lambda envoie un événement platform.logsDropped.

Envoi d'une demande d'abonnement à la télémétrie API

Les extensions Lambda peuvent s'abonner pour recevoir des données de télémétrie en envoyant une demande d'abonnement à la télémétrie. API La demande d’abonnement doit contenir des informations sur les types d’événements auxquels vous voulez que l’extension s’abonne. En outre, la demande peut contenir des informations sur la destination de la livraison et une configuration de mise en mémoire tampon.

Avant d’envoyer une demande d’abonnement, vous devez disposer d’un ID d’extension (Lambda-Extension-Identifier). Lorsque vous enregistrez votre extension auprès des extensions API, vous obtenez un identifiant d'extension à partir de la API réponse.

L’abonnement a lieu pendant la phase d’initialisation de l’extension. L'exemple suivant montre une HTTP demande d'abonnement aux trois flux de télémétrie : télémétrie de plate-forme, journaux de fonctions et journaux d'extension.

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 demande aboutit, l'abonné reçoit une réponse positive de HTTP 200.

HTTP/1.1 200 OK "OK"

Messages de télémétrie API entrants

Après s'être abonnée à l'aide de la télémétrieAPI, une extension commence automatiquement à recevoir la télémétrie de Lambda via des requêtes. POST Chaque corps de POST requête contient un tableau d'Eventobjets. Chaque Event est structuré selon le schéma suivant :

{ time: String, type: String, record: Object }
  • La propriété time définit le moment où la plateforme Lambda a généré l’événement. Cela est différent du moment où l'événement s'est réellement produit. La valeur de chaîne de time est un horodatage au format ISO 8601.

  • La propriété type définit le type d’événement. Le tableau suivant décrit toutes les valeurs possibles.

  • La record propriété définit un JSON objet qui contient les données de télémétrie. Le schéma de cet JSON objet dépend dutype.

Le tableau suivant récapitule tous les types d'Eventobjets et contient des liens vers la référence du API Event schéma de télémétrie pour chaque type d'événement.

Catégorie Type d’événement Description Schéma d’enregistrement des événements

Événement de plateforme

platform.initStart

L’initialisation de la fonction a commencé.

Schéma platform.initStart

Événement de plateforme

platform.initRuntimeDone

L’initialisation de la fonction est terminée.

Schéma platform.initRuntimeDone

Événement de plateforme

platform.initReport

Un rapport d’initialisation de la fonction.

Schéma platform.initReport

Événement de plateforme

platform.start

L’invocation de la fonction a commencé.

Schéma platform.start

Événement de plateforme

platform.runtimeDone

L’environnement d’exécution a fini de traiter un événement avec succès ou échec.

Schéma platform.runtimeDone

Événement de plateforme

platform.report

Un rapport sur l’invocation de la fonction.

Schéma platform.report

Événement de plateforme

platform.restoreStart

La restauration de l’exécution a commencé.

Schéma platform.restoreStart

Événement de plateforme

platform.restoreRuntimeDone

La restauration de l’exécution est terminée.

Schéma platform.restoreRuntimeDone

Événement de plateforme

platform.restoreReport

Le rapport de restauration de d’exécution.

Schéma platform.restoreReport

Événement de plateforme

platform.telemetrySubscription

L'extension s'est abonnée à la télémétrieAPI.

Schéma platform.telemetrySubscription

Événement de plateforme

platform.logsDropped

Les entrées de journal abandonnées par Lambda.

Schéma platform.logsDropped

Journaux de fonctions

function

Une ligne de journal du code de la fonction.

Schéma function

Journaux d’extension

extension

Une ligne de journal du code de l’extension.

Schéma extension