• 로그인

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

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

문제 신고

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

시사

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

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

전제 조건

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

1단계: X-Ray 활성화

이 설정에서 AWS X-Ray를 사용하지 않더라도 AWS OpenDistro에 내장된 추적 기능을 활성화하려면 Lambda 함수에서 X-Ray를 활성화해야 합니다.

X-Ray를 활성화하려면:

  1. Lambda 콘솔 에서 함수를 엽니다.
  2. 구성 , 모니터링 도구 를 차례로 선택합니다.
  3. 편집 을 선택합니다.
  4. X-Ray 에서 활성 추적 을 활성화합니다.

또는 SAM(서버리스 애플리케이션 모델) 또는 CloudFormation 템플릿을 사용하는 경우 Lambda 함수의 속성에 다음을 추가하여 X-Ray를 활성화할 수 있습니다.

yourFunctionHere:
Type: AWS::Serverless::Function
Properties:
...
Policies:
- AWSLambdaBasicExecutionRole
...
- AWSXrayWriteOnlyAccess
Tracing: Active

중요

이 옵션을 사용하려면 AWSLambdaBasicExecutionRole 또는 이에 상응하는 정책이 함수에 연결되어 있어야 합니다.

2단계: 레이어 설치

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

설치하려면:

  1. Lambda 콘솔 에서 함수를 엽니다.
  2. 디자이너 섹션의 레이어 아래에서 레이어 추가 를 선택합니다.
  3. ARN 지정 아래에 아래 목록에서 함수 아키텍처에 대한 계층 ARN 중 하나를 붙여넣습니다. {region}us-east-1 과 같은 AWS 리전으로 바꿉니다.
  4. 추가 를 선택합니다.
  • AMD64 / X86_64: arn:aws:lambda:{region}:901920570463:layer:aws-otel-collector-amd64-ver-0-45-0:2
  • ARM64: arn:aws:lambda:\<region>:901920570463:layer:aws-otel-collector-arm64-ver-0-45-0:2

SAM 및 CloudFormation 템플릿의 경우 함수 속성에 다음을 추가합니다. your-license-key-hereNew Relic 라이선스 키로 바꾸고 otlp.nr-data.net:4317 을 해당 지역의 New Relic OpenTelemetry Endpoint로 바꿔야 합니다.

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-45-0:2
# Use this if using arm64 architecture
- !Sub arn:${AWS::Partition}:lambda:${AWS::Region}:901920570463:layer:aws-otel-collector-arm64-ver-0-45-0:2

중요

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

3단계: New Relic 환경 변수 추가

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

  1. New Relic 계정에서 New Relic 라이센스 키 를 생성하고 복사합니다.
  2. Lambda 콘솔 에서 함수를 엽니다.
  3. 구성 을 선택한 다음 환경 변수 를 선택합니다.
  4. 환경 변수 에서 편집 을 선택합니다.
  5. 환경 변수 추가 를 선택합니다.
  6. 에 대해 NEW_RELIC_LICENSE_KEY 으로 설정하고 을 1단계에서 생성한 라이선스 키 값으로 설정합니다. 그런 다음 저장 을 선택합니다.
  7. 환경 변수 추가 를 다시 선택합니다.
  8. 의 경우 NEW_RELIC_OPENTELEMETRY_ENDPOINT 으로 설정하고 을 아래 옵션 중 하나로 설정합니다(New Relic 지역에 따라 다름). 그런 다음 저장 을 선택합니다.
  9. 환경 변수 추가 를 다시 선택합니다.
  10. 의 경우 OTEL_SERVICE_NAME 으로 설정하고 을 함수 이름으로 설정합니다. 그런 다음 저장 을 선택합니다.
  • otlp.nr-data.net:4317: New Relic 계정이 미국 지역에 있는 경우
  • otlp.eu01.nr-data.net:4317: New Relic 계정이 EU 지역에 있는 경우

SAM 및 CloudFormation 템플릿의 경우 함수 속성에 다음을 추가합니다. your-license-key-hereNew Relic 라이선스 키로 바꾸고 otlp.nr-data.net:4317 을 해당 지역의 New Relic 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 을 New Relic 라이선스 키로 바꾸고 otlp.nr-data.net:4317 을 New Relic 지역에 적합한 엔드포인트로 바꿉니다(위 목록 참조).

4단계: 수집기 구성

이제 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. 구성 을 선택한 다음 환경 변수 를 선택합니다.
  3. 환경 변수 에서 편집 을 선택합니다.
  4. 환경 변수 추가 를 선택합니다.
  5. 의 경우 OPENTELEMETRY_COLLECTOR_CONFIG_FILE 을 설정하고 /var/task/collector.yaml 로 설정합니다.
  6. 그런 다음 저장 을 선택합니다.

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 경로로 바꿉니다.

5단계: 기능 계측

먼저 AWS Lambda용 OpenTelemetry SDK를 추가합니다.

dotnet add package OpenTelemetry.Contrib.Instrumentation.AWSLambda

TracerProvider }에서 AddAWSLambdaConfigurations() 에 전화를 추가합니다.

TracerProvider tracerProvider = Sdk.CreateTracerProviderBuilder()
// add other instrumentations here
.AddAWSLambdaConfigurations()
.Build();

원래 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();
}

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

namespace Example
{
public class Function
{
public static TracerProvider tracerProvider;
static Function()
{
tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddAWSInstrumentation()
.AddOtlpExporter()
.AddAWSLambdaConfigurations()
.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 설명서 를 참조하십시오.

6단계: 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 © 2022 New Relic Inc.

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