View a markdown version of this page

동적 계측을 사용하여 애플리케이션 디버깅 - Amazon CloudWatch

동적 계측을 사용하여 애플리케이션 디버깅

동적 계측을 사용하면 다시 시작하거나 재배포하지 않고도 라이브 애플리케이션에서 런타임 상태를 캡처할 수 있습니다. 런타임 상태에는 변수 값, 메서드 인수, 반환 값 및 스택 트레이스가 포함됩니다. 코드에서 데이터를 캡처할 위치를 지정하는 계측 구성을 정의하고 실행 중인 에이전트는 런타임에 애플리케이션을 계측합니다.

개념

중단점

자동 만료되는 임시 계측입니다. 기본 만료 시간은 24시간이며 5분에서 24시간으로 구성할 수 있습니다. 디버깅 및 조사에 중단점을 사용합니다.

프로브

명시적으로 삭제될 때까지 지속되는 영구 계측입니다. 지속적인 관찰성을 위해 프로브를 사용합니다.

스냅샷

로컬 변수, 인수, 반환 값, 예외 및 스택 트레이스를 포함한 프로그램 상태의 특정 시점 캡처입니다. 동적 계측은 스냅샷을 CloudWatch Logs에 로그 레코드로 내보냅니다.

위치

계측이 적용되는 코드 위치입니다. 필수 필드는 언어에 따라 다릅니다.

지원되는 언어

  • Java

  • Python

  • JavaScript 또는 TypeScript

사전 조건

동적 계측을 사용하려면 배포 유형에 따라 계측 구성 요소를 최신 버전으로 업데이트합니다.

  • Amazon EKS 고객 - Amazon CloudWatch Observability EKS 추가 기능을 최신 버전으로 업데이트합니다. 추가 기능에는 ADOT SDK 및 CloudWatch 에이전트가 포함됩니다. 자세한 내용은 CloudWatch Observability EKS 추가 기능 설치를 참조하세요.

  • 다른 모든 고객 - 다음 구성 요소를 모두 업데이트합니다.

    • 사용 중인 언어(Java, Python 또는 Node.js)에 대한 AWS Distro for OpenTelemetry(ADOT) 계측 SDK

    • CloudWatch 에이전트를 최신 버전으로

다음 조건도 충족되어야 합니다.

  • 애플리케이션에 대해 CloudWatch Application Signals를 활성화해야 합니다.

  • 애플리케이션에서 환경 변수 OTEL_AWS_DYNAMIC_INSTRUMENTATION_ENABLED=true를 설정합니다.

  • 환경 변수 OTEL_SERVICE_NAME을 서비스 이름으로 설정합니다.

  • OTEL_RESOURCE_ATTRIBUTES=deployment.environment.name=my_deployment_env_name 환경 변수를 설정합니다. 기존 Application Signals 사용자의 경우 값은 Application Signals 콘솔에 표시된 서비스의 환경 이름과 일치해야 합니다.

  • CloudWatch 에이전트는 Application Signals 구성으로 실행 중이어야 합니다.

  • 동적 계측은 Lambda 환경에서 지원되지 않습니다.

애플리케이션에 동적 계측 추가

애플리케이션을 계측한 후(사전 조건 참조) 동적 원격 분석을 적용할 코드 부분을 지정하는 계측 구성을 생성합니다. 각 구성은 다음 두 가지를 정의합니다.

  1. 모니터링할 코드의 위치 - 중단점 또는 프로브가 적용되는 코드 위치입니다.

  2. 캡처할 데이터 - 중단점 또는 프로브가 실행될 때 캡처된 런타임 상태입니다.

참고

기본적으로 Dynamic Instrumentation은 제한된 데이터만 캡처합니다. 이 기능의 가치를 극대화하려면 캡처 제한에 설명된 옵션을 사용하여 캡처 구성을 확장하는 것이 좋습니다.

AWS CLI 또는 SDK를 사용하거나 IDE의 AI 코딩 어시스턴트와 함께 Model Context Protocol(MCP) 서버를 사용하여 구성을 생성할 수 있습니다.

CLI 또는 SDK를 사용하여 구성 생성

AWS CLI 또는 AWS SDK를 사용하여 프로그래밍 방식으로 계측 구성을 생성합니다.

코드 위치 지정

위치는 코드에서 계측이 적용되는 위치를 정의합니다. 필수 필드는 언어에 따라 다릅니다.

언어 필수 필드 선택 필드
Java CodeUnit(패키지), ClassName, MethodName, FilePath LineNumber
Python CodeUnit(모듈), MethodName, FilePath LineNumber, ClassName
JavaScript 또는 TypeScript FilePath, LineNumber 없음. 라인 수준 중단점만 지원됩니다. 프로브 및 함수 수준 중단점은 지원되지 않습니다. TypeScript는 소스 맵을 제공할 때 지원됩니다.

캡처할 데이터 구성

캡처 구성은 계측이 실행될 때 수집되는 런타임 상태를 제어합니다. 사용 가능한 옵션:

  • CaptureArguments - 캡처할 메서드 인수 이름 목록입니다.

  • CaptureReturn - 반환 값(부울)을 캡처합니다.

  • CaptureStackTrace - 스택 트레이스(부울)를 캡처합니다.

  • CaptureLocals - 캡처할 로컬 변수 이름 목록입니다.

  • CaptureLimits - 캡처 깊이 및 크기를 제어합니다(캡처 제한 참조).

구성 파라미터

구성을 생성할 때의 주요 파라미터:

  • instrumentation-typeBREAKPOINT 또는 PROBE

  • service - Application Signals에서 보고한 서비스 이름

  • environment - 환경 이름

  • signal-typeSNAPSHOT

  • location - 코드 위치 필드(위 참조)

  • capture-configuration - 캡처 옵션(위 참조)

예제

다음 예제에서는 Java 메서드에 중단점을 생성합니다.

aws application-signals create-instrumentation-configuration \ --instrumentation-type BREAKPOINT \ --service "my-service" \ --environment "production" \ --signal-type SNAPSHOT \ --location '{ "CodeLocation": { "Language": "Java", "CodeUnit": "com.example.service", "ClassName": "OrderController", "MethodName": "processOrder", "FilePath": "OrderController.java" } }' \ --capture-configuration '{ "CodeCapture": { "CaptureArguments": ["orderId", "user"], "CaptureReturn": true, "CaptureStackTrace": true, "CaptureLimits": { "MaxHits": 100, "MaxStringLength": 255, "MaxCollectionWidth": 20, "MaxObjectDepth": 3, "MaxFieldsPerObject": 20, "MaxStackFrames": 20 } } }'

MCP 서버를 사용하여 구성 생성

동적 계측을 사용하는 권장 접근 방식은 CloudWatch Application Signals MCP(Model Context Protocol) 서버를 사용하는 것입니다. MCP를 사용하면 IDE의 AI 코딩 어시스턴트와 에이전트가 개발 환경에서 직접 동적 계측 구성을 생성, 관리 및 쿼리할 수 있습니다.

AI 어시스턴트는 MCP를 사용하여 다음을 수행할 수 있습니다.

  • 편집기에서 나가지 않고 특정 코드 위치에 중단점과 프로브를 생성합니다.

  • 캡처된 스냅샷을 쿼리하여 런타임 변수 값과 직접 호출 경로를 검사합니다.

  • 스냅샷 데이터와 작업 중인 코드의 상관관계를 분석하여 수정 사항을 제안합니다.

  • 계측 구성의 수명 주기를 관리합니다(상태 보기, 만료된 중단점 삭제).

설정 및 사용 지침은 GitHub 웹 사이트의 Application Signals MCP 서버를 참조하세요.

데이터 스토리지

중단점 또는 프로브가 실행되면 Dynamic Instrumentation은 접두사(/aws/application-signals/service-nameservice-nameOTEL_SERVICE_NAME 환경 변수의 값)를 사용하여 CloudWatch Logs에 로그 그룹을 생성하고 캡처된 스냅샷을 해당 로그 그룹에 로그 레코드로 씁니다.

로그 그룹이 아직 없는 경우 Dynamic Instrumentation은 스냅샷을 처음 내보낼 때 자동으로 로그 그룹을 생성합니다. 로그 수집 및 스토리지에 대한 요금은 표준 CloudWatch Logs 요금으로 청구됩니다.

구성 보기 및 관리

CloudWatch 콘솔에서 서비스 세부 정보 페이지로 이동하여 계측 탭을 선택합니다.

  • 중단점프로브 간에 전환하여 유형별로 구성을 봅니다.

  • 설명, 캡처 구성, 위치, ARN 및 만료 시간을 포함한 구성 세부 정보를 봅니다.

  • 상태 기록을 확인하여 준비 완료에서 활성으로, 다시 오류/비활성화됨으로의 전환 과정을 추적합니다.

  • 더 이상 필요하지 않은 구성을 삭제합니다.

상태 이해

각 계측 구성에는 현재 상태를 나타내는 상태가 있습니다.

Status 설명
준비됨 에이전트가 구성을 수신했습니다.
ACTIVE 에이전트가 실행 중인 애플리케이션에 계측을 적용했습니다.
오류 계측을 적용하지 못했습니다. 자세한 내용은 오류 원인을 참조하세요.
DISABLED 계측이 만료되었거나 제거되었습니다.

계측이 ERROR 상태가 되면 다음 원인이 보고될 수 있습니다.

오류 원인 설명
FILE_NOT_FOUND 지정된 파일 경로가 애플리케이션에 존재하지 않습니다.
METHOD_NOT_FOUND 지정된 메서드가 대상 클래스 또는 모듈에 존재하지 않습니다.
LINE_NOT_EXECUTABLE 지정된 행 번호는 실행 가능한 문과 일치하지 않습니다.
OVERLOADED_METHODS 여러 메서드가 지정된 이름과 일치합니다. 추가 위치 세부 정보를 제공하여 올바른 메서드를 식별합니다.
LANGUAGE_MISMATCH 위치 필드가 실행 중인 애플리케이션의 언어와 일치하지 않습니다.
RUNTIME_ERROR 계측을 적용하는 동안 예기치 않은 오류가 발생했습니다.

캡처 제한

캡처 제한은 캡처된 데이터의 크기와 깊이를 제어합니다. 캡처 구성의 capture-limits 필드에서 이러한 값을 구성합니다.

Limit 기본값 Range 설명
maxStringLength 255 1~255 문자열 값당 캡처되는 최대 문자 수입니다.
maxCollectionWidth 20 1~20 컬렉션 또는 배열당 캡처되는 최대 요소 수입니다.
maxObjectDepth 3 1~5 중첩된 객체 순회를 위한 최대 깊이입니다.
maxFieldsPerObject 20 1~20 객체당 캡처되는 최대 필드 수입니다.
maxStackFrames 20 1~20 캡처된 최대 스택 프레임 수입니다.
maxHits 100 1~1,000 자동 비활성화 전 최대 캡처 수입니다. 중단점만 해당됩니다.

각 계측 지점은 초당 캡처 5개로 속도가 제한됩니다.