Instrumentar as funções do AWS Lambda - AWS X-Ray

Instrumentar as funções do AWS Lambda

O Scorekeep usa duas funções do AWS Lambda. A primeira é a função Node.js na ramificação lambda que gera nomes aleatórios para novos usuários. Quando um usuário cria uma sessão sem informar um nome, o aplicativo chama uma função denominada random-name com o AWS SDK for Java. O X-Ray SDK para Java registra informações sobre a chamada ao Lambda em um subsegmento assim como qualquer outra chamada feita com um cliente instrumentado do SDK da AWS.

nota

A execução da função random-name do Lambda requer a criação de recursos adicionais fora do ambiente do Elastic Beanstalk. Consulte o arquivo leia-me para obter mais informações e instruções: AWS Lambda Integration.

A segunda função, scorekeep-worker, é uma função Python que pode ser executada independentemente da API do Scorekeep. Quando um jogo termina, a API grava o ID da sessão e o ID do jogo em uma fila do SQS. A função de operador lê itens da fila e chama a API do Scorekeep para criar registros completos de cada sessão do jogo para armazenamento no Amazon S3.

O Scorekeep inclui modelos e scripts do AWS CloudFormation para criar as duas funções. Como você precisa empacotar o X-Ray SDK com o código da função, os modelos criam as funções sem nenhum código. Quando você implanta o Scorekeep, um arquivo de configuração incluído na pasta .ebextensions cria um pacote de origem que inclui o SDK e atualiza o código da função e a configuração com a AWS Command Line Interface.

Nome aleatório

O Scorekeep chama a função de nome aleatório quando um usuário inicia uma sessão do jogo sem fazer login ou especificando um nome de usuário. Quando o Lambda processa a chamada a random-name, ele lê o cabeçalho de rastreamento, que contém o ID de rastreamento e a decisão de amostragem gravados pelo X-Ray SDK para Java.

Para cada solicitação amostrada, o Lambda executa o daemon do X-Ray e grava dois segmentos. O primeiro registra informações sobre a chamada ao Lambda que invoca a função. Esse segmento contém as mesmas informações que o subsegmento registrado pelo Scorekeep, mas do ponto de vista do Lambda. O segundo segmento representa o trabalho que a função faz.

O Lambda passa o segmento de função para o X-Ray SDK por meio do contexto da função. Ao instrumentar uma função do Lambda, você não usa o SDK para criar um segmento para as solicitações de entrada. O Lambda fornece o segmento e você usa o SDK para instrumentar clientes e gravar subsegmentos.

Mapa de rastreamento que mostra como o Scorekeep chama uma função do Lambda a fim de obter nomes aleatórios para novos usuários

A função random-name é implementada em Node.js. Ele usa o SDK para JavaScript em Node.js para enviar notificações com o Amazon SNS e o X-Ray SDK para Node.js para instrumentar o cliente de SDK da AWS. Para gravar anotações, a função cria um subsegmento personalizado com AWSXRay.captureFunc e grava anotações na função instrumentada. No Lambda, não é possível gravar anotações diretamente no segmento da função, apenas em um subsegmento que você criar.

exemplo function/index.js: função do lambda de nome aleatório
var AWSXRay = require('aws-xray-sdk-core'); var AWS = AWSXRay.captureAWS(require('aws-sdk')); AWS.config.update({region: process.env.AWS_REGION}); var Chance = require('chance'); var myFunction = function(event, context, callback) { var sns = new AWS.SNS(); var chance = new Chance(); var userid = event.userid; var name = chance.first(); AWSXRay.captureFunc('annotations', function(subsegment){ subsegment.addAnnotation('Name', name); subsegment.addAnnotation('UserID', event.userid); }); // Notify var params = { Message: 'Created randon name "' + name + '"" for user "' + userid + '".', Subject: 'New user: ' + name, TopicArn: process.env.TOPIC_ARN }; sns.publish(params, function(err, data) { if (err) { console.log(err, err.stack); callback(err); } else { console.log(data); callback(null, {"name": name}); } }); }; exports.handler = myFunction;

Essa função é criada automaticamente quando você implanta o aplicativo de amostra para o Elastic Beanstalk. A ramificação xray inclui um script para criar uma função do Lambda vazia. Os arquivos de configuração na pasta .ebextensions criam o pacote da função com npm install durante a implantação e, em seguida, atualizam a função do Lambda com a AWS CLI.

Operador

A função de operador instrumentada é fornecida em sua própria ramificação xray-worker, uma vez que ela não pode executar a menos que você crie a função de operador e os recursos relacionados antes. Consulte o leia-me da ramificação para instruções.

A função é acionada por um evento do Amazon CloudWatch Events empacotado a cada 5 minutos. Quando ela é executada, a função obtém um item de uma fila do Amazon SQS que o Scorekeep gerencia. Cada mensagem contém informações sobre um jogo concluído.

O operador obtém o registro de jogos e documentos de outras tabelas às quais o registro do jogo faz referência. Por exemplo, o registro do jogo no DynamoDB inclui uma lista de movimentos executados durante o jogo. A lista não contém as movimentações propriamente ditas, mas os IDs das movimentações armazenados em uma tabela separada.

As sessões e os estados também são armazenados como referências. Isso impede que as entradas na tabela de jogos sejam muito grandes, mas requer chamadas adicionais para obter todas as informações sobre o jogo. O operador cancela as referências a todas essas entradas e cria um registro completo do jogo como um único documento no Amazon S3. Quando quiser analisar os dados, você poderá executar consultas diretamente no Amazon S3 com o Amazon Athena sem executar migrações de dados que exigem muita leitura para obter os dados do DynamoDB.

Mapa de rastreamento que mostra como a função de operador do Scorekeep usa o Amazon SQS, o Amazon S3 e a API do Scorekeep.

A função de operador tem o rastreamento ativo em sua configuração no AWS Lambda. Diferentemente do nome de função aleatória, o operador não recebe uma solicitação de um aplicativo instrumentado, de modo que AWS Lambda não recebe um cabeçalho de rastreamento. Com o rastreamento ativo, o Lambda cria o ID de rastreamento e toma as decisões de amostragem.

O X-Ray SDK para Python consiste apenas em algumas linhas na parte superior da função que importam o SDK e executam a função patch_all para aplicar patches ao AWS SDK for Python (Boto) e a HTTclients que ele usa para chamar o Amazon SQS e o Amazon S3. Quando o operador chama a API do Scorekeep, o SDK adiciona o cabeçalho de rastreamento à solicitação para rastrear chamadas por meio da API.

exemplo _lambda/scorekeep-worker/scorekeep-worker.py -- função do lambda do operador
import os import boto3 import json import requests import time from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.core import patch_all patch_all() queue_url = os.environ['WORKER_QUEUE'] def lambda_handler(event, context): # Create SQS client sqs = boto3.client('sqs') s3client = boto3.client('s3') # Receive message from SQS queue response = sqs.receive_message( QueueUrl=queue_url, AttributeNames=[ 'SentTimestamp' ], MaxNumberOfMessages=1, MessageAttributeNames=[ 'All' ], VisibilityTimeout=0, WaitTimeSeconds=0 ) ...