Strumentazione del codice Ruby in AWS Lambda
Lambda si integra con AWS X-Ray per consentire di tracciare, eseguire il debug e ottimizzare le applicazioni Lambda. Puoi utilizzare X-Ray per tracciare una richiesta mentre attraversa le risorse nell'applicazione, dall'API di frontend allo storage e al database di backend. Semplicemente aggiungendo la libreria SDK X-Ray alla configurazione della compilazione, è possibile registrare errori e latenza per qualsiasi chiamata effettuata dalla funzione a un servizio AWS.
Dopo aver configurato il tracciamento attivo, è possibile osservare richieste specifiche tramite l'applicazione. Il grafico dei servizi X-Ray mostra informazioni sull'applicazione e tutti i suoi componenti. Il seguente esempio mostra un'applicazione con due funzioni. La funzione principale elabora gli eventi e talvolta restituisce errori. La seconda funzione elabora gli errori che appaiono nel gruppo di log della prima funzione e utilizza l'SDK AWS per chiamare X-Ray, Amazon Simple Storage Service (Amazon S3) e Amazon CloudWatch Logs.
Per attivare il tracciamento attivo sulla funzione Lambda con la console, attenersi alla seguente procedura:
Per attivare il tracciamento attivo
Aprire la pagina Funzioni
della console Lambda. -
Scegliere una funzione.
Scegliere Configuration (Configurazione) e quindi Monitoring and operations tools (Strumenti di monitoraggio e operazioni).
Nel riquadro Strumenti di monitoraggio aggiuntivi scegli Modifica.
-
In CloudWatch Application Signals AWS X-Ray e, scegli Enable for Lambda service trace.
-
Selezionare Salva.
Prezzi
È possibile utilizzare il tracciamento X-Ray gratuitamente ogni mese fino a un certo limite come parte del piano gratuito di AWS. Oltre la soglia, X-Ray addebita lo storage di traccia e il recupero. Per ulteriori informazioni, consultare Prezzi di AWS X-Ray
La funzione ha bisogno dell'autorizzazione per caricare i dati di traccia su X-Ray. Quando si attiva il tracciamento nella console Lambda, Lambda aggiunge le autorizzazioni necessarie al ruolo di esecuzione della funzione. In caso contrario, aggiungere la policy AWSXRayDaemonWriteAccess
X-Ray non traccia tutte le richieste nell'applicazione. X-Ray applica un algoritmo di campionamento per garantire che il tracciamento avvenga in modo efficiente, continuando allo stesso tempo a fornire un campione rappresentativo di tutte le richieste. La frequenza di campionamento è di una richiesta al secondo e del 5% delle altre richieste. Non è possibile configurare la frequenza di campionamento di X-Ray per le funzioni.
In X-Ray, una traccia registra informazioni su una richiesta elaborata da uno o più servizi. Lambda registra 2 segmenti per traccia, che creano due nodi sul grafico del servizio. L'immagine seguente evidenzia questi due nodi:
Il primo nodo a sinistra rappresenta il servizio Lambda che riceve la richiesta di chiamata. Il secondo nodo rappresenta la specifica funzione Lambda. L'esempio seguente mostra una traccia con questi 2 segmenti. Entrambi sono nominati my-function, ma uno ha l'origine AWS::Lambda e l'altro ha l'origine AWS::Lambda::Function. Se il segmento AWS::Lambda mostra un errore, il servizio Lambda ha avuto un problema. Se il AWS::Lambda::Function segmento mostra un errore, la funzione ha avuto un problema.
Questo esempio espande il segmento AWS::Lambda::Function per visualizzare i relativi tre sottosegmenti.
Nota
AWS sta attualmente implementando modifiche al servizio Lambda. A causa di queste modifiche, potresti notare piccole differenze tra la struttura e il contenuto dei messaggi di log di sistema e dei segmenti di traccia emessi da diverse funzioni Lambda nel tuo Account AWS.
La traccia di esempio mostrata qui illustra il segmento di funzione vecchio stile. Le differenze tra i segmenti vecchio e nuovo stile sono descritte nei paragrafi seguenti.
Queste modifiche verranno implementate nelle prossime settimane e tutte le funzioni in tutte le Regioni AWS, ad eccezione delle regioni Cina e GovCloud, passeranno all'utilizzo dei messaggi di log e dei segmenti di traccia di nuovo formato.
Il segmento di funzioni vecchio stile contiene i seguenti sottosegmenti:
-
Inizializzazione – Rappresenta il tempo trascorso a caricare la funzione e ad eseguire il codice di inizializzazione. Questo sottosegmento viene visualizzato solo per il primo evento che viene elaborato da ogni istanza della funzione.
-
Chiamata: rappresenta il tempo impiegato per eseguire il codice del gestore.
-
Overhead: rappresenta il tempo impiegato dal runtime Lambda per prepararsi a gestire l'evento successivo.
Il segmento di funzione di nuovo stile non contiene un sottosegmento Invocation. I sottosegmenti dei clienti sono invece collegati direttamente al segmento di funzioni. Per ulteriori informazioni sulla struttura dei segmenti di funzioni vecchio e nuovo stile, consulta Informazioni sui monitoraggi di X-Ray.
È possibile strumentare il codice del gestore per registrare i metadati e tracciare le chiamate a valle. Per registrare dettagli sulle chiamate effettuate dal gestore ad altre risorse e servizi, utilizzare l'SDK for Ruby X-Ray. Per ottenere l'SDK, aggiungere il pacchetto aws-xray-sdk alle dipendenze dell'applicazione.
Esempio blank-ruby/function/Gemfile
# Gemfile source 'https://rubygems.org'gem 'aws-xray-sdk', '0.11.4'gem 'aws-sdk-lambda', '1.39.0' gem 'test-unit', '3.3.5'
Per strumentare i client AWS SDK, richiedere il modulo aws-xray-sdk/lambda dopo aver creato un client nel codice di inizializzazione.
Esempio blank-ruby/function/lambda_function.rb – Tracciamento di un client SDK AWS
# lambda_function.rb require 'logger' require 'json' require 'aws-sdk-lambda' $client = Aws::Lambda::Client.new() $client.get_account_settings()require 'aws-xray-sdk/lambda'def lambda_handler(event:, context:) logger = Logger.new($stdout) ...
In X-Ray, una traccia registra informazioni su una richiesta elaborata da uno o più servizi. Lambda registra 2 segmenti per traccia, che creano due nodi sul grafico del servizio. L'immagine seguente evidenzia questi due nodi:
Il primo nodo a sinistra rappresenta il servizio Lambda che riceve la richiesta di chiamata. Il secondo nodo rappresenta la specifica funzione Lambda. L'esempio seguente mostra una traccia con questi 2 segmenti. Entrambi sono nominati my-function, ma uno ha l'origine AWS::Lambda e l'altro ha l'origine AWS::Lambda::Function. Se il segmento AWS::Lambda mostra un errore, il servizio Lambda ha avuto un problema. Se il AWS::Lambda::Function segmento mostra un errore, la funzione ha avuto un problema.
Questo esempio espande il segmento AWS::Lambda::Function per visualizzare i relativi tre sottosegmenti.
Nota
AWS sta attualmente implementando modifiche al servizio Lambda. A causa di queste modifiche, potresti notare piccole differenze tra la struttura e il contenuto dei messaggi di log di sistema e dei segmenti di traccia emessi da diverse funzioni Lambda nel tuo Account AWS.
La traccia di esempio mostrata qui illustra il segmento di funzione vecchio stile. Le differenze tra i segmenti vecchio e nuovo stile sono descritte nei paragrafi seguenti.
Queste modifiche verranno implementate nelle prossime settimane e tutte le funzioni in tutte le Regioni AWS, ad eccezione delle regioni Cina e GovCloud, passeranno all'utilizzo dei messaggi di log e dei segmenti di traccia di nuovo formato.
Il segmento di funzioni vecchio stile contiene i seguenti sottosegmenti:
-
Inizializzazione – Rappresenta il tempo trascorso a caricare la funzione e ad eseguire il codice di inizializzazione. Questo sottosegmento viene visualizzato solo per il primo evento che viene elaborato da ogni istanza della funzione.
-
Chiamata: rappresenta il tempo impiegato per eseguire il codice del gestore.
-
Overhead: rappresenta il tempo impiegato dal runtime Lambda per prepararsi a gestire l'evento successivo.
Il segmento di funzione di nuovo stile non contiene un sottosegmento Invocation. I sottosegmenti dei clienti sono invece collegati direttamente al segmento di funzioni. Per ulteriori informazioni sulla struttura dei segmenti di funzioni vecchio e nuovo stile, consulta Informazioni sui monitoraggi di X-Ray.
È inoltre possibile strumentare i client HTTP, registrare query SQL e creare segmenti secondari personalizzati con annotazioni e metadati. Per ulteriori informazioni, consulta l'SDK for Ruby X-Ray nella Guida per gli sviluppatori di AWS X-Ray.
Sezioni
Abilitazione del tracciamento attivo con l'API Lambda
Per gestire la configurazione del tracciamento con AWS CLI CLI o SDK AWS, utilizza le seguenti operazioni API.
Il seguente comando AWS CLI di esempio consente il tracciamento attivo su una funzione denominata my-function.
aws lambda update-function-configuration --function-name my-function \ --tracing-config Mode=Active
La modalità di tracciamento fa parte della configurazione specifica della versione quando si pubblica una versione della funzione. Non è possibile modificare la modalità di tracciamento in una versione pubblicata.
Abilitazione del tracciamento attivo con CloudFormation
Per attivare il tracciamento su una risorsa AWS::Lambda::Function in un modello CloudFormation, utilizzare la proprietà TracingConfig.
Esempio function-inline.yml – Configurazione del tracciamento
Resources: function: Type: AWS::Lambda::Function Properties:TracingConfig: Mode: Active...
Per una risorsa AWS Serverless Application Model (AWS SAM) AWS::Serverless::Function, utilizzare la proprietà Tracing.
Esempio template.yml – Configurazione del tracciamento
Resources: function: Type: AWS::Serverless::Function Properties:Tracing: Active...
Memorizzazione delle dipendenze di runtime in un layer
Se si utilizza l'SDK X-Ray per strumentare i client SDK AWS del codice della funzione, il pacchetto di implementazione può diventare piuttosto grande. Per evitare di caricare dipendenze di runtime ogni volta che si aggiorna il codice della funzione, includere l'SDK X-Ray in un livello Lambda.
L'esempio seguente mostra una risorsa AWS::Serverless::LayerVersion che memorizza l'SDK for Ruby X-Ray.
Esempio template.yml – Livello delle dipendenze
Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: function/. Tracing: ActiveLayers: - !Ref libs...libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-ruby-lib Description: Dependencies for the blank-ruby sample app. ContentUri: lib/. CompatibleRuntimes: - ruby2.5
Con questa configurazione, si aggiorna il livello della libreria solo se si modificano le dipendenze di runtime. Poiché il pacchetto di implementazione della funzione contiene solo il codice, questo può contribuire a ridurre i tempi di caricamento.
La creazione di un layer per le dipendenze richiede modifiche alla compilazione per generare l'archivio dei layer prima della distribuzione. Per un esempio funzionante, vedere l'applicazione di esempio blank-ruby