본문 바로가기

프로젝트/Pinpoint, Scouter 구축(APM)

[Pinpoint - plugin]DB 추적 이슈 : tomcat 서버(Agent)와 DB 서버가 다를 때

 

문제 상황

 

기존 서비스 : 하나의 서버 안에 tomcat과 DB가 한 군데에 있어서 정상적으로 추적할 수 있었다.

 

현재 상황 : A 서버 안에 agent와 tomcat을 심었고, B 서버(물리적으로 다른 서버)를 DB 서버로 두어 현재 B 서버 내부의 postgreSQL을 탐색하지 못하는 것 같다.

 

01-30 15:34:10.010 [nfoSender-Timer] INFO  c.n.p.p.AgentInfoSender                  -- AgentInfo sent.
01-30 15:34:10.010 [           main] ERROR c.n.p.p.t.BaseClassFileTransformer       -- Transformer:com.navercorp.pinpoint.profiler.plugin.MatchableClassFileTransformerDelegate threw an exception. codeLocation:jar:file:/경로.jar!/ cl:org.springframework.boot.loader.LaunchedURLClassLoader@27df0f3d ctxCl:TomcatEmbeddedWebappClassLoader
  context: ROOT
  delegate: true
----------> Parent Classloader:
org.springframework.boot.loader.LaunchedURLClassLoader@27df0f3d
 agentCl:ParallelClassLoader@401625763{name='pinpoint.agent'} Cause:com.navercorp.pinpoint.bootstrap.instrument.NotFoundInstrumentException: Cannot find constructor with parameter types: [org.postgresql.util.HostSpec[], java.lang.String, java.lang.String, java.util.Properties, java.lang.String]
com.navercorp.pinpoint.exception.PinpointException: com.navercorp.pinpoint.bootstrap.instrument.NotFoundInstrumentException: Cannot find constructor with parameter types: [org.postgresql.util.HostSpec[], java.lang.String, java.lang.String, java.util.Properties, java.lang.String]
	at com.navercorp.pinpoint.profiler.plugin.MatchableClassFileTransformerDelegate.transform(MatchableClassFileTransformerDelegate.java:66) ~[pinpoint-profiler-2.3.3.jar:2.3.3]
	at com.navercorp.pinpoint.profiler.transformer.BaseClassFileTransformer.transform(BaseClassFileTransformer.java:56) ~[pinpoint-profiler-2.3.3.jar:2.3.3]
	at com.navercorp.pinpoint.profiler.transformer.DefaultClassFileTransformerDispatcher.transform(DefaultClassFileTransformerDispatcher.java:90) ~[pinpoint-profiler-2.3.3.jar:2.3.3]
	at sun.instrument.TransformerManager.transform(TransformerManager.java:188) ~[?:1.8.0_352]
	at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428) ~[?:1.8.0_352]
	at java.lang.ClassLoader.defineClass1(Native Method) ~[?:1.8.0_352]
	at java.lang.ClassLoader.defineClass(ClassLoader.java:756) ~[?:1.8.0_352]
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[?:1.8.0_352]
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:473) ~[?:1.8.0_352]
	at java.net.URLClassLoader.access$100(URLClassLoader.java:74) ~[?:1.8.0_352]
	at java.net.URLClassLoader$1.run(URLClassLoader.java:369) ~[?:1.8.0_352]
	at java.net.URLClassLoader$1.run(URLClassLoader.java:363) ~[?:1.8.0_352]
	at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_352]
	at java.net.URLClassLoader.findClass(URLClassLoader.java:362) ~[?:1.8.0_352]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418) ~[?:1.8.0_352]
	at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:151) ~[file
    -0.0.1.jar:?]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[?:1.8.0_352]
	at org.postgresql.Driver.makeConnection(Driver.java:402) ~[postgresql-42.4.0.jar!/:42.4.0]
	at org.postgresql.Driver.connect(Driver.java:261) ~[postgresql-42.4.0.jar!/:42.4.0]
	at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar!/:?]
	at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar!/:?]
	at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar!/:?]
	at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar!/:?]
	at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar!/:?]
	at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar!/:?]
	at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar!/:?]
	at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159) ~[spring-jdbc-5.3.16.jar!/:5.3.16]
	at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117) ~[spring-jdbc-5.3.16.jar!/:5.3.16]
	at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) ~[spring-jdbc-5.3.16.jar!/:5.3.16]
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:330) ~[spring-jdbc-5.3.16.jar!/:5.3.16]
	at org.springframework.boot.jdbc.EmbeddedDatabaseConnection.isEmbedded(EmbeddedDatabaseConnection.java:162) ~[spring-boot-2.6.4.jar!/:2.6.4]
	at org.springframework.boot.autoconfigure.orm.jpa.HibernateDefaultDdlAutoProvider.getDefaultDdlAuto(HibernateDefaultDdlAutoProvider.java:42) ~[spring-boot-autoconfigure-2.6.4.jar!/:2.6.4]
	at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.lambda$getVendorProperties$1(HibernateJpaConfiguration.java:130) ~[spring-boot-autoconfigure-2.6.4.jar!/:2.6.4]
	at org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings.getDdlAuto(HibernateSettings.java:41) ~[spring-boot-autoconfigure-2.6.4.jar!/:2.6.4]
	at org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties.determineDdlAuto(HibernateProperties.java:143) ~[spring-boot-autoconfigure-2.6.4.jar!/:2.6.4]
	at org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties.getAdditionalProperties(HibernateProperties.java:103) ~[spring-boot-autoconfigure-2.6.4.jar!/:2.6.4]
	at org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties.determineHibernateProperties(HibernateProperties.java:95) ~[spring-boot-autoconfigure-2.6.4.jar!/:2.6.4]
	at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration.getVendorProperties(HibernateJpaConfiguration.java:132) ~[spring-boot-autoconfigure-2.6.4.jar!/:2.6.4]
	at org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.entityManagerFactory(JpaBaseConfiguration.java:132) ~[spring-boot-autoconfigure-2.6.4.jar!/:2.6.4]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_352]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_352]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_352]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_352]

 

 

 

GPT의 도움을 조금 받았다.

에러 원인 분석 결과 다음과 같은 가능성이 있었다.

 

에러 로그 분석 결과, NotFoundInstrumentException 예외가 발생한 것으로 보입니다. 
이 예외는 Pinpoint 에이전트가 
org.postgresql.util.HostSpec[], java.lang.String, java.lang.String, java.util.Properties, 
java.lang.String 매개변수를 가진 생성자를 찾을 수 없을 때 발생합니다. 

이는 주로 PostgreSQL 드라이버의 버전이 Pinpoint 에이전트와 호환되지 않을 때 
나타날 수 있는 문제입니다.

 

 

에러 로그

 

com.navercorp.pinpoint.profiler.plugin.MatchableClassFileTransformerDelegate에서 에러가 발생. 이 클래스 내에서 transform 메서드가 호출되는 도중에 NotFoundInstrumentException 예외가 발생했음.

https://github.com/pinpoint-apm/pinpoint/blob/2.3.x/profiler/src/main/java/com/navercorp/pinpoint/profiler/plugin/MatchableClassFileTransformerDelegate.java

 

 

 

 

 

해결 방안

 

postgreSQL 버전 확인

 

 

 

https://github.com/pinpoint-apm/pinpoint/issues/6750

 

Cannot start pinpoint agent v2.0.1 normally · Issue #6750 · pinpoint-apm/pinpoint

What version of pinpoint are you using? v2.0.1 Describe your problem** When starting the application with pinpoint agent configured I'm getting an NotFoundInstrumentException. What have you done? S...

github.com

 

https://github.com/pinpoint-apm/pinpoint/tree/master/plugins/postgresql-jdbc

 

플러그인을 확인하자. 내가 문제되는 Postgresql JDBC Driver를 확인해보았다.

 

 

 

 

 

pinpoint.config 파일에서 설정을 변경할 수 있다.

 

내부 config 중 이 부분을 변경하자. jdbc에 따라 내용을 변경할 것.
profiler.jdbc.url=jdbc:postgresql://[해당 서버의 IP 주소]:[포트]/[데이터베이스명]