• /
  • EnglishEspañol日本語한국어Português
  • 로그인지금 시작하기

사용자의 편의를 위해 제공되는 기계 번역입니다.

영문본과 번역본이 일치하지 않는 경우 영문본이 우선합니다. 보다 자세한 내용은 이 페이지를 방문하시기 바랍니다.

문제 신고

New Relic 및 OpenTelemetry로 .NET Lambda 함수 추적

시사

.NET용 OpenTelemetry가 포함된 AWS Lambda는 아직 개발 중입니다.

Java에 대한 유사한 설명서가 있지만 OpenTelemetry와 함께 AWS Lambda용 Python, Go, JavaScript, Ruby 또는 PHP를 사용하는 경우 Java 또는 .NET 설명서를 설정에 대한 일반 가이드로 사용할 수 있습니다. 추가 정보는 OpenTelemetry용 AWS Distro를참조하십시오.

이 가이드에서는 OpenTelemetry Lambda 를 사용하여 AWS의 관리형 OpenTelemetry Lambda Layers 를 사용하여 .NET Lambda 함수를 추적하는 방법을 다룹니다. OpenTelemetry를 사용하면 널리 사용되는 많은 라이브러리에 대한 자동 계측을 포함하여 기능을 쉽게 계측할 수 있습니다.

전제 조건

이 가이드에서는 다음이 있다고 가정합니다.

중요

Lambda용 AWS OTel .NET SDK에서 DisableAwsXRayContextExtraction true 로 설정되어 있으므로 X-Ray를 활성화할 필요가 더 이상 없습니다. 자세한 내용은 Lambda용 AWS OTel .NET SDK Readme 에서 확인할 수 있습니다.

레이어 설치

AWS는 OpenTelemetry Lambda Collector 를 포함하는 관리형 계층을 게시합니다.

설치하려면:

  1. Lambda 콘솔 에서 함수를 엽니다.

  2. Designer 섹션의 Layers 아래에서 Add a layer 선택합니다.

  3. Specify an ARN 아래에 아래 목록에서 함수 아키텍처에 대한 계층 ARN 중 하나를 붙여넣습니다. {region}AWS 지역(예: us-east-1)으로 바꿉니다.

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

    SAM 및 CloudFormation 템플릿의 경우 함수 속성에 다음을 추가합니다.

    yourFunctionHere:
    Type: AWS::Serverless::Function
    Properties:
    # ...
    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:1

    중요

    위의 계층 ARN이 최신 상태인지 확인하려면 AWS에서 게시한 최신 ARN 을 참조하십시오.

New Relic 환경 변수 추가

이 계층이 수집하는 OpenTelemetry 데이터를 New Relic으로 보내려면 계층이 수신하는 원격 분석을 New Relic OpenTelemetry Endpoint 로 내보내도록 계층과 함께 패키징된 OpenTelemetry Lambda Collector를 구성해야 합니다. 그렇게 하기 전에 먼저 의존할 몇 가지 환경 변수를 설정해야 합니다.

  1. 뉴렐릭 계정에서 뉴렐릭 을(를) 생성하고 복사하세요.
  2. Lambda 콘솔 에서 함수를 엽니다.
  3. Configuration 선택한 다음 Environment variables 선택합니다.
  4. Environment variables 아래에서 Edit 선택합니다.
  5. Add environment variable 선택합니다.
  6. Key 의 경우 NEW_RELIC_LICENSE_KEY 로 설정하고 Value 를 1단계에서 생성한 인스턴스 키의 값으로 설정합니다. 그런 다음 Save 선택합니다.
  7. Add environment variable 다시 선택하세요.
  8. Key 의 경우 NEW_RELIC_OPENTELEMETRY_ENDPOINT 로 설정하고 Value 를 아래 옵션 중 하나로 설정합니다(뉴렐릭 지역에 따라 다름). 그런 다음 Save 선택합니다.
  9. Add environment variable 다시 선택하세요.
  10. Key 의 경우 OTEL_SERVICE_NAME 로 설정하고 Value 를 함수 이름으로 설정합니다. 그런 다음 Save 선택합니다.
  • otlp.nr-data.net:4317: New Relic 계정이 미국 지역에 있는 경우

  • otlp.eu01.nr-data.net:4317: New Relic 계정이 EU 지역에 있는 경우

    SAM 및 CloudFormation 템플릿의 경우 함수 속성에 다음을 추가합니다. your-license-key-here로 바꾸고 otlp.nr-data.net:4317 를 해당 지역의 뉴렐릭 OpenTelemetry EndPoint로 바꾸세요.

    yourFunctionHere:
    Type: AWS::Serverless::Function
    Properties:
    # ...
    Environment:
    Variables:
    # ...
    NEW_RELIC_LICENSE_KEY: your-license-key-here
    NEW_RELIC_OPENTELEMETRY_ENDPOINT: otlp.nr-data.net:4317
    OTEL_SERVICE_NAME: your-function-name-here

    중요

    your-license-key-here 뉴렐릭 으로 바꾸고 otlp.nr-data.net:4317 뉴렐릭 지역에 적합한 EndPoint로 바꾸세요(위 목록 참조).

수집기 구성

이제 OpenTelemetry Lambda Collector의 기본 구성을 New Relic OpenTelemetry Endpoint로 원격 분석을 내보내는 구성으로 재정의합니다. 이렇게 하려면 함수에 collector.yaml 구성 파일을 포함해야 합니다.

다음 내용으로 함수의 루트 디렉터리에 collector.yaml 파일을 만듭니다.

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]

collector.yaml 파일을 함수의 zip 패키지 루트 디렉터리에 묶습니다.

*.csproj 구성의 예는 다음과 같습니다.

<ItemGroup>
<Content Include="collector.yaml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>

그런 다음 함수를 다시 배포합니다.

  1. Lambda 콘솔 에서 함수를 엽니다.
  2. Configuration 선택한 다음 Environment variables 선택합니다.
  3. Environment variables 아래에서 Edit 선택합니다.
  4. Add environment variable 선택합니다.
  5. Key 의 경우 OPENTELEMETRY_COLLECTOR_CONFIG_FILE 설정하고 Value/var/task/collector.yaml 로 설정합니다.
  6. 그런 다음 Save 선택합니다.

SAM 및 CloudFormation 템플릿의 경우 다음을 함수의 속성에 추가합니다.

yourFunctionHere:
Type: AWS::Serverless::Function
Properties:
# ...
Environment:
Variables:
# ...
OPENTELEMETRY_COLLECTOR_CONFIG_FILE: /var/task/collector.yaml

중요

이것은 함수의 루트 디렉토리에 collector.yaml 를 번들로 묶었다고 가정합니다. 다른 곳에 번들로 묶은 경우 /var/task/collector.yamlcollector.yaml 경로로 바꿉니다.

귀하의 기능이 작동되었습니다

먼저 AWS Lambda용 OpenTelemetry SDKOTLP 내보내기 패키지를 추가합니다. OpenTelemetry.측정 량.AWSOpenTelemetry.측정, 분량.Http 와 같은 더 많은 OpenTelemetry 측정 측정 패키지를 추가하여 함수 동작에 대한 추가 가시성을 얻을 수 있습니다.

bash
$
dotnet add package OpenTelemetry.Instrumentation.AWSLambda
$
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
$
dotnet add package OpenTelemetry.Instrumentation.AWS
$
dotnet add package OpenTelemetry.Instrumentation.Http

함수의 정적 생성자에 있는 TracerProvider 에서 AddAWSLambdaConfigurations()AddOtlpExporter() 에 대한 호출을 추가합니다.

중요

함수의 생성자는 정적이어야 합니다. 왜냐하면 TracerProvider 는 Lambda 콜드 스타트당 한 번만 초기화되어야 하기 때문입니다.

TracerProvider tracerProvider = Sdk.CreateTracerProviderBuilder()
// add other instrumentations here
.AddAWSLambdaConfigurations(options => options.DisableAwsXRayContextExtraction = true)
.AddOtlpExporter()
.Build();

중요

X-Ray를 활성화하지 않는 경우 DisableAwsXRayContextExtraction 속성을 true 로 설정해야 합니다. 그렇지 않으면 Trace가 반환되지 않습니다.

원래 Lambda 핸들러 함수와 동일한 서명으로 래퍼 함수를 생성합니다. AWSLambdaWrapper.Trace() API를 호출하고 TracerProvider , 원래 Lambda 함수 및 해당 입력을 매개변수로 전달합니다.

// new Lambda function handler passed in
public string TracingFunctionHandler(JObject input, ILambdaContext context) =>
AWSLambdaWrapper.Trace(tracerProvider, OriginalFunctionHandler, input, context);
public string OriginalFunctionHandler(JObject input, ILambdaContext context) {
return input?.ToString();
}

원래 핸들러가 비동기 함수인 경우 Trace() 대신 TraceAsync() API를 사용하세요.

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

예를 들어 기본 API Gateway Lambda 함수는 다음과 같습니다.

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")
};
}
}
}
}

그런 다음 래퍼 함수를 Lambda 함수의 핸들러로 설정합니다. 위 클래스의 경우 핸들러는 function::Example.Function::TracingFunctionHandler 입니다.

AWS SDK 추적을 포함한 실제 예제는 이 샘플 앱 을 참조하십시오.

위의 내용은 기본적인 예일 뿐입니다. 고급 계측은 OpenTelemetry .NET SDK 설명서 를 참조하십시오.

New Relic UI에서 데이터 보기

먼저 Lambda 함수를 몇 번 호출하여 원격 분석 생성을 시작하려고 합니다. 거기에서 New Relic으로 이동하여 trace , metricslogs 를 찾으십시오.

원격 측정은 New Relic Serverless 아래에 나타나지 않습니다. 대신 New Relic OpenTelemetry Nerdlets에서 원격 측정 데이터를 찾을 수 있습니다.

분산 추적

경우에 따라 이 구성으로 New Relic 내에서 조각난 분산 추적을 볼 수 있습니다. 이는 추적이 시작되거나 ADOT 컨텍스트 외부에 있는 서비스(예: 관리형 AWS 서비스)와 관련될 때 발생합니다. 해당 서비스의 범위는 OpenTelemetry가 아닌 X-Ray에 의해 생성되며 ADOT은 이를 New Relic에 전달하지 않습니다. 추적이 조각난 것처럼 보이지만 여전히 Lambda 함수 내에서 성능에 대한 완전한 통찰력과 범위가 New Relic으로 전달된 다른 서비스를 제공합니다.

추가 정보

자세한 내용은 New Relic OpenTelemetry 빠른 시작 을 확인하십시오.

Copyright © 2024 New Relic Inc.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.