VISUALIZAR
AWS Lambda com OpenTelemetry for .NET ainda está em desenvolvimento.
Temos documentação semelhante para Java, mas se você estiver usando Python, Go, JavaScript, Ruby ou PHP para AWS Lambda com OpenTelemetry, poderá usar nossa documentação Java ou .NET como um guia geral para a configuração. Para obter informações adicionais, consulte AWS Distro para OpenTelemetry.
Este guia abordará como você pode usar o OpenTelemetry Lambda para trace sua função .NET do Lambda usando OpenTelemetry Lambda Layers gerenciados pela AWS. OpenTelemetry facilita a instrumentação de suas funções, incluindo instrumentação automática para muitas bibliotecas populares.
Pré-requisitos
Este guia pressupõe que você tenha o seguinte:
- Uma conta New Relic . Se você não tiver um, crie um gratuitamente.
- Uma conta AWS. Se você não tiver um, crie um gratuitamente.
- Uma função .NET do Lambda. Se você ainda não tem um, crie um agora.
Importante
A ativação do X-Ray não é mais necessária, porque DisableAwsXRayContextExtraction
está definido como true
no AWS OTel .NET SDK para Lambda. Você pode encontrar mais detalhes no Readme do AWS OTel .NET SDK for Lambda.
Instale a camada
A AWS publica uma camada gerenciada que inclui o coletor OpenTelemetry Lambda.
Para instalá-lo:
Abra sua função no Console do Lambda.
Em Layers na seção Designer , escolha Add a layer.
Em Specify an ARN, cole um dos ARNs de camada para a arquitetura da sua função na lista abaixo. Substitua
{region}
pela sua região da AWS, comous-east-1
.Escolha Add.
- AMD64/X86_64:
arn:aws:lambda:{region}:901920570463:layer:aws-otel-collector-amd64-ver-0-90-1:1
- ARM64:
arn:aws:lambda:\<region>:901920570463:layer:aws-otel-collector-arm64-ver-0-90-1:1
Para modelos SAM e CloudFormation, adicione o seguinte às propriedades da sua função:
yourFunctionHere:Type: AWS::Serverless::FunctionProperties:# ...Layers:# Use this if using x86_64 architecture- !Sub arn:${AWS::Partition}:lambda:${AWS::Region}:901920570463:layer:aws-otel-collector-amd64-ver-0-90-1:1# Use this if using arm64 architecture- !Sub arn:${AWS::Partition}:lambda:${AWS::Region}:901920570463:layer:aws-otel-collector-arm64-ver-0-90-1:1Importante
Consulte os ARNs mais recentes publicados pela AWS para verificar se os ARNs da camada acima estão atualizados.
- AMD64/X86_64:
Adicionar variáveis de ambiente do New Relic
Para enviar os dados OpenTelemetry que esta camada coleta para o New Relic, precisamos configurar o coletor OpenTelemetry Lambda que é empacotado com a camada para exportar a telemetria que recebe para o endpointOpenTelemetry do New Relic. Antes de fazermos isso, primeiro precisamos definir algumas variáveis de ambiente das quais dependerá.
- Gere e copie uma New Relic da sua conta New Relic.
- Abra sua função no Lambda Console.
- Escolha Configuration e depois Environment variables.
- Em Environment variables, escolha Edit.
- Escolha Add environment variable.
- Para Key defina-o como
NEW_RELIC_LICENSE_KEY
e defina Value como o valor da chave de licença gerada na etapa 1. Em seguida, escolha Save. - Escolha Add environment variable novamente.
- Para Key defina-o como
NEW_RELIC_OPENTELEMETRY_ENDPOINT
e defina Value como uma das opções abaixo (depende da sua região do New Relic). Em seguida, escolha Save. - Escolha Add environment variable novamente.
- Para Key defina-o como
OTEL_SERVICE_NAME
e defina Value como o nome da sua função. Em seguida, escolha Save.
otlp.nr-data.net:4317
: Se sua conta New Relic estiver na região dos EUAotlp.eu01.nr-data.net:4317
: Se a sua conta New Relic estiver na região da UEPara modelos SAM e CloudFormation, adicione o seguinte às propriedades da sua função. Certifique-se de substituir
your-license-key-here
por seu eotlp.nr-data.net:4317
pelo endpoint New Relic OpenTelemetry para sua região.yourFunctionHere:Type: AWS::Serverless::FunctionProperties:# ...Environment:Variables:# ...NEW_RELIC_LICENSE_KEY: your-license-key-hereNEW_RELIC_OPENTELEMETRY_ENDPOINT: otlp.nr-data.net:4317OTEL_SERVICE_NAME: your-function-name-hereImportante
Substitua
your-license-key-here
pelo seu New Relic eotlp.nr-data.net:4317
pelo endpoint apropriado para sua região do New Relic (veja a lista acima).
Configurar o coletor
Agora substituiremos a configuração padrão do coletor OpenTelemetry Lambda por uma que exporte a telemetria para o endpoint New Relic OpenTelemetry. Para fazer isso, devemos incluir um arquivo de configuração collector.yaml
com nossa função.
Crie um arquivo collector.yaml
no diretório raiz da sua função com o seguinte conteúdo:
receivers: otlp: protocols: grpc: http:
exporters: otlp: endpoint: ${NEW_RELIC_OPENTELEMETRY_ENDPOINT} headers: api-key: ${NEW_RELIC_LICENSE_KEY}
service: pipelines: traces: receivers: [otlp] exporters: [otlp] metrics: receivers: [otlp] exporters: [otlp] logs: receivers: [otlp] exporters: [otlp]
Agrupe esse arquivo collector.yaml
no diretório raiz do pacote zip da sua função.
Um exemplo de configuração *.csproj
pode ser assim:
<ItemGroup> <Content Include="collector.yaml"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </Content> </ItemGroup>
Então reimplante sua função.
- Abra sua função no Console do Lambda.
- Escolha Configuration e depois Environment variables.
- Em Environment variables, escolha Edit.
- Escolha Add environment variable.
- Para Key defina
OPENTELEMETRY_COLLECTOR_CONFIG_FILE
e defina Value como/var/task/collector.yaml
. - Em seguida, escolha Save.
Para modelos SAM e CloudFormation, adicione isto às propriedades da sua função:
yourFunctionHere: Type: AWS::Serverless::Function Properties: # ... Environment: Variables: # ... OPENTELEMETRY_COLLECTOR_CONFIG_FILE: /var/task/collector.yaml
Importante
Isso pressupõe que você agrupou seu collector.yaml
no diretório raiz da sua função. Se você o empacotou em outro lugar, substitua /var/task/collector.yaml
pelo caminho para seu collector.yaml
.
Instrumento Sua Função
Primeiro adicione o OpenTelemetry SDK para AWS Lambda, bem como o pacote de exportação OTLP. Você pode adicionar mais pacotes de instrumentação OpenTelemetry, como OpenTelemetry.instrumentação.AWS e OpenTelemetry.instrumentação.Http, para obter visibilidade adicional sobre o comportamento da sua função.
$dotnet add package OpenTelemetry.Instrumentation.AWSLambda$dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol$dotnet add package OpenTelemetry.Instrumentation.AWS$dotnet add package OpenTelemetry.Instrumentation.Http
Adicione chamadas para AddAWSLambdaConfigurations()
e AddOtlpExporter()
de TracerProvider
no construtor estático da sua função.
Importante
O construtor da sua função deve ser estático, porque TracerProvider
só deve ser inicializado uma vez por inicialização a frio do Lambda.
TracerProvider tracerProvider = Sdk.CreateTracerProviderBuilder() // add other instrumentations here .AddAWSLambdaConfigurations(options => options.DisableAwsXRayContextExtraction = true) .AddOtlpExporter() .Build();
Importante
Certifique-se de definir a propriedade DisableAwsXRayContextExtraction
como true
se você não ativar o X-Ray. Caso contrário, o rastreamento não será um instrumento.
Crie uma função wrapper com a mesma assinatura da função manipuladora do Lambda original. Chame a API AWSLambdaWrapper.Trace()
e passe TracerProvider
, a função original do Lambda, e suas entradas como parâmetro.
// new Lambda function handler passed inpublic string TracingFunctionHandler(JObject input, ILambdaContext context) => AWSLambdaWrapper.Trace(tracerProvider, OriginalFunctionHandler, input, context);
public string OriginalFunctionHandler(JObject input, ILambdaContext context) { return input?.ToString();}
Se o seu gerenciador original for uma função assíncrona, use a API TraceAsync()
em vez de Trace()
.
public Task<APIGatewayProxyResponse> TracingFunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) => AWSLambdaWrapper.TraceAsync(tracerProvider, OriginalFunctionHandler, request, context);
public async Task<APIGatewayProxyResponse> OriginalFunctionHandler(APIGatewayProxyRequest apigProxyEvent, ILambdaContext context){ //your function here.}
Por exemplo, uma função básica do API Gateway do Lambda ficaria assim:
using System;using Amazon.Lambda.APIGatewayEvents;using Amazon.Lambda.Core;using OpenTelemetry;using OpenTelemetry.Instrumentation.AWSLambda;using OpenTelemetry.Trace;
namespace Example{ public class Function { public static TracerProvider tracerProvider;
static Function() { tracerProvider = Sdk.CreateTracerProviderBuilder() .AddAWSLambdaConfigurations(options => options.DisableAwsXRayContextExtraction = true) .AddOtlpExporter() .Build();
// use AwsSdkSample::AwsSdkSample.Function::TracingFunctionHandler as input Lambda handler instead public APIGatewayProxyResponse TracingFunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { return AWSLambdaWrapper.Trace(tracerProvider, FunctionHandler, request, context); }
/// <summary> /// A simple function that takes a APIGatewayProxyRequest and returns a APIGatewayProxyResponse /// </summary> /// <param name="input"></param> /// <param name="context"></param> /// <returns></returns> public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { return new APIGatewayProxyResponse() { StatusCode = 200, Body = Environment.GetEnvironmentVariable("_X_AMZN_TRACE_ID") }; } } }}
Em seguida, defina a função wrapper como o manipulador da função do Lambda. Para a classe acima, o manipulador seria function::Example.Function::TracingFunctionHandler
.
Para obter um exemplo prático, incluindo o rastreamento do AWS SDK, consulte este aplicativo de exemplo.
O exemplo acima é apenas um exemplo básico. Para instrumentação mais avançada, consulte a documentação do OpenTelemetry .NET SDK.
Visualize seus dados na interface do New Relic
Primeiro você vai querer invocar sua função do Lambda algumas vezes para começar a gerar telemetria. A partir daí, vá para New Relic para encontrar seu trace, métrica e log.
Sua telemetria não aparecerá no New Relic Serverless. Em vez disso, você encontrará seus dados de telemetria nos New Relic OpenTelemetry Nerdlets.
Distributed tracing
Em alguns casos, você poderá ver rastreamento distribuído fragmentado no New Relic com esta configuração. Isso ocorre quando um trace inicia ou envolve um serviço que está fora do contexto ADOT (por exemplo, um serviço gerenciado da AWS). Os spans desse serviço são criados pelo X-Ray, não pelo OpenTelemetry, e o ADOT não os encaminha para o New Relic. Embora o rastreamento pareça fragmentado, eles ainda fornecem insights completos sobre o desempenho dentro da função do Lambda, bem como de outros serviços cujos spans foram encaminhados para a New Relic.
Mais Informações
Para obter mais informações, confira o início rápido do New Relic OpenTelemetry.