로그프레소 아키텍처
로그프레소 플랫폼은 OSGi 애플리케이션 서버에서 구동됩니다. OSGi(Open Service Gateway Initiative)는 자바 기반의 동적 모듈 시스템을 위한 표준 프레임워크입니다. OSGi는 애플리케이션을 모듈로 분할하여 개발, 배포, 관리할 수 있는 기능을 제공합니다.
로그프레소 플랫폼은 OSGi 프레임워크 구현체 중 Apache Felix 프레임워크를 기반으로 사용합니다. 로그프레소 앱은 OSGi 번들로 정의되므로, 런타임에 로그프레소 플랫폼에 설치하거나 제거할 수 있습니다. 로그프레소 앱은 정적 리소스와 자바 바이트코드가 포함된 JAR (Java Archive) 파일입니다. 로그프레소 플랫폼은 로그프레소 앱을 설치하는 시점에 번들에 내장된 정적 리소스를 설치하고 OSGi 서비스를 시작합니다.
로그프레소 플랫폼은 SSH(7022/tcp) 및 텔넷(7004/tcp) 프로토콜을 통해 셸을 제공합니다. 로그프레소 셸에 로그인하여 bundle.list를 입력하면 아래와 같이 수백 개의 OSGi 번들을 확인할 수 있습니다.
logpresso> bundle.list
[ ID] Symbolic Name Version Status
------------------------------------------------------------------
[ 0] org.apache.felix.framework 6.0.5 ACTIVE
[ 1] org.araqne.ipojo 1.2.1 ACTIVE
[ 2] org.apache.felix.ipojo 1.12.1.asm8 ACTIVE
[ 3] org.araqne.msgbus 1.13.1 ACTIVE
...
기본 설치된 번들과 마찬가지로 로그프레소 앱 역시 하나의 OSGi 번들입니다. 아래는 샘플 앱 번들에 포함된 파일 목록을 조회한 예입니다.
logpresso> bundle.resources 141
Bundle Resources
-------------------
META-INF/
com/
META-INF/MANIFEST.MF 파일은 OSGi 매니페스트를 포함합니다. 아래는 중요한 OSGi 매니페스트 엔트리를 선별한 것입니다.
logpresso> bundle.manifest 141
Bnd-LastModified: 1686382446996
Bundle-Name: Logpresso Sample App
Bundle-SymbolicName: com.logpresso.sonar.sample
Bundle-Version: 1.1.2608.0
번들 목록에 표시되는 이름은 Bundle-SymbolicName 항목의 값입니다. 번들 버전은 Bundle-Version 항목으로 정의합니다. 로그프레소 플랫폼에서 OSGi 번들의 이름과 버전은 유일해야 합니다.
아래는 OSGi 번들에 포함된 클래스 바이트코드의 예입니다.
bundle.resources 141 com/logpresso/sonar/sample/query
Bundle Resources
-------------------
com/logpresso/sonar/sample/query/SampleCreateSubnetGroupCommand.class
com/logpresso/sonar/sample/query/SampleCreateSubnetGroupCommandParser.class
com/logpresso/sonar/sample/query/SampleDriverQueryCommand.class
com/logpresso/sonar/sample/query/SampleParams.class
com/logpresso/sonar/sample/query/SampleQueryCommandParser.class
com/logpresso/sonar/sample/query/SampleSubnetGroupsCommand.class
com/logpresso/sonar/sample/query/SampleSubnetGroupsCommandParser.class
로그프레소 앱은 로그프레소 플랫폼이 제공하는 OSGi 서비스를 호출하여 기존 기능을 사용하거나, 로그프레소 플랫폼의 기능을 확장할 수 있습니다.
XDR UI 서빙 구조
앞에서 로그프레소 플랫폼이 앱을 설치하는 시점에 번들에 내장된 정적 리소스를 설치한다고 설명했습니다. 앱이 로그프레소 소나 웹 콘솔에 자체 화면을 제공하는 XDR UI가 이 구조를 사용합니다.
앱은 화면을 구성하는 HTML, JavaScript, CSS 파일을 번들의 WEB-INF 디렉터리에 포함합니다. 플랫폼은 이 파일들을 /app/{앱 코드}/ 경로로 서빙합니다. 즉 화면을 표시하기 위해 앱이 별도의 서블릿을 구현할 필요가 없습니다.
번들 내부 웹 콘솔에서 접근하는 주소
-------------------------------------------------------------------
WEB-INF/index.html /app/sample/
WEB-INF/assets/index-[해시].js /app/sample/assets/index-[해시].js
WEB-INF/assets/index-[해시].css /app/sample/assets/index-[해시].css
앱 코드는 번들의 sonar_app.json 파일에 정의하며, 이 값이 화면 주소의 일부가 됩니다. 사용자가 웹 콘솔의 앱 메뉴를 선택하면 웹 콘솔이 이 주소를 가리키는 iframe을 배치하고, 앱 화면은 그 안에서 동작합니다.
앱 화면을 iframe으로 격리하는 이유는 앱과 웹 콘솔이 서로 영향을 주지 않게 하기 위한 것입니다. 앱은 웹 콘솔과 다른 프레임워크나 버전을 사용할 수 있으며, 앱의 스타일이 웹 콘솔의 화면을 변형시키지 않습니다.
다음 절에서는 실제 앱 예제를 통해 REST API를 호출하는 쿼리 명령어를 어떻게 확장하는지 설명합니다.