Hello

Azure Monitor Application Insights 구성 (with JAVA) 본문

azure

Azure Monitor Application Insights 구성 (with JAVA)

nari0_0 2022. 9. 15. 10:01
728x90

현재 꽤 오래전에 구성한 applicationinsights-agent-3.0.0-PREVIEW.4.jar 를 사용하고 있었다.
어플리케이션 실행 될 때마다 agent 에러로그가 찍히는 현상을 다른 이슈를 확인 하다 발견하였는데, 에러는 agent 에서 의존하는 특정 클래스를 찾을 수 없다는 에러였다. 재밌는 것은 에러가 존재하지만 어플리케이션 실행에는 이슈는 없었다.

2020-08-21 09:59:07.169+09 INFO  applicationinsights.diagnostics - Application Insights Codeless Agent Attach Successful
2020-08-21 09:59:08.497+09 ERROR i.o.auto.tooling.HelperInjector - Error preparing helpers while processing class org.springframework.core.io.ClassPathResource for ClassPathResourceInstrumentation. Failed to inject helper classes into instance org.springframework.boot.loader.LaunchedURLClassLoader@22d6cac2
java.lang.IllegalStateException: Error invoking java.lang.ClassLoader#defineClass
        at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$Direct.defineClass(ClassInjector.java:607)
        at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection.injectRaw(ClassInjector.java:234)
        at io.opentelemetry.auto.tooling.HelperInjector.injectClassLoader(HelperInjector.java:184)
        at io.opentelemetry.auto.tooling.HelperInjector.transform(HelperInjector.java:134)
.
.(중략)
Caused by: java.lang.NoClassDefFoundError: io/micrometer/core/instrument/step/StepMeterRegistry
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:757)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at net.bytebuddy.dynamic.loading.ClassInjector$UsingReflection$Dispatcher$Direct.defineClass(ClassInjector.java:603)
        ... 59 common frames omitted
Caused by: java.lang.ClassNotFoundException: io.micrometer.core.instrument.step.StepMeterRegistry
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
        at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:92)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
        ... 66 common frames omitted

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.6.RELEASE)

 

문제 확인 후 최신 버전을 보니 3.3.1 버전까지 업데이트 되어 있어 우리 구성도 업데이트 하면서 변경된 부분을 정리하고자 작성한다.

 

azure insight는 연결 문자열을 사용하는 두 가지 방법을 제공한다. 

  • 환경 변수를 설정할 수 있습니다.
  • applicationinsights.json을 작성해 구성 파일을 사용할 수 있다.
    applicationinsights-agent-3.3.1.jar과 동일한 디렉터리에 두어 사용합니다.

우리는 json으로 구성하는 방식을 사용하는 중인데, 구조가 거의 다 바뀌어 구성옵션 페이지를 확인하면서 변경해 주었다.

{
  "connectionString": "your connectionString",
  "role": {
    "name": "role-name",
    "instance": "role-name"
  },
  "instrumentation": {
    "logging": {
      "level": "INFO"
    },
    "micrometer": {
      "enabled": false
    }
  },
  "heartbeat": {
    "intervalSeconds": 60
  },
  "jmxMetrics": [
    {
      "objectName": "java.lang:type=ClassLoading",
      "attribute": "LoadedClassCount",
      "name": "Loaded Class Count"
    }
  ]
}

 

메트릭을 사용하기 위해서 개체 이름 및 특성을 알고 있어야하나, 해당 속성은 라이브러리, 프레임워크 및 애플리케이션 서버별로 다르고 제대로 문서화되지 않는 경우가 많습니다.

사용 가능한 메트릭을 보려면 applicationinsights.json 구성 파일에서 자가 진단 수준을 DEBUG로 설정합니다. 예를 들면 다음과 같습니다.

{
  "selfDiagnostics": {
    "level": "DEBUG"
  }
}

처음 구성 할 때는 애플리케이션의 JVM 인수에 -javaagent:"path/to/applicationinsights-agent-3.3.1.jar" 추가해 jvm 실행 시 사용할 수 있도록 한다.

 

참조 : https://docs.microsoft.com/ko-kr/azure/azure-monitor/app/java-in-process-agent

https://docs.microsoft.com/ko-kr/azure/azure-monitor/app/java-standalone-config

728x90