1. 소개
이 기사에서는 개발자 관찰 가능성 플랫폼인 Lightrun 을 애플리케이션에 도입하고 이를 통해 달성할 수 있는 것을 보여줌으로써 살펴보겠습니다.
2. 라이트런이란?
Lightrun은 Java(다른 언어도 지원됨) 애플리케이션을 계측한 다음 IntelliJ, Visual Studio Code 및 기타 여러 로깅 플랫폼과 APM 내에서 직접 계측을 볼 수 있는 관찰 가능성 플랫폼입니다. 모든 환경에서 실행되는 애플리케이션에 계측을 원활하게 추가하고 어디서나 액세스할 수 있도록 설계되어 로컬 워크스테이션에서 프로덕션 인스턴스에 이르기까지 어디서나 문제를 신속하게 진단할 수 있습니다.
Lightrun은 함께 통합되는 두 가지 구성 요소와 함께 작동합니다.
- Lightrun 에이전트는 애플리케이션의 일부로 실행되며 요청에 따라 원격 측정을 계측합니다. Java 애플리케이션에서 이는 Java Agent 로 작동합니다 . Lightrun을 사용하려는 모든 애플리케이션의 일부로 이 에이전트를 실행합니다.
- Lightrun 플러그인은 개발 환경의 일부로 실행되며 에이전트와 통신할 수 있습니다. 이는 실행 중인 항목을 확인하고 애플리케이션에 새 계측을 추가하고 이 계측의 결과를 수신하는 수단입니다.
이 모든 것이 설정되면 세 가지 다른 유형의 계측 을 관리할 수 있습니다 .
- 로그 – 랜덤의 로그 문을 실행 중인 애플리케이션에 언제든지 추가하여 사용 가능한 값(복잡한 표현식 포함)을 로그아웃할 수 있는 기능입니다. 이러한 로그는 표준 출력으로 보내거나 개발 환경의 Lightrun 플러그인으로 다시 보내거나 동시에 두 가지 모두로 보낼 수 있습니다. 또한 예를 들어 코드에 미리 정의된 특정 사용자 또는 세션 ID를 기반으로 조건부로 호출할 수 있습니다.
- 스냅샷 – 이를 통해 언제든지 애플리케이션의 라이브 스냅샷을 캡처할 수 있습니다. 그러면 스냅샷이 트리거된 정확한 시기와 위치, 모든 변수의 값, 이 시점까지의 전체 호출 스택에 대한 세부 정보가 기록됩니다. 로그와 마찬가지로 조건부로 호출할 수도 있습니다.
- 메트릭 – 이를 통해 Micrometer 에서 생성할 수 있는 것과 유사한 메트릭을 기록할 수 있으므로 코드 라인이 실행되는 횟수를 계산하고 코드 블록에 대한 타이밍을 기록하거나 원하는 다른 수치 계산을 할 수 있습니다.
이러한 모든 작업은 이미 코드에서 쉽게 수행할 수 있습니다. 여기에서 Lightrun이 우리에게 제공 하는 것은 애플리케이션을 변경하거나 재배포할 필요 없이 이미 실행 중인 애플리케이션에서 이러한 작업을 수행할 수 있는 기능입니다. 즉 가동 중지 시간 없이 생산에서 대상 기기를 얻을 수 있습니다.
또한 이러한 모든 로그는 일시적입니다. 소스 코드나 실행 중인 애플리케이션에 지속되지 않으며 필요에 따라 추가 및 제거할 수 있습니다.
3. 적용 예
이 기사에서는 이미 빌드되어 작업할 준비가 된 애플리케이션이 있습니다. 이 응용 프로그램은 사람에게 할당된 작업을 추적하도록 설계되었으며 사용자가 이 데이터를 쿼리할 수 있습니다. 이 코드는 GitHub에서 찾을 수 있으며 올바르게 빌드하려면 Java 17+ 및 Maven 3.6이 필요합니다.
이 애플리케이션은 세 가지 서비스로 설계되었습니다. 하나는 사용자 관리용, 다른 하나는 작업 관리용, 세 번째는 두 서비스를 오케스트레이션하는 것입니다. 그런 다음 작업 서비스 와 사용자 서비스 는 자체 데이터베이스를 가지며 둘 사이에 JMS Queue이 있습니다. 사용자 서비스 가 사용자가 삭제되었음을 표시하여 작업 서비스 가 작업 을 정리할 수 있도록 합니다.
이러한 데이터베이스와 JMS Queue은 모두 편의를 위해 애플리케이션 내에 내장되어 있습니다. 그러나 실제로 이것은 자연스럽게 실제 인프라를 사용합니다.
3.1. 작업 서비스
이 기사에서는 tasks-service 에만 관심이 있습니다 . 그러나 향후 기사에서는 이 세 가지 모두와 이들이 서로 어떻게 상호 작용하는지 살펴보겠습니다.
이 서비스는 Java 17에서 Maven으로 빌드된 Spring Boot 애플리케이션입니다. 실행 시 다음에 대한 HTTP 엔드포인트가 있습니다.
- GET / – 클라이언트가 태스크를 생성한 사용자 및 상태별로 필터링하여 태스크를 검색할 수 있습니다.
- POST / – 클라이언트가 새 작업을 만들 수 있습니다.
- GET /{id} – 클라이언트가 ID로 단일 작업을 가져올 수 있습니다.
- PATCH /{id} – 클라이언트가 작업을 업데이트하여 할당된 사용자와 상태를 변경할 수 있습니다.
- DELETE /{id} – 클라이언트가 작업을 삭제할 수 있습니다.
또한 사용자 서비스 에서 사용자가 삭제된 시기를 나타낼 수 있는 JMS Listener도 있습니다 . 이 경우 해당 사용자가 생성한 모든 작업을 자동으로 삭제하고 해당 사용자에게 할당된 모든 작업 할당을 취소합니다.
또한 Lightrun의 도움으로 진단할 수 있는 애플리케이션에 몇 가지 버그가 있습니다.
4. 라이트런 설정하기
시작하기 전에 Lightrun 계정이 필요하고 로컬에서 설정해야 합니다. https://app.lightrun.com/ 을 방문 하고 지침을 따르면 됩니다.
등록을 마치면 개발 환경과 프로그래밍 언어를 선택해야 합니다. 이 문서에서는 IntelliJ와 Java를 사용할 것이므로 이를 선택하고 다음으로 넘어갑니다.
그런 다음 Lightrun 플러그인을 우리 환경에 설치하는 방법에 대한 지침을 얻었으므로 이를 따를 수 있습니다.
또한 개발 환경에서 새 계정에 로그인했는지 확인해야 합니다. 그런 다음 편집기 내에서 Lightrun 에이전트(아직 없음)에 액세스할 수 있습니다.
마지막으로 애플리케이션을 계측하는 데 사용할 Java 에이전트를 다운로드하는 방법에 대한 지침을 얻습니다. 이러한 지침은 플랫폼에 따라 다르므로 정확한 설정에 맞는 지침을 따라야 합니다.
이 작업을 완료하면 에이전트가 설치된 상태에서 애플리케이션을 시작할 수 있습니다. 작업 서비스 가 빌드 되었는지 확인한 다음 실행할 수 있습니다.
$ java -jar -agentpath:../agent/lightrun_agent.so target/tasks-service-0.0.1-SNAPSHOT.jar
이 시점에서 웹 브라우저의 온보딩 화면을 통해 진행할 수 있으며 개발 환경의 UI가 자동으로 업데이트되어 애플리케이션 실행을 표시합니다.
이것들은 모두 Lightrun 계정에 연결되어 있으므로 응용 프로그램이 실행되는 위치에 관계없이 볼 수 있습니다. 즉, 로컬 컴퓨터, Docker 컨테이너 내부 또는 런타임을 지원하는 다른 환경에서 실행되는 애플리케이션에서 세계 어디에 있든 정확히 동일한 도구를 사용할 수 있습니다.
5. 스냅샷 캡처
Lightrun의 가장 강력한 기능 중 하나는 현재 실행 중인 애플리케이션 에 스냅샷 을 추가하는 기능입니다. 그러면 애플리케이션의 지정된 지점에서 정확한 실행 상태를 캡처할 수 있습니다. 그러면 코드 내에서 정확히 무슨 일이 일어나고 있는지에 대한 귀중한 통찰력을 얻을 수 있습니다. 프로그램의 흐름을 방해하지 않는다는 점을 제외하면 "가상 중단점"으로 생각할 수 있습니다. 대신 나중에 볼 수 있도록 중단점에서 볼 수 있는 모든 정보를 캡처합니다.
스냅샷과 로그 및 메트릭은 개발 환경 내에서 추가됩니다. 일반적으로 계측을 추가하려는 라인을 마우스 오른쪽 버튼으로 클릭한 다음 "Lightrun" 옵션을 선택하여 이 작업을 수행합니다.
그런 다음 후속 메뉴에서 선택하여 계측을 추가할 수 있습니다.
그러면 스냅샷을 추가할 수 있는 패널이 열립니다.
여기에서 계측하려는 에이전트를 선택하고 작동 방식에 대한 기타 세부 정보를 지정해야 합니다.
모든 것이 만족스러우면 만들기 버튼을 누릅니다. 그러면 사이드바에 새 스냅샷 항목이 추가되고 코드 줄에 파란색 카메라 아이콘이 표시됩니다.
그러면 이 줄이 실행될 때 스냅샷을 캡처함을 나타냅니다.
문제가 발생하면 대신 카메라가 빨간색이 됩니다. 일반적으로 이는 실행 중인 코드가 소스 코드와 일치하지 않음을 의미하지만 다른 이유가 있을 수 있으며 여기서도 탐색해야 합니다.
6. 버그 진단 - 작업 검색
불행 하게도 작업 서비스 에는 필터링된 작업 검색을 수행해도 아무 것도 반환되지 않는 버그가 있습니다. 필터링되지 않은 검색을 수행하면 모든 작업이 올바르게 반환되지만 필터가 추가되자마자( createdBy , status 또는 둘 다) 갑자기 결과가 표시되지 않습니다.
예를 들어 http://localhost:8082?status=PENDING 을 호출하면 몇 가지 결과를 얻어야 하지만 대신 항상 빈 배열을 얻게 됩니다.
우리 애플리케이션은 들어오는 HTTP 요청을 처리하기 위한 TasksController 가 있도록 설계되었습니다. 그런 다음 TasksService 를 호출하여 실제 작업을 수행하고 이것은 TasksRepository 측면에서 작동합니다 .
이 리포지토리는 스프링 데이터 인터페이스이므로 직접 측정할 수 있는 코드가 없습니다. 대신 TasksService 에 스냅샷을 추가합니다 . 특히 search() 메서드 의 첫 줄에 추가할 것 입니다. 이렇게 하면 메서드 내에서 어떤 코드 경로를 통과하는지에 관계없이 메서드가 호출될 때 존재하는 초기 조건을 볼 수 있습니다.
이 작업을 마치면 Endpoints을 호출합니다. 다시, 빈 배열의 동일한 결과를 얻습니다.
그러나 이번에는 개발 환경에서 스냅샷을 캡처합니다. 스냅샷 탭에서 볼 수 있습니다.
이는 스냅샷이 캡처된 위치에 대한 스택 추적과 스냅샷이 캡처된 시점에 보이는 모든 변수의 상태를 보여줍니다. 여기서 변수에 초점을 맞추자. 이 중 두 개는 메서드에 전달된 매개변수이고 세 번째는 this 입니다. 매개변수는 잠재적으로 가장 흥미로운 매개변수이므로 살펴보겠습니다.
즉시 문제를 볼 수 있습니다. 우리는 "PENDING" 값(우리가 검색하는 상태)을 createdBy 매개변수에 부여했습니다!
코드를 자세히 살펴보면 불행하게도 TasksController 와 TasksService 사이의 매개 변수가 바뀌었음을 알 수 있습니다. 이것은 쉬운 수정이며 TasksService 의 매개 변수를 바꾸거나 TasksController 에서 전달된 값을 바꾸면 갑자기 검색이 제대로 작동하기 시작합니다.
7. 요약
여기에서 Lightrun 관찰 가능성 플랫폼에 대한 간략한 소개, 시작 방법 및 이 플랫폼이 우리에게 줄 수 있는 몇 가지 이점을 살펴보았습니다. 다음 기사에서 이러한 내용을 더 자세히 살펴볼 것입니다.
작동 방식에 대한 더 많은 확신과 통찰력을 제공하기 위해 다음 응용 프로그램에서 사용하지 않겠습니까?