1. 소개
이전 기사 에서 개발자 관찰 가능성 플랫폼인 Lightrun 을 소개 했습니다. 이 기사에서는 제공하는 기능, 응용 프로그램에서 가장 잘 사용할 수 있는 방법 및 얻을 수 있는 기능에 대해 자세히 살펴보겠습니다.
2. 스냅샷
지난 기사에서 우리는 스냅샷 이 무엇이고 우리를 위해 무엇을 할 수 있는지 간략하게 살펴보았습니다. 여기에서 우리는 그것들이 무엇인지, 우리가 그것들을 어떻게 가장 잘 사용할 수 있는지, 그것들이 우리를 위해 무엇을 할 수 있는지 더 깊이 살펴볼 것입니다.
스냅샷은 디버거 중단점과 유사합니다. 애플리케이션의 모든 코드 줄에 스냅샷을 등록할 수 있습니다. 트리거될 때마다 전체 스택 추적과 보이는 모든 변수의 값을 자동으로 기록합니다. 일반 중단점과 마찬가지로 여기에는 로컬 변수, 메서드 매개 변수 및 클래스 필드가 포함되며 전체 스택 프레임까지 수행됩니다.
스냅샷과 디버거 중단점의 주요 차이점은 스냅샷이 방해가 되지 않는다는 것입니다. 전체 응용 프로그램이든 실행 중인 스레드든 차단을 유발하지 않습니다. 그들은 현재 실행 상태를 기록하고 응용 프로그램은 어떤 식으로든 응용 프로그램을 중단하지 않고 계속됩니다.
디버거와 같은 기존의 차단 중단점은 우리가 세부 사항을 보는 동안 단일 스레드 또는 전체 응용 프로그램이 일시 중지되도록 합니다. Lightrun을 사용하면 라이브 애플리케이션에 전혀 영향을 주지 않고 이 모든 작업을 수행할 수 있습니다.
2.1. 스냅샷 배치
스냅샷은 코드 편집기에서 직접 애플리케이션에 배치됩니다. 이 기사에서는 IntelliJ IDEA를 사용하고 있지만 Visual Studio Code에서도 모든 것을 달성할 수 있습니다. 애플리케이션에서 스냅샷을 배치할 위치를 결정해야 합니다. 그런 다음 이 코드 줄을 마우스 오른쪽 버튼으로 클릭하고 메뉴에서 "Lightrun > 스냅샷(가상 중단점)"을 선택할 수 있습니다.
이렇게 하면 스냅샷의 세부 정보를 지정할 수 있는 대화 상자가 열립니다.
이것의 기본 동작은 비교적 간단하지만 이것이 가장 유용한 경우가 많습니다. 그것은:
- 선택한 정확한 라인의 스냅샷을 찍습니다.
- 스냅샷을 트리거할 시기에 대한 조건이 없습니다.
- 스냅샷으로 기록할 추가 표현이 없습니다.
- 스냅샷이 처음 트리거될 때만 기록합니다.
- 추가된 후 1시간이 지나면 만료됩니다.
즉, 다음 1시간 이내라면 이 코드 줄이 다음에 실행될 때 정확한 실행 상태를 기록합니다. 문제를 진단할 때 가장 유용한 설정인 경우가 많습니다. 녹음에 노이즈가 생기지 않고 녹음된 내용을 제어하고 싶기 때문입니다. 이 기사의 뒷부분에서 이 모든 것에 대해 자세히 알아보겠습니다.
이 작업을 완료하면 스냅샷이 등록된 코드 줄 옆에 파란색 카메라 아이콘이 배치됩니다. 이는 스냅샷이 성공적으로 배치되었으며 트리거될 때 기록됨을 나타냅니다.
스냅샷이 트리거되면 자동으로 편집기에서 세부 정보를 볼 수 있습니다. 이는 동일한 목적을 위해 설계되었기 때문에 IntelliJ 중단점 패널과 거의 동일하게 보이고 기능합니다.
여기에서 실행에 대한 전체 스택 추적과 액세스할 수 있는 변수를 즉시 볼 수 있습니다. 여기에는 현재 클래스 인스턴스의 필드를 볼 수 있는 this 변수가 포함됩니다 . 또한 기존 디버거와 똑같은 방식으로 원하는 만큼 드릴다운하고 스택 프레임의 다른 메서드를 클릭할 수 있습니다.
2.2. 조건부 스냅샷
일부 시나리오에서는 특정 조건이 충족될 때만 스냅샷을 기록하려고 합니다. 예를 들어 현재 사용자가 특정 사용자 이름인 경우에만 가능합니다.
Lightrun 스냅샷을 사용하면 설정의 일부로 조건을 지정할 수 있습니다. 이는 디버거에서 조건부 중단점이 작동하는 방식과 매우 유사합니다. 조건은 true 또는 false 로 평가되는 Java 표현식으로 지정됩니다 . 이는 스냅샷이 트리거되는 시점에 표시되는 모든 것, 즉 로컬 변수, 매개변수, 클래스 필드 또는 기타 모든 것에 액세스할 수 있습니다.
예를 들어 매개변수 id 가 있는 메서드가 있다고 가정해 보겠습니다 . 이것이 호출될 때 스냅샷을 기록하고 싶지만 제공된 ID가 특정 값일 때만 가능합니다. 원하는 대로 정확히 트리거된 조건으로 이를 설정할 수 있습니다.
즉, 스냅샷은 특정 테스트 값으로 호출될 때만 트리거되지만 동일한 값을 사용하지 않는 한 서비스의 다른 라이브 사용은 무시됩니다. 이렇게 하면 스냅샷 창에 표시되는 내용이 복잡하게 되거나 진단이 더 어려워지는 일 없이 정확히 원하는 내용을 확인할 수 있습니다.
2.3. 추가 표현
경우에 따라 스냅샷의 일부로 기록하려는 추가 값이 있을 수 있습니다.
예를 들어 중첩된 값을 드릴다운하여 더 쉽게 표면화하는 것과 같이 삶을 더 쉽게 만들기 위해 다른 값에서 계산할 수 있습니다. 예를 들어 RequestContextHolder 또는 SecurityContextHolder 와 같은 정적 변수에서 다른 방법으로는 기록되지 않을 값을 가져오기 위한 호출일 수도 있습니다 . 우리가 볼 수 있는 모든 값에 대한 메서드 호출일 수도 있고 이러한 메서드의 결과를 기록할 수도 있습니다.
표현식은 스냅샷 대화 상자에 기록할 표현식을 입력하여 조건과 매우 유사한 방식으로 추가됩니다.
하나의 스냅샷에 필요한 만큼 표현식을 추가할 수 있으며 스냅샷이 트리거될 때마다 모두 계산되고 기록됩니다.
그런 다음 이러한 값은 "변수" 창의 일부로 기록된 스냅샷에 표시되며 자동으로 감지된 변수가 아니라 수동으로 추가된 표현식임을 나타내는 다른 아이콘이 있습니다.
2.4. 여러 스냅샷 기록
경우에 따라 같은 장소에서 여러 스냅샷을 기록해야 할 수도 있습니다. 예를 들어 시스템을 통해 약간 다른 여러 요청을 실행하고 차이점을 식별하기 위해 스냅샷을 비교할 수 있습니다.
Lightrun 스냅샷은 기본적으로 단일 스냅샷만 기록하지만 대신 스냅샷 대화 상자에 최대 히트 수를 입력하여 원하는 만큼 기록하도록 구성할 수 있습니다.
이렇게 하면 이 실행 횟수에 대한 스냅샷이 기록되고 편집기에서 사용할 수 있습니다.
작업할 스냅샷이 여러 개 있으므로 이제 어떤 것이 어떤 것인지 알아야 합니다. "스냅샷" 탭 옆에 있는 "i" 아이콘을 클릭하면 이 정확한 스냅샷에 대한 정보 대화 상자가 나타납니다.
여기에서 스냅샷이 기록된 서버 인스턴스와 기록된 시간을 볼 수 있습니다. 이제 필요한 만큼 많은 스냅샷을 기록하고 진행 상황을 더 잘 진단할 수 있도록 어떤 스냅샷인지 결정할 수 있습니다.
2.5. 자동으로 만료되는 스냅샷
스냅샷 기록은 우리 애플리케이션의 성능 비용이 적습니다. 또한 애플리케이션에서 Lightrun 서버로 데이터를 전송하여 잠재적으로 비용이 발생할 수 있습니다. 즉, 스냅샷은 문제 진단에 매우 유용하지만 필요 이상으로 오래 머물지 않도록 해야 합니다. Lightrun은 스냅샷을 자동으로 만료하여 우리의 정확한 요구 사항에 대해서만 애플리케이션에 영향을 미치고 더 이상 영향을 주지 않도록 하여 이 문제를 해결합니다.
기본적으로 스냅샷은 1시간 후에 자동으로 비활성화됩니다. 최소한의 영향으로 집중적인 테스트를 직접 수행하려는 경우 이를 매우 짧은 기간으로 설정할 수 있습니다. 또는 예를 들어 밤새, 주말 또는 그 이상 발생하는 특정 문제의 발생을 캡처하기 위해 이것을 매우 긴 기간으로 설정할 수 있습니다.
스냅샷 생성 대화 상자의 "고급" 섹션에서 스냅샷이 활성화되는 기간을 조정할 수 있습니다. 이렇게 하면 만료 시간에 대한 추가 옵션이 제공되어 스냅샷이 활성화되는 기간을 시간, 분, 초 단위로 지정할 수 있습니다.
이 시간이 지나면 스냅샷이 남아 있으므로 기록된 스냅샷을 계속 사용할 수 있습니다. 그러나 아직 최대 적중 횟수에 도달하지 않은 경우에도 기록을 중지합니다. 이것을 변경하지 않으면 기본값은 1시간이 됩니다. 이 시간이 지나면 스냅샷의 카메라 아이콘이 빨간색으로 바뀌어 더 이상 활성화되지 않음을 나타냅니다.
그렇지 않으면 기록된 데이터를 사용할 수 없기 때문에 스냅샷은 시스템에 남아 있습니다. 그러나 다시 활성화하지 않는 한 더 이상 데이터를 기록하지 않습니다.
3. 로그
Lightrun이 제공하는 또 다른 기능은 아무것도 변경하거나 다시 시작할 필요 없이 애플리케이션 에 로깅 문 을 동적으로 추가하는 기능입니다.
로그는 구성 방식이 스냅샷과 비슷하지만 목적이 다릅니다. 스냅샷은 트리거될 때 스레드의 정확한 상태를 기록하여 작동합니다. 대신 로그는 필요한 정보를 로그 스트림에 기록합니다.
즉, 애플리케이션에 내장되거나 Lightrun에 의해 동적으로 추가되는 많은 로그 메시지가 로그 스트림에서 함께 혼합되어 발생하는 상황에 대한 더 큰 그림을 제공합니다. 애플리케이션의 로그 메시지와 Lightrun에서 추가한 모든 로그가 동일한 스트림으로 결합되어 정확히 무슨 일이 일어나고 있는지 전체 그림을 볼 수 있습니다.
3.1. 동적 로그 추가
Lightrun으로 동적 로그를 추가하는 것은 스냅샷을 추가하는 것과 매우 유사한 방식으로 수행됩니다. 이전에 로그 문을 추가하려는 줄을 마우스 오른쪽 버튼으로 클릭하고 메뉴에서 "Lightrun > Log"를 선택합니다.
그러면 동적 로그 문을 구성하고 실행 중인 애플리케이션에 추가할 수 있는 대화 상자가 표시됩니다.
이를 통해 출력할 로그 메시지를 지정할 수 있습니다. 메시지의 일부로 동적 표현을 포함할 수 있습니다. 스냅샷 조건이 작동하는 것과 똑같은 방식으로 로그 메시지를 트리거하는 데 필요한 조건을 지정할 수도 있습니다.
기본적으로 이러한 로그 메시지는 1시간 후에 만료되지만 "고급" 버튼을 클릭하여 스냅샷과 동일하게 변경할 수도 있습니다.
로그 메시지에도 로깅 수준이 있으며 기본값은 INFO이지만 필요에 따라 DEBUG, WARN 또는 ERROR로 변경할 수 있습니다.
로그 문을 추가하면 편집기는 로그 문이 있는 위치와 수행 중인 작업을 표시하기 위해 코드 보기에 이를 표시합니다.
3.2. 로그 보기
기본적으로 동적 로그 메시지는 Java Util Logging을 사용하여 기록됩니다. 이 경우 애플리케이션이 생성하는 다른 로그 메시지와 인터리브된 메시지를 볼 수 있으며 이는 더 많은 정보를 제공할 수 있습니다.
로컬에서 볼 수 있도록 편집기로 로그 메시지를 보낼 수도 있습니다. 이것은 우리가 스냅샷을 보는 방식과 유사하게 Lightrun 콘솔에서 볼 수 있습니다. 이는 출력 로그 파일에 추가 노이즈를 추가하지 않고 시스템에 로깅을 추가하려는 경우, 특히 해당 로그가 다른 팀 구성원이나 다른 시스템에서 사용되는 경우 매우 유용할 수 있습니다.
사이드바에서 에이전트 메뉴를 열고 Log Piping을 선택하여 로그 메시지 출력 위치를 변경할 수 있습니다.
여기에서 앱(애플리케이션의 구성된 Java Util Logging 설정에 쓰기를 의미함), 플러그인(편집기에서 활성화된 Lightrun 플러그인에 쓰기를 의미함) 또는 둘 다 중에서 선택할 수 있습니다. 이 작업은 개별 로그 메시지가 아닌 전체 Lightrun 에이전트에 대해 수행됩니다.
Lightrun 에이전트가 작동하는 방식으로 인해 Java Util 로깅 구성은 애플리케이션의 표준 구성이 아닙니다. 대신 Java Util 로깅에 쓸 때 Lightrun 동적 로거의 대상 및 출력 형식을 구성하는 데 필요한 일부 Lightrun 에이전트 플래그 가 있습니다.
3.3. 로깅 식
간단한 문자열을 로깅하는 것은 이미 유용합니다. 그러나 애플리케이션의 로깅 값이 훨씬 더 유용합니다. 스냅샷에 사용자 정의 표현식을 포함할 수 있는 것과 같은 방식으로 로그에 대해 이를 수행할 수 있습니다.
로그로 이 작업을 수행할 때 로그 메시지에 직접 표현식을 추가합니다. 표현식을 중괄호로 묶으면 됩니다.
Searching tasks: status={status}, createdBy={createdBy}
이렇게 하면 로그 문이 생성될 때 다음 표현식이 자동으로 확장됩니다.
이러한 표현식은 스냅샷과 똑같은 방식으로 로그 문이 생성되는 시점에서 결정할 수 있는 모든 것이 될 수 있습니다.
이러한 식은 때때로 계산하는 데 많은 CPU 시간이 소요될 수 있습니다. 이 경우 Lightrun은 애플리케이션 실행을 방해하지 않도록 특정 로그를 자동으로 일시 중지할 수 있습니다. 따라서 가능한 한 간단하게 로깅 표현식을 유지하는 것이 좋습니다.
4. 지표
Lightrun으로 수행할 수 있는 마지막 작업은 애플리케이션에 대한 일부 메트릭 을 기록하는 것입니다. 이를 통해 애플리케이션의 사용 세부 정보(예: 특정 작업이 얼마나 자주 발생하는지 또는 얼마나 오래 걸리는지)를 볼 수 있습니다.
스냅샷 및 로그와 동일한 방식으로 적절한 코드 행을 마우스 오른쪽 버튼으로 클릭하고 "Lightrun > Metrics"를 선택하여 메트릭을 추가합니다.
이것이 약간 다르다는 것을 바로 알 수 있습니다. 추가할 수 있는 다양한 유형의 메트릭이 있습니다.
- 카운터 – 코드 라인이 실행된 횟수의 간단한 카운트를 기록합니다.
- 시간 측정 – 두 줄의 코드 사이를 이동하는 데 걸리는 시간을 기록합니다.
- 방법 기간 – 방법에 들어가고 나가는 데 걸리는 시간을 기록합니다.
- 사용자 정의 지표 - 사용자 정의 표현식을 사용하여 코드에서 사용 가능한 값을 기반으로 지표를 생성합니다.
각각의 경우 메트릭 생성을 위한 표준 Lightrun 대화 상자가 나타납니다. 이렇게 하면 메트릭 이름, 트리거 조건, 작동 중지 후 만료 시간을 추가하는 등 메트릭을 구성할 수 있습니다. 이는 스냅샷 및 로그에 대해 할 수 있는 것과 똑같은 방식입니다.
이러한 메트릭은 기본적으로 로깅 프로세스로 출력되지만 원하는 경우 StatsD, Prometheus 및 기타 도구에 통합될 수도 있습니다.
4.1. 카운터
카운터는 일부 코드가 실행된 횟수를 간단히 측정한 것입니다. 코드 라인에 도달할 때마다 카운터가 1씩 증가하고 이것이 얼마나 자주 발생했는지 확인할 수 있습니다.
카운터를 추가하려면 Lightrun 메뉴에서 카운터를 선택한 다음 대화 상자를 채워야 합니다.
이것의 대부분은 상당히 표준입니다. 유일하게 특이한 부분은 "이름" 필드입니다. 모든 카운터를 추적할 수 있도록 모든 카운터에 고유한 이름을 지정해야 합니다.
특히 여기서 강력한 기능 중 하나는 모든 메트릭과 마찬가지로 조건이 연결된 카운터를 설정할 수 있다는 것입니다. 이를 통해 예를 들어 특정 사용자에 대해서만 또는 특정 레코드에 영향을 미치는 경우와 같이 다른 조건이 충족될 때만 특정 코드 라인에 도달한 횟수를 계산할 수 있습니다.
카운터를 추가해도 즉시 아무 작업도 수행되지 않습니다. 그러나 처음 트리거되면 로그가 출력되는 방식과 유사한 방식으로 메트릭 값을 파이프 설정을 기반으로 하는 로깅 출력으로 보고하기 시작합니다.
편집기는 10초마다 메트릭의 값을 표시합니다.
로그 출력에는 매초마다 측정항목이 표시됩니다.
이 출력은 로그 출력과 정확히 동일한 설정으로 제어되며 발생하는 상황을 더 잘 파악할 수 있도록 메트릭을 로그와 인터리브합니다. 이를 통해 메트릭이 어떻게 변경되었는지 시간 경과에 따라 추적하여 코드가 트리거된 비율을 확인할 수 있습니다.
4.2. 기간
카운터가 코드 라인이 실행된 횟수를 측정하는 데 사용되는 경우 시간 기간은 코드가 실행되는 시간을 측정하는 데 사용됩니다. 이를 "TicToc" 메트릭이라고도 합니다. Tic은 녹음을 시작하고 Toc은 녹음을 중지하며 시계의 소음과 비슷합니다.
기간을 생성할 때 측정할 코드 조각을 정확하게 구성해야 합니다. 대화 상자를 열기 전에 코드 블록을 선택하거나 대화 상자에 줄 번호를 입력하여 기록을 시작하고 중지할 줄을 지정하면 됩니다.
이 외에 시간 지속 시간을 생성하는 것은 카운터를 생성하는 것과 동일합니다.
일단 생성되면 이러한 메트릭은 처음 트리거될 때까지 기다리지 않고 즉시 출력을 시작합니다. 이러한 출력은 플러그인 및 애플리케이션 표준 출력 모두에 대한 것이며 카운터와 정확히 동일하며 코드 섹션이 실행된 빈도와 코드가 실행되는 데 걸린 가장 빠르고 가장 느리고 평균적인 시간을 보여줍니다.
4.3. 방법 기간
메서드 기간 메트릭은 본질적으로 시간 기간과 동일하지만 시작 및 종료 라인을 지정하는 대신 전체 메서드를 지정합니다.
일단 추가되면 전체 메서드 본문을 포괄하는 기간 메트릭과 정확히 동일하게 작동합니다. 반환 또는 예외 여부에 관계없이 시작 시간은 메소드가 입력된 시간으로 간주되고 종료 시간은 종료 시간으로 간주됩니다.
우리는 여기 출력에서 이것이 실제로 "TicToc Log" 항목임을 볼 수 있습니다. Lightrun만이 코드 라인이 아닌 메서드 자체를 기반으로 시작 지점과 중지 지점을 자동으로 결정했습니다.
4.4. Custom 측정항목
최종 측정항목은 단순히 Custom 측정항목입니다. 이를 통해 숫자가 무엇이든 코드에 존재하는 숫자를 집계할 수 있습니다. 예를 들어 일부 검색 결과에 반환된 레코드 수를 계산할 수 있습니다.
이 유형의 지표를 생성할 때 표현식을 지정해야 합니다. 이 식은 메트릭이 집계할 숫자를 반환하며 다른 곳과 마찬가지로 코드의 이 지점에서 계산할 수 있는 모든 식일 수 있습니다.
이러한 지표가 출력되면 트리거된 횟수와 표현식의 최대값, 최소값 및 평균값이 표시됩니다.
5. 요약
여기에서 Lightrun이 애플리케이션에 대한 더 많은 통찰력을 제공하고 작동 방식을 더 잘 이해할 수 있는 주요 방법을 자세히 다루었습니다.
무슨 일이 일어나고 있는지 더 잘 이해하거나 진행 중일 수 있는 문제를 진단하는 데 도움이 되도록 다음 응용 프로그램에서 사용하지 않겠습니까?