그레이엄 덤플턴: 랩처를 이용한 실시간 추적 노트

그레이엄 덤플턴: 랩처를 이용한 실시간 추적

Wrapture 바인딩은 원래 단위 테스트에 사용되었지만 강력한 추적 메커니즘으로도 활용될 수 있습니다. 바인딩은 메서드 호출을 관찰하고 이벤트를 방출하며, 이 이벤트는 테스트 테이프 대신 "싱크(sink)"에 의해 처리됩니다. 이를 통해 실행 중인 프로그램의 실시간 내레이션이 가능합니다.이 글에서는 카드 결제가 거부될 수 있는 Gateway, Ledger, Notifier를 포함하는 OrderService를 예로 들어 이를 설명합니다. 세 개의 바인딩이 주요 메서드인 OrderService.place, Gateway.charge, Ledger.record에 적용됩니다. 간단한 Printer 싱크를 사용하여 이러한 이벤트를 표시합니다.출력은 인수, 반환 값, 예외를 포함한 자세한 호출 정보를 보여주며, 들여쓰기는 호출 중첩을 나타냅니다. 중요한 점은 wrapture.redact() 캡처 정책을 바인딩 수준에서 사용하여 카드 번호와 같은 민감한 데이터를 삭제할 수 있다는 것입니다.싱크가 등록되지 않은 경우 바인딩은 최소한의 오버헤드를 발생시키며, 호출당 약 0.5마이크로초의 속도로 실행됩니다. 대규모 추적을 관리하기 위해 싱크 또는 바인딩 수준에서 필터링을 적용할 수 있습니다.wrapture.Depth(1, wrapture.Printer())와 같은 싱크 수준 필터링은 최상위 수준 호출로 출력을 제한하여 간결한 개요를 제공합니다. when=을 사용한 바인딩 수준 필터링은 특정 호출에 대한 이벤트 생성을 방지하는 술어(predicate)를 사용하여 매우 효율적입니다.그러나 when=은 지정된 이벤트만 건너뛰며, 중첩된 호출은 여전히 기록됩니다. 전체 호출 트리를 억제하려면 바인딩에 tree=True를 추가하여 "여기서부터 아래로는 아무것도" 추적되지 않도록 할 수 있습니다.바인딩은 또한 filtered_calls를 추적하여 사용자가 어떤 작업이 억제되었는지 이해할 수 있도록 합니다. 이 설정은 프로그램이 최소한의 코드 변경과 다양한 모니터링 요구에 맞는 사용자 정의 가능한 싱크를 통해 실시간 데이터로 자체 동작을 설명할 수 있도록 합니다.