로그프레소 아키텍처

로그프레소 플랫폼은 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를 호출하는 쿼리 명령어를 어떻게 확장하는지 설명합니다.