Full Code of megaease/easeagent for AI

master ec7bd5f578ef cached
1354 files
4.6 MB
1.3M tokens
9025 symbols
1 requests
Download .txt
Showing preview only (5,291K chars total). Download the full file or copy to clipboard to get everything.
Repository: megaease/easeagent
Branch: master
Commit: ec7bd5f578ef
Files: 1354
Total size: 4.6 MB

Directory structure:
gitextract_4u5zqd_x/

├── .editorconfig
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       ├── build.yml
│       └── license-checker.yml
├── .gitignore
├── .licenserc.yaml
├── AOSP-Checkstyles.xml
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── build/
│   ├── pom.xml
│   └── src/
│       ├── assembly/
│       │   └── src.xml
│       └── main/
│           ├── java/
│           │   └── com/
│           │       └── megaease/
│           │           └── easeagent/
│           │               └── StartBootstrap.java
│           └── resources/
│               ├── agent-to-cloud_1.0.properties
│               ├── agent.properties
│               ├── easeagent-log4j2.xml
│               └── user-minimal-cfg.properties
├── config/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── com/
│       │           └── megaease/
│       │               └── easeagent/
│       │                   └── config/
│       │                       ├── AutoRefreshConfigItem.java
│       │                       ├── CompatibilityConversion.java
│       │                       ├── ConfigAware.java
│       │                       ├── ConfigFactory.java
│       │                       ├── ConfigLoader.java
│       │                       ├── ConfigManagerMXBean.java
│       │                       ├── ConfigNotifier.java
│       │                       ├── ConfigPropertiesUtils.java
│       │                       ├── ConfigUtils.java
│       │                       ├── Configs.java
│       │                       ├── GlobalConfigs.java
│       │                       ├── JarFileConfigLoader.java
│       │                       ├── OtelSdkConfigs.java
│       │                       ├── PluginConfig.java
│       │                       ├── PluginConfigManager.java
│       │                       ├── PluginProperty.java
│       │                       ├── PluginSourceConfig.java
│       │                       ├── ValidateUtils.java
│       │                       ├── WrappedConfigManager.java
│       │                       ├── report/
│       │                       │   ├── ReportConfigAdapter.java
│       │                       │   └── ReportConfigConst.java
│       │                       └── yaml/
│       │                           └── YamlReader.java
│       └── test/
│           ├── java/
│           │   └── com/
│           │       └── megaease/
│           │           └── easeagent/
│           │               └── config/
│           │                   ├── CompatibilityConversionTest.java
│           │                   ├── ConfigFactoryTest.java
│           │                   ├── ConfigPropertiesUtilsTest.java
│           │                   ├── ConfigUtilsTest.java
│           │                   ├── ConfigsTest.java
│           │                   ├── IPluginConfigConstTest.java
│           │                   ├── JarFileConfigLoaderTest.java
│           │                   ├── OtelSdkConfigsTest.java
│           │                   ├── PluginConfigManagerTest.java
│           │                   ├── PluginConfigTest.java
│           │                   ├── PluginPropertyTest.java
│           │                   ├── PluginSourceConfigTest.java
│           │                   ├── ValidateUtilsTest.java
│           │                   ├── report/
│           │                   │   └── ReportConfigAdapterTest.java
│           │                   └── yaml/
│           │                       └── YamlReaderTest.java
│           └── resources/
│               ├── agent.properties
│               ├── agent.yaml
│               ├── easeagent_config.jar
│               ├── user-spec.properties
│               ├── user-spec2.properties
│               └── user.properties
├── context/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── com/
│       │           └── megaease/
│       │               └── easeagent/
│       │                   └── context/
│       │                       ├── AsyncContextImpl.java
│       │                       ├── ContextManager.java
│       │                       ├── GlobalContext.java
│       │                       ├── ProgressFieldsManager.java
│       │                       ├── RetBound.java
│       │                       ├── SessionContext.java
│       │                       └── log/
│       │                           ├── LoggerFactoryImpl.java
│       │                           ├── LoggerImpl.java
│       │                           └── LoggerMdc.java
│       └── test/
│           ├── java/
│           │   └── com/
│           │       └── megaease/
│           │           └── easeagent/
│           │               └── context/
│           │                   ├── AsyncContextImplTest.java
│           │                   ├── ContextManagerTest.java
│           │                   ├── GlobalContextTest.java
│           │                   ├── ProgressFieldsManagerTest.java
│           │                   ├── RetBoundTest.java
│           │                   ├── SessionContextTest.java
│           │                   └── log/
│           │                       ├── LoggerFactoryImplTest.java
│           │                       ├── LoggerImplTest.java
│           │                       └── LoggerMdcTest.java
│           └── resources/
│               └── log4j2.xml
├── core/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── megaease/
│       │   │           └── easeagent/
│       │   │               └── core/
│       │   │                   ├── AppendBootstrapClassLoaderSearch.java
│       │   │                   ├── Bootstrap.java
│       │   │                   ├── GlobalAgentHolder.java
│       │   │                   ├── config/
│       │   │                   │   ├── CanaryListUpdateAgentHttpHandler.java
│       │   │                   │   ├── CanaryUpdateAgentHttpHandler.java
│       │   │                   │   ├── ConfigsUpdateAgentHttpHandler.java
│       │   │                   │   ├── PluginPropertiesHttpHandler.java
│       │   │                   │   ├── PluginPropertyHttpHandler.java
│       │   │                   │   └── ServiceUpdateAgentHttpHandler.java
│       │   │                   ├── health/
│       │   │                   │   └── HealthProvider.java
│       │   │                   ├── info/
│       │   │                   │   ├── AgentInfoFactory.java
│       │   │                   │   └── AgentInfoProvider.java
│       │   │                   ├── plugin/
│       │   │                   │   ├── BaseLoader.java
│       │   │                   │   ├── BridgeDispatcher.java
│       │   │                   │   ├── CommonInlineAdvice.java
│       │   │                   │   ├── Dispatcher.java
│       │   │                   │   ├── PluginLoader.java
│       │   │                   │   ├── annotation/
│       │   │                   │   │   ├── EaseAgentInstrumented.java
│       │   │                   │   │   └── Index.java
│       │   │                   │   ├── interceptor/
│       │   │                   │   │   ├── InterceptorPluginDecorator.java
│       │   │                   │   │   ├── ProviderChain.java
│       │   │                   │   │   └── ProviderPluginDecorator.java
│       │   │                   │   ├── matcher/
│       │   │                   │   │   ├── ClassLoaderMatcherConvert.java
│       │   │                   │   │   ├── ClassMatcherConvert.java
│       │   │                   │   │   ├── ClassTransformation.java
│       │   │                   │   │   ├── Converter.java
│       │   │                   │   │   ├── MethodMatcherConvert.java
│       │   │                   │   │   └── MethodTransformation.java
│       │   │                   │   ├── registry/
│       │   │                   │   │   ├── AdviceRegistry.java
│       │   │                   │   │   └── PluginRegistry.java
│       │   │                   │   └── transformer/
│       │   │                   │       ├── AnnotationTransformer.java
│       │   │                   │       ├── CompoundPluginTransformer.java
│       │   │                   │       ├── DynamicFieldAdvice.java
│       │   │                   │       ├── DynamicFieldTransformer.java
│       │   │                   │       ├── ForAdviceTransformer.java
│       │   │                   │       ├── TypeFieldTransformer.java
│       │   │                   │       ├── advice/
│       │   │                   │       │   ├── AgentAdvice.java
│       │   │                   │       │   ├── AgentForAdvice.java
│       │   │                   │       │   ├── AgentJavaConstantValue.java
│       │   │                   │       │   ├── BypassMethodVisitor.java
│       │   │                   │       │   └── MethodIdentityJavaConstant.java
│       │   │                   │       └── classloader/
│       │   │                   │           └── CompoundClassloader.java
│       │   │                   └── utils/
│       │   │                       ├── AgentArray.java
│       │   │                       ├── ContextUtils.java
│       │   │                       ├── JsonUtil.java
│       │   │                       ├── MutableObject.java
│       │   │                       ├── ServletUtils.java
│       │   │                       └── TextUtils.java
│       │   └── resources/
│       │       ├── META-INF/
│       │       │   └── services/
│       │       │       └── com.megaease.easeagent.plugin.bean.BeanProvider
│       │       └── version.txt
│       └── test/
│           └── java/
│               └── com/
│                   └── megaease/
│                       └── easeagent/
│                           └── core/
│                               ├── AppendBootstrapClassLoaderSearchTest.java
│                               ├── BootstrapTest.java
│                               ├── HttpServerTest.java
│                               ├── info/
│                               │   └── AgentInfoFactoryTest.java
│                               ├── instrument/
│                               │   ├── ClinitMethodTransformTest.java
│                               │   ├── NewInstanceMethodTransformTest.java
│                               │   ├── NonStaticMethodTransformTest.java
│                               │   ├── OrchestrationTransformTest.java
│                               │   ├── StaticMethodTransformTest.java
│                               │   ├── TestContext.java
│                               │   ├── TestPlugin.java
│                               │   └── TransformTestBase.java
│                               ├── matcher/
│                               │   ├── ClassLoaderMatcherTest.java
│                               │   ├── ClassMatcherTest.java
│                               │   └── MethodMatcherTest.java
│                               ├── plugin/
│                               │   └── PluginLoaderTest.java
│                               └── utils/
│                                   └── AgentAttachmentRule.java
├── doc/
│   ├── add-plugin-demo.md
│   ├── benchmark.md
│   ├── context.md
│   ├── criteria-for-configuring-priorities.md
│   ├── development-guide.md
│   ├── how-to-use/
│   │   ├── megacloud-config.md
│   │   ├── use-in-docker.md
│   │   └── use-on-host.md
│   ├── matcher-DSL.md
│   ├── metric-api.md
│   ├── plugin-unit-test.md
│   ├── prometheus-metric-schedule.md
│   ├── report-development-guide.md
│   ├── spring-boot-3.x.x-demo.md
│   ├── spring-boot-upgrade.md
│   ├── spring-petclinic-demo.md
│   ├── tracing-api.md
│   └── user-manual.md
├── httpserver/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── com/
│                   └── megaease/
│                       └── easeagent/
│                           └── httpserver/
│                               ├── HttpRequest.java
│                               ├── HttpResponse.java
│                               ├── IHttpHandler.java
│                               ├── IHttpServer.java
│                               ├── jdk/
│                               │   ├── AgentHttpServerV2.java
│                               │   ├── RootContextHandler.java
│                               │   └── UriResource.java
│                               ├── nano/
│                               │   ├── AgentHttpHandler.java
│                               │   ├── AgentHttpHandlerProvider.java
│                               │   └── AgentHttpServer.java
│                               └── nanohttpd/
│                                   ├── protocols/
│                                   │   └── http/
│                                   │       ├── ClientHandler.java
│                                   │       ├── HTTPSession.java
│                                   │       ├── IHTTPSession.java
│                                   │       ├── NanoHTTPD.java
│                                   │       ├── ServerRunnable.java
│                                   │       ├── content/
│                                   │       │   ├── ContentType.java
│                                   │       │   ├── Cookie.java
│                                   │       │   └── CookieHandler.java
│                                   │       ├── request/
│                                   │       │   └── Method.java
│                                   │       ├── response/
│                                   │       │   ├── ChunkedOutputStream.java
│                                   │       │   ├── IStatus.java
│                                   │       │   ├── Response.java
│                                   │       │   └── Status.java
│                                   │       ├── sockets/
│                                   │       │   ├── DefaultServerSocketFactory.java
│                                   │       │   └── SecureServerSocketFactory.java
│                                   │       ├── tempfiles/
│                                   │       │   ├── DefaultTempFile.java
│                                   │       │   ├── DefaultTempFileManager.java
│                                   │       │   ├── DefaultTempFileManagerFactory.java
│                                   │       │   ├── ITempFile.java
│                                   │       │   └── ITempFileManager.java
│                                   │       └── threading/
│                                   │           ├── DefaultAsyncRunner.java
│                                   │           └── IAsyncRunner.java
│                                   ├── router/
│                                   │   └── RouterNanoHTTPD.java
│                                   └── util/
│                                       ├── IFactory.java
│                                       ├── IFactoryThrowing.java
│                                       ├── IHandler.java
│                                       └── ServerRunner.java
├── loader/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── com/
│       │           └── megaease/
│       │               └── easeagent/
│       │                   ├── EaseAgentClassLoader.java
│       │                   ├── JarCache.java
│       │                   ├── Main.java
│       │                   └── StringSequence.java
│       └── test/
│           ├── java/
│           │   └── com/
│           │       └── megaease/
│           │           └── easeagent/
│           │               └── MainTest.java
│           └── resources/
│               └── test-mock-load.jar
├── log4j2/
│   ├── README.md
│   ├── log4j2-api/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── log4j2/
│   │                               ├── ClassLoaderUtils.java
│   │                               ├── ClassloaderSupplier.java
│   │                               ├── FinalClassloaderSupplier.java
│   │                               ├── Logger.java
│   │                               ├── LoggerFactory.java
│   │                               ├── MDC.java
│   │                               ├── api/
│   │                               │   ├── AgentLogger.java
│   │                               │   ├── AgentLoggerFactory.java
│   │                               │   ├── ILevel.java
│   │                               │   └── Mdc.java
│   │                               └── exception/
│   │                                   └── Log4j2Exception.java
│   ├── log4j2-impl/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── log4j2/
│   │                               └── impl/
│   │                                   ├── AgentLoggerProxy.java
│   │                                   ├── LoggerProxyFactory.java
│   │                                   ├── MdcProxy.java
│   │                                   └── Slf4jLogger.java
│   └── pom.xml
├── metrics/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── megaease/
│       │   │           └── easeagent/
│       │   │               └── metrics/
│       │   │                   ├── AgentScheduledReporter.java
│       │   │                   ├── AutoRefreshReporter.java
│       │   │                   ├── MetricBeanProviderImpl.java
│       │   │                   ├── MetricProviderImpl.java
│       │   │                   ├── MetricRegistryService.java
│       │   │                   ├── PrometheusAgentHttpHandler.java
│       │   │                   ├── config/
│       │   │                   │   ├── MetricsCollectorConfig.java
│       │   │                   │   ├── MetricsConfig.java
│       │   │                   │   └── PluginMetricsConfig.java
│       │   │                   ├── converter/
│       │   │                   │   ├── AbstractConverter.java
│       │   │                   │   ├── Converter.java
│       │   │                   │   ├── ConverterAdapter.java
│       │   │                   │   ├── EaseAgentPrometheusExports.java
│       │   │                   │   ├── IgnoreOutputException.java
│       │   │                   │   ├── KeyType.java
│       │   │                   │   └── MetricsAdditionalAttributes.java
│       │   │                   ├── impl/
│       │   │                   │   ├── CounterImpl.java
│       │   │                   │   ├── GaugeImpl.java
│       │   │                   │   ├── HistogramImpl.java
│       │   │                   │   ├── MeterImpl.java
│       │   │                   │   ├── MetricInstance.java
│       │   │                   │   ├── MetricRegistryImpl.java
│       │   │                   │   ├── SnapshotImpl.java
│       │   │                   │   └── TimerImpl.java
│       │   │                   ├── jvm/
│       │   │                   │   ├── JvmBeanProvider.java
│       │   │                   │   ├── gc/
│       │   │                   │   │   └── JVMGCMetricV2.java
│       │   │                   │   └── memory/
│       │   │                   │       └── JVMMemoryMetricV2.java
│       │   │                   └── model/
│       │   │                       └── JVMMemoryGaugeMetricModel.java
│       │   └── resources/
│       │       └── META-INF/
│       │           └── services/
│       │               └── com.megaease.easeagent.plugin.bean.BeanProvider
│       └── test/
│           ├── java/
│           │   └── com/
│           │       └── megaease/
│           │           └── easeagent/
│           │               └── metrics/
│           │                   ├── MetricProviderImplTest.java
│           │                   ├── MetricRegistryServiceTest.java
│           │                   ├── PrometheusAgentHttpHandlerTest.java
│           │                   ├── TestConst.java
│           │                   ├── config/
│           │                   │   └── PluginMetricsConfigTest.java
│           │                   ├── converter/
│           │                   │   ├── AbstractConverterTest.java
│           │                   │   ├── ConverterAdapterTest.java
│           │                   │   ├── IgnoreOutputExceptionTest.java
│           │                   │   └── MetricsAdditionalAttributesTest.java
│           │                   ├── impl/
│           │                   │   ├── CounterImplTest.java
│           │                   │   ├── GaugeImplTest.java
│           │                   │   ├── HistogramImplTest.java
│           │                   │   ├── MeterImplTest.java
│           │                   │   ├── MetricInstanceTest.java
│           │                   │   ├── MetricRegistryImplTest.java
│           │                   │   ├── MetricRegistryMock.java
│           │                   │   ├── MetricTestUtils.java
│           │                   │   ├── MockClock.java
│           │                   │   ├── SnapshotImplTest.java
│           │                   │   └── TimerImplTest.java
│           │                   └── jvm/
│           │                       └── memory/
│           │                           └── JVMMemoryMetricV2Test.java
│           └── resources/
│               ├── log4j2.xml
│               └── mock_agent.properties
├── mock/
│   ├── config-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   ├── config/
│   │       │                   │   └── MockConfigLoader.java
│   │       │                   └── mock/
│   │       │                       └── config/
│   │       │                           └── MockConfig.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── mock/
│   │           │                   └── config/
│   │           │                       └── MockConfigTest.java
│   │           └── resources/
│   │               ├── mock_agent.properties
│   │               └── mock_agent.yaml
│   ├── context-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── mock/
│   │                               └── context/
│   │                                   ├── MockContext.java
│   │                                   └── MockContextManager.java
│   ├── log4j2-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── megaease/
│   │       │   │           └── easeagent/
│   │       │   │               └── mock/
│   │       │   │                   └── log4j2/
│   │       │   │                       ├── AllUrlsSupplier.java
│   │       │   │                       ├── DirUrlsSupplier.java
│   │       │   │                       ├── JarPathUrlsSupplier.java
│   │       │   │                       ├── JarUrlsSupplier.java
│   │       │   │                       ├── URLClassLoaderSupplier.java
│   │       │   │                       └── UrlSupplier.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           └── services/
│   │       │               └── com.megaease.easeagent.log4j2.ClassloaderSupplier
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── log4j2/
│   │           │                   └── impl/
│   │           │                       ├── AgentLoggerFactoryTest.java
│   │           │                       └── MDCTest.java
│   │           └── resources/
│   │               └── log4j2.xml
│   ├── metrics-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── mock/
│   │           │                   └── metrics/
│   │           │                       ├── MetricTestUtils.java
│   │           │                       └── MockMetricProvider.java
│   │           └── resources/
│   │               └── META-INF/
│   │                   └── services/
│   │                       └── com.megaease.easeagent.mock.utils.MockProvider
│   ├── plugin-api-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── mock/
│   │       │                       └── plugin/
│   │       │                           └── api/
│   │       │                               ├── MockEaseAgent.java
│   │       │                               ├── junit/
│   │       │                               │   ├── AfterStatement.java
│   │       │                               │   ├── BeforeStatement.java
│   │       │                               │   ├── EaseAgentJunit4ClassRunner.java
│   │       │                               │   └── ScopeMustBeCloseException.java
│   │       │                               └── utils/
│   │       │                                   ├── ConfigTestUtils.java
│   │       │                                   ├── ContextUtils.java
│   │       │                                   ├── InterceptorTestUtils.java
│   │       │                                   ├── SpanTestUtils.java
│   │       │                                   └── TagVerifier.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── mock/
│   │           │                   └── plugin/
│   │           │                       └── api/
│   │           │                           ├── TestContext.java
│   │           │                           ├── TestEaseAgent.java
│   │           │                           ├── demo/
│   │           │                           │   ├── InterceptorTest.java
│   │           │                           │   ├── M1MetricCollect.java
│   │           │                           │   └── MockEaseAgentTest.java
│   │           │                           └── utils/
│   │           │                               └── ConfigTestUtilsTest.java
│   │           └── resources/
│   │               └── log4j2.xml
│   ├── pom.xml
│   ├── report-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── mock/
│   │       │                       └── report/
│   │       │                           ├── JsonReporter.java
│   │       │                           ├── MetricFlushable.java
│   │       │                           ├── MockAtomicReferenceReportSpanReport.java
│   │       │                           ├── MockReport.java
│   │       │                           ├── MockSpan.java
│   │       │                           ├── MockSpanReport.java
│   │       │                           └── impl/
│   │       │                               ├── LastJsonReporter.java
│   │       │                               └── ZipkinMockSpanImpl.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── mock/
│   │           │                   └── report/
│   │           │                       └── MockReportTest.java
│   │           └── resources/
│   │               └── log4j2.xml
│   ├── utils-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── mock/
│   │                               └── utils/
│   │                                   ├── JdkHttpServer.java
│   │                                   ├── MockProvider.java
│   │                                   └── MockSystemEnv.java
│   └── zipkin-mock/
│       ├── pom.xml
│       └── src/
│           ├── main/
│           │   ├── java/
│           │   │   ├── brave/
│           │   │   │   ├── TracerTestUtils.java
│           │   │   │   └── internal/
│           │   │   │       └── collect/
│           │   │   │           └── WeakConcurrentMapTestUtils.java
│           │   │   └── com/
│           │   │       └── megaease/
│           │   │           └── easeagent/
│           │   │               └── mock/
│           │   │                   └── zipkin/
│           │   │                       └── MockTracingProvider.java
│           │   └── resources/
│           │       └── META-INF/
│           │           └── services/
│           │               └── com.megaease.easeagent.mock.utils.MockProvider
│           └── test/
│               └── java/
│                   └── com/
│                       └── megaease/
│                           └── easeagent/
│                               └── mock/
│                                   └── zipkin/
│                                       └── MockTracingProviderTest.java
├── plugin-api/
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       ├── com/
│       │       │   └── megaease/
│       │       │       └── easeagent/
│       │       │           └── plugin/
│       │       │               ├── AgentPlugin.java
│       │       │               ├── AppendBootstrapLoader.java
│       │       │               ├── CodeVersion.java
│       │       │               ├── Ordered.java
│       │       │               ├── Points.java
│       │       │               ├── annotation/
│       │       │               │   ├── AdviceTo.java
│       │       │               │   ├── AdvicesTo.java
│       │       │               │   ├── DynamicField.java
│       │       │               │   └── Injection.java
│       │       │               ├── api/
│       │       │               │   ├── Cleaner.java
│       │       │               │   ├── Context.java
│       │       │               │   ├── InitializeContext.java
│       │       │               │   ├── ProgressFields.java
│       │       │               │   ├── Reporter.java
│       │       │               │   ├── config/
│       │       │               │   │   ├── AutoRefreshConfigSupplier.java
│       │       │               │   │   ├── AutoRefreshPluginConfig.java
│       │       │               │   │   ├── AutoRefreshPluginConfigImpl.java
│       │       │               │   │   ├── AutoRefreshPluginConfigRegistry.java
│       │       │               │   │   ├── ChangeItem.java
│       │       │               │   │   ├── Config.java
│       │       │               │   │   ├── ConfigChangeListener.java
│       │       │               │   │   ├── ConfigConst.java
│       │       │               │   │   ├── Const.java
│       │       │               │   │   ├── IConfigFactory.java
│       │       │               │   │   ├── IPluginConfig.java
│       │       │               │   │   └── PluginConfigChangeListener.java
│       │       │               │   ├── context/
│       │       │               │   │   ├── AsyncContext.java
│       │       │               │   │   ├── ContextCons.java
│       │       │               │   │   ├── ContextUtils.java
│       │       │               │   │   ├── IContextManager.java
│       │       │               │   │   └── RequestContext.java
│       │       │               │   ├── dispatcher/
│       │       │               │   │   └── IDispatcher.java
│       │       │               │   ├── health/
│       │       │               │   │   └── AgentHealth.java
│       │       │               │   ├── logging/
│       │       │               │   │   ├── AccessLogInfo.java
│       │       │               │   │   ├── ILoggerFactory.java
│       │       │               │   │   ├── Logger.java
│       │       │               │   │   └── Mdc.java
│       │       │               │   ├── metric/
│       │       │               │   │   ├── Counter.java
│       │       │               │   │   ├── Gauge.java
│       │       │               │   │   ├── Histogram.java
│       │       │               │   │   ├── Meter.java
│       │       │               │   │   ├── Metric.java
│       │       │               │   │   ├── MetricProvider.java
│       │       │               │   │   ├── MetricRegistry.java
│       │       │               │   │   ├── MetricRegistrySupplier.java
│       │       │               │   │   ├── MetricSupplier.java
│       │       │               │   │   ├── ServiceMetric.java
│       │       │               │   │   ├── ServiceMetricRegistry.java
│       │       │               │   │   ├── ServiceMetricSupplier.java
│       │       │               │   │   ├── Snapshot.java
│       │       │               │   │   ├── Timer.java
│       │       │               │   │   └── name/
│       │       │               │   │       ├── ConverterType.java
│       │       │               │   │       ├── MetricField.java
│       │       │               │   │       ├── MetricName.java
│       │       │               │   │       ├── MetricSubType.java
│       │       │               │   │       ├── MetricType.java
│       │       │               │   │       ├── MetricValueFetcher.java
│       │       │               │   │       ├── NameFactory.java
│       │       │               │   │       └── Tags.java
│       │       │               │   ├── middleware/
│       │       │               │   │   ├── MiddlewareConstants.java
│       │       │               │   │   ├── Redirect.java
│       │       │               │   │   ├── RedirectProcessor.java
│       │       │               │   │   ├── ResourceConfig.java
│       │       │               │   │   └── Type.java
│       │       │               │   ├── otlp/
│       │       │               │   │   └── common/
│       │       │               │   │       ├── AgentAttributes.java
│       │       │               │   │       ├── AgentInstrumentLibInfo.java
│       │       │               │   │       ├── AgentLogData.java
│       │       │               │   │       ├── AgentLogDataImpl.java
│       │       │               │   │       ├── LogMapper.java
│       │       │               │   │       ├── OtlpSpanContext.java
│       │       │               │   │       └── SemanticKey.java
│       │       │               │   └── trace/
│       │       │               │       ├── Extractor.java
│       │       │               │       ├── Getter.java
│       │       │               │       ├── ITracing.java
│       │       │               │       ├── Injector.java
│       │       │               │       ├── Message.java
│       │       │               │       ├── MessagingRequest.java
│       │       │               │       ├── MessagingTracing.java
│       │       │               │       ├── Request.java
│       │       │               │       ├── Response.java
│       │       │               │       ├── Scope.java
│       │       │               │       ├── Setter.java
│       │       │               │       ├── Span.java
│       │       │               │       ├── SpanContext.java
│       │       │               │       ├── Tracing.java
│       │       │               │       ├── TracingContext.java
│       │       │               │       ├── TracingProvider.java
│       │       │               │       └── TracingSupplier.java
│       │       │               ├── asm/
│       │       │               │   └── Modifier.java
│       │       │               ├── async/
│       │       │               │   ├── AgentThreadFactory.java
│       │       │               │   ├── ScheduleHelper.java
│       │       │               │   ├── ScheduleRunner.java
│       │       │               │   ├── ThreadLocalCurrentContext.java
│       │       │               │   └── ThreadUtils.java
│       │       │               ├── bean/
│       │       │               │   ├── AgentInitializingBean.java
│       │       │               │   └── BeanProvider.java
│       │       │               ├── bridge/
│       │       │               │   ├── AgentInfo.java
│       │       │               │   ├── EaseAgent.java
│       │       │               │   ├── NoOpAgentReporter.java
│       │       │               │   ├── NoOpCleaner.java
│       │       │               │   ├── NoOpConfigFactory.java
│       │       │               │   ├── NoOpContext.java
│       │       │               │   ├── NoOpDispatcher.java
│       │       │               │   ├── NoOpIPluginConfig.java
│       │       │               │   ├── NoOpLoggerFactory.java
│       │       │               │   ├── NoOpMetrics.java
│       │       │               │   ├── NoOpReporter.java
│       │       │               │   └── NoOpTracer.java
│       │       │               ├── enums/
│       │       │               │   ├── ClassMatch.java
│       │       │               │   ├── Operator.java
│       │       │               │   ├── Order.java
│       │       │               │   └── StringMatch.java
│       │       │               ├── field/
│       │       │               │   ├── AgentDynamicFieldAccessor.java
│       │       │               │   ├── AgentFieldReflectAccessor.java
│       │       │               │   ├── DynamicFieldAccessor.java
│       │       │               │   ├── NullObject.java
│       │       │               │   └── TypeFieldGetter.java
│       │       │               ├── interceptor/
│       │       │               │   ├── AgentInterceptorChain.java
│       │       │               │   ├── Interceptor.java
│       │       │               │   ├── InterceptorProvider.java
│       │       │               │   ├── MethodInfo.java
│       │       │               │   └── NonReentrantInterceptor.java
│       │       │               ├── matcher/
│       │       │               │   ├── ClassMatcher.java
│       │       │               │   ├── IClassMatcher.java
│       │       │               │   ├── IMethodMatcher.java
│       │       │               │   ├── Matcher.java
│       │       │               │   ├── MethodMatcher.java
│       │       │               │   ├── loader/
│       │       │               │   │   ├── ClassLoaderMatcher.java
│       │       │               │   │   ├── IClassLoaderMatcher.java
│       │       │               │   │   └── NegateClassLoaderMatcher.java
│       │       │               │   └── operator/
│       │       │               │       ├── AndClassMatcher.java
│       │       │               │       ├── AndMethodMatcher.java
│       │       │               │       ├── NegateClassMatcher.java
│       │       │               │       ├── NegateMethodMatcher.java
│       │       │               │       ├── Operator.java
│       │       │               │       ├── OrClassMatcher.java
│       │       │               │       └── OrMethodMatcher.java
│       │       │               ├── processor/
│       │       │               │   ├── BeanUtils.java
│       │       │               │   ├── ElementVisitor8.java
│       │       │               │   ├── GenerateProviderBean.java
│       │       │               │   ├── PluginProcessor.java
│       │       │               │   └── RepeatedAnnotationVisitor.java
│       │       │               ├── report/
│       │       │               │   ├── AgentReport.java
│       │       │               │   ├── ByteWrapper.java
│       │       │               │   ├── Call.java
│       │       │               │   ├── Callback.java
│       │       │               │   ├── EncodedData.java
│       │       │               │   ├── Encoder.java
│       │       │               │   ├── Packer.java
│       │       │               │   ├── Sender.java
│       │       │               │   ├── encoder/
│       │       │               │   │   └── JsonEncoder.java
│       │       │               │   ├── metric/
│       │       │               │   │   └── MetricReporterFactory.java
│       │       │               │   └── tracing/
│       │       │               │       ├── Annotation.java
│       │       │               │       ├── Endpoint.java
│       │       │               │       ├── ReportSpan.java
│       │       │               │       └── ReportSpanImpl.java
│       │       │               ├── tools/
│       │       │               │   ├── config/
│       │       │               │   │   └── NameAndSystem.java
│       │       │               │   ├── loader/
│       │       │               │   │   └── AgentHelperClassLoader.java
│       │       │               │   ├── matcher/
│       │       │               │   │   ├── ClassMatcherUtils.java
│       │       │               │   │   └── MethodMatcherUtils.java
│       │       │               │   ├── metrics/
│       │       │               │   │   ├── AccessLogServerInfo.java
│       │       │               │   │   ├── ErrorPercentModelGauge.java
│       │       │               │   │   ├── GaugeMetricModel.java
│       │       │               │   │   ├── HttpLog.java
│       │       │               │   │   ├── LastMinutesCounterGauge.java
│       │       │               │   │   ├── NameFactorySupplier.java
│       │       │               │   │   ├── RedisMetric.java
│       │       │               │   │   └── ServerMetric.java
│       │       │               │   └── trace/
│       │       │               │       ├── BaseHttpClientTracingInterceptor.java
│       │       │               │       ├── HttpRequest.java
│       │       │               │       ├── HttpResponse.java
│       │       │               │       ├── HttpUtils.java
│       │       │               │       └── TraceConst.java
│       │       │               └── utils/
│       │       │                   ├── AdditionalAttributes.java
│       │       │                   ├── ClassInstance.java
│       │       │                   ├── ClassUtils.java
│       │       │                   ├── ImmutableMap.java
│       │       │                   ├── NoNull.java
│       │       │                   ├── Pair.java
│       │       │                   ├── SystemClock.java
│       │       │                   ├── SystemEnv.java
│       │       │                   ├── common/
│       │       │                   │   ├── DataSize.java
│       │       │                   │   ├── DataUnit.java
│       │       │                   │   ├── ExceptionUtil.java
│       │       │                   │   ├── HostAddress.java
│       │       │                   │   ├── JsonUtil.java
│       │       │                   │   ├── StringUtils.java
│       │       │                   │   └── WeakConcurrentMap.java
│       │       │                   └── jackson/
│       │       │                       └── annotation/
│       │       │                           └── JsonProperty.java
│       │       └── io/
│       │           └── opentelemetry/
│       │               └── sdk/
│       │                   └── resources/
│       │                       └── EaseAgentResource.java
│       └── test/
│           └── java/
│               └── com/
│                   └── megaease/
│                       └── easeagent/
│                           └── plugin/
│                               ├── api/
│                               │   ├── MockSystemEnv.java
│                               │   ├── ProgressFieldsTest.java
│                               │   ├── metric/
│                               │   │   └── name/
│                               │   │       └── NameFactoryTest.java
│                               │   └── middleware/
│                               │       ├── RedirectProcessorTest.java
│                               │       ├── RedirectTest.java
│                               │       └── ResourceConfigTest.java
│                               ├── async/
│                               │   └── ThreadLocalCurrentContextTest.java
│                               └── tools/
│                                   └── config/
│                                       └── AutoRefreshConfigSupplierTest.java
├── plugins/
│   ├── async/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       ├── AsyncPlugin.java
│   │       │                       ├── advice/
│   │       │                       │   ├── CrossThreadAdvice.java
│   │       │                       │   └── ReactSchedulersAdvice.java
│   │       │                       └── interceptor/
│   │       │                           └── RunnableInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── interceptor/
│   │           │                       └── RunnableInterceptorTest.java
│   │           └── resources/
│   │               └── log4j2.xml
│   ├── dubbo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── dubbo/
│   │       │                           ├── AlibabaDubboCtxUtils.java
│   │       │                           ├── ApacheDubboCtxUtils.java
│   │       │                           ├── DubboMetricTags.java
│   │       │                           ├── DubboPlugin.java
│   │       │                           ├── DubboTraceTags.java
│   │       │                           ├── advice/
│   │       │                           │   ├── AlibabaDubboAdvice.java
│   │       │                           │   ├── AlibabaDubboResponseFutureAdvice.java
│   │       │                           │   └── ApacheDubboAdvice.java
│   │       │                           ├── config/
│   │       │                           │   └── DubboTraceConfig.java
│   │       │                           └── interceptor/
│   │       │                               ├── DubboBaseInterceptor.java
│   │       │                               ├── metrics/
│   │       │                               │   ├── DubboBaseMetricsInterceptor.java
│   │       │                               │   ├── DubboMetrics.java
│   │       │                               │   ├── alibaba/
│   │       │                               │   │   ├── AlibabaDubboAsyncMetricsInterceptor.java
│   │       │                               │   │   ├── AlibabaDubboMetricsCallback.java
│   │       │                               │   │   └── AlibabaDubboMetricsInterceptor.java
│   │       │                               │   └── apache/
│   │       │                               │       ├── ApacheDubboMetricsAsyncCallback.java
│   │       │                               │       └── ApacheDubboMetricsInterceptor.java
│   │       │                               └── trace/
│   │       │                                   ├── alibaba/
│   │       │                                   │   ├── AlibabaDubboAsyncTraceInterceptor.java
│   │       │                                   │   ├── AlibabaDubboClientRequest.java
│   │       │                                   │   ├── AlibabaDubboServerRequest.java
│   │       │                                   │   ├── AlibabaDubboTraceCallback.java
│   │       │                                   │   └── AlibabaDubboTraceInterceptor.java
│   │       │                                   └── apache/
│   │       │                                       ├── ApacheDubboClientRequest.java
│   │       │                                       ├── ApacheDubboServerRequest.java
│   │       │                                       ├── ApacheDubboTraceCallback.java
│   │       │                                       └── ApacheDubboTraceInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── dubbo/
│   │           │                       └── interceptor/
│   │           │                           ├── AlibabaDubboBaseTest.java
│   │           │                           ├── ApacheDubboBaseTest.java
│   │           │                           ├── metrics/
│   │           │                           │   ├── alibaba/
│   │           │                           │   │   ├── AlibabaDubboAsyncMetricsInterceptorTest.java
│   │           │                           │   │   └── AlibabaDubboMetricsInterceptorTest.java
│   │           │                           │   └── apache/
│   │           │                           │       └── ApacheDubboMetricsInterceptorTest.java
│   │           │                           └── trace/
│   │           │                               ├── alibaba/
│   │           │                               │   ├── AlibabaDubboAsyncTraceInterceptorTest.java
│   │           │                               │   └── AlibabaDubboTraceInterceptorTest.java
│   │           │                               └── apache/
│   │           │                                   └── ApacheDubboTraceInterceptorTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── elasticsearch/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── elasticsearch/
│   │       │                           ├── ElasticsearchPlugin.java
│   │       │                           ├── ElasticsearchRedirectPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   └── SpringElasticsearchAdvice.java
│   │       │                           ├── interceptor/
│   │       │                           │   ├── AsyncResponse4MetricsListener.java
│   │       │                           │   ├── AsyncResponse4TraceListener.java
│   │       │                           │   ├── ElasticsearchBaseInterceptor.java
│   │       │                           │   ├── ElasticsearchBaseMetricsInterceptor.java
│   │       │                           │   ├── ElasticsearchBaseTraceInterceptor.java
│   │       │                           │   ├── ElasticsearchCtxUtils.java
│   │       │                           │   ├── ElasticsearchMetric.java
│   │       │                           │   ├── ElasticsearchPerformRequestAsync4MetricsInterceptor.java
│   │       │                           │   ├── ElasticsearchPerformRequestAsync4TraceInterceptor.java
│   │       │                           │   ├── ElasticsearchPerformRequestMetricsInterceptor.java
│   │       │                           │   ├── ElasticsearchPerformRequestTraceInterceptor.java
│   │       │                           │   └── redirect/
│   │       │                           │       └── SpringElasticsearchInterceptor.java
│   │       │                           └── points/
│   │       │                               ├── ElasticsearchPerformRequestAsyncPoints.java
│   │       │                               └── ElasticsearchPerformRequestPoints.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── plugin/
│   │                               └── elasticsearch/
│   │                                   └── interceptor/
│   │                                       ├── ElasticsearchBaseTest.java
│   │                                       ├── ElasticsearchCtxUtilsTest.java
│   │                                       ├── ElasticsearchPerformRequestAsyncMetricsInterceptorTest.java
│   │                                       ├── ElasticsearchPerformRequestAsyncTraceInterceptorTest.java
│   │                                       ├── ElasticsearchPerformRequestMetricsInterceptorTest.java
│   │                                       └── ElasticsearchPerformRequestTraceInterceptorTest.java
│   ├── healthy/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── healthy/
│   │       │                           ├── HealthPlugin.java
│   │       │                           ├── OnApplicationEventInterceptor.java
│   │       │                           └── SpringApplicationAdminMXBeanRegistrarAdvice.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── plugin/
│   │                               └── healthy/
│   │                                   └── OnApplicationEventInterceptorTest.java
│   ├── httpclient/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── httpclient/
│   │       │                           ├── ForwardedPlugin.java
│   │       │                           ├── HttpClientPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   ├── HttpClient5AsyncAdvice.java
│   │       │                           │   ├── HttpClient5DoExecuteAdvice.java
│   │       │                           │   └── HttpClientDoExecuteAdvice.java
│   │       │                           └── interceptor/
│   │       │                               ├── HttpClient5AsyncForwardedInterceptor.java
│   │       │                               ├── HttpClient5AsyncTracingInterceptor.java
│   │       │                               ├── HttpClient5DoExecuteForwardedInterceptor.java
│   │       │                               ├── HttpClient5DoExecuteInterceptor.java
│   │       │                               ├── HttpClientDoExecuteForwardedInterceptor.java
│   │       │                               └── HttpClientDoExecuteInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── httpclient/
│   │           │                       └── interceptor/
│   │           │                           ├── HttpClient5AsyncForwardedInterceptorTest.java
│   │           │                           ├── HttpClient5AsyncTracingInterceptorTest.java
│   │           │                           ├── HttpClient5DoExecuteForwardedInterceptorTest.java
│   │           │                           ├── HttpClient5DoExecuteInterceptorTest.java
│   │           │                           ├── HttpClientDoExecuteForwardedInterceptorTest.java
│   │           │                           ├── HttpClientDoExecuteInterceptorTest.java
│   │           │                           └── TestConst.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── httpservlet/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── httpservlet/
│   │       │                           ├── AccessPlugin.java
│   │       │                           ├── ForwardedPlugin.java
│   │       │                           ├── HttpServletPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   └── DoFilterPoints.java
│   │       │                           ├── interceptor/
│   │       │                           │   ├── BaseServletInterceptor.java
│   │       │                           │   ├── DoFilterForwardedInterceptor.java
│   │       │                           │   ├── DoFilterMetricInterceptor.java
│   │       │                           │   ├── DoFilterTraceInterceptor.java
│   │       │                           │   ├── HttpServerRequest.java
│   │       │                           │   ├── ServletAccessLogServerInfo.java
│   │       │                           │   └── ServletHttpLogInterceptor.java
│   │       │                           └── utils/
│   │       │                               ├── InternalAsyncListener.java
│   │       │                               └── ServletUtils.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── httpservlet/
│   │           │                       └── interceptor/
│   │           │                           ├── BaseServletInterceptorTest.java
│   │           │                           ├── DoFilterForwardedInterceptorTest.java
│   │           │                           ├── DoFilterMetricInterceptorTest.java
│   │           │                           ├── DoFilterTraceInterceptorTest.java
│   │           │                           ├── HttpServerRequestTest.java
│   │           │                           ├── ServletAccessLogInfoServerInfoTest.java
│   │           │                           ├── ServletHttpLogInterceptorTest.java
│   │           │                           ├── TestConst.java
│   │           │                           └── TestServletUtils.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── httpurlconnection/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── httpurlconnection/
│   │       │                           ├── ForwardedPlugin.java
│   │       │                           ├── HttpURLConnectionPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   └── HttpURLConnectionGetResponseCodeAdvice.java
│   │       │                           └── interceptor/
│   │       │                               ├── HttpURLConnectionGetResponseCodeForwardedInterceptor.java
│   │       │                               └── HttpURLConnectionGetResponseCodeInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── httpurlconnection/
│   │           │                       └── interceptor/
│   │           │                           ├── HttpURLConnectionGetResponseCodeForwardedInterceptorTest.java
│   │           │                           ├── HttpURLConnectionGetResponseCodeInterceptorTest.java
│   │           │                           └── TestUtils.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── httpurlconnection-jdk17/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── httpurlconnection/
│   │       │                           └── jdk17/
│   │       │                               ├── ForwardedPlugin.java
│   │       │                               ├── HttpURLConnectionPlugin.java
│   │       │                               ├── advice/
│   │       │                               │   └── HttpURLConnectionAdvice.java
│   │       │                               └── interceptor/
│   │       │                                   ├── DynamicFieldUtils.java
│   │       │                                   ├── HttpURLConnectionForwardedInterceptor.java
│   │       │                                   ├── HttpURLConnectionInterceptor.java
│   │       │                                   └── HttpURLConnectionUtils.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── httpurlconnection/
│   │           │                       └── jdk17/
│   │           │                           └── interceptor/
│   │           │                               ├── HttpURLConnectionForwardedInterceptorTest.java
│   │           │                               ├── HttpURLConnectionInterceptorTest.java
│   │           │                               └── TestUtils.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── jdbc/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── jdbc/
│   │       │                           ├── JdbcConnectionMetricPlugin.java
│   │       │                           ├── JdbcDataSourceMetricPlugin.java
│   │       │                           ├── JdbcRedirectPlugin.java
│   │       │                           ├── JdbcTracingPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   ├── HikariDataSourceAdvice.java
│   │       │                           │   ├── JdbcConnectionAdvice.java
│   │       │                           │   ├── JdbcDataSourceAdvice.java
│   │       │                           │   └── JdbcStatementAdvice.java
│   │       │                           ├── common/
│   │       │                           │   ├── DatabaseInfo.java
│   │       │                           │   ├── JdbcUtils.java
│   │       │                           │   ├── MD5DictionaryItem.java
│   │       │                           │   ├── MD5ReportConsumer.java
│   │       │                           │   ├── MD5SQLCompression.java
│   │       │                           │   ├── SQLCompression.java
│   │       │                           │   ├── SQLCompressionFactory.java
│   │       │                           │   ├── SQLCompressionWrapper.java
│   │       │                           │   └── SqlInfo.java
│   │       │                           └── interceptor/
│   │       │                               ├── JdbConPrepareOrCreateStmInterceptor.java
│   │       │                               ├── JdbcStmPrepareSqlInterceptor.java
│   │       │                               ├── metric/
│   │       │                               │   ├── JdbcDataSourceMetricInterceptor.java
│   │       │                               │   ├── JdbcMetric.java
│   │       │                               │   └── JdbcStmMetricInterceptor.java
│   │       │                               ├── redirect/
│   │       │                               │   └── HikariSetPropertyInterceptor.java
│   │       │                               └── tracing/
│   │       │                                   └── JdbcStmTracingInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── jdbc/
│   │           │                       ├── MockJDBCStatement.java
│   │           │                       ├── TestUtils.java
│   │           │                       ├── common/
│   │           │                       │   ├── DatabaseInfoTest.java
│   │           │                       │   ├── JdbcUtilsTest.java
│   │           │                       │   ├── MD5DictionaryItemTest.java
│   │           │                       │   ├── MD5ReportConsumerTest.java
│   │           │                       │   ├── MD5SQLCompressionTest.java
│   │           │                       │   └── SqlInfoTest.java
│   │           │                       └── interceptor/
│   │           │                           ├── JdbConPrepareOrCreateStmInterceptorTest.java
│   │           │                           ├── JdbcStmPrepareSqlInterceptorTest.java
│   │           │                           ├── metric/
│   │           │                           │   ├── JdbcDataSourceMetricInterceptorTest.java
│   │           │                           │   ├── JdbcMetricTest.java
│   │           │                           │   └── JdbcStmMetricInterceptorTest.java
│   │           │                           ├── redirect/
│   │           │                           │   └── HikariSetPropertyInterceptorTest.java
│   │           │                           └── tracing/
│   │           │                               └── JdbcStmTracingInterceptorTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── kafka/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── kafka/
│   │       │                           ├── KafkaPlugin.java
│   │       │                           ├── KafkaRedirectPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   ├── KafkaConsumerAdvice.java
│   │       │                           │   ├── KafkaConsumerConfigAdvice.java
│   │       │                           │   ├── KafkaConsumerRecordAdvice.java
│   │       │                           │   ├── KafkaMessageListenerAdvice.java
│   │       │                           │   ├── KafkaProducerAdvice.java
│   │       │                           │   └── KafkaProducerConfigAdvice.java
│   │       │                           └── interceptor/
│   │       │                               ├── AsyncCallback.java
│   │       │                               ├── KafkaUtils.java
│   │       │                               ├── initialize/
│   │       │                               │   ├── ConsumerRecordInterceptor.java
│   │       │                               │   ├── KafkaConsumerConstructInterceptor.java
│   │       │                               │   ├── KafkaConsumerPollInterceptor.java
│   │       │                               │   └── KafkaProducerConstructInterceptor.java
│   │       │                               ├── metric/
│   │       │                               │   ├── KafkaConsumerMetricInterceptor.java
│   │       │                               │   ├── KafkaMessageListenerMetricInterceptor.java
│   │       │                               │   ├── KafkaMetric.java
│   │       │                               │   ├── KafkaProducerMetricInterceptor.java
│   │       │                               │   └── MetricCallback.java
│   │       │                               ├── redirect/
│   │       │                               │   ├── KafkaAbstractConfigConstructInterceptor.java
│   │       │                               │   ├── KafkaConsumerConfigConstructInterceptor.java
│   │       │                               │   └── KafkaProducerConfigConstructInterceptor.java
│   │       │                               └── tracing/
│   │       │                                   ├── KafkaConsumerRequest.java
│   │       │                                   ├── KafkaConsumerTracingInterceptor.java
│   │       │                                   ├── KafkaHeaders.java
│   │       │                                   ├── KafkaMessageListenerTracingInterceptor.java
│   │       │                                   ├── KafkaProducerDoSendInterceptor.java
│   │       │                                   ├── KafkaProducerRequest.java
│   │       │                                   ├── KafkaTags.java
│   │       │                                   └── TraceCallback.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── kafka/
│   │           │                       └── interceptor/
│   │           │                           ├── AsyncCallbackTest.java
│   │           │                           ├── KafkaTestUtils.java
│   │           │                           ├── KafkaUtilsTest.java
│   │           │                           ├── MockConsumerRecord.java
│   │           │                           ├── MockKafkaConsumer.java
│   │           │                           ├── MockKafkaProducer.java
│   │           │                           ├── TestConst.java
│   │           │                           ├── initialize/
│   │           │                           │   ├── ConsumerRecordInterceptorTest.java
│   │           │                           │   ├── KafkaConsumerConstructInterceptorTest.java
│   │           │                           │   ├── KafkaConsumerPollInterceptorTest.java
│   │           │                           │   ├── KafkaProducerConstructInterceptorTest.java
│   │           │                           │   └── MockDynamicFieldAccessor.java
│   │           │                           ├── metric/
│   │           │                           │   ├── KafkaConsumerMetricInterceptorTest.java
│   │           │                           │   ├── KafkaMessageListenerMetricInterceptorTest.java
│   │           │                           │   ├── KafkaMetricTest.java
│   │           │                           │   ├── KafkaProducerMetricInterceptorTest.java
│   │           │                           │   └── MetricCallbackTest.java
│   │           │                           ├── redirect/
│   │           │                           │   └── KafkaAbstractConfigConstructInterceptorTest.java
│   │           │                           └── tracing/
│   │           │                               ├── KafkaConsumerRequestTest.java
│   │           │                               ├── KafkaConsumerTracingInterceptorTest.java
│   │           │                               ├── KafkaHeadersTest.java
│   │           │                               ├── KafkaMessageListenerTracingInterceptorTest.java
│   │           │                               ├── KafkaProducerDoSendInterceptorTest.java
│   │           │                               ├── KafkaProducerRequestTest.java
│   │           │                               └── TraceCallbackTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── log4j2-log-plugin/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── log4j2/
│   │                               ├── Log4j2Plugin.java
│   │                               ├── interceptor/
│   │                               │   └── Log4j2AppenderInterceptor.java
│   │                               ├── log/
│   │                               │   └── Log4jLogMapper.java
│   │                               └── points/
│   │                                   └── AbstractLoggerPoints.java
│   ├── logback/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── logback/
│   │                               ├── LogbackPlugin.java
│   │                               ├── interceptor/
│   │                               │   └── LogbackAppenderInterceptor.java
│   │                               ├── log/
│   │                               │   └── LogbackLogMapper.java
│   │                               └── points/
│   │                                   └── LoggerPoints.java
│   ├── mongodb/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── mongodb/
│   │       │                           ├── MongoPlugin.java
│   │       │                           ├── MongoRedirectPlugin.java
│   │       │                           ├── MongoUtils.java
│   │       │                           ├── interceptor/
│   │       │                           │   ├── InterceptorHelper.java
│   │       │                           │   ├── MetricHelper.java
│   │       │                           │   ├── MongoBaseInterceptor.java
│   │       │                           │   ├── MongoBaseMetricInterceptor.java
│   │       │                           │   ├── MongoBaseTraceInterceptor.java
│   │       │                           │   ├── MongoClientConstruct4MetricInterceptor.java
│   │       │                           │   ├── MongoClientConstruct4TraceInterceptor.java
│   │       │                           │   ├── MongoCtx.java
│   │       │                           │   ├── MongoDbRedirectInterceptor.java
│   │       │                           │   ├── MongoInternalConnectionSendAndReceiveAsync4MetricInterceptor.java
│   │       │                           │   ├── MongoInternalConnectionSendAndReceiveAsync4TraceInterceptor.java
│   │       │                           │   ├── MongoMetric.java
│   │       │                           │   ├── MongoReactiveInitMetricInterceptor.java
│   │       │                           │   ├── MongoReactiveInitTraceInterceptor.java
│   │       │                           │   ├── TraceHelper.java
│   │       │                           │   └── listener/
│   │       │                           │       ├── MongoBaseCommandListener.java
│   │       │                           │       ├── MongoBaseMetricCommandListener.java
│   │       │                           │       ├── MongoBaseTraceCommandListener.java
│   │       │                           │       ├── MongoMetricCommandListener.java
│   │       │                           │       ├── MongoReactiveMetricCommandListener.java
│   │       │                           │       ├── MongoReactiveTraceCommandListener.java
│   │       │                           │       └── MongoTraceCommandListener.java
│   │       │                           └── points/
│   │       │                               ├── MongoAsyncMongoClientsPoints.java
│   │       │                               ├── MongoClientImplPoints.java
│   │       │                               ├── MongoDBInternalConnectionPoints.java
│   │       │                               └── MongoRedirectPoints.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── plugin/
│   │                               └── mongodb/
│   │                                   ├── MongoBaseTest.java
│   │                                   ├── MongoMetricTest.java
│   │                                   ├── MongoReactiveMetricTest.java
│   │                                   ├── MongoReactiveTraceTest.java
│   │                                   ├── MongoTraceTest.java
│   │                                   └── TraceHelperTest.java
│   ├── motan/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── motan/
│   │       │                           ├── MotanPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   ├── MotanConsumerAdvice.java
│   │       │                           │   └── MotanProviderAdvice.java
│   │       │                           ├── config/
│   │       │                           │   └── MotanPluginConfig.java
│   │       │                           └── interceptor/
│   │       │                               ├── MotanClassUtils.java
│   │       │                               ├── MotanCtxUtils.java
│   │       │                               ├── metrics/
│   │       │                               │   ├── MetricsFutureListener.java
│   │       │                               │   ├── MotanBaseMetricsInterceptor.java
│   │       │                               │   ├── MotanMetric.java
│   │       │                               │   ├── MotanMetricTags.java
│   │       │                               │   └── MotanMetricsInterceptor.java
│   │       │                               └── trace/
│   │       │                                   ├── MotanBaseInterceptor.java
│   │       │                                   ├── MotanTags.java
│   │       │                                   ├── consumer/
│   │       │                                   │   ├── MotanConsumerRequest.java
│   │       │                                   │   ├── MotanConsumerTraceInterceptor.java
│   │       │                                   │   └── TraceFutureListener.java
│   │       │                                   └── provider/
│   │       │                                       ├── MotanProviderRequest.java
│   │       │                                       └── MotanProviderTraceInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── motan/
│   │           │                       └── interceptor/
│   │           │                           ├── metrics/
│   │           │                           │   └── MotanMetricsInterceptorTest.java
│   │           │                           └── trace/
│   │           │                               ├── MotanInterceptorTest.java
│   │           │                               ├── consumer/
│   │           │                               │   └── MotanConsumerInterceptorTest.java
│   │           │                               └── provider/
│   │           │                                   └── MotanProviderInterceptorTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── okhttp/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── okhttp/
│   │       │                           ├── ForwardedPlugin.java
│   │       │                           ├── OkHttpPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   └── OkHttpAdvice.java
│   │       │                           └── interceptor/
│   │       │                               ├── ForwardedRequest.java
│   │       │                               ├── InternalRequest.java
│   │       │                               ├── InternalResponse.java
│   │       │                               ├── OkHttpAsyncTracingInterceptor.java
│   │       │                               ├── OkHttpForwardedInterceptor.java
│   │       │                               └── OkHttpTracingInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── okhttp/
│   │           │                       └── interceptor/
│   │           │                           ├── OkHttpAsyncTracingInterceptorTest.java
│   │           │                           ├── OkHttpForwardedInterceptorTest.java
│   │           │                           ├── OkHttpTestUtils.java
│   │           │                           ├── OkHttpTracingInterceptorTest.java
│   │           │                           └── TestConst.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── pom.xml
│   ├── rabbitmq/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── rabbitmq/
│   │       │                           ├── RabbitMqConsumerMetric.java
│   │       │                           ├── RabbitMqPlugin.java
│   │       │                           ├── RabbitMqProducerMetric.java
│   │       │                           ├── RabbitMqRedirectPlugin.java
│   │       │                           ├── spring/
│   │       │                           │   ├── RabbitMqMessageListenerAdvice.java
│   │       │                           │   └── interceptor/
│   │       │                           │       ├── RabbitMqMessageListenerOnMessageInterceptor.java
│   │       │                           │       ├── RabbitMqOnMessageMetricInterceptor.java
│   │       │                           │       └── RabbitMqOnMessageTracingInterceptor.java
│   │       │                           └── v5/
│   │       │                               ├── advice/
│   │       │                               │   ├── RabbitMqChannelAdvice.java
│   │       │                               │   ├── RabbitMqConfigFactoryAdvice.java
│   │       │                               │   ├── RabbitMqConsumerAdvice.java
│   │       │                               │   └── RabbitMqPropertyAdvice.java
│   │       │                               └── interceptor/
│   │       │                                   ├── RabbitMqChannelConsumeInterceptor.java
│   │       │                                   ├── RabbitMqChannelConsumerDeliveryInterceptor.java
│   │       │                                   ├── RabbitMqChannelPublishInterceptor.java
│   │       │                                   ├── RabbitMqConsumerHandleDeliveryInterceptor.java
│   │       │                                   ├── metirc/
│   │       │                                   │   ├── RabbitMqConsumerMetricInterceptor.java
│   │       │                                   │   └── RabbitMqProducerMetricInterceptor.java
│   │       │                                   ├── redirect/
│   │       │                                   │   ├── RabbitMqConfigFactoryInterceptor.java
│   │       │                                   │   └── RabbitMqPropertyInterceptor.java
│   │       │                                   └── tracing/
│   │       │                                       ├── RabbitMqChannelPublishTracingInterceptor.java
│   │       │                                       └── RabbitMqConsumerTracingInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── rabbitmq/
│   │           │                       ├── RabbitMqConsumerMetricTest.java
│   │           │                       ├── RabbitMqProducerMetricTest.java
│   │           │                       ├── TestUtils.java
│   │           │                       ├── spring/
│   │           │                       │   └── interceptor/
│   │           │                       │       ├── RabbitMqMessageListenerOnMessageInterceptorTest.java
│   │           │                       │       ├── RabbitMqOnMessageMetricInterceptorTest.java
│   │           │                       │       └── RabbitMqOnMessageTracingInterceptorTest.java
│   │           │                       └── v5/
│   │           │                           └── interceptor/
│   │           │                               ├── MockConsumer.java
│   │           │                               ├── RabbitMqChannelConsumeInterceptorTest.java
│   │           │                               ├── RabbitMqChannelConsumerDeliveryInterceptorTest.java
│   │           │                               ├── RabbitMqChannelPublishInterceptorTest.java
│   │           │                               ├── RabbitMqConsumerHandleDeliveryInterceptorTest.java
│   │           │                               ├── metirc/
│   │           │                               │   ├── RabbitMqConsumerMetricInterceptorTest.java
│   │           │                               │   └── RabbitMqProducerMetricInterceptorTest.java
│   │           │                               ├── redirect/
│   │           │                               │   └── RabbitMqPropertyInterceptorTest.java
│   │           │                               └── tracing/
│   │           │                                   ├── RabbitMqChannelPublishTracingInterceptorTest.java
│   │           │                                   └── RabbitMqConsumerTracingInterceptorTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── redis/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── redis/
│   │       │                           ├── RedisPlugin.java
│   │       │                           ├── RedisRedirectPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   ├── JedisAdvice.java
│   │       │                           │   ├── JedisConstructorAdvice.java
│   │       │                           │   ├── LettuceRedisClientAdvice.java
│   │       │                           │   ├── RedisChannelWriterAdvice.java
│   │       │                           │   ├── RedisClusterClientAdvice.java
│   │       │                           │   ├── RedisPropertiesAdvice.java
│   │       │                           │   ├── RedisPropertiesClusterAdvice.java
│   │       │                           │   └── StatefulRedisConnectionAdvice.java
│   │       │                           └── interceptor/
│   │       │                               ├── RedisClassUtils.java
│   │       │                               ├── RedisClientUtils.java
│   │       │                               ├── initialize/
│   │       │                               │   ├── CommonRedisClientInterceptor.java
│   │       │                               │   ├── CompletableFutureWrapper.java
│   │       │                               │   ├── ConnectionFutureWrapper.java
│   │       │                               │   ├── RedisClientInterceptor.java
│   │       │                               │   └── RedisClusterClientInterceptor.java
│   │       │                               ├── metric/
│   │       │                               │   ├── CommonRedisMetricInterceptor.java
│   │       │                               │   ├── JedisMetricInterceptor.java
│   │       │                               │   └── LettuceMetricInterceptor.java
│   │       │                               ├── redirect/
│   │       │                               │   ├── JedisConstructorInterceptor.java
│   │       │                               │   ├── LettuceRedisClientConstructInterceptor.java
│   │       │                               │   ├── RedisPropertiesClusterSetNodesInterceptor.java
│   │       │                               │   └── RedisPropertiesSetPropertyInterceptor.java
│   │       │                               └── tracing/
│   │       │                                   ├── CommonRedisTracingInterceptor.java
│   │       │                                   ├── JedisTracingInterceptor.java
│   │       │                                   ├── LettuceTracingInterceptor.java
│   │       │                                   └── StatefulRedisConnectionInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── redis/
│   │           │                       └── interceptor/
│   │           │                           ├── RedisUtils.java
│   │           │                           ├── TestConst.java
│   │           │                           ├── initialize/
│   │           │                           │   ├── CommonRedisClientInterceptorTest.java
│   │           │                           │   ├── CompletableFutureWrapperTest.java
│   │           │                           │   ├── ConnectionFutureWrapperTest.java
│   │           │                           │   └── DynamicFieldAccessorObj.java
│   │           │                           ├── metric/
│   │           │                           │   ├── CommonRedisMetricInterceptorTest.java
│   │           │                           │   ├── JedisMetricInterceptorTest.java
│   │           │                           │   └── LettuceMetricInterceptorTest.java
│   │           │                           ├── redirect/
│   │           │                           │   ├── JedisConstructorInterceptorTest.java
│   │           │                           │   ├── LettuceRedisClientConstructInterceptorTest.java
│   │           │                           │   ├── RedisPropertiesClusterSetNodesInterceptorTest.java
│   │           │                           │   └── RedisPropertiesSetPropertyInterceptorTest.java
│   │           │                           └── tracing/
│   │           │                               ├── CommonRedisTracingInterceptorTest.java
│   │           │                               ├── JedisTracingInterceptorTest.java
│   │           │                               └── LettuceTracingInterceptorTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── servicename/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── servicename/
│   │       │                           ├── Const.java
│   │       │                           ├── ReflectionTool.java
│   │       │                           ├── ServiceNamePlugin.java
│   │       │                           ├── ServiceNamePluginConfig.java
│   │       │                           ├── advice/
│   │       │                           │   ├── FeignBlockingLoadBalancerClientAdvice.java
│   │       │                           │   ├── FeignLoadBalancerAdvice.java
│   │       │                           │   ├── FilteringWebHandlerAdvice.java
│   │       │                           │   ├── LoadBalancerFeignClientAdvice.java
│   │       │                           │   ├── RestTemplateInterceptAdvice.java
│   │       │                           │   └── WebClientFilterAdvice.java
│   │       │                           └── interceptor/
│   │       │                               ├── BaseServiceNameInterceptor.java
│   │       │                               ├── FeignBlockingLoadBalancerClientInterceptor.java
│   │       │                               ├── FeignLoadBalancerInterceptor.java
│   │       │                               ├── FilteringWebHandlerInterceptor.java
│   │       │                               ├── LoadBalancerFeignClientInterceptor.java
│   │       │                               ├── RestTemplateInterceptInterceptor.java
│   │       │                               └── WebClientFilterInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   ├── com/
│   │           │   │   └── megaease/
│   │           │   │       └── easeagent/
│   │           │   │           └── plugin/
│   │           │   │               └── servicename/
│   │           │   │                   ├── ReflectionToolTest.java
│   │           │   │                   └── interceptor/
│   │           │   │                       ├── BaseServiceNameInterceptorTest.java
│   │           │   │                       ├── CheckUtils.java
│   │           │   │                       ├── FeignBlockingLoadBalancerClientInterceptorTest.java
│   │           │   │                       ├── FeignLoadBalancerInterceptorTest.java
│   │           │   │                       ├── FilteringWebHandlerInterceptorTest.java
│   │           │   │                       ├── LoadBalancerFeignClientInterceptorTest.java
│   │           │   │                       ├── RestTemplateInterceptInterceptorTest.java
│   │           │   │                       ├── TestConst.java
│   │           │   │                       └── WebClientFilterInterceptorTest.java
│   │           │   └── org/
│   │           │       └── springframework/
│   │           │           ├── cloud/
│   │           │           │   └── openfeign/
│   │           │           │       └── ribbon/
│   │           │           │           └── MockRibbonRequest.java
│   │           │           └── web/
│   │           │               └── reactive/
│   │           │                   └── function/
│   │           │                       └── client/
│   │           │                           └── MockClientRequest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── sofarpc/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── sofarpc/
│   │       │                           ├── SofaRpcCtxUtils.java
│   │       │                           ├── SofaRpcMetricsTags.java
│   │       │                           ├── SofaRpcPlugin.java
│   │       │                           ├── SofaRpcTraceTags.java
│   │       │                           ├── adivce/
│   │       │                           │   ├── BoltFutureInvokeCallbackConstructAdvice.java
│   │       │                           │   ├── ConsumerAdvice.java
│   │       │                           │   ├── FutureInvokeCallbackConstructAdvice.java
│   │       │                           │   ├── ProviderAdvice.java
│   │       │                           │   ├── ResponseCallbackAdvice.java
│   │       │                           │   └── ResponseFutureAdvice.java
│   │       │                           ├── config/
│   │       │                           │   └── SofaRpcTraceConfig.java
│   │       │                           └── interceptor/
│   │       │                               ├── initalize/
│   │       │                               │   └── SofaRpcFutureInvokeCallbackConstructInterceptor.java
│   │       │                               ├── metrics/
│   │       │                               │   ├── SofaRpcMetrics.java
│   │       │                               │   ├── SofaRpcMetricsBaseInterceptor.java
│   │       │                               │   ├── callback/
│   │       │                               │   │   ├── SofaRpcResponseCallbackMetrics.java
│   │       │                               │   │   └── SofaRpcResponseCallbackMetricsInterceptor.java
│   │       │                               │   ├── common/
│   │       │                               │   │   └── SofaRpcMetricsInterceptor.java
│   │       │                               │   └── future/
│   │       │                               │       └── SofaRpcResponseFutureMetricsInterceptor.java
│   │       │                               └── trace/
│   │       │                                   ├── SofaRpcTraceBaseInterceptor.java
│   │       │                                   ├── callback/
│   │       │                                   │   ├── SofaRpcResponseCallbackTrace.java
│   │       │                                   │   └── SofaRpcResponseCallbackTraceInterceptor.java
│   │       │                                   ├── common/
│   │       │                                   │   ├── SofaClientTraceRequest.java
│   │       │                                   │   ├── SofaRpcConsumerTraceInterceptor.java
│   │       │                                   │   ├── SofaRpcProviderTraceInterceptor.java
│   │       │                                   │   └── SofaServerTraceRequest.java
│   │       │                                   └── future/
│   │       │                                       └── SofaRpcResponseFutureTraceInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── sofarpc/
│   │           │                       └── interceptor/
│   │           │                           ├── BaseInterceptorTest.java
│   │           │                           ├── MockBoltResponseFuture.java
│   │           │                           ├── metrics/
│   │           │                           │   ├── BaseMetricsInterceptorTest.java
│   │           │                           │   ├── callback/
│   │           │                           │   │   ├── MockSofaResponseCallback.java
│   │           │                           │   │   └── SofaRpcResponseCallbackMetricsInterceptorTest.java
│   │           │                           │   ├── common/
│   │           │                           │   │   └── SofaRpcMetricsInterceptorTest.java
│   │           │                           │   └── future/
│   │           │                           │       └── SofaRpcResponseFutureMetricsInterceptorTest.java
│   │           │                           └── trace/
│   │           │                               ├── callback/
│   │           │                               │   ├── MockSofaResponseCallback.java
│   │           │                               │   └── SofaRpcResponseCallbackTraceInterceptorTest.java
│   │           │                               ├── common/
│   │           │                               │   ├── SofaRpcConsumerTraceInterceptorTest.java
│   │           │                               │   └── SofaRpcProviderTraceInterceptorTest.java
│   │           │                               └── future/
│   │           │                                   └── SofaRpcResponseFutureTraceInterceptorTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── spring-boot-3.5.3/
│   │   ├── pom.xml
│   │   ├── spring-boot-gateway-3.5.3/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   └── java/
│   │   │       │       └── easeagent/
│   │   │       │           └── plugin/
│   │   │       │               └── spring353/
│   │   │       │                   └── gateway/
│   │   │       │                       ├── AccessPlugin.java
│   │   │       │                       ├── ForwardedPlugin.java
│   │   │       │                       ├── GatewayCons.java
│   │   │       │                       ├── SpringGatewayPlugin.java
│   │   │       │                       ├── advice/
│   │   │       │                       │   ├── AgentGlobalFilterAdvice.java
│   │   │       │                       │   ├── HttpHeadersFilterAdvice.java
│   │   │       │                       │   └── InitGlobalFilterAdvice.java
│   │   │       │                       ├── interceptor/
│   │   │       │                       │   ├── TimeUtils.java
│   │   │       │                       │   ├── forwarded/
│   │   │       │                       │   │   └── GatewayServerForwardedInterceptor.java
│   │   │       │                       │   ├── initialize/
│   │   │       │                       │   │   ├── AgentGlobalFilter.java
│   │   │       │                       │   │   └── GlobalFilterInterceptor.java
│   │   │       │                       │   ├── log/
│   │   │       │                       │   │   ├── GatewayAccessLogInterceptor.java
│   │   │       │                       │   │   └── SpringGatewayAccessLogServerInfo.java
│   │   │       │                       │   ├── metric/
│   │   │       │                       │   │   └── GatewayMetricsInterceptor.java
│   │   │       │                       │   └── tracing/
│   │   │       │                       │       ├── FluxHttpServerRequest.java
│   │   │       │                       │       ├── FluxHttpServerResponse.java
│   │   │       │                       │       ├── GatewayServerTracingInterceptor.java
│   │   │       │                       │       └── HttpHeadersFilterTracingInterceptor.java
│   │   │       │                       └── reactor/
│   │   │       │                           ├── AgentCoreSubscriber.java
│   │   │       │                           └── AgentMono.java
│   │   │       └── test/
│   │   │           ├── java/
│   │   │           │   └── easeagent/
│   │   │           │       └── plugin/
│   │   │           │           └── spring353/
│   │   │           │               └── gateway/
│   │   │           │                   ├── TestConst.java
│   │   │           │                   ├── TestServerWebExchangeUtils.java
│   │   │           │                   ├── interceptor/
│   │   │           │                   │   ├── TimeUtilsTest.java
│   │   │           │                   │   ├── forwarded/
│   │   │           │                   │   │   └── GatewayServerForwardedInterceptorTest.java
│   │   │           │                   │   ├── initialize/
│   │   │           │                   │   │   ├── AgentGlobalFilterTest.java
│   │   │           │                   │   │   └── GlobalFilterInterceptorTest.java
│   │   │           │                   │   ├── log/
│   │   │           │                   │   │   ├── GatewayAccessLogInfoInterceptorTest.java
│   │   │           │                   │   │   └── SpringGatewayAccessLogInfoServerInfoTest.java
│   │   │           │                   │   ├── metric/
│   │   │           │                   │   │   ├── GatewayMetricsInterceptorTest.java
│   │   │           │                   │   │   └── MockRouteBuilder.java
│   │   │           │                   │   └── tracing/
│   │   │           │                   │       ├── FluxHttpServerRequestTest.java
│   │   │           │                   │       ├── FluxHttpServerResponseTest.java
│   │   │           │                   │       ├── GatewayServerTracingInterceptorTest.java
│   │   │           │                   │       └── HttpHeadersFilterTracingInterceptorTest.java
│   │   │           │                   └── reactor/
│   │   │           │                       ├── AgentCoreSubscriberTest.java
│   │   │           │                       ├── AgentMonoTest.java
│   │   │           │                       └── MockCoreSubscriber.java
│   │   │           └── resources/
│   │   │               └── mock_agent.properties
│   │   ├── spring-boot-rest-template-3.5.3/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   └── java/
│   │   │       │       └── com/
│   │   │       │           └── megaease/
│   │   │       │               └── easeagent/
│   │   │       │                   └── plugin/
│   │   │       │                       └── rest/
│   │   │       │                           └── template/
│   │   │       │                               ├── ForwardedPlugin.java
│   │   │       │                               ├── RestTemplatePlugin.java
│   │   │       │                               ├── advice/
│   │   │       │                               │   └── ClientHttpRequestAdvice.java
│   │   │       │                               └── interceptor/
│   │   │       │                                   ├── forwarded/
│   │   │       │                                   │   └── RestTemplateForwardedInterceptor.java
│   │   │       │                                   └── tracing/
│   │   │       │                                       └── ClientHttpRequestInterceptor.java
│   │   │       └── test/
│   │   │           ├── java/
│   │   │           │   ├── com/
│   │   │           │   │   └── megaease/
│   │   │           │   │       └── easeagent/
│   │   │           │   │           └── plugin/
│   │   │           │   │               └── rest/
│   │   │           │   │                   └── template/
│   │   │           │   │                       └── interceptor/
│   │   │           │   │                           ├── TestConst.java
│   │   │           │   │                           ├── forwarded/
│   │   │           │   │                           │   └── RestTemplateForwardedInterceptorTest.java
│   │   │           │   │                           └── tracing/
│   │   │           │   │                               └── ClientHttpRequestInterceptorTest.java
│   │   │           │   └── org/
│   │   │           │       └── springframework/
│   │   │           │           └── http/
│   │   │           │               └── client/
│   │   │           │                   └── SimpleClientHttpResponseFactory.java
│   │   │           └── resources/
│   │   │               └── mock_agent.properties
│   │   └── spring-boot-servicename-3.5.3/
│   │       ├── pom.xml
│   │       └── src/
│   │           ├── main/
│   │           │   └── java/
│   │           │       └── com/
│   │           │           └── megaease/
│   │           │               └── easeagent/
│   │           │                   └── plugin/
│   │           │                       └── servicename/
│   │           │                           └── springboot353/
│   │           │                               ├── Const.java
│   │           │                               ├── ReflectionTool.java
│   │           │                               ├── ServiceNamePlugin.java
│   │           │                               ├── ServiceNamePluginConfig.java
│   │           │                               ├── advice/
│   │           │                               │   ├── FeignClientLoadBalancerClientAdvice.java
│   │           │                               │   ├── FilteringWebHandlerAdvice.java
│   │           │                               │   ├── RestTemplateInterceptAdvice.java
│   │           │                               │   └── WebClientFilterAdvice.java
│   │           │                               └── interceptor/
│   │           │                                   ├── BaseServiceNameInterceptor.java
│   │           │                                   ├── FeignClientLoadBalancerClientInterceptor.java
│   │           │                                   ├── FilteringWebHandlerInterceptor.java
│   │           │                                   ├── RestTemplateInterceptInterceptor.java
│   │           │                                   └── WebClientFilterInterceptor.java
│   │           └── test/
│   │               ├── java/
│   │               │   └── com/
│   │               │       └── megaease/
│   │               │           └── easeagent/
│   │               │               └── plugin/
│   │               │                   └── servicename/
│   │               │                       └── springboot353/
│   │               │                           ├── ReflectionToolTest.java
│   │               │                           └── interceptor/
│   │               │                               ├── BaseServiceNameInterceptorTest.java
│   │               │                               ├── CheckUtils.java
│   │               │                               ├── FeignBlockingLoadBalancerClientInterceptorTest.java
│   │               │                               ├── FilteringWebHandlerInterceptorTest.java
│   │               │                               ├── RestTemplateInterceptInterceptorTest.java
│   │               │                               ├── TestConst.java
│   │               │                               └── WebClientFilterInterceptorTest.java
│   │               └── resources/
│   │                   └── mock_agent.properties
│   ├── spring-gateway/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── easeagent/
│   │       │           └── plugin/
│   │       │               └── spring/
│   │       │                   └── gateway/
│   │       │                       ├── AccessPlugin.java
│   │       │                       ├── ForwardedPlugin.java
│   │       │                       ├── SpringGatewayPlugin.java
│   │       │                       ├── advice/
│   │       │                       │   ├── AgentGlobalFilterAdvice.java
│   │       │                       │   ├── CodeCons.java
│   │       │                       │   ├── HttpHeadersFilterAdvice.java
│   │       │                       │   └── InitGlobalFilterAdvice.java
│   │       │                       ├── interceptor/
│   │       │                       │   ├── GatewayCons.java
│   │       │                       │   ├── initialize/
│   │       │                       │   │   ├── AgentGlobalFilter.java
│   │       │                       │   │   ├── GatewayServerForwardedInterceptor.java
│   │       │                       │   │   └── GlobalFilterInterceptor.java
│   │       │                       │   ├── metric/
│   │       │                       │   │   ├── GatewayMetricsInterceptor.java
│   │       │                       │   │   ├── TimeUtils.java
│   │       │                       │   │   └── log/
│   │       │                       │   │       ├── GatewayAccessLogInterceptor.java
│   │       │                       │   │       └── SpringGatewayAccessLogServerInfo.java
│   │       │                       │   └── tracing/
│   │       │                       │       ├── FluxHttpServerRequest.java
│   │       │                       │       ├── FluxHttpServerResponse.java
│   │       │                       │       ├── GatewayServerTracingInterceptor.java
│   │       │                       │       └── HttpHeadersFilterTracingInterceptor.java
│   │       │                       └── reactor/
│   │       │                           ├── AgentCoreSubscriber.java
│   │       │                           └── AgentMono.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── easeagent/
│   │           │       └── plugin/
│   │           │           └── spring/
│   │           │               └── gateway/
│   │           │                   ├── TestConst.java
│   │           │                   ├── TestServerWebExchangeUtils.java
│   │           │                   ├── interceptor/
│   │           │                   │   ├── initialize/
│   │           │                   │   │   ├── AgentGlobalFilterTest.java
│   │           │                   │   │   ├── GatewayServerForwardedInterceptorTest.java
│   │           │                   │   │   └── GlobalFilterInterceptorTest.java
│   │           │                   │   ├── metric/
│   │           │                   │   │   ├── GatewayMetricsInterceptorTest.java
│   │           │                   │   │   ├── MockRouteBuilder.java
│   │           │                   │   │   ├── TimeUtilsTest.java
│   │           │                   │   │   └── log/
│   │           │                   │   │       ├── GatewayAccessLogInfoInterceptorTest.java
│   │           │                   │   │       └── SpringGatewayAccessLogInfoServerInfoTest.java
│   │           │                   │   └── tracing/
│   │           │                   │       ├── FluxHttpServerRequestTest.java
│   │           │                   │       ├── FluxHttpServerResponseTest.java
│   │           │                   │       ├── GatewayServerTracingInterceptorTest.java
│   │           │                   │       └── HttpHeadersFilterTracingInterceptorTest.java
│   │           │                   └── reactor/
│   │           │                       ├── AgentCoreSubscriberTest.java
│   │           │                       ├── AgentMonoTest.java
│   │           │                       └── MockCoreSubscriber.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── springweb/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── megaease/
│   │       │   │           ├── easeagent/
│   │       │   │           │   └── plugin/
│   │       │   │           │       └── springweb/
│   │       │   │           │           ├── FeignClientPlugin.java
│   │       │   │           │           ├── ForwardedPlugin.java
│   │       │   │           │           ├── RestTemplatePlugin.java
│   │       │   │           │           ├── SpringWebPlugin.java
│   │       │   │           │           ├── WebClientPlugin.java
│   │       │   │           │           ├── advice/
│   │       │   │           │           │   ├── ClientHttpRequestAdvice.java
│   │       │   │           │           │   ├── FeignClientAdvice.java
│   │       │   │           │           │   ├── WebClientBuilderAdvice.java
│   │       │   │           │           │   └── WebClientFilterAdvice.java
│   │       │   │           │           ├── interceptor/
│   │       │   │           │           │   ├── HeadersFieldFinder.java
│   │       │   │           │           │   ├── forwarded/
│   │       │   │           │           │   │   ├── FeignClientForwardedInterceptor.java
│   │       │   │           │           │   │   ├── RestTemplateForwardedInterceptor.java
│   │       │   │           │           │   │   └── WebClientFilterForwardedInterceptor.java
│   │       │   │           │           │   ├── initialize/
│   │       │   │           │           │   │   └── WebClientBuildInterceptor.java
│   │       │   │           │           │   └── tracing/
│   │       │   │           │           │       ├── ClientHttpRequestInterceptor.java
│   │       │   │           │           │       ├── FeignClientTracingInterceptor.java
│   │       │   │           │           │       └── WebClientFilterTracingInterceptor.java
│   │       │   │           │           └── reactor/
│   │       │   │           │               ├── AgentCoreSubscriber.java
│   │       │   │           │               └── AgentMono.java
│   │       │   │           └── plugin/
│   │       │   │               └── easeagent/
│   │       │   │                   └── springweb/
│   │       │   │                       └── interceptor/
│   │       │   │                           └── tracing/
│   │       │   │                               └── WebClientTracingFilter.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           ├── java/
│   │           │   ├── com/
│   │           │   │   └── megaease/
│   │           │   │       └── easeagent/
│   │           │   │           └── plugin/
│   │           │   │               └── springweb/
│   │           │   │                   ├── interceptor/
│   │           │   │                   │   ├── HeadersFieldFinderTest.java
│   │           │   │                   │   ├── RequestUtils.java
│   │           │   │                   │   ├── TestConst.java
│   │           │   │                   │   ├── forwarded/
│   │           │   │                   │   │   ├── FeignClientForwardedInterceptorTest.java
│   │           │   │                   │   │   ├── RestTemplateForwardedInterceptorTest.java
│   │           │   │                   │   │   └── WebClientFilterForwardedInterceptorTest.java
│   │           │   │                   │   ├── initialize/
│   │           │   │                   │   │   └── WebClientBuildInterceptorTest.java
│   │           │   │                   │   └── tracing/
│   │           │   │                   │       ├── ClientHttpRequestInterceptorTest.java
│   │           │   │                   │       ├── FeignClientTracingInterceptorTest.java
│   │           │   │                   │       └── WebClientFilterTracingInterceptorTest.java
│   │           │   │                   └── reactor/
│   │           │   │                       ├── AgentCoreSubscriberTest.java
│   │           │   │                       ├── AgentMonoTest.java
│   │           │   │                       ├── MockCoreSubscriber.java
│   │           │   │                       └── MockMono.java
│   │           │   └── org/
│   │           │       └── springframework/
│   │           │           ├── http/
│   │           │           │   └── client/
│   │           │           │       └── SimpleClientHttpResponseFactory.java
│   │           │           └── web/
│   │           │               └── reactive/
│   │           │                   └── function/
│   │           │                       └── client/
│   │           │                           ├── MockClientRequest.java
│   │           │                           └── MockDefaultClientResponse.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   └── tomcat-jdk17/
│       ├── pom.xml
│       └── src/
│           ├── main/
│           │   └── java/
│           │       └── com/
│           │           └── megaease/
│           │               └── easeagent/
│           │                   └── plugin/
│           │                       └── tomcat/
│           │                           ├── AccessPlugin.java
│           │                           ├── ForwardedPlugin.java
│           │                           ├── TomcatPlugin.java
│           │                           ├── advice/
│           │                           │   └── FilterChainPoints.java
│           │                           ├── interceptor/
│           │                           │   ├── BaseServletInterceptor.java
│           │                           │   ├── FilterChainForwardedInterceptor.java
│           │                           │   ├── FilterChainMetricInterceptor.java
│           │                           │   ├── FilterChainTraceInterceptor.java
│           │                           │   ├── HttpServerRequest.java
│           │                           │   ├── TomcatAccessLogServerInfo.java
│           │                           │   └── TomcatHttpLogInterceptor.java
│           │                           └── utils/
│           │                               ├── InternalAsyncListener.java
│           │                               └── ServletUtils.java
│           └── test/
│               ├── java/
│               │   └── com/
│               │       └── megaease/
│               │           └── easeagent/
│               │               └── plugin/
│               │                   └── tomcat/
│               │                       └── interceptor/
│               │                           ├── BaseServletInterceptorTest.java
│               │                           ├── FilterChainForwardedInterceptorTest.java
│               │                           ├── FilterChainMetricInterceptorTest.java
│               │                           ├── FilterChainTraceInterceptorTest.java
│               │                           ├── HttpServerRequestTest.java
│               │                           ├── ServletAccessLogInfoServerInfoTest.java
│               │                           ├── TestConst.java
│               │                           ├── TestServletUtils.java
│               │                           └── TomcatHttpLogInterceptorTest.java
│               └── resources/
│                   └── mock_agent.properties
├── pom.xml
├── release
├── report/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       ├── com/
│       │       │   └── megaease/
│       │       │       └── easeagent/
│       │       │           └── report/
│       │       │               ├── AgentReportAware.java
│       │       │               ├── DefaultAgentReport.java
│       │       │               ├── GlobalExtractor.java
│       │       │               ├── OutputProperties.java
│       │       │               ├── ReportConfigChange.java
│       │       │               ├── async/
│       │       │               │   ├── AsyncProps.java
│       │       │               │   ├── AsyncReporter.java
│       │       │               │   ├── AsyncReporterMetrics.java
│       │       │               │   ├── DefaultAsyncReporter.java
│       │       │               │   ├── log/
│       │       │               │   │   ├── AccessLogReporter.java
│       │       │               │   │   ├── ApplicationLogReporter.java
│       │       │               │   │   └── LogAsyncProps.java
│       │       │               │   ├── trace/
│       │       │               │   │   ├── SDKAsyncReporter.java
│       │       │               │   │   └── TraceAsyncProps.java
│       │       │               │   └── zipkin/
│       │       │               │       ├── AgentBufferNextMessage.java
│       │       │               │       ├── AgentByteBoundedQueue.java
│       │       │               │       └── WithSizeConsumer.java
│       │       │               ├── encoder/
│       │       │               │   ├── PackedMessage.java
│       │       │               │   ├── log/
│       │       │               │   │   ├── AccessLogJsonEncoder.java
│       │       │               │   │   ├── AccessLogWriter.java
│       │       │               │   │   ├── LogDataJsonEncoder.java
│       │       │               │   │   ├── LogDataWriter.java
│       │       │               │   │   └── pattern/
│       │       │               │   │       ├── LogDataDatePatternConverterDelegate.java
│       │       │               │   │       ├── LogDataLevelPatternConverter.java
│       │       │               │   │       ├── LogDataLineSeparatorPatternConverter.java
│       │       │               │   │       ├── LogDataLoggerPatternConverter.java
│       │       │               │   │       ├── LogDataMdcPatternConverter.java
│       │       │               │   │       ├── LogDataPatternConverter.java
│       │       │               │   │       ├── LogDataPatternFormatter.java
│       │       │               │   │       ├── LogDataSimpleLiteralPatternConverter.java
│       │       │               │   │       ├── LogDataThreadNamePatternConverter.java
│       │       │               │   │       ├── LogDataThrowablePatternConverter.java
│       │       │               │   │       ├── NamePatternConverter.java
│       │       │               │   │       ├── NoOpPatternConverter.java
│       │       │               │   │       └── SimpleMessageConverter.java
│       │       │               │   ├── metric/
│       │       │               │   │   └── MetricJsonEncoder.java
│       │       │               │   └── span/
│       │       │               │       ├── AbstractAgentV2SpanEndpointWriter.java
│       │       │               │       ├── AgentV2SpanAnnotationsWriter.java
│       │       │               │       ├── AgentV2SpanBaseWriter.java
│       │       │               │       ├── AgentV2SpanGlobalWriter.java
│       │       │               │       ├── AgentV2SpanLocalEndpointWriter.java
│       │       │               │       ├── AgentV2SpanRemoteEndpointWriter.java
│       │       │               │       ├── AgentV2SpanTagsWriter.java
│       │       │               │       ├── AgentV2SpanWriter.java
│       │       │               │       ├── GlobalExtrasSupplier.java
│       │       │               │       ├── SpanJsonEncoder.java
│       │       │               │       └── okhttp/
│       │       │               │           ├── HttpSpanJsonEncoder.java
│       │       │               │           └── OkHttpJsonRequestBody.java
│       │       │               ├── metric/
│       │       │               │   ├── MetricItem.java
│       │       │               │   ├── MetricProps.java
│       │       │               │   └── MetricReporterFactoryImpl.java
│       │       │               ├── plugin/
│       │       │               │   ├── NoOpCall.java
│       │       │               │   ├── NoOpEncoder.java
│       │       │               │   ├── ReporterLoader.java
│       │       │               │   └── ReporterRegistry.java
│       │       │               ├── sender/
│       │       │               │   ├── AgentKafkaSender.java
│       │       │               │   ├── AgentLoggerSender.java
│       │       │               │   ├── NoOpSender.java
│       │       │               │   ├── SenderConfigDecorator.java
│       │       │               │   ├── SenderWithEncoder.java
│       │       │               │   ├── ZipkinCallWrapper.java
│       │       │               │   ├── metric/
│       │       │               │   │   ├── KeySender.java
│       │       │               │   │   ├── MetricKafkaSender.java
│       │       │               │   │   └── log4j/
│       │       │               │   │       ├── AppenderManager.java
│       │       │               │   │       ├── LoggerFactory.java
│       │       │               │   │       ├── MetricRefreshableAppender.java
│       │       │               │   │       ├── RefreshableAppender.java
│       │       │               │   │       └── TestableAppender.java
│       │       │               │   └── okhttp/
│       │       │               │       ├── ByteRequestBody.java
│       │       │               │       ├── HttpCall.java
│       │       │               │       └── HttpSender.java
│       │       │               ├── trace/
│       │       │               │   ├── Platform.java
│       │       │               │   ├── RefreshableReporter.java
│       │       │               │   ├── ReportSpanBuilder.java
│       │       │               │   └── TraceReport.java
│       │       │               └── util/
│       │       │                   ├── SpanUtils.java
│       │       │                   ├── TextUtils.java
│       │       │                   └── Utils.java
│       │       └── zipkin2/
│       │           └── reporter/
│       │               ├── TracerConverter.java
│       │               ├── brave/
│       │               │   ├── ConvertSpanReporter.java
│       │               │   └── ConvertZipkinSpanHandler.java
│       │               └── kafka11/
│       │                   ├── SDKKafkaSender.java
│       │                   ├── SDKSender.java
│       │                   └── SimpleSender.java
│       └── test/
│           ├── java/
│           │   └── com/
│           │       └── megaease/
│           │           └── easeagent/
│           │               └── report/
│           │                   ├── HttpSenderTest.java
│           │                   ├── async/
│           │                   │   └── zipkin/
│           │                   │       └── AgentByteBoundedQueueTest.java
│           │                   ├── encoder/
│           │                   │   └── log/
│           │                   │       ├── LogDataJsonEncoderTest.java
│           │                   │       └── LogDataWriterTest.java
│           │                   ├── metric/
│           │                   │   ├── MetricPropsTest.java
│           │                   │   └── MetricReporterFactoryTest.java
│           │                   ├── sender/
│           │                   │   ├── AgentKafkaSenderTest.java
│           │                   │   └── metric/
│           │                   │       └── log4j/
│           │                   │           └── AppenderManagerTest.java
│           │                   ├── trace/
│           │                   │   └── TraceReportTest.java
│           │                   └── utils/
│           │                       └── UtilsTest.java
│           └── resources/
│               └── sender/
│                   ├── outputServer_disabled.json
│                   ├── outputServer_empty_bootstrapServer_disabled.json
│                   ├── outputServer_empty_bootstrapServer_enabled.json
│                   └── outputServer_enabled.json
├── resources/
│   ├── rootfs/
│   │   └── Dockerfile
│   └── scripts/
│       ├── Jenkinsfile
│       └── build-image.sh
└── zipkin/
    ├── pom.xml
    └── src/
        ├── main/
        │   ├── java/
        │   │   └── com/
        │   │       └── megaease/
        │   │           └── easeagent/
        │   │               └── zipkin/
        │   │                   ├── CustomTagsSpanHandler.java
        │   │                   ├── TracingProviderImpl.java
        │   │                   ├── impl/
        │   │                   │   ├── AsyncRequest.java
        │   │                   │   ├── MessageImpl.java
        │   │                   │   ├── RemoteGetterImpl.java
        │   │                   │   ├── RemoteSetterImpl.java
        │   │                   │   ├── RequestContextImpl.java
        │   │                   │   ├── ScopeImpl.java
        │   │                   │   ├── SpanContextImpl.java
        │   │                   │   ├── SpanImpl.java
        │   │                   │   ├── TracingImpl.java
        │   │                   │   └── message/
        │   │                   │       ├── MessagingTracingImpl.java
        │   │                   │       ├── ZipkinConsumerRequest.java
        │   │                   │       └── ZipkinProducerRequest.java
        │   │                   └── logging/
        │   │                       ├── AgentLogMDC.java
        │   │                       ├── AgentMDCScopeDecorator.java
        │   │                       └── LogUtils.java
        │   └── resources/
        │       └── META-INF/
        │           └── services/
        │               └── com.megaease.easeagent.plugin.bean.BeanProvider
        └── test/
            └── java/
                ├── brave/
                │   ├── TracerTestUtils.java
                │   └── internal/
                │       └── collect/
                │           └── WeakConcurrentMapTestUtils.java
                └── com/
                    └── megaease/
                        └── easeagent/
                            └── zipkin/
                                ├── CustomTagsSpanHandlerTest.java
                                ├── TracingProviderImplMock.java
                                ├── TracingProviderImplTest.java
                                ├── impl/
                                │   ├── AsyncRequestTest.java
                                │   ├── MessageImplTest.java
                                │   ├── MessagingRequestMock.java
                                │   ├── RemoteGetterImplTest.java
                                │   ├── RemoteSetterImplTest.java
                                │   ├── RequestContextImplTest.java
                                │   ├── RequestMock.java
                                │   ├── ScopeImplTest.java
                                │   ├── SpanContextImplTest.java
                                │   ├── SpanImplTest.java
                                │   ├── TracingImplTest.java
                                │   └── message/
                                │       ├── MessagingTracingImplTest.java
                                │       ├── ZipkinConsumerRequestTest.java
                                │       └── ZipkinProducerRequestTest.java
                                └── logging/
                                    ├── AgentLogMDCTest.java
                                    ├── AgentMDCScopeDecoratorTest.java
                                    └── LogUtilsTest.java

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
insert_final_newline = true
end_of_line = lf

[*.md]
trim_trailing_whitespace = false


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''

---

---
name: 🐞 Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''

---

**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Execute '...'
2. Send a request to '....'
3. See error

**Expected behavior**
A clear and concise description of what you expected to happen.

**Version**
The version number of Easegress.

**Configuration**
* EaseAgent Configuration
```
```

**Logs**
```
EaseAgent logs, if applicable.
```

**OS and Hardware**
 - OS: [e.g. Ubuntu 20.04]
 - CPU:[e.g. Intel(R) Core(TM) i5-8265U]
 - Memory: [e.g. 16GB]

**Additional context**
Add any other context about the problem here.


---
Thanks for contributing 🎉!


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''

---

---
name: 🚀 Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''

---

**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]

**Describe the solution you'd like**
A clear and concise description of what you want to happen.

**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.

**Additional context**
Add any other context or screenshots about the feature request here.


---
Thanks for contributing 🎉!


================================================
FILE: .github/workflows/build.yml
================================================
# This is a basic workflow to help you get started with Actions

name: Build & Test

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [ master ]
    paths-ignore:
      - 'doc/**'
      - 'resources/**'
      - '**.md'
  pull_request:
    branches: [ master ]
    paths-ignore:
      - 'doc/**'
      - 'resources/**'
      - '**.md'

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ${{ matrix.os }}

    strategy:
      fail-fast: false
      matrix:
        os: [ ubuntu-latest, windows-latest ]
        java-version: [ 8, 11, 16, 17 ]
        java-distribution: [ adopt, adopt-openj9 ]

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:


      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - name: Checkout Codebase
        uses: actions/checkout@v2

      - name: Setup Java Version
        uses: actions/setup-java@v3.14.1
        with:
          java-version: ${{ matrix.java-version }}
          distribution: ${{ matrix.java-distribution }}
          architecture: x64
          cache: 'maven'

      # Runs a single command using the runners shell
      - name: Build with Maven
        run: mvn clean package


================================================
FILE: .github/workflows/license-checker.yml
================================================
name: License checker

on:
  push:
    branches:
      - maste
    paths-ignore:
      - 'doc/**'
      - 'resources/**'
      - '**.md'
  pull_request:
    branches:
      - master
    paths-ignore:
      - 'doc/**'
      - 'resources/**'
      - '**.md'

jobs:
  check-license:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Check License Header
        uses: apache/skywalking-eyes@main
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          log: info


================================================
FILE: .gitignore
================================================
.idea/
*.iml
target/
dependency-reduced-pom.xml
*.class
*.swp
**/*.versionsBackup

.patch
.classpath
.factorypath
.project
.settings
.DS_Store
.vscode
logs/
tmp/


================================================
FILE: .licenserc.yaml
================================================
header:
  license:
    content: |
      Copyright (c) 2022, MegaEase
      All rights reserved.
      
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
      You may obtain a copy of the License at
      
          http://www.apache.org/licenses/LICENSE-2.0
      
      Unless required by applicable law or agreed to in writing, software
      distributed under the License is distributed on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      See the License for the specific language governing permissions and
      limitations under the License.
  paths:
    - './'

  paths-ignore:
    - '.editorconfig'
    - 'install'
    - 'release'
    - '**/target/**'
    - '**/*.xml'
    - '**/*.yaml'
    - '**/*.properties'
    - '**/*.md'
    - '**/*.iml'
    - 'LICENSE'
    - '.github/'
    - '.git/'
    - 'doc/'
    - '**/resources/**'
    - 'CHANGELOG.md'
    - '.gitignore'
    - 'README.md'

  comment: on-failure

dependency:
  files:
    - go.mod


================================================
FILE: AOSP-Checkstyles.xml
================================================
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
          "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
          "https://checkstyle.org/dtds/configuration_1_3.dtd">

<!--
    Checkstyle configuration that checks the Google coding conventions from Google Java Style
    that can be found at https://google.github.io/styleguide/javaguide.html

    Checkstyle is very configurable. Be sure to read the documentation at
    http://checkstyle.org (or in your downloaded distribution).

    To completely disable a check, just comment it out or delete it from the file.
    To suppress certain violations please review suppression filters.

    Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov.
 -->

<module name = "Checker">
  <property name="charset" value="UTF-8"/>

  <property name="severity" value="warning"/>

  <property name="fileExtensions" value="java, properties, xml"/>
  <!-- Excludes all 'module-info.java' files              -->
  <!-- See https://checkstyle.org/config_filefilters.html -->
  <module name="BeforeExecutionExclusionFileFilter">
    <property name="fileNamePattern" value="module\-info\.java$"/>
  </module>
  <!-- https://checkstyle.org/config_filters.html#SuppressionFilter -->
  <module name="SuppressionFilter">
    <property name="file" value="${org.checkstyle.google.suppressionfilter.config}"
           default="checkstyle-suppressions.xml" />
    <property name="optional" value="true"/>
  </module>

  <!-- Checks for whitespace                               -->
  <!-- See http://checkstyle.org/config_whitespace.html -->
  <module name="FileTabCharacter">
    <property name="eachLine" value="true"/>
  </module>

  <module name="LineLength">
    <property name="fileExtensions" value="java"/>
    <property name="max" value="100"/>
    <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
  </module>

  <module name="TreeWalker">
    <module name="OuterTypeFilename"/>
    <module name="IllegalTokenText">
      <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
      <property name="format"
               value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
      <property name="message"
               value="Consider using special escape sequence instead of octal value or Unicode escaped value."/>
    </module>
    <module name="AvoidEscapedUnicodeCharacters">
      <property name="allowEscapesForControlCharacters" value="true"/>
      <property name="allowByTailComment" value="true"/>
      <property name="allowNonPrintableEscapes" value="true"/>
    </module>
    <module name="AvoidStarImport"/>
    <module name="OneTopLevelClass"/>
    <module name="NoLineWrap">
      <property name="tokens" value="PACKAGE_DEF, IMPORT, STATIC_IMPORT"/>
    </module>
    <module name="EmptyBlock">
      <property name="option" value="TEXT"/>
      <property name="tokens"
               value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
    </module>
    <module name="NeedBraces">
      <property name="tokens"
               value="LITERAL_DO, LITERAL_ELSE, LITERAL_FOR, LITERAL_IF, LITERAL_WHILE"/>
    </module>
    <module name="LeftCurly">
      <property name="tokens"
               value="ANNOTATION_DEF, CLASS_DEF, CTOR_DEF, ENUM_CONSTANT_DEF, ENUM_DEF,
                    INTERFACE_DEF, LAMBDA, LITERAL_CASE, LITERAL_CATCH, LITERAL_DEFAULT,
                    LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF,
                    LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, METHOD_DEF,
                    OBJBLOCK, STATIC_INIT, RECORD_DEF, COMPACT_CTOR_DEF"/>
    </module>
    <module name="RightCurly">
      <property name="id" value="RightCurlySame"/>
      <property name="tokens"
               value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE,
                    LITERAL_DO"/>
    </module>
    <module name="RightCurly">
      <property name="id" value="RightCurlyAlone"/>
      <property name="option" value="alone"/>
      <property name="tokens"
               value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT,
                    INSTANCE_INIT, ANNOTATION_DEF, ENUM_DEF, INTERFACE_DEF, RECORD_DEF,
                    COMPACT_CTOR_DEF"/>
    </module>
    <module name="SuppressionXpathSingleFilter">
      <!-- suppresion is required till https://github.com/checkstyle/checkstyle/issues/7541 -->
      <property name="id" value="RightCurlyAlone"/>
      <property name="query" value="//RCURLY[parent::SLIST[count(./*)=1]
                                     or preceding-sibling::*[last()][self::LCURLY]]"/>
    </module>
    <module name="WhitespaceAfter">
      <property name="tokens"
               value="COMMA, SEMI, TYPECAST, LITERAL_IF, LITERAL_ELSE,
                    LITERAL_WHILE, LITERAL_DO, LITERAL_FOR, DO_WHILE"/>
    </module>
    <module name="WhitespaceAround">
      <property name="allowEmptyConstructors" value="true"/>
      <property name="allowEmptyLambdas" value="true"/>
      <property name="allowEmptyMethods" value="true"/>
      <property name="allowEmptyTypes" value="true"/>
      <property name="allowEmptyLoops" value="true"/>
      <property name="ignoreEnhancedForColon" value="false"/>
      <property name="tokens"
               value="ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN, BXOR,
                    BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, DO_WHILE, EQUAL, GE, GT, LAMBDA, LAND,
                    LCURLY, LE, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE, LITERAL_FINALLY,
                    LITERAL_FOR, LITERAL_IF, LITERAL_RETURN, LITERAL_SWITCH, LITERAL_SYNCHRONIZED,
                    LITERAL_TRY, LITERAL_WHILE, LOR, LT, MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN,
                    NOT_EQUAL, PLUS, PLUS_ASSIGN, QUESTION, RCURLY, SL, SLIST, SL_ASSIGN, SR,
                    SR_ASSIGN, STAR, STAR_ASSIGN, LITERAL_ASSERT, TYPE_EXTENSION_AND"/>
      <message key="ws.notFollowed"
              value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
      <message key="ws.notPreceded"
              value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
    </module>
    <module name="OneStatementPerLine"/>
    <module name="MultipleVariableDeclarations"/>
    <module name="ArrayTypeStyle"/>
    <module name="MissingSwitchDefault"/>
    <module name="FallThrough"/>
    <module name="UpperEll"/>
    <module name="ModifierOrder"/>
    <module name="EmptyLineSeparator">
      <property name="tokens"
               value="PACKAGE_DEF, IMPORT, STATIC_IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
                    STATIC_INIT, INSTANCE_INIT, METHOD_DEF, CTOR_DEF, VARIABLE_DEF, RECORD_DEF,
                    COMPACT_CTOR_DEF"/>
      <property name="allowNoEmptyLineBetweenFields" value="true"/>
    </module>
    <module name="SeparatorWrap">
      <property name="id" value="SeparatorWrapDot"/>
      <property name="tokens" value="DOT"/>
      <property name="option" value="nl"/>
    </module>
    <module name="SeparatorWrap">
      <property name="id" value="SeparatorWrapComma"/>
      <property name="tokens" value="COMMA"/>
      <property name="option" value="EOL"/>
    </module>
    <module name="SeparatorWrap">
      <!-- ELLIPSIS is EOL until https://github.com/google/styleguide/issues/259 -->
      <property name="id" value="SeparatorWrapEllipsis"/>
      <property name="tokens" value="ELLIPSIS"/>
      <property name="option" value="EOL"/>
    </module>
    <module name="SeparatorWrap">
      <!-- ARRAY_DECLARATOR is EOL until https://github.com/google/styleguide/issues/258 -->
      <property name="id" value="SeparatorWrapArrayDeclarator"/>
      <property name="tokens" value="ARRAY_DECLARATOR"/>
      <property name="option" value="EOL"/>
    </module>
    <module name="SeparatorWrap">
      <property name="id" value="SeparatorWrapMethodRef"/>
      <property name="tokens" value="METHOD_REF"/>
      <property name="option" value="nl"/>
    </module>
    <module name="PackageName">
      <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
      <message key="name.invalidPattern"
             value="Package name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="TypeName">
      <property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
                    ANNOTATION_DEF, RECORD_DEF"/>
      <message key="name.invalidPattern"
             value="Type name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="MemberName">
      <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
      <message key="name.invalidPattern"
             value="Member name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="ParameterName">
      <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
      <message key="name.invalidPattern"
             value="Parameter name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="LambdaParameterName">
      <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
      <message key="name.invalidPattern"
             value="Lambda parameter name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="CatchParameterName">
      <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
      <message key="name.invalidPattern"
             value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="LocalVariableName">
      <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
      <message key="name.invalidPattern"
             value="Local variable name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="PatternVariableName">
      <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
      <message key="name.invalidPattern"
             value="Pattern variable name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="ClassTypeParameterName">
      <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
      <message key="name.invalidPattern"
             value="Class type name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="RecordComponentName">
      <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
      <message key="name.invalidPattern"
               value="Record component name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="RecordTypeParameterName">
      <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
      <message key="name.invalidPattern"
               value="Record type name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="MethodTypeParameterName">
      <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
      <message key="name.invalidPattern"
             value="Method type name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="InterfaceTypeParameterName">
      <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
      <message key="name.invalidPattern"
             value="Interface type name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="NoFinalizer"/>
    <module name="GenericWhitespace">
      <message key="ws.followed"
             value="GenericWhitespace ''{0}'' is followed by whitespace."/>
      <message key="ws.preceded"
             value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
      <message key="ws.illegalFollow"
             value="GenericWhitespace ''{0}'' should followed by whitespace."/>
      <message key="ws.notPreceded"
             value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
    </module>
    <module name="Indentation">
      <property name="basicOffset" value="4"/>
      <property name="braceAdjustment" value="4"/>
      <property name="caseIndent" value="4"/>
      <property name="throwsIndent" value="8"/>
      <property name="lineWrappingIndentation" value="8"/>
      <property name="arrayInitIndent" value="4"/>
    </module>
    <module name="AbbreviationAsWordInName">
      <property name="ignoreFinal" value="false"/>
      <property name="allowedAbbreviationLength" value="0"/>
      <property name="tokens"
               value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, ANNOTATION_DEF, ANNOTATION_FIELD_DEF,
                    PARAMETER_DEF, VARIABLE_DEF, METHOD_DEF, PATTERN_VARIABLE_DEF, RECORD_DEF,
                    RECORD_COMPONENT_DEF"/>
    </module>
    <module name="NoWhitespaceBeforeCaseDefaultColon"/>
    <module name="OverloadMethodsDeclarationOrder"/>
    <module name="VariableDeclarationUsageDistance"/>
    <module name="CustomImportOrder">
      <property name="sortImportsInGroupAlphabetically" value="true"/>
      <property name="separateLineBetweenGroups" value="true"/>
      <property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE"/>
      <property name="tokens" value="IMPORT, STATIC_IMPORT, PACKAGE_DEF"/>
    </module>
    <module name="MethodParamPad">
      <property name="tokens"
               value="CTOR_DEF, LITERAL_NEW, METHOD_CALL, METHOD_DEF,
                    SUPER_CTOR_CALL, ENUM_CONSTANT_DEF, RECORD_DEF"/>
    </module>
    <module name="NoWhitespaceBefore">
      <property name="tokens"
               value="COMMA, SEMI, POST_INC, POST_DEC, DOT,
                    LABELED_STAT, METHOD_REF"/>
      <property name="allowLineBreaks" value="true"/>
    </module>
    <module name="ParenPad">
      <property name="tokens"
               value="ANNOTATION, ANNOTATION_FIELD_DEF, CTOR_CALL, CTOR_DEF, DOT, ENUM_CONSTANT_DEF,
                    EXPR, LITERAL_CATCH, LITERAL_DO, LITERAL_FOR, LITERAL_IF, LITERAL_NEW,
                    LITERAL_SWITCH, LITERAL_SYNCHRONIZED, LITERAL_WHILE, METHOD_CALL,
                    METHOD_DEF, QUESTION, RESOURCE_SPECIFICATION, SUPER_CTOR_CALL, LAMBDA,
                    RECORD_DEF"/>
    </module>
    <module name="OperatorWrap">
      <property name="option" value="NL"/>
      <property name="tokens"
               value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR,
                    LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR, METHOD_REF,
                    TYPE_EXTENSION_AND "/>
    </module>
    <module name="AnnotationLocation">
      <property name="id" value="AnnotationLocationMostCases"/>
      <property name="tokens"
               value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF,
                      RECORD_DEF, COMPACT_CTOR_DEF"/>
    </module>
    <module name="AnnotationLocation">
      <property name="id" value="AnnotationLocationVariables"/>
      <property name="tokens" value="VARIABLE_DEF"/>
      <property name="allowSamelineMultipleAnnotations" value="true"/>
    </module>
    <module name="NonEmptyAtclauseDescription"/>
    <module name="InvalidJavadocPosition"/>
    <module name="JavadocTagContinuationIndentation"/>
    <module name="SummaryJavadoc">
      <property name="forbiddenSummaryFragments"
               value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}]( is a )"/>
    </module>
    <module name="JavadocParagraph"/>
    <module name="RequireEmptyLineBeforeBlockTagGroup"/>
    <module name="AtclauseOrder">
      <property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
      <property name="target"
               value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
    </module>
    <module name="JavadocMethod">
      <property name="accessModifiers" value="public"/>
      <property name="allowMissingParamTags" value="true"/>
      <property name="allowMissingReturnTag" value="true"/>
      <property name="allowedAnnotations" value="Override, Test"/>
      <property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF, COMPACT_CTOR_DEF"/>
    </module>
    <module name="MissingJavadocMethod">
      <property name="scope" value="public"/>
      <property name="minLineCount" value="2"/>
      <property name="allowedAnnotations" value="Override, Test"/>
      <property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF,
                                   COMPACT_CTOR_DEF"/>
    </module>
    <module name="MissingJavadocType">
      <property name="scope" value="protected"/>
      <property name="tokens"
                value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
                      RECORD_DEF, ANNOTATION_DEF"/>
      <property name="excludeScope" value="nothing"/>
    </module>
    <module name="MethodName">
      <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
      <message key="name.invalidPattern"
             value="Method name ''{0}'' must match pattern ''{1}''."/>
    </module>
    <module name="SingleLineJavadoc"/>
    <module name="EmptyCatchBlock">
      <property name="exceptionVariableName" value="expected"/>
    </module>
    <module name="CommentsIndentation">
      <property name="tokens" value="SINGLE_LINE_COMMENT, BLOCK_COMMENT_BEGIN"/>
    </module>
    <!-- https://checkstyle.org/config_filters.html#SuppressionXpathFilter -->
    <module name="SuppressionXpathFilter">
      <property name="file" value="${org.checkstyle.google.suppressionxpathfilter.config}"
             default="checkstyle-xpath-suppressions.xml" />
      <property name="optional" value="true"/>
    </module>
  </module>
</module>


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.

## Our Standards

Examples of behavior that contributes to a positive environment for our
community include:

* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
  and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
  overall community

Examples of unacceptable behavior include:

* The use of sexualized language or imagery, and sexual attention or
  advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
  address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
  professional setting

## Enforcement Responsibilities

Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.

Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.

## Scope

This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
service@megaease.com.
All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the
reporter of any incident.

## Enforcement Guidelines

Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:

### 1. Correction

**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.

**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.

### 2. Warning

**Community Impact**: A violation through a single incident or series
of actions.

**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.

### 3. Temporary Ban

**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.

**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.

### 4. Permanent Ban

**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior,  harassment of an
individual, or aggression toward or disparagement of classes of individuals.

**Consequence**: A permanent ban from any sort of public interaction within
the community.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.


================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
# EaseAgent

A lightweight & opening Java Agent for Cloud-Native and APM system

- [EaseAgent](#easeagent)
  - [Overview](#overview)
    - [Purpose](#purpose)
    - [Principles](#principles)
  - [Features](#features)
  - [Architecture Diagram](#architecture-diagram)
      - [Description](#description)
  - [QuickStart](#quickstart)
    - [Get And Set Environment Variable](#get-and-set-environment-variable)
      - [Setup Environment Variable](#setup-environment-variable)
      - [Download](#download)
      - [Build From the Source](#build-from-the-source)
      - [Get Configuration file](#get-configuration-file)
    - [Monitor Spring Petclinic](#monitor-spring-petclinic)
      - [Prerequisites](#prerequisites)
      - [Initialize and Start the project](#initialize-and-start-the-project)
      - [Metric](#metric)
      - [Tracing](#tracing)
      - [Build Spring Petclinic](#build-spring-petclinic)
    - [Add an Enhancement Plugin](#add-an-enhancement-plugin)
  - [User Manual](#user-manual)
  - [Enhancement Plugin Development Guide](#enhancement-plugin-development-guide)
  - [Report Plugin Development Guide](#report-plugin-development-guide)
  - [Community](#community)
  - [Licenses](#licenses)

## Overview
- EaseAgent is the underlying component that provides non-intrusive extensions to applications of the Java ecosystem. 
- EaseAgent can collect distributed application tracing, metrics, and logs, which could be used in the APM system and improve the observability of a distributed system. for the tracing, EaseAgent follows the [Google Dapper](https://research.google/pubs/pub36356/) paper.
- EaseAgent also can work with Cloud-Native architecture. For example, it can help Service Mesh (especially for [EaseMesh](https://github.com/megaease/easemesh/) ) to do some control panel work.
- EaseAgent supports plugins mechanism development, which is easy to extend or add new functionality.

### Purpose
- EaseAgent can be a Java agent for APM(Application Performance Management) system.
- EaseAgent collects the basic metrics and the service tracing logs, which is very helpful for performance analysis and troubleshooting.
- EaseAgent is compatible with mainstream monitoring ecosystems, such as Kafka, ElasticSearch, Prometheus, Zipkin, etc.
- EaseAgent majorly focuses on the Spring Boot development environments, but users can support any Java ecosystem applications through plugins.
- EaseAgent can support scenario-specific business requirements through the plugin mechanism, such as traffic redirection, traffic coloring, etc.

### Principles
- Safe to Java application/service.
- Instrumenting a Java application in a non-intrusive way.
- Lightweight and very low CPU, memory, and I/O resource usage.
- Highly extensible, users can easily do extensions through a simple and clear plugin interface.
- Design for Micro-Service architecture, collecting the data from a service perspective.

## Features
* Easy to use. It is right out of the box for Metrics, Tracing and Logs collecting.
    * Collecting Metric & Tracing Logs.
        * `JDBC 4.0`
        * `HTTP Servlet`、`HTTP Filter`
        * `Spring Boot 2.2.x`: `WebClient` 、 `RestTemplate`、`FeignClient`
        * `RabbitMQ Client 5.x`、 `Kafka Client 2.4.x`
        * `Jedis 3.5.x`、 `Lettuce 5.3.x (sync、async)`
        * `ElasticSearch Client >= 7.x (sync、async)`
        * `Mongodb Client >=4.0.x (sync、async)`
        * `Motan`
        * `Dubbo`
        * `SofaRpc >= 5.3.0`
    * Collecting Access Logs.
        * `HTTP Servlet`、`HTTP Filter`
        * `Spring Cloud Gateway`
    * Instrumenting the `traceId` and `spanId` into user application logging automatically
    * Supplying the `health check` endpoint
    * Supplying the `readiness check` endpoint for `SpringBoot2.2.x`
    * Supplying the `agent info` endpoint
    
*  Data Reports
    * Console Reporter.
    * Prometheus Exports.
    * Http Reporter.
    * Kafka Reporter.
    * Custom Reporter.

* Easy to Extend
    * Simple and clear Plugin Interface, creating a plugin as few as three classes.
    * Extremely cleanly packaged `Tracing` and `Metric` API, with a small amount of code to achieve business support.

* Standardization
    * The tracing data format is fully compatible with the Zipkin data format.
    * Metric data format fully supports integration with `Prometheus`.
    * The application log format is fully compatible with the `Opentelemetry` data format.


## Architecture Diagram
![image](./doc/images/EaseAgent-Architecture-Base-v2.0.png)

#### Description
**Plugin Framework** in `core` module is base on [Byte buddy](https://github.com/raphw/byte-buddy) technology.

1. Easeagent's plugin defines where (which classes and methods) to make enhancements by implementing the `Points`  and what to do at the point of enhancement by implementing the `Interceptor`.
2. When the program invokes the enhanced method of class defined by Points, the `unique index`(uid) owned by the method will be used as a parameter to call the common interface of `Agent Common Method Advice`, which finds the `Agent Interceptor Chain` by the `Unique Index` and calls the `before` method of each Interceptor in the chain in order of priority.
3. Normally, both the `Metric Interceptor` and the `Tracing Interceptor` are in the agent interceptor chain and are called sequentially.
4. According to call the `Metric API` and `Tracing API` in interceptors, the `Metric` and `Tracing` information will be stored in `MetricRegistry` and `Tracing`.
5. The `Reporter` module will get information from `MetricRegistry` and `Tracing` and send it to `Kafka`.
6. The `after` method of each interceptor in the `Agent Interceptor Chain` will be invoked in the reverse order of the `before` invoked at last.
7. The `tracing` data can be sent to `kafka` server or `zipkin` server, the `metric` data can be sent to `kafka` server and pull by `Prometheus` server.

## QuickStart

### Get And Set Environment Variable

Setup Environment Variable and then download the latest release of `easeagent.jar` or build it from the source.

#### Setup Environment Variable
```
$ cd ~/easeagent #[Replace with agent path]
$ export EASE_AGENT_PATH=`pwd` # export EASE_AGENT_PATH=[Replace with agent path]
$ mkdir plugins
```

#### Download
Download `easeagent.jar` from releases [releases](https://github.com/megaease/easeagent/releases).

```
$ curl -Lk https://github.com/megaease/easeagent/releases/latest/download/easeagent.jar -O
```

#### Build From the Source

You need Java 1.8+ and git:

Download EaseAgent with `git clone https://github.com/megaease/easeagent.git`.
```
$ cd easeagent
$ mvn clean package -Dmaven.test.skip
$ cp ./build/target/easeagent-dep.jar $EASE_AGENT_PATH/easeagent.jar
```
The `./build/target/easeagent-dep.jar` is the agent jar with all the dependencies.

> For the Windows platform, please make sure git `core.autocrlf` is set to false before git clone.
> You can use `git config --global core.autocrlf false` to modify `core.autocrlf`.

[How to use easeagent.jar on host?](doc/how-to-use/use-on-host.md)

[How to use easeagent.jar in docker?](doc/how-to-use/use-in-docker.md)

#### Get Configuration file
Extracting the default configuration file.
```
$ cd $EASE_AGENT_PATH
$ jar xf easeagent.jar agent.properties easeagent-log4j2.xml
```

By default, there is an agent.properties configuration file, which is configured to print all output data to the console.

### Monitor Spring Petclinic
#### Prerequisites
- Make sure you have installed the docker, docker-compose in your environment.
- Make sure your docker version is higher than v19.+.
- Make sure your docker-compose version is higher than v2.+.

[Project Details](https://github.com/megaease/easeagent-spring-petclinic)

#### Initialize and Start the project
```
$ git clone https://github.com/megaease/easeagent-spring-petclinic.git
$ cd easeagent-spring-petclinic
$ git submodule update --init
$ ./spring-petclinic.sh start
```

> The script will download the latest release of EaseAgent. 
> If you want to use your own built EaseAgent, copy it to the directory: `easeagent/downloaded`
>> ```$ cp $EASE_AGENT_PATH/easeagent.jar  easeagent/downloaded/easeagent-latest.jar``` 

It requires `Docker` to pull images from the docker hub, be patient. 

Open Browser to visit grafana UI: [http://localhost:3000](http://localhost:3000).

#### Metric
Click the `search dashboards`, the first icon in the left menu bar. Choose the `spring-petclinic-easeagent` to open the dashboard we prepare for you.

Prometheus Metric Schedule: [Prometheus Metric](doc/prometheus-metric-schedule.md)

![metric](doc/images/grafana-metric.png)

#### Tracing

If you want to check the tracing-data, you could click the explore in the left menu bar. Click the Search - beta to switch search mode. Click search query button in the right up corner, there is a list containing many tracing. Choose one to click.

![tracing](doc/images/grafana-tracing.png)

#### Build Spring Petclinic

[Spring Petclinic Demo](doc/spring-petclinic-demo.md)

### Add an Enhancement Plugin
[Add a Demo Plugin to EaseAgent](doc/add-plugin-demo.md)

## User Manual
For more information, please refer to the [User Manual](./doc/user-manual.md).

## Enhancement Plugin Development Guide
Refer to [Plugin Development Guide](./doc/development-guide.md).

## Report Plugin Development Guide
Report plugin enables user report tracing/metric data to different kinds of the backend in a different format.

Refer to [Report Plugin Development Guide](./doc/report-development-guide.md)

## Community

* [Github Issues](https://github.com/megaease/easeagent/issues)
* [Join Slack Workspace](https://join.slack.com/t/openmegaease/shared_invite/zt-upo7v306-lYPHvVwKnvwlqR0Zl2vveA) for requirement, issue and development.
* [MegaEase on Twitter](https://twitter.com/megaease)

If you have any questions, welcome to discuss them in our community. Welcome to join!


## Licenses
EaseAgent is licensed under the Apache License, Version 2.0. See [LICENSE](./LICENSE) for the full license text.


================================================
FILE: build/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!--
  Copyright (c) 2017, MegaEase
  All rights reserved.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>easeagent</artifactId>
        <groupId>com.megaease.easeagent</groupId>
        <version>2.3.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>build</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.megaease.easeagent</groupId>
            <artifactId>metrics</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.megaease.easeagent</groupId>
            <artifactId>zipkin</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.megaease.easeagent</groupId>
            <artifactId>log4j2-api</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.megaease.easeagent</groupId>
            <artifactId>core</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.megaease.easeagent</groupId>
            <artifactId>loader</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>easeagent</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source>${version.java}</source>
                    <target>${version.java}</target>
                    <encoding>${encoding.file}</encoding>
                    <compilerArgs>
                        <arg>-Xlint:unchecked</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <phase>prepare-package</phase>
                        <configuration>
                            <target>
                                <mkdir dir="target/inner-plugins"/>
                                <copy todir="target/inner-plugins" flatten="true">
                                    <fileset dir="${project.basedir}/../plugins" includes="**/*.jar"/>
                                </copy>

                                <!--
                                <mkdir dir="target/boot"/>
                                <copy todir="target/boot" flatten="true">
                                    <fileset dir="${project.basedir}/../log4j2/log4j2-api" includes="**/log4j2-api*.jar"/>
                                </copy>
                                -->

                                <mkdir dir="target/log4j2"/>
                                <copy todir="target/log4j2" flatten="true">
                                    <fileset dir="${project.basedir}/../log4j2/log4j2-impl" includes="**/*agent-lib.jar"/>
                                </copy>
                            </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>${version.maven-shade-plugin}</version>
                <configuration>
                    <minimizeJar>true</minimizeJar>
                    <transformers>
                        <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                        <transformer
                                implementation="com.github.edwgiz.maven_shade_plugin.log4j2_cache_transformer.PluginsCacheFileTransformer">
                        </transformer>
                    </transformers>
                    <filters>
                        <filter>
                            <artifact>org.apache.logging.log4j:*</artifact>
                            <includes>
                                <include>**</include>
                            </includes>
                        </filter>
                    </filters>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>com.github.edwgiz</groupId>
                        <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId>
                        <version>2.14.0</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>pl.project13.maven</groupId>
                <artifactId>git-commit-id-plugin</artifactId>
                <version>4.9.10</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>revision</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <verbose>true</verbose>
                    <gitDescribe>
                        <skip>false</skip>
                        <always>true</always>
                    </gitDescribe>
                    <dateFormat>yyyy-MM-dd'T'HH:mm:ssZ</dateFormat>
                    <generateGitPropertiesFile>true</generateGitPropertiesFile>
                    <generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties
                    </generateGitPropertiesFilename>
                    <includeOnlyProperties>
                        <includeOnlyProperty>git.commit.*</includeOnlyProperty>
                    </includeOnlyProperties>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <descriptors>
                        <descriptor>src/assembly/src.xml</descriptor>
                    </descriptors>
                    <archive>
                        <manifestEntries>
                            <Can-Redefine-Classes>true</Can-Redefine-Classes>
                            <Can-Retransform-Classes>true</Can-Retransform-Classes>
                            <Premain-Class>com.megaease.easeagent.Main</Premain-Class>
                            <Bootstrap-Class>com.megaease.easeagent.StartBootstrap</Bootstrap-Class>
                            <Logging-Property>log4j.configurationFile</Logging-Property>
                            <Easeagent-Version>${version}</Easeagent-Version>
                        </manifestEntries>
                    </archive>
                    <archiverConfig>
                        <compress>false</compress>
                    </archiverConfig>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>


</project>


================================================
FILE: build/src/assembly/src.xml
================================================
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
    <id>dep</id>
    <baseDirectory>/</baseDirectory>
    <formats>
        <format>jar</format>
    </formats>
    <fileSets>
        <fileSet>
            <directory>${project.build.outputDirectory}</directory>
            <outputDirectory/>
            <includes>
                <include>git.properties</include>
                <include>agent.yaml</include>
                <include>agent.properties</include>
                <include>user-minimal-cfg.properties</include>
                <include>easeagent-log4j2.xml</include>
            </includes>
        </fileSet>

        <!--
        <fileSet>
            <directory>${project.build.basedir}/plugins/</directory>
            <outputDirectory>plugins</outputDirectory>
            <includes>
                <include>pom.xml</include>
                <include>**/*.jar</include>
            </includes>
        </fileSet>

        <fileSet>
            <directory>${project.basedir}/target/plugins/</directory>
            <outputDirectory>plugins</outputDirectory>
            <includes>
                <include>pom.xml</include>
                <include>**/*.jar</include>
            </includes>
        </fileSet>
        -->

        <fileSet>
            <directory>${project.basedir}/target/inner-plugins/</directory>
            <outputDirectory>plugins</outputDirectory>
            <excludes>
                <exclude>original-*.jar</exclude>
            </excludes>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>${project.basedir}/target/log4j2/</directory>
            <outputDirectory>log4j2</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>

        <fileSet>
            <directory>${project.basedir}/target/boot/</directory>
            <outputDirectory>boot</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
    </fileSets>
    <dependencySets>
        <dependencySet>
            <outputDirectory>boot</outputDirectory>
            <includes>
                <include>com.megaease.easeagent:plugin-api</include>
            </includes>
            <unpack>false</unpack>
        </dependencySet>
        <dependencySet>
            <outputDirectory>lib</outputDirectory>
            <excludes>
                <exclude>**/com/megaease/easeagent/plugin/*</exclude>
                <exclude>**/com/megaease/easeagent/boot/*</exclude>
                <exclude>**/com/megaease/easeagent/log4j2/*</exclude>
            </excludes>
            <includes>
                <include>com.megaease.easeagent:build</include>
            </includes>
            <!--
            <unpack>false</unpack>
            -->
        </dependencySet>
        <dependencySet>
            <outputDirectory/>
            <includes>
                <include>com.megaease.easeagent:loader</include>
            </includes>
            <unpack>true</unpack>
        </dependencySet>
    </dependencySets>
</assembly>


================================================
FILE: build/src/main/java/com/megaease/easeagent/StartBootstrap.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent;

import com.megaease.easeagent.core.Bootstrap;

import java.lang.instrument.Instrumentation;

public class StartBootstrap {
    private StartBootstrap() {}

    public static void premain(String args, Instrumentation inst, String javaAgentJarPath) {
        Bootstrap.start(args, inst, javaAgentJarPath);
    }
}


================================================
FILE: build/src/main/resources/agent-to-cloud_1.0.properties
================================================
# for v2.0 agent send to megacloud-v1.0 kafka topic setting

plugin.observability.global.metric.topic=application-meter
plugin.observability.access.metric.topic=application-log
plugin.observability.redis.metric.topic=platform-meter
plugin.observability.rabbit.metric.topic=platform-meter
plugin.observability.kafka.metric.topic=platform-meter
plugin.observability.elasticsearch.metric.topic=platform-meter

plugin.observability.jvmGc.metric.topic=platform-meter
plugin.observability.jvmMemory.metric.topic=platform-meter





================================================
FILE: build/src/main/resources/agent.properties
================================================
name=demo-service
system=demo-system
### http server
# When the enabled value = false, agent will not start the http server
# You can use -Deaseagent.server.enabled=[true | false] to override.
easeagent.server.enabled=true
# http server port. You can use -Deaseagent.server.port=[port] to override.
easeagent.server.port=9900
# Enable health/readiness
easeagent.health.readiness.enabled=true
plugin.integrability.global.healthReady.enabled=true
# forwarded headers page
# Pass-through headers from the root process all the way to the end
# format: easeagent.progress.forwarded.headers={headerName}
#easeagent.progress.forwarded.headers=X-Forwarded-For
#easeagent.progress.forwarded.headers=X-Location,X-Mesh-Service-Canary,X-Phone-Os
###
### default tracings configuration
###
# sampledType:
## counting: percentage sampling, sampled limit 0.01 to 1, 1 is always sample, 0 is never sample, 0.1 is ten samples per hundred
## rate_limiting: traces per second, sampled >= 0, 0 is never sample, 10 is max 10 traces per second
## boundary: percentage sampling by traceId, sampled limit 0.0001 to 1, 1 is always sample, 0 is never sample
##           if sampled=0.001, when (traceId^random)%10000<=(0.001*10000) sampled
## sampledType must be used with sampled, otherwise the default value is used Sampler.ALWAYS_SAMPLE
observability.tracings.sampledType=
observability.tracings.sampled=1
# get header from response headers then tag to tracing span
# format: observability.tracings.tag.response.headers.{key}={value}
# support ease mesh
# X-EG-Circuit-Breaker
# X-EG-Retryer
# X-EG-Rate-Limiter
# X-EG-Time-Limiter
observability.tracings.tag.response.headers.eg.0=X-EG-Circuit-Breaker
observability.tracings.tag.response.headers.eg.1=X-EG-Retryer
observability.tracings.tag.response.headers.eg.2=X-EG-Rate-Limiter
observability.tracings.tag.response.headers.eg.3=X-EG-Time-Limiter
# -------------------- plugin global config ---------------------
plugin.observability.global.init.enabled=true
plugin.observability.global.tracing.enabled=true
plugin.observability.global.metric.enabled=true
plugin.observability.global.metric.interval=30
plugin.observability.global.metric.topic=application-metrics
plugin.observability.global.metric.url=/application-metrics
##
# if different with reporter.outputServer.appendType,
# following options can be used in user config file to override
# the default or global one
#
## when it's scrape by prometheus, noop can be used
# plugin.observability.global.metric.appendType=noop
## for debug, console can be used
# plugin.observability.global.metric.appendType=console
# plugin.observability.global.metric.appendType=http
#
# add service name to header enabled by name for easemesh
plugin.integrability.global.addServiceNameHead.enabled=true
# redirect the middleware address when env has address, see: com.megaease.easeagent.plugin.api.middleware.RedirectProcessor
# about redirect: jdbc, kafka, rabbitmq, redis,
plugin.integrability.global.redirect.enabled=true
# forwarded headers enabled.
# headers see config: easeagent.progress.forwarded.headers.???=???
plugin.integrability.global.forwarded.enabled=true
plugin.hook.global.foundation.enabled=true
plugin.observability.global.log.enabled=true
plugin.observability.global.log.topic=application-log
plugin.observability.global.log.url=/application-log
#plugin.observability.global.log.appendType=console
plugin.observability.global.log.level=INFO
plugin.observability.global.log.encoder=LogDataJsonEncoder
#plugin.observability.global.log.encoder.collectMdcKeys=
# support pattern:
# "logLevel": "%-5level",
# "threadId": "%thread",
# "location": "%logger{36}",
# "message": "%msg%n",
plugin.observability.global.log.encoder.timestamp=%d{UNIX_MILLIS}
plugin.observability.global.log.encoder.logLevel=%-5level
plugin.observability.global.log.encoder.threadId=%thread
plugin.observability.global.log.encoder.location=%logger{36}
plugin.observability.global.log.encoder.message=%msg%n%xEx{3}
#
# -------------------- access ---------------------
## access: servlet and spring gateway
plugin.observability.access.log.encoder=AccessLogJsonEncoder
# plugin.observability.access.metric.appendType=kafka
#plugin.observability.logback.log.enabled=false
#plugin.observability.log4j2.log.enabled=false
# ----------------------------------------------
# if the plugin configuration is consistent with the global namespace,
# do not add configuration items not commented out in this default configuration file.
# otherwise, they can not be overridden by Global configuration in user's configuration file.
#
# -------------------- jvm  ---------------------
# plugin.observability.jvmGc.metric.enabled=true
# plugin.observability.jvmGc.metric.interval=30
plugin.observability.jvmGc.metric.topic=platform-metrics
plugin.observability.jvmGc.metric.url=/platform-metrics
# plugin.observability.jvmGc.metric.appendType=kafka
# plugin.observability.jvmMemory.metric.enabled=true
# plugin.observability.jvmMemory.metric.interval=30
plugin.observability.jvmMemory.metric.topic=platform-metrics
plugin.observability.jvmMemory.metric.url=/platform-metrics
# plugin.observability.jvmMemory.metric.appendType=kafka
#
# -------------------- async ---------------------
# plugin.observability.async.tracing.enabled=true
#
# -------------------- elasticsearch redirect ---------------------
# plugin.integrability.elasticsearch.redirect.enabled=true
# plugin.observability.elasticsearch.tracing.enabled=true
# elasticsearch metric
# plugin.observability.elasticsearch.metric.enabled=true
# plugin.observability.elasticsearch.metric.interval=30
plugin.observability.elasticsearch.metric.topic=platform-metrics
plugin.observability.elasticsearch.metric.url=/platform-metrics
# plugin.observability.elasticsearch.metric.appendType=kafka
#
# -------------------- httpServlet ---------------------
# plugin.observability.httpServlet.tracing.enabled=true
# plugin.observability.httpServlet.metric.enabled=true
# plugin.observability.httpServlet.metric.interval=30
# plugin.observability.httpServlet.metric.topic=application-metrics
# plugin.observability.httpServlet.metric.url=/application-metrics
# plugin.observability.httpServlet.metric.appendType=kafka
#
#
# -------------------- tomcat ---------------------
# plugin.observability.tomcat.tracing.enabled=true
# plugin.observability.tomcat.metric.enabled=true
# plugin.observability.tomcat.metric.interval=30
# plugin.observability.tomcat.metric.topic=application-metrics
# plugin.observability.tomcat.metric.url=/application-metrics
# plugin.observability.tomcat.metric.appendType=kafka
#
# -------------------- jdbc ---------------------
## jdbc tracing
# plugin.observability.jdbc.tracing.enabled=true
# jdbcStatement metric
# plugin.observability.jdbcStatement.metric.enabled=true
# plugin.observability.jdbcStatement.metric.interval=30
# plugin.observability.jdbcStatement.metric.topic=application-metrics
# plugin.observability.jdbcStatement.metric.url=/application-metrics
# plugin.observability.jdbcStatement.metric.appendType=kafka
## jdbcConnection metric
# plugin.observability.jdbcConnection.metric.enabled=true
# plugin.observability.jdbcConnection.metric.interval=30
# plugin.observability.jdbcConnection.metric.topic=application-metrics
# plugin.observability.jdbcConnection.metric.url=/application-metrics
# plugin.observability.jdbcConnection.metric.appendType=kafka
## sql compress
## compress.enabled=true, can use md5Dictionary to compress
## compress.enabled=false, use original sql
plugin.observability.jdbc.sql.compress.enabled=true
## md5Dictionary metric
# plugin.observability.md5Dictionary.metric.enabled=true
# plugin.observability.md5Dictionary.metric.interval=30
# plugin.observability.md5Dictionary.metric.topic=application-metrics
# plugin.observability.md5Dictionary.metric.url=/application-metrics
# plugin.observability.md5Dictionary.metric.appendType=kafka
## jdbc redirect
# plugin.integrability.jdbc.redirect.enabled=true
#
# -------------------- kafka ---------------------
# kafka tracing
# plugin.observability.kafka.tracing.enabled=true
# kafka metric
# plugin.observability.kafka.metric.enabled=true
# plugin.observability.kafka.metric.interval=30
plugin.observability.kafka.metric.topic=platform-metrics
plugin.observability.kafka.metric.url=/platform-metrics
# plugin.observability.kafka.metric.appendType=kafka
# kafka redirect
# plugin.integrability.kafka.redirect.enabled=true
#
# -------------------- rabbitmq ---------------------
# rabbitmq tracing
# plugin.observability.rabbitmq.tracing.enabled=true
# rabbitmq metric
# plugin.observability.rabbitmq.metric.enabled=true
# plugin.observability.rabbitmq.metric.interval=30
plugin.observability.rabbitmq.metric.topic=platform-metrics
plugin.observability.rabbitmq.metric.url=/platform-metrics
# plugin.observability.rabbitmq.metric.appendType=kafka
# rabbitmq redirect
# plugin.integrability.rabbitmq.redirect.enabled=true
#
# -------------------- redis ---------------------
# redis tracing
# plugin.observability.redis.tracing.enabled=true
# redis metric
# plugin.observability.redis.metric.enabled=true
# plugin.observability.redis.metric.interval=30
plugin.observability.redis.metric.topic=platform-metrics
plugin.observability.redis.metric.url=/platform-metrics
# plugin.observability.redis.metric.appendType=kafka
# redis redirect
# plugin.integrability.redis.redirect.enabled=true
#
# -------------------- springGateway ---------------------
# springGateway tracing
# plugin.observability.springGateway.tracing.enabled=true
# springGateway metric
# plugin.observability.springGateway.metric.enabled=true
# plugin.observability.springGateway.metric.interval=30
# plugin.observability.springGateway.metric.topic=application-metrics
# plugin.observability.springGateway.metric.url=/application-metrics
# plugin.observability.springGateway.metric.appendType=kafka
#
# -------------------- request ---------------------
## httpclient tracing\uFF1Ahttpclient and httpclient5
# plugin.observability.httpclient.tracing.enabled=true
## okHttp tracing
# plugin.observability.okHttp.tracing.enabled=true
## webclient tracing
# plugin.observability.webclient.tracing.enabled=true
## feignClient tracing
# plugin.observability.feignClient.tracing.enabled=true
## restTemplate tracing
# plugin.observability.restTemplate.tracing.enabled=true
## httpURLConnection tracing
# plugin.observability.httpURLConnection.tracing.enabled=true
# -------------------- service name ---------------------
## add service name to header by name for easemesh. default name: X-Mesh-RPC-Service
# plugin.integrability.serviceName.addServiceNameHead.propagate.head=X-Mesh-RPC-Service
#
# -------------------- mongodb ---------------------
## mongodb tracing
# plugin.observability.mongodb.tracing.enabled=true
## mongodb metric
# plugin.observability.mongodb.metric.enabled=true
# plugin.observability.mongodb.metric.interval=30
plugin.observability.mongodb.metric.topic=platform-metrics
plugin.observability.mongodb.metric.url=/platform-metrics
# plugin.observability.mongodb.metric.appendType=kafka
## mongodb redirect
# plugin.integrability.mongodb.redirect.enabled=true
## mongodb foundation
# plugin.hook.mongodb.foundation.enabled=true
#
# -------------------- motan ---------------------
# motan tracing
# plugin.observability.motan.tracing.enabled=true
## motan args collect switch
# plugin.observability.motan.tracing.args.collect.enabled=false
## motan result collect switch
# plugin.observability.motan.tracing.result.collect.enabled=false
# motan metric
# plugin.observability.motan.metric.enabled=true
# plugin.observability.motan.metric.interval=30
plugin.observability.motan.metric.topic=platform-metrics
plugin.observability.motan.metric.url=/platform-metrics
# plugin.observability.motan.metric.appendType=kafka
#
# -------------------- dubbo ---------------------
## dubbo tracing
#plugin.observability.dubbo.tracing.enabled=true
## dubbo arguments collect switch
#plugin.observability.dubbo.tracing.args.collect.enabled=false
## dubbo return result collect switch
#plugin.observability.dubbo.tracing.result.collect.enabled=false
## dubbo metric
#plugin.observability.dubbo.metric.enabled=true
#plugin.observability.dubbo.metric.interval=30
#plugin.observability.dubbo.metric.topic=platform-metrics
#plugin.observability.dubbo.metric.url=/platform-metrics
# plugin.observability.dubbo.metric.appendType=kafka
# -------------------- sofarpc ---------------------
# sofarpc tracing
# plugin.observability.sofarpc.tracing.enabled=true
## sofarpc args collect switch
# plugin.observability.sofarpc.tracing.args.collect.enabled=false
## sofarpc result collect switch
# plugin.observability.sofarpc.tracing.result.collect.enabled=false
# sofarpc metric
# plugin.observability.sofarpc.metric.enabled=true
# plugin.observability.sofarpc.metric.interval=30
plugin.observability.sofarpc.metric.topic=platform-metrics
plugin.observability.sofarpc.metric.url=/platform-metrics
# plugin.observability.sofarpc.metric.appendType=kafka
# -------------- output ------------------
## http/kafka/zipkin server host and port for tracing and metric
###### example ######
## http: [http|https]://127.0.0.1:8080/report
## kafka: 192.168.1.2:9092, 192.168.1.3:9092, 192.168.1.3:9092
## zipkin: [http|https]://127.0.0.1:8080/zipkin
reporter.outputServer.bootstrapServer=127.0.0.1:9092
reporter.outputServer.appendType=console
reporter.outputServer.timeout=1000
## enabled=false: disable output tracing and metric
## enabled=true: output tracing and metric
reporter.outputServer.enabled=true
## username and password for http basic auth
reporter.outputServer.username=
reporter.outputServer.password=
## enable=false: disable mtls
## enable=true: enable tls
## key, cert, ca_cert is enabled when tls.enable=true
reporter.outputServer.tls.enable=false
reporter.outputServer.tls.key=
reporter.outputServer.tls.cert=
reporter.outputServer.tls.ca_cert=
# --- redefine to output properties
reporter.log.output.messageMaxBytes=999900
reporter.log.output.reportThread=1
reporter.log.output.queuedMaxSpans=1000
reporter.log.output.queuedMaxSize=1000000
reporter.log.output.messageTimeout=1000
## sender.appendType config
## [http] send to http server
## [kafka] send to kafka
## [console] send to console
## reporter.log.sender.appendType=console
## enabled=true:
# reporter.log.sender.enabled=true
# reporter.log.sender.url=/application-log
## sender.appendType config
## [http] send to http server
## [kafka] send to kafka
## [console] send to console
# reporter.tracing.sender.appendType=http
# reporter.tracing.sender.appendType=console
## enabled=true:
reporter.tracing.sender.enabled=true
## url is only used in http
## append to outputServer.bootstrapServer
###### example ######
## reporter.outputServer.bootstrapServer=http://127.0.0.1:8080/report
## reporter.tracing.sender.url=/tracing
## final output url: http://127.0.0.1:8080/report/tracing
## if url is start with [http|https], url override reporter.outputServer.bootstrapServer
###### example ######
## reporter.outputServer.bootstrapServer=http://127.0.0.1:8080/report
## reporter.tracing.sender.url=http://127.0.0.10:9090/tracing
## final output url: http://127.0.0.10:9090/tracing
reporter.tracing.sender.url=/application-tracing-log
## topic for kafka use
reporter.tracing.sender.topic=application-tracing-log
reporter.tracing.encoder=SpanJsonEncoder
# --- redefine to output properties
reporter.tracing.output.messageMaxBytes=999900
reporter.tracing.output.reportThread=1
reporter.tracing.output.queuedMaxSpans=1000
reporter.tracing.output.queuedMaxSize=1000000
reporter.tracing.output.messageTimeout=1000
## sender.appendType config
## [http] send to http server
## [metricKafka] send to kafka
## [console] send to console
#reporter.metric.sender.appendType=http
#reporter.metric.sender.appendType=console
## url is only used in http
## append to outputServer.bootstrapServer
###### example ######
## reporter.outputServer.bootstrapServer=http://127.0.0.1:8080/report
## reporter.metric.sender.url=/metric
## final output url: http://127.0.0.1:8080/report/metric
## if url is start with [http|https], url override reporter.outputServer.bootstrapServer
###### example ######
## reporter.outputServer.bootstrapServer=http://127.0.0.1:8080/report
## reporter.metric.sender.url=http://127.0.0.10:9090/metric
## final output url: http://127.0.0.10:9090/metric
#reporter.metric.sender.url=/metrics

## support spring boot 3.5.3: jdk17+3.5.3
#runtime.code.version.points.jdk=jdk17
#runtime.code.version.points.spring-boot=3.x.x


================================================
FILE: build/src/main/resources/easeagent-log4j2.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <RollingFile name="RollingFile" fileName="logs/easeagent.log" filePattern="logs/easeagent-%d{MM-dd-yyyy}.log"
                     ignoreExceptions="false">
            <PatternLayout>
                <Pattern>%d [%10.10t] %5p %10.10c{1} - %msg%n</Pattern>
            </PatternLayout>
            <TimeBasedTriggeringPolicy />
        </RollingFile>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d [%10.10t] %5p %10.10c{1} - [%X{traceId}/%X{spanId}] %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
<!--            <AppenderRef ref="RollingFile"/>-->
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

================================================
FILE: build/src/main/resources/user-minimal-cfg.properties
================================================
## This a minimal configuration required to start the EaseAgent.
## In most cases, this is all the configuration items that the normal user needs to be concerned about.
## 
## When the user specifies a user configration file as this one, the items in user config file will override the default 
## configuration in agent.properties packaged in easeagent.jar
##
## -Deaseagent.config.path=/path/to/user-cfg-file

name=demo-springweb
system=demo-system

###
### report configuration  
###
reporter.outputServer.bootstrapServer=http://127.0.0.1:9411
reporter.outputServer.appendType=console

##
## Global metric configuration
## the appendType is same as outputServer, so comment out
# plugin.observability.global.metric.appendType=console

##
## tracing sender

## [http] send to http server
## [kafka] send to kafka
## [console] send to console
#
reporter.tracing.sender.appendType=
# reporter.tracing.sender.url=http://tempo:9411/api/v2/spans
reporter.tracing.sender.url=http://localhost:9411/api/v2/spans

## access log sender
## [http] send to http server
## [kafka] send to kafka
## [console] send to console
## the appendType is same as outputServer, so comment out
## reporter.log.sender.appendType=console




================================================
FILE: config/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright (c) 2021, MegaEase
  ~ All rights reserved.
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~   http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>easeagent</artifactId>
        <groupId>com.megaease.easeagent</groupId>
        <version>2.3.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>config</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.megaease.easeagent</groupId>
            <artifactId>plugin-api</artifactId>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

        <dependency>
            <groupId>com.megaease.easeagent</groupId>
            <artifactId>log4j2-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>com.megaease.easeagent</groupId>
            <artifactId>log4j2-mock</artifactId>
            <version>${project.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.stefanbirkner</groupId>
            <artifactId>system-rules</artifactId>
            <version>1.19.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/AutoRefreshConfigItem.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import com.megaease.easeagent.plugin.api.config.Config;

import java.util.function.BiFunction;

public class AutoRefreshConfigItem<T> {
    private volatile T value;

    public AutoRefreshConfigItem(Config config, String name, BiFunction<Config, String, T> func) {
        ConfigUtils.bindProp(name, config, func, v -> this.value = v);
    }

    public T getValue() {
        return value;
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/CompatibilityConversion.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.megaease.easeagent.config;

import com.megaease.easeagent.log4j2.Logger;
import com.megaease.easeagent.log4j2.LoggerFactory;
import com.megaease.easeagent.plugin.api.ProgressFields;
import com.megaease.easeagent.plugin.api.config.ConfigConst;

import javax.annotation.Nonnull;
import java.util.*;
import java.util.function.BiFunction;

public class CompatibilityConversion {
    private static final Logger LOGGER = LoggerFactory.getLogger(CompatibilityConversion.class);
    protected static final String[] REQUEST_NAMESPACE = new String[]{
        ConfigConst.Namespace.HTTPCLIENT,
        ConfigConst.Namespace.OK_HTTP,
        ConfigConst.Namespace.WEB_CLIENT,
        ConfigConst.Namespace.FEIGN_CLIENT,
        ConfigConst.Namespace.REST_TEMPLATE,
    };
    private static final Map<String, BiFunction<String, String, Conversion<?>>> KEY_TO_NAMESPACE;
    private static final Set<String> METRIC_SKIP;
    private static final Set<String> TRACING_SKIP;

    static {
        Map<String, BiFunction<String, String, Conversion<?>>> map = new HashMap<>();
        map.put(ConfigConst.Observability.KEY_METRICS_ACCESS, SingleBuilder.observability(ConfigConst.Namespace.ACCESS));

        map.put(ConfigConst.Observability.KEY_METRICS_REQUEST, MultipleBuilder.observability(Arrays.asList(REQUEST_NAMESPACE)));
        map.put(ConfigConst.Observability.KEY_METRICS_JDBC_STATEMENT, SingleBuilder.observability(ConfigConst.Namespace.JDBC_STATEMENT));
        map.put(ConfigConst.Observability.KEY_METRICS_JDBC_CONNECTION, SingleBuilder.observability(ConfigConst.Namespace.JDBC_CONNECTION));
        map.put(ConfigConst.Observability.KEY_METRICS_MD5_DICTIONARY, SingleBuilder.observability(ConfigConst.Namespace.MD5_DICTIONARY));
        map.put(ConfigConst.Observability.KEY_METRICS_RABBIT, SingleBuilder.observability(ConfigConst.Namespace.RABBITMQ));
        map.put(ConfigConst.Observability.KEY_METRICS_KAFKA, SingleBuilder.observability(ConfigConst.Namespace.KAFKA));
        map.put(ConfigConst.Observability.KEY_METRICS_CACHE, SingleBuilder.observability(ConfigConst.Namespace.REDIS));
        map.put(ConfigConst.Observability.KEY_METRICS_JVM_GC, null);
        map.put(ConfigConst.Observability.KEY_METRICS_JVM_MEMORY, null);

        map.put(ConfigConst.Observability.KEY_TRACE_REQUEST, MultipleBuilder.observability(Arrays.asList(REQUEST_NAMESPACE)));
        map.put(ConfigConst.Observability.KEY_TRACE_REMOTE_INVOKE, SingleBuilder.observability(ConfigConst.Namespace.WEB_CLIENT));
        map.put(ConfigConst.Observability.KEY_TRACE_KAFKA, SingleBuilder.observability(ConfigConst.Namespace.KAFKA));
        map.put(ConfigConst.Observability.KEY_TRACE_JDBC, SingleBuilder.observability(ConfigConst.Namespace.JDBC));
        map.put(ConfigConst.Observability.KEY_TRACE_CACHE, SingleBuilder.observability(ConfigConst.Namespace.REDIS));
        map.put(ConfigConst.Observability.KEY_TRACE_RABBIT, SingleBuilder.observability(ConfigConst.Namespace.RABBITMQ));

        KEY_TO_NAMESPACE = map;

        TRACING_SKIP = new HashSet<>();
        TRACING_SKIP.add(ConfigConst.Observability.KEY_COMM_ENABLED);
        TRACING_SKIP.add(ConfigConst.Observability.KEY_COMM_SAMPLED_TYPE);
        TRACING_SKIP.add(ConfigConst.Observability.KEY_COMM_SAMPLED);
        TRACING_SKIP.add(ConfigConst.Observability.KEY_COMM_OUTPUT);
        TRACING_SKIP.add(ConfigConst.Observability.KEY_COMM_TAG);

        METRIC_SKIP = new HashSet<>();
        METRIC_SKIP.add(ConfigConst.Observability.KEY_METRICS_JVM_GC);
        METRIC_SKIP.add(ConfigConst.Observability.KEY_METRICS_JVM_MEMORY);
    }

    public static Map<String, String> transform(Map<String, String> oldConfigs) {
        Map<String, Object> changedKeys = new HashMap<>();
        Map<String, String> newConfigs = new HashMap<>();
        for (Map.Entry<String, String> entry : oldConfigs.entrySet()) {
            Conversion<?> conversion = transformConversion(entry.getKey());
            Object changed = conversion.transform(newConfigs, entry.getValue());
            if (conversion.isChange()) {
                changedKeys.put(entry.getKey(), changed);
            }
        }
        if (changedKeys.isEmpty()) {
            return oldConfigs;
        }
        if (LOGGER.isInfoEnabled()) {
            LOGGER.info("config key has transform: ");
            for (Map.Entry<String, Object> entry : changedKeys.entrySet()) {
                LOGGER.info("{} to {}", entry.getKey(), entry.getValue());
            }
        }
        return newConfigs;
    }

    private static Conversion<?> transformConversion(String key) {
        if (key.startsWith("observability.metrics.")) {
            return metricConversion(key);
        } else if (key.startsWith("observability.tracings.")) {
            return tracingConversion(key);
        } else if (key.startsWith(ConfigConst.GlobalCanaryLabels.SERVICE_HEADERS + ".")) {
//            return forwardedHeadersConversion(key);
        }
        return new FinalConversion(key, false);
    }

    private static Conversion<?> metricConversion(String key) {
        if (key.equals(ConfigConst.Observability.METRICS_ENABLED)) {
            return new MultipleFinalConversion(Arrays.asList(new FinalConversion(ConfigConst.Observability.METRICS_ENABLED, true),
                new FinalConversion(ConfigConst.Plugin.OBSERVABILITY_GLOBAL_METRIC_ENABLED, true)), true);
        }
        return conversion(key, METRIC_SKIP, ConfigConst.PluginID.METRIC);
    }


    private static Conversion<?> tracingConversion(String key) {
        if (key.equals(ConfigConst.Observability.TRACE_ENABLED)) {
            return new FinalConversion(ConfigConst.Plugin.OBSERVABILITY_GLOBAL_TRACING_ENABLED, true);
        }
        return conversion(key, TRACING_SKIP, ConfigConst.PluginID.TRACING);
    }

//    private static Conversion<?> forwardedHeadersConversion(String key) {
//        return new FinalConversion(key.replace(ConfigConst.GlobalCanaryLabels.SERVICE_HEADERS + ".", ProgressFields.EASEAGENT_PROGRESS_FORWARDED_HEADERS_CONFIG + "."), true);
//    }

    private static Conversion<?> conversion(String key, Set<String> skipSet, String pluginId) {
        String[] keys = ConfigConst.split(key);
        if (keys.length < 4) {
            return new FinalConversion(key, false);
        }
        String key2 = keys[2];
        if (skipSet.contains(key2)) {
            return new FinalConversion(key, false);
        }
        BiFunction<String, String, Conversion<?>> builder = KEY_TO_NAMESPACE.get(key2);
        if (builder == null) {
            builder = SingleBuilder.observability(key2);
        }
        String[] properties = new String[keys.length - 3];
        int index = 0;
        for (int i = 3; i < keys.length; i++) {
            properties[index++] = keys[i];
        }
        return builder.apply(pluginId, ConfigConst.join(properties));
    }

    interface Conversion<K> {
        K transform(Map<String, String> configs, String value);

        boolean isChange();
    }

    static class FinalConversion implements Conversion<String> {
        private final String key;
        private final boolean change;

        public FinalConversion(String key, boolean change) {
            this.key = key;
            this.change = change;
        }

        @Override
        public String transform(Map<String, String> configs, String value) {
            configs.put(key, value);
            return key;
        }

        public boolean isChange() {
            return change;
        }
    }

    static class MultipleFinalConversion implements Conversion<List<String>> {
        private final List<FinalConversion> conversions;
        private final boolean change;

        MultipleFinalConversion(@Nonnull List<FinalConversion> conversions, boolean change) {
            this.conversions = conversions;
            this.change = change;
        }

        @Override
        public List<String> transform(Map<String, String> configs, String value) {
            List<String> result = new ArrayList<>();
            for (FinalConversion conversion : conversions) {
                result.add(conversion.transform(configs, value));
            }
            return result;
        }

        @Override
        public boolean isChange() {
            return change;
        }
    }

    static class SingleConversion implements Conversion<String> {
        private final String domain;
        private final String namespace;
        private final String id;
        private final String properties;

        public SingleConversion(String domain, String namespace, String id, String properties) {
            this.domain = domain;
            this.namespace = namespace;
            this.id = id;
            this.properties = properties;
        }

        @Override
        public String transform(Map<String, String> configs, String value) {
            String key = ConfigUtils.buildPluginProperty(domain, namespace, id, properties);
            configs.put(key, value);
            return key;
        }

        @Override
        public boolean isChange() {
            return true;
        }
    }

    static class MultipleConversion implements Conversion<List<String>> {
        private final String domain;
        private final List<String> namespaces;
        private final String id;
        private final String properties;

        public MultipleConversion(String domain, List<String> namespaces, String id, String properties) {
            this.domain = domain;
            this.namespaces = namespaces;
            this.id = id;
            this.properties = properties;
        }

        @Override
        public List<String> transform(Map<String, String> configs, String value) {
            List<String> keys = new ArrayList<>();
            for (String namespace : namespaces) {
                String key = ConfigUtils.buildPluginProperty(domain, namespace, id, properties);
                keys.add(key);
                configs.put(key, value);
            }
            return keys;
        }

        @Override
        public boolean isChange() {
            return true;
        }
    }

    static class SingleBuilder implements BiFunction<String, String, Conversion<?>> {
        private final String domain;
        private final String namespace;

        public SingleBuilder(String domain, String namespace) {
            this.domain = domain;
            this.namespace = namespace;
        }

        @Override
        public Conversion apply(String id, String properties) {
            return new SingleConversion(domain, namespace, id, properties);
        }

        static SingleBuilder observability(String namespace) {
            return new SingleBuilder(ConfigConst.OBSERVABILITY, namespace);
        }
    }

    static class MultipleBuilder implements BiFunction<String, String, Conversion<?>> {
        private final String domain;
        private final List<String> namespaces;

        public MultipleBuilder(String domain, List<String> namespaces) {
            this.domain = domain;
            this.namespaces = namespaces;
        }

        @Override
        public Conversion apply(String id, String properties) {
            return new MultipleConversion(domain, namespaces, id, properties);
        }

        static MultipleBuilder observability(List<String> namespaces) {
            return new MultipleBuilder(ConfigConst.OBSERVABILITY, namespaces);
        }
    }


}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/ConfigAware.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import com.megaease.easeagent.plugin.api.config.Config;

public interface ConfigAware {
    void setConfig(Config config);
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/ConfigFactory.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import com.megaease.easeagent.log4j2.Logger;
import com.megaease.easeagent.log4j2.LoggerFactory;
import com.megaease.easeagent.plugin.utils.ImmutableMap;
import com.megaease.easeagent.plugin.utils.SystemEnv;
import com.megaease.easeagent.plugin.utils.common.JsonUtil;
import com.megaease.easeagent.plugin.utils.common.StringUtils;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class ConfigFactory {
    private static final Logger LOGGER = LoggerFactory.getLogger(ConfigFactory.class);
    private static final String CONFIG_PROP_FILE = "agent.properties";
    private static final String CONFIG_YAML_FILE = "agent.yaml";

    public static final String AGENT_CONFIG_PATH_PROP_KEY = "easeagent.config.path";

    public static final String AGENT_SERVICE = "name";
    public static final String AGENT_SYSTEM = "system";

    public static final String AGENT_SERVER_PORT = "easeagent.server.port";
    public static final String AGENT_SERVER_ENABLED = "easeagent.server.enabled";

    public static final String EASEAGENT_ENV_CONFIG = "EASEAGENT_ENV_CONFIG";

    private static final Map<String, String> AGENT_CONFIG_KEYS_TO_PROPS =
        ImmutableMap.<String, String>builder()
            .put("easeagent.name", AGENT_SERVICE)
            .put("easeagent.system", AGENT_SYSTEM)
            .put("easeagent.server.port", AGENT_SERVER_PORT)
            .put("easeagent.server.enabled", AGENT_SERVER_ENABLED)
            .build();

    // OTEL_SERVICE_NAME=xxx
    private static final Map<String, String> AGENT_ENV_KEY_TO_PROPS = new HashMap<>();


    static {
        for (Map.Entry<String, String> entry : AGENT_CONFIG_KEYS_TO_PROPS.entrySet()) {
            // dot.case -> UPPER_UNDERSCORE
            AGENT_ENV_KEY_TO_PROPS.put(
                ConfigPropertiesUtils.toEnvVarName(entry.getKey()),
                entry.getValue()
            );
        }
    }

    /**
     * update config value from environment variables and java properties
     * <p>
     * java properties > environment variables > env:EASEAGENT_ENV_CONFIG={} > default
     */
    static Map<String, String> updateEnvCfg() {
        Map<String, String> envCfg = new TreeMap<>();

        String configEnv = SystemEnv.get(EASEAGENT_ENV_CONFIG);
        if (StringUtils.isNotEmpty(configEnv)) {
            Map<String, Object> map = JsonUtil.toMap(configEnv);
            Map<String, String> strMap = new HashMap<>();
            if (!map.isEmpty()) {
                for (Map.Entry<String, Object> entry : map.entrySet()) {
                    strMap.put(entry.getKey(), entry.getValue().toString());
                }
            }
            envCfg.putAll(strMap);
        }

        // override by environment variables, eg: export EASEAGENT_NAME=xxx
        for (Map.Entry<String, String> entry : AGENT_ENV_KEY_TO_PROPS.entrySet()) {
            String value = SystemEnv.get(entry.getKey());
            if (!StringUtils.isEmpty(value)) {
                envCfg.put(entry.getValue(), value);
            }
        }

        // override by java properties; eg: java -Deaseagent.name=xxx
        for (Map.Entry<String, String> entry : AGENT_CONFIG_KEYS_TO_PROPS.entrySet()) {
            String value = System.getProperty(entry.getKey());
            if (!StringUtils.isEmpty(value)) {
                envCfg.put(entry.getValue(), value);
            }
        }

        return envCfg;
    }

    private ConfigFactory() {
    }

    /**
     * Get config file path from system properties or environment variables
     */
    public static String getConfigPath() {
        // get config path from -Deaseagent.config.path=/easeagent/agent.properties || export EASEAGENT_CONFIG_PATH=/easeagent/agent.properties
        String path = ConfigPropertiesUtils.getString(AGENT_CONFIG_PATH_PROP_KEY);

        if (StringUtils.isEmpty(path)) {
            // eg: -Dotel.javaagent.configuration-file=/easeagent/agent.properties || export OTEL_JAVAAGENT_CONFIGURATION_FILE=/easeagent/agent.properties
            path = OtelSdkConfigs.getConfigPath();
        }
        return path;
    }

    public static GlobalConfigs loadConfigs(String pathname, ClassLoader loader) {
        // load property configuration file if exist
        GlobalConfigs configs = loadDefaultConfigs(loader, CONFIG_PROP_FILE);

        // load yaml configuration file if exist
        GlobalConfigs yConfigs = loadDefaultConfigs(loader, CONFIG_YAML_FILE);
        configs.mergeConfigs(yConfigs);

        // override by user special config file
        if (StringUtils.isNotEmpty(pathname)) {
            GlobalConfigs configsFromOuterFile = ConfigLoader.loadFromFile(new File(pathname));
            LOGGER.info("Loaded user special config file: {}", pathname);
            configs.mergeConfigs(configsFromOuterFile);
        }

        // override by opentelemetry sdk env config
        configs.updateConfigsNotNotify(OtelSdkConfigs.updateEnvCfg());

        // check environment cfg override
        configs.updateConfigsNotNotify(updateEnvCfg());

        if (LOGGER.isDebugEnabled()) {
            final String display = configs.toPrettyDisplay();
            LOGGER.debug("Loaded conf:\n{}", display);
        }
        return configs;
    }

    private static GlobalConfigs loadDefaultConfigs(ClassLoader loader, String file) {
        GlobalConfigs globalConfigs = JarFileConfigLoader.load(file);
        if (globalConfigs != null) {
            return globalConfigs;
        }
        return ConfigLoader.loadFromClasspath(loader, file);
    }

}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/ConfigLoader.java
================================================
/*
 * Copyright (c) 2021, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import com.megaease.easeagent.config.yaml.YamlReader;
import com.megaease.easeagent.log4j2.Logger;
import com.megaease.easeagent.log4j2.LoggerFactory;
import org.yaml.snakeyaml.parser.ParserException;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class ConfigLoader {
    private static final Logger LOGGER = LoggerFactory.getLogger(ConfigLoader.class);

    private static boolean checkYaml(String filename) {
        return filename.endsWith(".yaml") || filename.endsWith(".yml");
    }

    static GlobalConfigs loadFromFile(File file) {
        try (FileInputStream in = new FileInputStream(file)) {
            return ConfigLoader.loadFromStream(in, file.getAbsolutePath());
        } catch (IOException e) {
            LOGGER.warn("Load config file failure: {}", file.getAbsolutePath());
        }
        return new GlobalConfigs(Collections.emptyMap());
    }

    static GlobalConfigs loadFromStream(InputStream in, String filename) throws IOException {
        if (in != null) {
            Map<String, String> map;
            if (checkYaml(filename)) {
                try {
                    map = new YamlReader().load(in).compress();
                } catch (ParserException e) {
                    LOGGER.warn("Wrong Yaml format, load config file failure: {}", filename);
                    map = Collections.emptyMap();
                }
            } else {
                map = extractPropsMap(in);
            }
            return new GlobalConfigs(map);
        } else {
            return new GlobalConfigs(Collections.emptyMap());
        }
    }

    private static HashMap<String, String> extractPropsMap(InputStream in) throws IOException {
        Properties properties = new Properties();
        properties.load(in);
        HashMap<String, String> map = new HashMap<>();
        for (String one : properties.stringPropertyNames()) {
            map.put(one, properties.getProperty(one));
        }
        return map;
    }

    static GlobalConfigs loadFromClasspath(ClassLoader classLoader, String file) {
        try (InputStream in = classLoader.getResourceAsStream(file)) {
            return ConfigLoader.loadFromStream(in, file);
        } catch (IOException e) {
            LOGGER.warn("Load config file:{} by classloader:{} failure: {}", file, classLoader.toString(), e);
        }

        return new GlobalConfigs(Collections.emptyMap());
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/ConfigManagerMXBean.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import java.io.IOException;
import java.util.List;
import java.util.Map;

public interface ConfigManagerMXBean {
    void updateConfigs(Map<String, String> configs);

    void updateService(String json, String version) throws IOException;

    void updateCanary(String json, String version) throws IOException;

    void updateService2(Map<String, String> configs, String version);

    void updateCanary2(Map<String, String> configs, String version);

    Map<String, String> getConfigs();

    List<String> availableConfigNames();

    default void healthz() {
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/ConfigNotifier.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import com.megaease.easeagent.log4j2.Logger;
import com.megaease.easeagent.log4j2.LoggerFactory;
import com.megaease.easeagent.plugin.api.config.ChangeItem;
import com.megaease.easeagent.plugin.api.config.ConfigChangeListener;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;

public class ConfigNotifier {
    private static final Logger LOGGER = LoggerFactory.getLogger(ConfigNotifier.class);
    private final CopyOnWriteArrayList<ConfigChangeListener> listeners = new CopyOnWriteArrayList<>();
    private final String prefix;

    public ConfigNotifier(String prefix) {
        this.prefix = prefix;
    }

    public Runnable addChangeListener(ConfigChangeListener listener) {
        final boolean add = listeners.add(listener);
        return () -> {
            if (add) {
                listeners.remove(listener);
            }
        };
    }

    public void handleChanges(List<ChangeItem> list) {
        final List<ChangeItem> changes = this.prefix.isEmpty() ? list : filterChanges(list);
        if (changes.isEmpty()) {
            return;
        }
        listeners.forEach(one -> {
            try {
                one.onChange(changes);
            } catch (Exception e) {
                LOGGER.warn("Notify config changes to listener failure: {}", e);
            }
        });
    }

    private List<ChangeItem> filterChanges(List<ChangeItem> list) {
        return list.stream().filter(one -> one.getFullName().startsWith(prefix))
            .map(e -> new ChangeItem(e.getFullName().substring(prefix.length()), e.getFullName(), e.getOldValue(), e.getNewValue()))
            .collect(Collectors.toList());
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/ConfigPropertiesUtils.java
================================================
/*
 * Copyright (c) 2022, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import com.megaease.easeagent.plugin.utils.SystemEnv;

import javax.annotation.Nullable;
import java.util.Locale;

/**
 * Get config from system properties or environment variables.
 */
final class ConfigPropertiesUtils {

    public static boolean getBoolean(String propertyName, boolean defaultValue) {
        String strValue = getString(propertyName);
        return strValue == null ? defaultValue : Boolean.parseBoolean(strValue);
    }

    public static int getInt(String propertyName, int defaultValue) {
        String strValue = getString(propertyName);
        if (strValue == null) {
            return defaultValue;
        }
        try {
            return Integer.parseInt(strValue);
        } catch (NumberFormatException ignored) {
            return defaultValue;
        }
    }

    @Nullable
    public static String getString(String propertyName) {
        String value = System.getProperty(propertyName);
        if (value != null) {
            return value;
        }
        return SystemEnv.get(toEnvVarName(propertyName));
    }

    /**
     * dot.case -> UPPER_UNDERSCORE
     */
    public static String toEnvVarName(String propertyName) {
        return propertyName.toUpperCase(Locale.ROOT).replace('-', '_').replace('.', '_');
    }

    private ConfigPropertiesUtils() {
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/ConfigUtils.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.megaease.easeagent.plugin.api.config.ChangeItem;
import com.megaease.easeagent.plugin.api.config.Config;
import com.megaease.easeagent.plugin.api.config.ConfigConst;

import java.io.IOException;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.stream.Collectors;

import static com.megaease.easeagent.plugin.api.config.ConfigConst.*;

public class ConfigUtils {
    private ConfigUtils() {
    }

    public static <R> void bindProp(String name, Config configs, BiFunction<Config, String, R> func, Consumer<R> consumer, R def) {
        Runnable process = () -> {
            R result = func.apply(configs, name);
            result = firstNotNull(result, def);
            if (result != null) {
                consumer.accept(result);
            }
        };
        process.run();
        configs.addChangeListener(list -> {
            boolean hasChange = list.stream().map(ChangeItem::getFullName).anyMatch(fn -> fn.equals(name));
            if (hasChange) {
                process.run();
            }
        });
    }

    @SafeVarargs
    private static <R> R firstNotNull(R... ars) {
        for (R one : ars) {
            if (one != null) {
                return one;
            }
        }
        return null;
    }

    public static <R> void bindProp(String name, Config configs, BiFunction<Config, String, R> func, Consumer<R> consumer) {
        bindProp(name, configs, func, consumer, null);
    }

    public static Map<String, String> json2KVMap(String json) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        JsonNode node = mapper.readTree(json);
        List<Map.Entry<String, String>> list = extractKVs(null, node);
        return list.stream().collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    }

    public static List<Map.Entry<String, String>> extractKVs(String prefix, JsonNode node) {
        List<Map.Entry<String, String>> rst = new LinkedList<>();
        if (node.isObject()) {
            Iterator<String> names = node.fieldNames();
            while (names.hasNext()) {
                String current = names.next();
                rst.addAll(extractKVs(join(prefix, current), node.path(current)));
            }
        } else if (node.isArray()) {
            int len = node.size();
            for (int i = 0; i < len; i++) {
                rst.addAll(extractKVs(join(prefix, i + ""), node.path(i)));
            }
        } else {
            rst.add(new AbstractMap.SimpleEntry<>(prefix, node.asText("")));
        }
        return rst;
    }

    private static String join(String prefix, String current) {
        return prefix == null ? current : ConfigConst.join(prefix, current);
    }

    public static boolean isGlobal(String namespace) {
        return PLUGIN_GLOBAL.equals(namespace);
    }

    public static boolean isPluginConfig(String key) {
        return key != null && key.startsWith(PLUGIN_PREFIX);
    }

    public static boolean isPluginConfig(String key, String domain, String namespace, String id) {
        return key != null && key.startsWith(ConfigConst.join(PLUGIN, domain, namespace, id));
    }

    public static PluginProperty pluginProperty(String path) {
        String[] configs = path.split("\\" + DELIMITER);
        if (configs.length < 5) {
            throw new ValidateUtils.ValidException(String.format("Property[%s] must be format: %s", path, ConfigConst.join(PLUGIN, "<Domain>", "<Namespace>", "<Id>", "<Properties>")));
        }

        for (int idOffsetEnd = 3; idOffsetEnd < configs.length - 1; idOffsetEnd++) {
            new PluginProperty(configs[1], configs[2],
                ConfigConst.join(Arrays.copyOfRange(configs, 3, idOffsetEnd)),
                ConfigConst.join(Arrays.copyOfRange(configs, idOffsetEnd + 1, configs.length)));
        }

        return new PluginProperty(configs[1], configs[2], configs[3], ConfigConst.join(Arrays.copyOfRange(configs, 4, configs.length)));
    }


    public static String requireNonEmpty(String obj, String message) {
        if (obj == null || obj.trim().isEmpty()) {
            throw new ValidateUtils.ValidException(message);
        }
        return obj.trim();
    }

    public static String buildPluginProperty(String domain, String namespace, String id, String property) {
        return String.format(PLUGIN_FORMAT, domain, namespace, id, property);
    }

    public static String buildCodeVersionKey(String key) {
        return RUNTIME_CODE_VERSION_POINTS_PREFIX + key;
    }

    /**
     * extract config item with a fromPrefix to and convert the prefix to 'toPrefix' for configuration Compatibility
     *
     * @param cfg        config source map
     * @param fromPrefix from
     * @param toPrefix   to
     * @return Extracted and converted KV map
     */
    public static Map<String, String> extractAndConvertPrefix(Map<String, String> cfg, String fromPrefix, String toPrefix) {
        Map<String, String> convert = new HashMap<>();

        Set<String> keys = new HashSet<>();
        cfg.forEach((key, value) -> {
            if (key.startsWith(fromPrefix)) {
                keys.add(key);
                key = toPrefix + key.substring(fromPrefix.length());
                convert.put(key, value);
            }
        });

        // override, new configuration KV override previous KV
        convert.putAll(extractByPrefix(cfg, toPrefix));

        return convert;
    }

    /**
     * Extract config items from config by prefix
     *
     * @param config config
     * @param prefix prefix
     * @return Extracted KV
     */
    public static Map<String, String> extractByPrefix(Config config, String prefix) {
        return extractByPrefix(config.getConfigs(), prefix);
    }

    public static Map<String, String> extractByPrefix(Map<String, String> cfg, String prefix) {
        Map<String, String> extract = new TreeMap<>();

        // override, new configuration KV override previous KV
        cfg.forEach((key, value) -> {
            if (key.startsWith(prefix)) {
                extract.put(key, value);
            }
        });

        return extract;
    }

    public static int isChanged(String name, Map<String, String> map, String check) {
        if (map.get(name) == null || map.get(name).equals(check)) {
            return 0;
        }
        return 1;
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/Configs.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;


import com.megaease.easeagent.log4j2.Logger;
import com.megaease.easeagent.log4j2.LoggerFactory;
import com.megaease.easeagent.plugin.api.config.ChangeItem;
import com.megaease.easeagent.plugin.api.config.Config;
import com.megaease.easeagent.plugin.api.config.ConfigChangeListener;

import java.util.*;
import java.util.stream.Collectors;

public class Configs implements Config {
    private static final Logger LOGGER = LoggerFactory.getLogger(Configs.class);
    protected Map<String, String> source;
    protected ConfigNotifier notifier;

    protected Configs() {
    }

    public Configs(Map<String, String> source) {
        this.source = new TreeMap<>(source);
        notifier = new ConfigNotifier("");
    }

    public void updateConfigsNotNotify(Map<String, String> changes) {
        this.source.putAll(changes);
    }

    public void updateConfigs(Map<String, String> changes) {
        Map<String, String> dump = new TreeMap<>(this.source);
        List<ChangeItem> items = new LinkedList<>();
        changes.forEach((name, value) -> {
            String old = dump.get(name);
            if (!Objects.equals(old, value)) {
                dump.put(name, value);
                items.add(new ChangeItem(name, name, old, value));
            }
        });
        if (!items.isEmpty()) {
            LOGGER.info("change items: {}", items);
            this.source = dump;
            this.notifier.handleChanges(items);
        }
    }

    protected boolean hasText(String text) {
        return text != null && text.trim().length() > 0;
    }

    @Override
    public Map<String, String> getConfigs() {
        return new TreeMap<>(this.source);
    }

    public String toPrettyDisplay() {
        return this.source.toString();
    }

    public boolean hasPath(String path) {
        return this.source.containsKey(path);
    }


    public String getString(String name) {
        return this.source.get(name);
    }

    public String getString(String name, String defVal) {
        String val = this.source.get(name);

        return val == null ? defVal : val;
    }

    public Integer getInt(String name) {
        String value = this.source.get(name);
        if (value == null) {
            return null;
        }
        try {
            return Integer.parseInt(value);
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    public Integer getInt(String name, int defValue) {
        Integer anInt = getInt(name);
        if (anInt == null) {
            return defValue;
        }
        return anInt;
    }

    public Boolean getBooleanNullForUnset(String name) {
        String value = this.source.get(name);
        if (value == null) {
            return null;
        }
        return value.equalsIgnoreCase("yes") || value.equalsIgnoreCase("true");
    }

    public Boolean getBoolean(String name) {
        String value = this.source.get(name);
        if (value == null) {
            return false;
        }
        return value.equalsIgnoreCase("yes") || value.equalsIgnoreCase("true");
    }

    @Override
    public Boolean getBoolean(String name, boolean defValue) {
        Boolean aBoolean = getBooleanNullForUnset(name);
        if (aBoolean == null) {
            return defValue;
        }
        return aBoolean;
    }

    public Double getDouble(String name) {
        String value = this.source.get(name);
        if (value == null) {
            return null;
        }
        try {
            return Double.parseDouble(value);
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    public Double getDouble(String name, double defValue) {
        Double aDouble = getDouble(name);
        if (aDouble == null) {
            return defValue;
        }
        return aDouble;
    }

    public Long getLong(String name) {
        String value = this.source.get(name);
        if (value == null) {
            return null;
        }
        try {
            return Long.parseLong(value);
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    public Long getLong(String name, long defValue) {
        Long aLong = getLong(name);
        if (aLong == null) {
            return defValue;
        }
        return aLong;
    }

    public List<String> getStringList(String name) {
        String value = this.source.get(name);
        if (value == null) {
            return Collections.emptyList();
        }
        return Arrays.stream(value.split(",")).filter(Objects::nonNull).collect(Collectors.toList());
    }

    @Override
    public Runnable addChangeListener(ConfigChangeListener listener) {
        return notifier.addChangeListener(listener);
    }

    @Override
    public Set<String> keySet() {
        return this.source.keySet();
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/GlobalConfigs.java
================================================
/*
 * Copyright (c) 2021, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
package com.megaease.easeagent.config;

import com.megaease.easeagent.config.report.ReportConfigAdapter;
import com.megaease.easeagent.plugin.api.config.ConfigConst;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

public class GlobalConfigs extends Configs implements ConfigManagerMXBean {
    Configs originalConfig;

    public GlobalConfigs(Map<String, String> source) {
        super();
        this.originalConfig = new Configs(source);
        // reporter adapter
        Map<String, String> map = new TreeMap<>(source);
        ReportConfigAdapter.convertConfig(map);
        // check environment config
        this.source = new TreeMap<>(map);
        this.notifier = new ConfigNotifier("");
    }

    public Configs getOriginalConfig() {
        return this.originalConfig;
    }

    @Override
    public void updateConfigsNotNotify(Map<String, String> changes) {
        // update original config
        Map<String, String> newGlobalCfg = new TreeMap<>(this.originalConfig.getConfigs());
        newGlobalCfg.putAll(changes);
        this.originalConfig.updateConfigsNotNotify(changes);

        // report adapter
        ReportConfigAdapter.convertConfig(newGlobalCfg);

        super.updateConfigsNotNotify(newGlobalCfg);
    }

    @Override
    public void updateConfigs(Map<String, String> changes) {
        // update original config
        Map<String, String> newGlobalCfg = new TreeMap<>(this.originalConfig.getConfigs());
        newGlobalCfg.putAll(changes);
        this.originalConfig.updateConfigsNotNotify(changes);

        // report adapter
        ReportConfigAdapter.convertConfig(newGlobalCfg);

        super.updateConfigs(newGlobalCfg);
    }

    public void mergeConfigs(GlobalConfigs configs) {
        Map<String, String> merged = configs.getOriginalConfig().getConfigs();
        if (merged.isEmpty()) {
            return;
        }
        this.updateConfigsNotNotify(merged);
        return;
    }

    @Override
    public List<String> availableConfigNames() {
        throw new UnsupportedOperationException();
    }

    @Override
    public void updateService(String json, String version) throws IOException {
        this.updateConfigs(ConfigUtils.json2KVMap(json));
    }

    @Override
    public void updateCanary(String json, String version) throws IOException {
        Map<String, String> originals = ConfigUtils.json2KVMap(json);
        HashMap<String, String> rst = new HashMap<>();
        originals.forEach((k, v) -> rst.put(ConfigConst.join(ConfigConst.GLOBAL_CANARY_LABELS, k), v));
        this.updateConfigs(rst);
    }

    @Override
    public void updateService2(Map<String, String> configs, String version) {
        this.updateConfigs(configs);
    }

    @Override
    public void updateCanary2(Map<String, String> configs, String version) {
        HashMap<String, String> rst = new HashMap<>();
        for (Map.Entry<String, String> entry : configs.entrySet()) {
            String k = entry.getKey();
            String v = entry.getValue();
            rst.put(ConfigConst.join(ConfigConst.GLOBAL_CANARY_LABELS, k), v);
        }
        this.updateConfigs(CompatibilityConversion.transform(rst));
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/JarFileConfigLoader.java
================================================
/*
 * Copyright (c) 2021, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import com.megaease.easeagent.log4j2.Logger;
import com.megaease.easeagent.log4j2.LoggerFactory;
import com.megaease.easeagent.plugin.api.config.ConfigConst;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;

public class JarFileConfigLoader {
    private static final Logger LOGGER = LoggerFactory.getLogger(JarFileConfigLoader.class);

    static GlobalConfigs load(String file) {
        String agentJarPath = System.getProperty(ConfigConst.AGENT_JAR_PATH);
        if (agentJarPath == null) {
            return null;
        }
        try {
            JarFile jarFile = new JarFile(new File(agentJarPath));
            ZipEntry zipEntry = jarFile.getEntry(file);
            if (zipEntry == null) {
                return null;
            }
            try (InputStream in = jarFile.getInputStream(zipEntry)) {
                return ConfigLoader.loadFromStream(in, file);
            } catch (IOException e) {
                LOGGER.debug("Load config file:{} failure: {}", file, e);
            }
        } catch (IOException e) {
            LOGGER.debug("create JarFile:{} failure: {}", agentJarPath, e);
        }
        return null;
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/OtelSdkConfigs.java
================================================
/*
 * Copyright (c) 2022, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import com.google.common.base.Splitter;
import com.megaease.easeagent.plugin.utils.ImmutableMap;
import com.megaease.easeagent.plugin.utils.SystemEnv;
import com.megaease.easeagent.plugin.utils.common.StringUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;


/**
 * Compatible with opentelemetry-java.
 * <p>
 * {@see https://github.com/open-telemetry/opentelemetry-java/blob/main/sdk-extensions/autoconfigure/README.md#disabling-opentelemetrysdk}
 */
public class OtelSdkConfigs {
    private static final String OTEL_RESOURCE_ATTRIBUTES_KEY = "otel.resource.attributes";

    private static final String CONFIG_PATH_PROP_KEY = "otel.javaagent.configuration-file";

    private static final Splitter.MapSplitter OTEL_RESOURCE_ATTRIBUTES_SPLITTER
        = Splitter.on(",")
        .omitEmptyStrings()
        .withKeyValueSeparator("=");

    private static final Map<String, String> SDK_ATTRIBUTES_TO_EASE_AGENT_PROPS =
        ImmutableMap.<String, String>builder()
            .put("sdk.disabled", "easeagent.server.enabled")
            .put("service.name", "name") //"easeagent.name"
            .put("service.namespace", "system") //"easeagent.system"
            .build();

    // -Dotel.service.name=xxx
    private static final Map<String, String> OTEL_SDK_PROPS_TO_EASE_AGENT_PROPS = new HashMap<>();

    // OTEL_SERVICE_NAME=xxx
    private static final Map<String, String> OTEL_SDK_ENV_VAR_TO_EASE_AGENT_PROPS = new HashMap<>();

    static {
        for (Map.Entry<String, String> entry : SDK_ATTRIBUTES_TO_EASE_AGENT_PROPS.entrySet()) {
            // lower.hyphen -> UPPER_UNDERSCORE
            OTEL_SDK_PROPS_TO_EASE_AGENT_PROPS.put(
                "otel." + entry.getKey(),
                entry.getValue()
            );
        }

        for (Map.Entry<String, String> entry : OTEL_SDK_PROPS_TO_EASE_AGENT_PROPS.entrySet()) {
            // dot.case -> UPPER_UNDERSCORE
            OTEL_SDK_ENV_VAR_TO_EASE_AGENT_PROPS.put(
                ConfigPropertiesUtils.toEnvVarName(entry.getKey()),
                entry.getValue()
            );
        }
    }

    /**
     * Get config path from java properties or environment variables
     */
    static String getConfigPath() {
        return ConfigPropertiesUtils.getString(CONFIG_PATH_PROP_KEY);
    }


    /**
     * update config value from environment variables and java properties
     * <p>
     * java properties > environment variables > OTEL_RESOURCE_ATTRIBUTES
     */
    static Map<String, String> updateEnvCfg() {
        Map<String, String> envCfg = new TreeMap<>();

        String configEnv = ConfigPropertiesUtils.getString(OTEL_RESOURCE_ATTRIBUTES_KEY);
        if (StringUtils.isNotEmpty(configEnv)) {
            Map<String, String> map = OTEL_RESOURCE_ATTRIBUTES_SPLITTER.split(configEnv);
            if (!map.isEmpty()) {
                for (Map.Entry<String, String> entry : SDK_ATTRIBUTES_TO_EASE_AGENT_PROPS.entrySet()) {
                    String value = map.get(entry.getKey());
                    if (!StringUtils.isEmpty(value)) {
                        envCfg.put(entry.getValue(), value);
                    }
                }
            }
        }

        // override by environment variables, eg: export OTEL_SERVICE_NAME=xxx
        for (Map.Entry<String, String> entry : OTEL_SDK_ENV_VAR_TO_EASE_AGENT_PROPS.entrySet()) {
            String value = SystemEnv.get(entry.getKey());
            if (!StringUtils.isEmpty(value)) {
                envCfg.put(entry.getValue(), value);
            }
        }

        // override by java properties; eg: java -Dotel.service.name=xxx
        for (Map.Entry<String, String> entry : OTEL_SDK_PROPS_TO_EASE_AGENT_PROPS.entrySet()) {
            String value = System.getProperty(entry.getKey());
            if (!StringUtils.isEmpty(value)) {
                envCfg.put(entry.getValue(), value);
            }
        }

        return envCfg;
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/PluginConfig.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import com.megaease.easeagent.log4j2.Logger;
import com.megaease.easeagent.log4j2.LoggerFactory;
import com.megaease.easeagent.plugin.api.config.Const;
import com.megaease.easeagent.plugin.api.config.IPluginConfig;
import com.megaease.easeagent.plugin.api.config.PluginConfigChangeListener;
import com.megaease.easeagent.plugin.utils.common.StringUtils;

import javax.annotation.Nonnull;
import java.util.*;
import java.util.function.Consumer;
import java.util.stream.Collectors;

public class PluginConfig implements IPluginConfig {
    private static final Logger LOGGER = LoggerFactory.getLogger(PluginConfig.class);
    private final Set<PluginConfigChangeListener> listeners;
    private final String domain;
    private final String namespace;
    private final String id;
    private final Map<String, String> global;
    private final Map<String, String> cover;
    private final boolean enabled;

    protected PluginConfig(@Nonnull String domain, @Nonnull String id, @Nonnull Map<String, String> global, @Nonnull String namespace, @Nonnull Map<String, String> cover, @Nonnull Set<PluginConfigChangeListener> listeners) {
        this.domain = domain;
        this.namespace = namespace;
        this.id = id;
        this.global = global;
        this.cover = cover;
        this.listeners = listeners;
        Boolean b = getBoolean(Const.ENABLED_CONFIG);
        if (b == null) {
            enabled = false;
        } else {
            enabled = b;
        }
    }

    public static PluginConfig build(@Nonnull String domain, @Nonnull String id,
                                     @Nonnull Map<String, String> global, @Nonnull String namespace,
                                     @Nonnull Map<String, String> cover, PluginConfig oldConfig) {
        Set<PluginConfigChangeListener> listeners;
        if (oldConfig == null) {
            listeners = new HashSet<>();
        } else {
            listeners = oldConfig.listeners;
        }
        return new PluginConfig(domain, id, global, namespace, cover, listeners);
    }

    @Override
    public String domain() {
        return domain;
    }

    @Override
    public String namespace() {
        return namespace;
    }

    @Override
    public String id() {
        return id;
    }


    @Override
    public boolean hasProperty(String property) {
        return global.containsKey(property) || cover.containsKey(property);
    }

    @Override
    public String getString(String property) {
        String value = cover.get(property);
        if (value != null) {
            return value;
        }
        return global.get(property);
    }


    @Override
    public Integer getInt(String property) {
        String value = this.getString(property);
        if (value == null) {
            return null;
        }
        try {
            return Integer.parseInt(value);
        } catch (Exception e) {
            return null;
        }
    }

    private boolean isTrue(String value) {
        return value.equalsIgnoreCase("yes") || value.equalsIgnoreCase("true");
    }

    @Override
    public Boolean getBoolean(String property) {
        String value = cover.get(property);
        boolean implB = true;
        if (value != null) {
            implB = isTrue(value);
        }
        value = global.get(property);
        boolean globalB = false;
        if (value != null) {
            globalB = isTrue(value);
        }
        return implB && globalB;
    }

    @Override
    public boolean enabled() {
        return enabled;
    }

    @Override
    public Double getDouble(String property) {
        String value = this.getString(property);
        if (value == null) {
            return null;
        }
        try {
            return Double.parseDouble(value);
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    public Long getLong(String property) {
        String value = this.getString(property);
        if (value == null) {
            return null;
        }
        try {
            return Long.parseLong(value);
        } catch (Exception e) {
            return null;
        }
    }

    @Override
    public List<String> getStringList(String property) {
        String value = this.getString(property);
        if (StringUtils.isEmpty(value)) {
            return Collections.emptyList();
        }
        return Arrays.stream(value.split(","))
            .map(String::trim)
            .collect(Collectors.toList());
    }

    @Override
    public IPluginConfig getGlobal() {
        return new Global(domain, id, global, namespace);
    }

    @Override
    public Set<String> keySet() {
        Set<String> keys = new HashSet<>(global.keySet());
        keys.addAll(cover.keySet());
        return keys;
    }

    @Override
    public void addChangeListener(PluginConfigChangeListener listener) {
        synchronized (listeners) {
            listeners.add(listener);
        }
    }

    public void foreachConfigChangeListener(Consumer<PluginConfigChangeListener> action) {
        Set<PluginConfigChangeListener> oldListeners;
        synchronized (listeners) {
            oldListeners = new HashSet<>(listeners);
        }
        for (PluginConfigChangeListener oldListener : oldListeners) {
            try {
                action.accept(oldListener);
            } catch (Exception e) {
                LOGGER.error("PluginConfigChangeListener<{}> change plugin config fail : {}", oldListener.getClass(), e.getMessage());
            }
        }
    }

    public class Global extends PluginConfig implements IPluginConfig {

        public Global(String domain, String id, Map<String, String> global, String namespace) {
            super(domain, id, global, namespace, Collections.emptyMap(), Collections.emptySet());
        }

        @Override
        public void addChangeListener(PluginConfigChangeListener listener) {
            PluginConfig.this.addChangeListener(listener);
        }

        @Override
        public void foreachConfigChangeListener(Consumer<PluginConfigChangeListener> action) {
            PluginConfig.this.foreachConfigChangeListener(action);
        }
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/PluginConfigManager.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import com.megaease.easeagent.log4j2.Logger;
import com.megaease.easeagent.log4j2.LoggerFactory;
import com.megaease.easeagent.plugin.api.config.ChangeItem;
import com.megaease.easeagent.plugin.api.config.Config;
import com.megaease.easeagent.plugin.api.config.ConfigChangeListener;
import com.megaease.easeagent.plugin.api.config.IConfigFactory;

import java.util.*;

import static com.megaease.easeagent.plugin.api.config.ConfigConst.PLUGIN_GLOBAL;

public class PluginConfigManager implements IConfigFactory {
    private static final Logger LOGGER = LoggerFactory.getLogger(PluginConfigManager.class);
    private Runnable shutdownRunnable;
    private final Configs configs;
    private final Map<Key, PluginSourceConfig> pluginSourceConfigs;
    private final Map<Key, PluginConfig> pluginConfigs;

    private PluginConfigManager(Configs configs, Map<Key, PluginSourceConfig> pluginSourceConfigs, Map<Key, PluginConfig> pluginConfigs) {
        this.configs = Objects.requireNonNull(configs, "configs must not be null.");
        this.pluginSourceConfigs = Objects.requireNonNull(pluginSourceConfigs, "pluginSourceConfigs must not be null.");
        this.pluginConfigs = Objects.requireNonNull(pluginConfigs, "pluginConfigs must not be null.");
    }

    public static PluginConfigManager.Builder builder(Configs configs) {
        PluginConfigManager pluginConfigManager = new PluginConfigManager(configs, new HashMap<>(), new HashMap<>());
        return pluginConfigManager.new Builder();
    }

    @Override
    public Config getConfig() {
        return this.configs;
    }

    @Override
    public String getConfig(String property) {
        return configs.getString(property);
    }

    @Override
    public String getConfig(String property, String defaultValue) {
        return configs.getString(property, defaultValue);
    }

    public PluginConfig getConfig(String domain, String namespace, String id) {
        return getConfig(domain, namespace, id, null);
    }

    public synchronized PluginConfig getConfig(String domain, String namespace, String id, PluginConfig oldConfig) {
        Key key = new Key(domain, namespace, id);
        PluginConfig pluginConfig = pluginConfigs.get(key);
        if (pluginConfig != null) {
            return pluginConfig;
        }
        Map<String, String> globalConfig = getGlobalConfig(domain, id);
        Map<String, String> coverConfig = getCoverConfig(domain, namespace, id);
        PluginConfig newPluginConfig = PluginConfig.build(domain, id, globalConfig, namespace, coverConfig, oldConfig);
        pluginConfigs.put(key, newPluginConfig);
        return newPluginConfig;
    }

    private Map<String, String> getGlobalConfig(String domain, String id) {
        return getConfigSource(domain, PLUGIN_GLOBAL, id);
    }

    private Map<String, String> getCoverConfig(String domain, String namespace, String id) {
        return getConfigSource(domain, namespace, id);
    }

    private Map<String, String> getConfigSource(String domain, String namespace, String id) {
        PluginSourceConfig sourceConfig = pluginSourceConfigs.get(new Key(domain, namespace, id));
        if (sourceConfig == null) {
            return Collections.emptyMap();
        }
        return sourceConfig.getProperties();
    }


    private Set<Key> keys(Set<String> keys) {
        Set<Key> propertyKeys = new HashSet<>();
        for (String k : keys) {
            if (!ConfigUtils.isPluginConfig(k)) {
                continue;
            }
            PluginProperty property = ConfigUtils.pluginProperty(k);
            Key key = new Key(property.getDomain(), property.getNamespace(), property.getId());
            propertyKeys.add(key);
        }
        return propertyKeys;
    }


    public void shutdown() {
        shutdownRunnable.run();
    }

    protected synchronized void onChange(Map<String, String> sources) {
        Set<Key> sourceKeys = keys(sources.keySet());
        Map<String, String> newSources = buildNewSources(sourceKeys, sources);
        for (Key sourceKey : sourceKeys) {
            pluginSourceConfigs.put(sourceKey, PluginSourceConfig.build(sourceKey.getDomain(), sourceKey.getNamespace(), sourceKey.getId(), newSources));
        }
        Set<Key> changeKeys = buildChangeKeys(sourceKeys);

        for (Key changeKey : changeKeys) {
            final PluginConfig oldConfig = pluginConfigs.remove(changeKey);
            final PluginConfig newConfig = getConfig(changeKey.getDomain(), changeKey.getNamespace(), changeKey.id, oldConfig);
            if (oldConfig == null) {
                continue;
            }
            try {
                oldConfig.foreachConfigChangeListener(listener -> listener.onChange(oldConfig, newConfig));
            } catch (Exception e) {
                LOGGER.warn("change config<{}> fail: {}", changeKey.toString(), e.getMessage());
            }
        }
    }

    private Map<String, String> buildNewSources(Set<Key> sourceKeys, Map<String, String> sources) {
        Map<String, String> newSources = new HashMap<>();
        for (Key sourceKey : sourceKeys) {
            PluginSourceConfig pluginSourceConfig = pluginSourceConfigs.get(sourceKey);
            if (pluginSourceConfig == null) {
                continue;
            }
            newSources.putAll(pluginSourceConfig.getSource());
        }
        newSources.putAll(sources);
        return newSources;
    }

    private Set<Key> buildChangeKeys(Set<Key> sourceKeys) {
        Set<Key> changeKeys = new HashSet<>(sourceKeys);
        for (Key key : sourceKeys) {
            if (!ConfigUtils.isGlobal(key.getNamespace())) {
                continue;
            }
            for (Key oldKey : pluginConfigs.keySet()) {
                if (!key.id.equals(oldKey.id)) {
                    continue;
                }
                changeKeys.add(oldKey);
            }
        }
        return changeKeys;
    }

    class Key {
        private final String domain;
        private final String namespace;
        private final String id;

        public Key(String domain, String namespace, String id) {
            this.domain = domain;
            this.namespace = namespace;
            this.id = id;
        }

        public String getDomain() {
            return domain;
        }

        public String getNamespace() {
            return namespace;
        }

        public String getId() {
            return id;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Key key = (Key) o;
            return Objects.equals(domain, key.domain) &&
                Objects.equals(namespace, key.namespace) &&
                Objects.equals(id, key.id);
        }

        @Override
        public int hashCode() {

            return Objects.hash(domain, namespace, id);
        }

        @Override
        public String toString() {
            return "Key{" +
                "domain='" + domain + '\'' +
                ", namespace='" + namespace + '\'' +
                ", id='" + id + '\'' +
                '}';
        }
    }

    public class Builder {
        public PluginConfigManager build() {
            synchronized (PluginConfigManager.this) {
                Map<String, String> sources = configs.getConfigs();
                Set<Key> sourceKeys = keys(sources.keySet());
                for (Key sourceKey : sourceKeys) {
                    pluginSourceConfigs.put(sourceKey, PluginSourceConfig.build(sourceKey.getDomain(), sourceKey.getNamespace(), sourceKey.getId(), sources));
                }
                for (Key key : pluginSourceConfigs.keySet()) {
                    getConfig(key.getDomain(), key.getNamespace(), key.getId());
                }
                shutdownRunnable = configs.addChangeListener(new ChangeListener());
            }
            return PluginConfigManager.this;
        }
    }

    class ChangeListener implements ConfigChangeListener {

        @Override
        public void onChange(List<ChangeItem> list) {
            Map<String, String> sources = new HashMap<>();
            for (ChangeItem changeItem : list) {
                sources.put(changeItem.getFullName(), changeItem.getNewValue());
            }
            PluginConfigManager.this.onChange(sources);
        }
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/PluginProperty.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import java.util.Objects;

public class PluginProperty {
    private final String domain;
    private final String namespace;
    private final String id;
    private final String property;

    public PluginProperty(String domain, String namespace, String id, String property) {
        this.domain = domain;
        this.namespace = namespace;
        this.id = id;
        this.property = property;
    }

    public String getDomain() {
        return domain;
    }

    public String getNamespace() {
        return namespace;
    }

    public String getId() {
        return id;
    }

    public String getProperty() {
        return property;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        PluginProperty that = (PluginProperty) o;
        return Objects.equals(domain, that.domain) &&
            Objects.equals(namespace, that.namespace) &&
            Objects.equals(id, that.id) &&
            Objects.equals(property, that.property);
    }

    @Override
    public int hashCode() {

        return Objects.hash(domain, namespace, id, property);
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/PluginSourceConfig.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class PluginSourceConfig {
    private final String domain;
    private final String namespace;
    private final String id;
    private final Map<String, String> source;
    private final Map<PluginProperty, String> properties;

    public PluginSourceConfig(String domain, String namespace, String id, Map<String, String> source, Map<PluginProperty, String> properties) {
        this.domain = Objects.requireNonNull(domain, "domain must not be null.");
        this.namespace = Objects.requireNonNull(namespace, "namespace must not be null.");
        this.id = Objects.requireNonNull(id, "id must not be null.");
        this.source = Objects.requireNonNull(source, "source must not be null.");
        this.properties = Objects.requireNonNull(properties, "properties must not be null.");
    }

    public static PluginSourceConfig build(String domain, String namespace, String id, Map<String, String> source) {
        Map<String, String> pluginSource = new HashMap<>();
        Map<PluginProperty, String> properties = new HashMap<>();
        for (Map.Entry<String, String> sourceEntry : source.entrySet()) {
            String key = sourceEntry.getKey();
            if (!ConfigUtils.isPluginConfig(key, domain, namespace, id)) {
                continue;
            }
            pluginSource.put(key, sourceEntry.getValue());
            PluginProperty property = ConfigUtils.pluginProperty(key);
            properties.put(property, sourceEntry.getValue());
        }
        return new PluginSourceConfig(domain, namespace, id, pluginSource, properties);
    }

    public Map<String, String> getSource() {
        return source;
    }

    public String getDomain() {
        return domain;
    }

    public String getNamespace() {
        return namespace;
    }

    public String getId() {
        return id;
    }

    public Map<String, String> getProperties() {
        Map<String, String> result = new HashMap<>();
        for (Map.Entry<PluginProperty, String> propertyEntry : properties.entrySet()) {
            result.put(propertyEntry.getKey().getProperty(), propertyEntry.getValue());
        }
        return result;
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/ValidateUtils.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

public class ValidateUtils {
    public static class ValidException extends RuntimeException {
        public ValidException(String message) {
            super(message);
        }
    }

    public interface Validator {
        void validate(String name, String value);
    }

    public static void validate(Configs configs, String name, Validator... vs){
        String value = configs.getString(name);
        for (Validator one : vs) {
            one.validate(name, value);
        }
    }

    public static final Validator HasText = (name, value) -> {
        if (value == null || value.trim().length() == 0) {
            throw new ValidException(String.format("Property[%s] has no non-empty value", name));
        }
    };

    public static final Validator Bool = (name, value) -> {
        String upper = value.toUpperCase();
        if (upper.equals("TRUE") || upper.equals("FALSE")) {
            return;
        }
        throw new ValidException(String.format("Property[%s] has no boolean value", name));
    };

    public static final Validator NumberInt = (name, value) -> {
        try {
            Integer.parseInt(value.trim());
        } catch (Exception e) {
            throw new ValidException(String.format("Property[%s] has no integer value", name));
        }
    };
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/WrappedConfigManager.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config;

import com.megaease.easeagent.plugin.async.ThreadUtils;

import java.io.IOException;
import java.util.List;
import java.util.Map;

public class WrappedConfigManager implements ConfigManagerMXBean {
    private final ClassLoader customClassLoader;
    private final ConfigManagerMXBean conf;

    public WrappedConfigManager(ClassLoader customClassLoader, ConfigManagerMXBean config) {
        this.customClassLoader = customClassLoader;
        this.conf = config;
    }

    @Override
    public void updateConfigs(Map<String, String> configs) {
        ThreadUtils.callWithClassLoader(customClassLoader, () -> {
            conf.updateConfigs(configs);
            return null;
        });
    }

    @Override
    public void updateService(String json, String version) throws IOException {
        try {
            ThreadUtils.callWithClassLoader(customClassLoader, () -> {
                try {
                    conf.updateService(json, version);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                return null;
            });
        } catch (RuntimeException e) {
            if (e.getCause() instanceof IOException) {
                throw (IOException) e.getCause();
            }
            throw e;
        }
    }

    @Override
    public void updateCanary(String json, String version) throws IOException {
        try {
            ThreadUtils.callWithClassLoader(customClassLoader, () -> {
                try {
                    conf.updateCanary(json, version);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                return null;
            });
        } catch (RuntimeException e) {
            if (e.getCause() instanceof IOException) {
                throw (IOException) e.getCause();
            }
            throw e;
        }
    }

    @Override
    public void updateService2(Map<String, String> configs, String version) {
        ThreadUtils.callWithClassLoader(customClassLoader, () -> {
            conf.updateService2(configs, version);
            return null;
        });
    }

    @Override
    public void updateCanary2(Map<String, String> configs, String version) {
        ThreadUtils.callWithClassLoader(customClassLoader, () -> {
            conf.updateCanary2(configs, version);
            return null;
        });
    }

    @Override
    public Map<String, String> getConfigs() {
        return ThreadUtils.callWithClassLoader(customClassLoader, conf::getConfigs);
    }

    @Override
    public List<String> availableConfigNames() {
        return ThreadUtils.callWithClassLoader(customClassLoader, conf::availableConfigNames);
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/report/ReportConfigAdapter.java
================================================
/*
 * Copyright (c) 2021, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
package com.megaease.easeagent.config.report;

import com.megaease.easeagent.plugin.api.config.Config;
import com.megaease.easeagent.plugin.api.config.ConfigConst;
import com.megaease.easeagent.plugin.api.config.Const;
import com.megaease.easeagent.plugin.utils.NoNull;
import com.megaease.easeagent.plugin.utils.common.StringUtils;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.TreeMap;

import static com.megaease.easeagent.config.ConfigUtils.extractAndConvertPrefix;
import static com.megaease.easeagent.config.ConfigUtils.extractByPrefix;
import static com.megaease.easeagent.config.report.ReportConfigConst.*;

@Slf4j
public class ReportConfigAdapter {
    private ReportConfigAdapter() {}

    public static void convertConfig(Map<String, String> config) {
        Map<String, String> cfg = extractAndConvertReporterConfig(config);
        config.putAll(cfg);
    }

    public static Map<String, String> extractReporterConfig(Config configs) {
        Map<String, String> cfg = extractByPrefix(configs.getConfigs(), REPORT);

        // default config
        cfg.put(TRACE_ENCODER, NoNull.of(cfg.get(TRACE_ENCODER), SPAN_JSON_ENCODER_NAME));
        cfg.put(METRIC_ENCODER, NoNull.of(cfg.get(METRIC_ENCODER), METRIC_JSON_ENCODER_NAME));
        cfg.put(LOG_ENCODER, NoNull.of(cfg.get(LOG_ENCODER), LOG_DATA_JSON_ENCODER_NAME));
        cfg.put(LOG_ACCESS_ENCODER, NoNull.of(cfg.get(LOG_ACCESS_ENCODER), ACCESS_LOG_JSON_ENCODER_NAME));

        cfg.put(TRACE_SENDER_NAME, NoNull.of(cfg.get(TRACE_SENDER_NAME), getDefaultAppender(cfg)));
        cfg.put(METRIC_SENDER_NAME, NoNull.of(cfg.get(METRIC_SENDER_NAME), getDefaultAppender(cfg)));
        cfg.put(LOG_ACCESS_SENDER_NAME, NoNull.of(cfg.get(LOG_ACCESS_SENDER_NAME), getDefaultAppender(cfg)));
        cfg.put(LOG_SENDER_NAME, NoNull.of(cfg.get(LOG_SENDER_NAME), getDefaultAppender(cfg)));

        return cfg;
    }

    public static String getDefaultAppender(Map<String, String> cfg) {
        String outputAppender = cfg.get(join(OUTPUT_SERVER_V2, APPEND_TYPE_KEY));

        if (StringUtils.isEmpty(outputAppender)) {
            return Const.DEFAULT_APPEND_TYPE;
        }

        return outputAppender;
    }

    private static Map<String, String> extractAndConvertReporterConfig(Map<String, String> srcConfig) {
        Map<String, String> extract = extractTracingConfig(srcConfig);
        Map<String, String> outputCfg = new TreeMap<>(extract);

        // metric config
        extract = extractMetricPluginConfig(srcConfig);
        outputCfg.putAll(extract);

        // log config
        extract = extractLogPluginConfig(srcConfig);
        outputCfg.putAll(extract);

        // if there are access log in metric
        updateAccessLogCfg(outputCfg);

        // all extract configuration will be overridden by config items start with "report" in srcConfig
        extract = extractByPrefix(srcConfig, REPORT);
        outputCfg.putAll(extract);

        return outputCfg;
    }


    /**
     * this can be deleted if there is not any v1 configuration needed to compatible with
     * convert v1 tracing config to v2
     */
    private static Map<String, String> extractTracingConfig(Map<String, String> srcCfg) {
        // outputServer config
        Map<String, String> extract = extractAndConvertPrefix(srcCfg, OUTPUT_SERVER_V1, OUTPUT_SERVER_V2);
        Map<String, String> outputCfg = new TreeMap<>(extract);

        // async output config
        extract = extractAndConvertPrefix(srcCfg, TRACE_OUTPUT_V1, TRACE_ASYNC);

        String target = srcCfg.get(join(TRACE_OUTPUT_V1, "target"));
        extract.remove(join(TRACE_ASYNC, "target"));

        if (!StringUtils.isEmpty(outputCfg.get(TRACE_SENDER_NAME))) {
            log.info("Reporter V2 config trace sender as: {}", outputCfg.get(TRACE_SENDER_NAME));
        } else if ("system".equals(target)) {
            // check output servers
            if (StringUtils.hasText(outputCfg.get(BOOTSTRAP_SERVERS))) {
                outputCfg.put(TRACE_SENDER_NAME, KAFKA_SENDER_NAME);
                outputCfg.put(TRACE_SENDER_TOPIC_V2, extract.remove(join(TRACE_ASYNC, TOPIC_KEY)));
            } else {
                outputCfg.put(TRACE_SENDER_NAME, CONSOLE_SENDER_NAME);
            }
        } else if ("zipkin".equals(target)) {
            outputCfg.put(TRACE_SENDER_NAME, ZIPKIN_SENDER_NAME);
            String url = extract.remove(join(TRACE_ASYNC, "target.zipkinUrl"));
            if (StringUtils.isEmpty(url)) {
                outputCfg.put(TRACE_SENDER_NAME, CONSOLE_SENDER_NAME);
            } else {
                outputCfg.put(join(TRACE_SENDER, "url"), url);
            }
        } else if (!StringUtils.isEmpty(target)) {
            outputCfg.put(TRACE_SENDER_NAME, CONSOLE_SENDER_NAME);
            log.info("Unsupported output configuration item:{}={}", TRACE_OUTPUT_TARGET_V1, target);
        }
        outputCfg.putAll(extract);

        return outputCfg;
    }

    /**
     * For Compatibility, call after metric config adapter
     *
     * extract 'reporter.metric.access.*' to 'reporter.log.access.*'
     */
    private static void updateAccessLogCfg(Map<String, String> outputCfg) {
        // reporter.metric.access.*
        String prefix = join(METRIC_V2, ConfigConst.Namespace.ACCESS);
        Map<String, String> metricAccess = extractByPrefix(outputCfg, prefix);
        Map<String, String> accessLog = extractAndConvertPrefix(metricAccess, prefix, LOG_ACCESS);

        // access log use `kafka` sender
        if (METRIC_KAFKA_SENDER_NAME.equals(accessLog.get(LOG_ACCESS_SENDER_NAME))) {
            accessLog.put(LOG_ACCESS_SENDER_NAME, KAFKA_SENDER_NAME);
        }

        outputCfg.putAll(accessLog);
    }

    /**
     * metric report configuration
     *
     * extract `plugin.observability.global.metric.*` config items to reporter.metric.sender.*`
     *
     * extract `plugin.observability.[namespace].metric.*` config items
     * to reporter.metric.[namespace].sender.*`
     *
     * @param srcCfg source configuration map
     * @return metric reporter config start with 'reporter.metric.[namespace].sender'
     */
    private static Map<String, String> extractMetricPluginConfig(Map<String, String> srcCfg) {
        final String globalKey = "." + ConfigConst.PLUGIN_GLOBAL + ".";
        final String prefix = join(ConfigConst.PLUGIN, ConfigConst.OBSERVABILITY);
        int metricKeyLength = ConfigConst.METRIC_SERVICE_ID.length();

        Map<String, String> global = extractGlobalMetricConfig(srcCfg);
        HashSet<String> namespaces = new HashSet<>();
        Map<String, String> metricConfigs = new HashMap<>(global);

        for (Map.Entry<String, String> e : srcCfg.entrySet()) {
            String key = e.getKey();
            if (!key.startsWith(prefix)) {
                continue;
            }
            int idx = key.indexOf(ConfigConst.METRIC_SERVICE_ID, prefix.length());
            if (idx < 0) {
                continue;
            }
            String namespaceWithSeparator = key.substring(prefix.length(), idx);
            String suffix = key.substring(idx + metricKeyLength + 1);
            String newKey;

            if (namespaceWithSeparator.equals(globalKey)) {
                continue;
            } else {
                if (!namespaces.contains(namespaceWithSeparator)) {
                    namespaces.add(namespaceWithSeparator);
                    Map<String, String> d = extractAndConvertPrefix(global,
                        METRIC_V2 + ".", METRIC_V2 + namespaceWithSeparator);
                    metricConfigs.putAll(d);
                }
            }

            if (suffix.startsWith(ENCODER_KEY) || suffix.startsWith(ASYNC_KEY)) {
                newKey = METRIC_V2 + namespaceWithSeparator + suffix;
            } else if (suffix.equals(INTERVAL_KEY)) {
                newKey = METRIC_V2 + namespaceWithSeparator + join(ASYNC_KEY, suffix);
            } else {
                newKey = METRIC_V2 + namespaceWithSeparator + join(SENDER_KEY, suffix);
            }

            if (newKey.endsWith(APPEND_TYPE_KEY) && e.getValue().equals("kafka")) {
                metricConfigs.put(newKey, METRIC_KAFKA_SENDER_NAME);
            } else {
                metricConfigs.put(newKey, e.getValue());
            }
        }

        return metricConfigs;
    }

    private static Map<String, String> extractGlobalMetricConfig(Map<String, String> srcCfg) {
        final String prefix = join(ConfigConst.PLUGIN, ConfigConst.OBSERVABILITY,
            ConfigConst.PLUGIN_GLOBAL,
            ConfigConst.PluginID.METRIC);
        Map<String, String> global = new TreeMap<>();
        Map<String, String> extract = extractAndConvertPrefix(srcCfg, prefix, METRIC_SENDER);

        for (Map.Entry<String, String> e : extract.entrySet()) {
            if (e.getKey().startsWith(ENCODER_KEY, METRIC_SENDER.length() + 1)) {
                global.put(join(METRIC_V2, e.getKey().substring(METRIC_SENDER.length() + 1)), e.getValue());
            } else if (e.getKey().endsWith(INTERVAL_KEY)) {
                global.put(join(METRIC_ASYNC, INTERVAL_KEY), e.getValue());
            } else if (e.getKey().endsWith(APPEND_TYPE_KEY) && e.getValue().equals("kafka")) {
                global.put(e.getKey(), METRIC_KAFKA_SENDER_NAME);
            } else {
                global.put(e.getKey(), e.getValue());
            }
        }


        // global log level (async)
        global.putAll(extractByPrefix(srcCfg, METRIC_SENDER));
        global.putAll(extractByPrefix(srcCfg, METRIC_ASYNC));
        global.putAll(extractByPrefix(srcCfg, METRIC_ENCODER));

        return global;
    }

    /**
     * metric report configuration
     *
     * extract `plugin.observability.global.metric.*` config items to reporter.metric.sender.*`
     *
     * extract `plugin.observability.[namespace].metric.*` config items
     * to reporter.metric.[namespace].sender.*`
     *
     * @param srcCfg source configuration map
     * @return metric reporter config start with 'reporter.metric.[namespace].sender'
     */
    private static Map<String, String> extractLogPluginConfig(Map<String, String> srcCfg) {
        final String globalKey = "." + ConfigConst.PLUGIN_GLOBAL + ".";
        final String prefix = join(ConfigConst.PLUGIN, ConfigConst.OBSERVABILITY);

        String typeKey = join("", ConfigConst.PluginID.LOG, "");
        int typeKeyLength = ConfigConst.PluginID.LOG.length();

        final String reporterPrefix = LOGS;

        Map<String, String> global = extractGlobalLogConfig(srcCfg);
        HashSet<String> namespaces = new HashSet<>();
        Map<String, String> outputConfigs = new TreeMap<>(global);

        for (Map.Entry<String, String> e : srcCfg.entrySet()) {
            String key = e.getKey();
            if (!key.startsWith(prefix)) {
                continue;
            }
            int idx = key.indexOf(typeKey, prefix.length());
            if (idx < 0) {
                continue;
            } else {
                idx += 1;
            }
            String namespaceWithSeparator = key.substring(prefix.length(), idx);
            String suffix = key.substring(idx + typeKeyLength + 1);
            String newKey;

            if (namespaceWithSeparator.equals(globalKey)) {
                continue;
            } else {
                if (!namespaces.contains(namespaceWithSeparator)) {
                    namespaces.add(namespaceWithSeparator);
                    Map<String, String> d = extractAndConvertPrefix(global,
                        reporterPrefix + ".", reporterPrefix + namespaceWithSeparator);
                    outputConfigs.putAll(d);
                }
            }

            if (suffix.startsWith(ENCODER_KEY) || suffix.startsWith(ASYNC_KEY)) {
                newKey = reporterPrefix + namespaceWithSeparator + suffix;
            } else {
                newKey = reporterPrefix + namespaceWithSeparator + join(SENDER_KEY, suffix);
            }

            outputConfigs.put(newKey, e.getValue());
        }

        return outputConfigs;
    }

    /**
     * extract `plugin.observability.global.log.*` config items to `reporter.log.sender.*`
     * extract `plugin.observability.global.log.output.*` config items to `reporter.log.output.*`
     *
     * @param srcCfg source config map
     * @return reporter log config
     */
    private static Map<String, String> extractGlobalLogConfig(Map<String, String> srcCfg) {
        final String prefix = join(ConfigConst.PLUGIN, ConfigConst.OBSERVABILITY,
            ConfigConst.PLUGIN_GLOBAL,
            ConfigConst.PluginID.LOG);
        Map<String, String> global = new TreeMap<>();
        Map<String, String> extract = extractAndConvertPrefix(srcCfg, prefix, LOG_SENDER);

        for (Map.Entry<String, String> e : extract.entrySet()) {
            String key = e.getKey();
            if (key.startsWith(ENCODER_KEY, LOG_SENDER.length() + 1)) {
                global.put(join(LOGS, key.substring(LOG_SENDER.length() + 1)), e.getValue());
            } else if (key.startsWith(ASYNC_KEY, LOG_SENDER.length() + 1)) {
                global.put(join(LOGS, key.substring(LOG_SENDER.length() + 1)), e.getValue());
            } else {
                global.put(e.getKey(), e.getValue());
            }
        }

        // global log level (async)
        global.putAll(extractByPrefix(srcCfg, LOG_SENDER));
        global.putAll(extractByPrefix(srcCfg, LOG_ASYNC));
        global.putAll(extractByPrefix(srcCfg, LOG_ENCODER));

        return global;
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/report/ReportConfigConst.java
================================================
/*
 * Copyright (c) 2021, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
package com.megaease.easeagent.config.report;

@SuppressWarnings("unused")
public class ReportConfigConst {
    private ReportConfigConst() {}

    public static final String KAFKA_SENDER_NAME = "kafka";
    public static final String METRIC_KAFKA_SENDER_NAME = "metricKafka";
    public static final String CONSOLE_SENDER_NAME = "console";
    public static final String ZIPKIN_SENDER_NAME = "http";

    public static final String NOOP_SENDER_NAME = "noop";

    public static final String SPAN_JSON_ENCODER_NAME = "SpanJsonEncoder";
    public static final String METRIC_JSON_ENCODER_NAME = "MetricJsonEncoder";
    public static final String LOG_DATA_JSON_ENCODER_NAME = "LogDataJsonEncoder";
    public static final String ACCESS_LOG_JSON_ENCODER_NAME = "AccessLogJsonEncoder";

    public static final String HTTP_SPAN_JSON_ENCODER_NAME = "HttpSpanJsonEncoder";

    public static final String LOG_ENCODER_NAME = "StringEncoder";

    static final String DELIMITER = ".";
    public static final String TOPIC_KEY = "topic";
    public static final String LOG_APPENDER_KEY = "appenderName";

    public static final String ENABLED_KEY = "enabled";
    public static final String SENDER_KEY = "sender";
    public static final String ENCODER_KEY = "encoder";
    public static final String ASYNC_KEY = "output";
    public static final String APPEND_TYPE_KEY = "appendType";
    public static final String INTERVAL_KEY = "interval";

    public static final String ASYNC_THREAD_KEY = "reportThread";
    public static final String ASYNC_MSG_MAX_BYTES_KEY = "messageMaxBytes";
    public static final String ASYNC_MSG_TIMEOUT_KEY = "messageTimeout";
    public static final String ASYNC_QUEUE_MAX_SIZE_KEY = "queuedMaxSize";
    public static final String ASYNC_QUEUE_MAX_LOGS_KEY = "queuedMaxLogs";
    public static final String ASYNC_QUEUE_MAX_ITEMS_KEY = "queuedMaxItems";

    /**
     * Reporter v2 configuration
     */
    // -- lv1 --
    public static final String REPORT = "reporter";
    // ---- lv2 ----
    public static final String OUTPUT_SERVER_V2 = join(REPORT, "outputServer");
    public static final String TRACE_V2 = join(REPORT, "tracing");
    public static final String LOGS = join(REPORT, "log");
    public static final String METRIC_V2 = join(REPORT, "metric");
    public static final String GENERAL = join(REPORT, "general");
    // ------ lv3 ------
    public static final String BOOTSTRAP_SERVERS = join(OUTPUT_SERVER_V2, "bootstrapServer");
    public static final String OUTPUT_SERVERS_ENABLE = join(OUTPUT_SERVER_V2, ENABLED_KEY);
    public static final String OUTPUT_SERVERS_TIMEOUT = join(OUTPUT_SERVER_V2, "timeout");

    public static final String OUTPUT_SECURITY_PROTOCOL_V2 = join(OUTPUT_SERVER_V2, "security.protocol");
    public static final String OUTPUT_SERVERS_SSL = join(OUTPUT_SERVER_V2, "ssl");

    public static final String LOG_ASYNC = join(LOGS, ASYNC_KEY);

    public static final String LOG_SENDER = join(LOGS, SENDER_KEY);
    public static final String LOG_ENCODER = join(LOGS, ENCODER_KEY);

    public static final String LOG_ACCESS = join(LOGS, "access");
    public static final String LOG_ACCESS_SENDER = join(LOG_ACCESS, SENDER_KEY);
    public static final String LOG_ACCESS_ENCODER = join(LOG_ACCESS, ENCODER_KEY);

    public static final String TRACE_SENDER = join(TRACE_V2, SENDER_KEY);
    public static final String TRACE_ENCODER = join(TRACE_V2, ENCODER_KEY);
    public static final String TRACE_ASYNC = join(TRACE_V2, ASYNC_KEY);

    public static final String METRIC_SENDER = join(METRIC_V2, SENDER_KEY);
    public static final String METRIC_ENCODER = join(METRIC_V2, ENCODER_KEY);
    public static final String METRIC_ASYNC = join(METRIC_V2, ASYNC_KEY);

    // -------- lv4  --------
    public static final String LOG_SENDER_TOPIC = join(LOG_SENDER, TOPIC_KEY);
    public static final String LOG_SENDER_NAME = join(LOG_SENDER, APPEND_TYPE_KEY);

    public static final String LOG_ACCESS_SENDER_NAME = join(LOG_ACCESS_SENDER, APPEND_TYPE_KEY);
    public static final String LOG_ACCESS_SENDER_ENABLED = join(LOG_ACCESS_SENDER, ENABLED_KEY);
    public static final String LOG_ACCESS_SENDER_TOPIC = join(LOG_ACCESS_SENDER, TOPIC_KEY);

    public static final String LOG_ASYNC_MESSAGE_MAX_BYTES = join(LOG_ASYNC, ASYNC_MSG_MAX_BYTES_KEY);
    public static final String LOG_ASYNC_REPORT_THREAD = join(LOG_ASYNC, ASYNC_THREAD_KEY);
    public static final String LOG_ASYNC_MESSAGE_TIMEOUT = join(LOG_ASYNC, ASYNC_MSG_TIMEOUT_KEY);
    public static final String LOG_ASYNC_QUEUED_MAX_LOGS = join(LOG_ASYNC, ASYNC_QUEUE_MAX_LOGS_KEY);
    public static final String LOG_ASYNC_QUEUED_MAX_SIZE = join(LOG_ASYNC, ASYNC_QUEUE_MAX_SIZE_KEY);

    public static final String TRACE_SENDER_NAME = join(TRACE_SENDER, APPEND_TYPE_KEY);
    public static final String TRACE_SENDER_ENABLED_V2 = join(TRACE_SENDER, ENABLED_KEY);
    public static final String TRACE_SENDER_TOPIC_V2 = join(TRACE_SENDER, TOPIC_KEY);

    public static final String TRACE_ASYNC_MESSAGE_MAX_BYTES_V2 = join(TRACE_ASYNC, ASYNC_MSG_MAX_BYTES_KEY);
    public static final String TRACE_ASYNC_REPORT_THREAD_V2 = join(TRACE_ASYNC, ASYNC_THREAD_KEY);
    public static final String TRACE_ASYNC_MESSAGE_TIMEOUT_V2 = join(TRACE_ASYNC, ASYNC_MSG_TIMEOUT_KEY);
    public static final String TRACE_ASYNC_QUEUED_MAX_SPANS_V2 = join(TRACE_ASYNC, "queuedMaxSpans");
    public static final String TRACE_ASYNC_QUEUED_MAX_SIZE_V2 = join(TRACE_ASYNC, ASYNC_QUEUE_MAX_SIZE_KEY);

    public static final String METRIC_SENDER_NAME = join(METRIC_SENDER, APPEND_TYPE_KEY);
    public static final String METRIC_SENDER_ENABLED = join(METRIC_SENDER, ENABLED_KEY);
    public static final String METRIC_SENDER_TOPIC = join(METRIC_SENDER, TOPIC_KEY);
    public static final String METRIC_SENDER_APPENDER = join(METRIC_SENDER, LOG_APPENDER_KEY);

    public static final String METRIC_ASYNC_INTERVAL = join(METRIC_ASYNC, INTERVAL_KEY);
    public static final String METRIC_ASYNC_QUEUED_MAX_ITEMS = join(METRIC_ASYNC, ASYNC_QUEUE_MAX_ITEMS_KEY);
    public static final String METRIC_ASYNC_MESSAGE_MAX_BYTES = join(METRIC_ASYNC, ASYNC_MSG_MAX_BYTES_KEY);

    public static final String OUTPUT_SSL_KEYSTORE_TYPE_V2 = join(OUTPUT_SERVERS_SSL, "keystore.type");
    public static final String OUTPUT_KEY_V2 = join(OUTPUT_SERVERS_SSL, "keystore.key");
    public static final String OUTPUT_CERT_V2 = join(OUTPUT_SERVERS_SSL, "keystore.certificate.chain");
    public static final String OUTPUT_TRUST_CERT_V2 = join(OUTPUT_SERVERS_SSL, "truststore.certificates");
    public static final String OUTPUT_TRUST_CERT_TYPE_V2 = join(OUTPUT_SERVERS_SSL, "truststore.type");
    public static final String OUTPUT_ENDPOINT_IDENTIFICATION_ALGORITHM_V2 = join(OUTPUT_SERVERS_SSL, "endpoint.identification.algorithm");

    /**
     * Reporter v1 configuration
     */
    public static final String OBSERVABILITY = "observability";
    // ---- lv2 ----
    public static final String TRACING = join(OBSERVABILITY, "tracings");
    public static final String OUTPUT_SERVER_V1 = join(OBSERVABILITY, "outputServer");
    // ------ lv3 ------
    public static final String TRACE_OUTPUT_V1 = join(TRACING, ASYNC_KEY);
    public static final String BOOTSTRAP_SERVERS_V1 = join(OUTPUT_SERVER_V1, "bootstrapServer");

    // --------- lv4 ---------
    public static final String TRACE_OUTPUT_ENABLED_V1 = join(TRACE_OUTPUT_V1, ENABLED_KEY);
    public static final String TRACE_OUTPUT_TOPIC_V1 = join(TRACE_OUTPUT_V1, TOPIC_KEY);
    public static final String TRACE_OUTPUT_TARGET_V1 = join(TRACE_OUTPUT_V1, "target");
    public static final String TRACE_OUTPUT_TARGET_ZIPKIN_URL = join(TRACE_OUTPUT_V1, "target.zipkinUrl");

    public static final String TRACE_OUTPUT_REPORT_THREAD_V1 = join(TRACE_OUTPUT_V1, ASYNC_THREAD_KEY);
    public static final String TRACE_OUTPUT_MESSAGE_TIMEOUT_V1 = join(TRACE_OUTPUT_V1, ASYNC_MSG_TIMEOUT_KEY);
    public static final String TRACE_OUTPUT_QUEUED_MAX_SPANS_V1 = join(TRACE_OUTPUT_V1, "queuedMaxSpans");
    public static final String TRACE_OUTPUT_QUEUED_MAX_SIZE_V1 = join(TRACE_OUTPUT_V1, ASYNC_QUEUE_MAX_SIZE_KEY);

    public static final String GLOBAL_METRIC = "plugin.observability.global.metric";
    public static final String GLOBAL_METRIC_ENABLED = join(GLOBAL_METRIC, ENABLED_KEY);
    public static final String GLOBAL_METRIC_TOPIC = join(GLOBAL_METRIC, TOPIC_KEY);
    public static final String GLOBAL_METRIC_APPENDER = join(GLOBAL_METRIC, APPEND_TYPE_KEY);

    public static String join(String... texts) {
        return String.join(DELIMITER, texts);
    }
}


================================================
FILE: config/src/main/java/com/megaease/easeagent/config/yaml/YamlReader.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.megaease.easeagent.config.yaml;

import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;

import java.io.InputStream;
import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

public class YamlReader {

    private Map<String, Object> yaml;

    private static final DumperOptions DUMPER_OPTIONS;

    static {
        DUMPER_OPTIONS = new DumperOptions();
        DUMPER_OPTIONS.setLineBreak(DumperOptions.LineBreak.getPlatformLineBreak());
    }

    public YamlReader() {
        // ignored
    }

    public YamlReader load(InputStream in) {
        if (in != null) {
            yaml = new Yaml(DUMPER_OPTIONS).load(in);
        }
        return this;
    }

    public Map<String, Object> getYaml() {
        return yaml;
    }

    public static YamlReader merge(YamlReader target, YamlReader source) {
        Map<String, Object> targetMap = target.yaml;
        Map<String, Object> sourceMap = source.yaml;

        merge(targetMap, sourceMap);

        YamlReader result = new YamlReader();
        result.yaml = new HashMap<>(targetMap);
        return result;
    }

    @SuppressWarnings("unchecked")
    private static void merge(Map<String, Object> target, Map<String, Object> source) {
        source.forEach((key, value) -> {
            Object existing = target.get(key);
            if (value instanceof Map && existing instanceof Map) {
                Map<String, Object> result = new LinkedHashMap<>((Map<String, Object>) existing);
                merge(result, (Map<String, Object>) value);
                target.put(key, result);
            } else {
                target.put(key, value);
            }
        });
    }

    public Map<String, String> compress() {
        if (Objects.isNull(yaml) || yaml.size() == 0) {
            return Collections.emptyMap();
        }

        final Deque<String> keyStack = new LinkedList<>();
        final Map<String, String> resultMap = new HashMap<>();

        compress(yaml, keyStack, resultMap);

        return resultMap;
    }

    @SuppressWarnings("unchecked")
    private void compress(Map<?, Object> result, Deque<String> keyStack, Map<String, String> resultMap) {
        result.forEach((k, v) -> {
            keyStack.addLast(String.valueOf(k));

            if (v instanceof Map) {
                compress((Map<?, Object>) v, keyStack, resultMap);
                keyStack.removeLast();
                return;
            }

            if (v instanceof List) {
                String value = ((List<Object>) v).stream()
                    .map(String::valueOf)
                    .collect(Collectors.joining(","));

                resultMap.put(String.join(".", keyStack), value);
                keyStack.removeLast();
                return;
            }

            resultMap.put(String.join(".", keyStack), String.valueOf(v));
            keyStack.removeLast();
        });
    }
}


================================================
FILE: config/src/test/java/com/megaease/easeagent/config/CompatibilityConversionTest.java
================================================
/*
 * Copyright (c) 2017, MegaEase
 * All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.megaease.easeagent.config;

import com.megaease.easeagent.plugin.api.ProgressFields;
import com.megaease.easeagent.plugin.api.config.ConfigConst;
import org.junit.Test;

import java.util.Collections;
import java.util.Map;

import static com.megaease.easeagent.config.CompatibilityConversion.REQUEST_NAMESPACE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

public class CompatibilityConversionTest {

    @Test
    public void transform() {
        Map<String, String> newMap = CompatibilityConversion.transform(Collections.singletonMap(ConfigConst.Observability.METRICS_ENABLED, "false"));
        assertEquals(2, newMap.size());
        assertTrue(newMap.containsKey(ConfigConst.Plugin.OBSERVABILITY_GLOBAL_METRIC_ENABLED));
        assertTrue(newMap.containsKey(ConfigConst.Observability.METRICS_ENABLED));
        newMap = CompatibilityConversion.transform(Collections.singletonMap(ConfigConst.Observability.TRACE_ENABLED, "false"));
        assertEquals(1, newMap.size());
        assertTrue(newMap.containsKey(ConfigConst.Plugin.OBSERVABILITY_GLOBAL_TRACING_ENABLED));
//        newMap = CompatibilityConversion.transform(Collections.singletonMap("globalCanaryHeaders.serviceHeaders.mesh-app-backend.0", "X-canary"));
//        assertEquals(1, newMap.size());
//        assertTrue(newMap.containsKey(ProgressFields.EASEAGENT_PROGRESS_FORWARDED_HEADERS_CONFIG + ".mesh-app-backend.0"));

        newMap = CompatibilityConversion.transform(Collections.singletonMap("observability.outputServer.bootstrapServer", "tstatssta"));
        assertEquals(1, newMap.size());
        assertTrue(newMap.containsKey("observability.outputServer.bootstrapServer"));


        newMap = CompatibilityConversion.transform(Collections.singletonMap("observability.metrics.access.enabled", "true"));
        assertEquals(1, newMap.size());
        assertEquals("true", newMap.get("plugin.observability.access.metric.enabled"));


        newMap = CompatibilityConversion.transform(Collections.singletonMap("observability.metrics.access.interval", "30"));
        assertEquals(1, newMap.size());
        assertEquals("30", newMap.get("plugin.observability.access.metric.interval"));

        newMap = CompatibilityConversion.transform(Collections.singletonMap("observability.tracings.remoteInvoke.enabled", "true"));
        assertEquals(1, newMap.size());
        assertEquals("true", newMap.get("plugin.observability.webclient.tracing.enabled"));

        newMap = CompatibilityConversion.transform(Collections.singletonMap("observability.tracings.request.enabled", "true"));
        assertEquals(REQUEST_NAMESPACE.length, newMap.size());
        for (String s : REQUEST_NAMESPACE) {
            assertEquals("true", newMap.get("plugin.observability." + s + ".tracing.enabled"));
        }

        newMap = CompatibilityConversion.transform(Collections.singletonMap("observability.metrics.jvmGc.enabled", "true"));
        assertEquals(1, newMap.size());
        assertEqua
Download .txt
gitextract_4u5zqd_x/

├── .editorconfig
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   └── feature_request.md
│   └── workflows/
│       ├── build.yml
│       └── license-checker.yml
├── .gitignore
├── .licenserc.yaml
├── AOSP-Checkstyles.xml
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── build/
│   ├── pom.xml
│   └── src/
│       ├── assembly/
│       │   └── src.xml
│       └── main/
│           ├── java/
│           │   └── com/
│           │       └── megaease/
│           │           └── easeagent/
│           │               └── StartBootstrap.java
│           └── resources/
│               ├── agent-to-cloud_1.0.properties
│               ├── agent.properties
│               ├── easeagent-log4j2.xml
│               └── user-minimal-cfg.properties
├── config/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── com/
│       │           └── megaease/
│       │               └── easeagent/
│       │                   └── config/
│       │                       ├── AutoRefreshConfigItem.java
│       │                       ├── CompatibilityConversion.java
│       │                       ├── ConfigAware.java
│       │                       ├── ConfigFactory.java
│       │                       ├── ConfigLoader.java
│       │                       ├── ConfigManagerMXBean.java
│       │                       ├── ConfigNotifier.java
│       │                       ├── ConfigPropertiesUtils.java
│       │                       ├── ConfigUtils.java
│       │                       ├── Configs.java
│       │                       ├── GlobalConfigs.java
│       │                       ├── JarFileConfigLoader.java
│       │                       ├── OtelSdkConfigs.java
│       │                       ├── PluginConfig.java
│       │                       ├── PluginConfigManager.java
│       │                       ├── PluginProperty.java
│       │                       ├── PluginSourceConfig.java
│       │                       ├── ValidateUtils.java
│       │                       ├── WrappedConfigManager.java
│       │                       ├── report/
│       │                       │   ├── ReportConfigAdapter.java
│       │                       │   └── ReportConfigConst.java
│       │                       └── yaml/
│       │                           └── YamlReader.java
│       └── test/
│           ├── java/
│           │   └── com/
│           │       └── megaease/
│           │           └── easeagent/
│           │               └── config/
│           │                   ├── CompatibilityConversionTest.java
│           │                   ├── ConfigFactoryTest.java
│           │                   ├── ConfigPropertiesUtilsTest.java
│           │                   ├── ConfigUtilsTest.java
│           │                   ├── ConfigsTest.java
│           │                   ├── IPluginConfigConstTest.java
│           │                   ├── JarFileConfigLoaderTest.java
│           │                   ├── OtelSdkConfigsTest.java
│           │                   ├── PluginConfigManagerTest.java
│           │                   ├── PluginConfigTest.java
│           │                   ├── PluginPropertyTest.java
│           │                   ├── PluginSourceConfigTest.java
│           │                   ├── ValidateUtilsTest.java
│           │                   ├── report/
│           │                   │   └── ReportConfigAdapterTest.java
│           │                   └── yaml/
│           │                       └── YamlReaderTest.java
│           └── resources/
│               ├── agent.properties
│               ├── agent.yaml
│               ├── easeagent_config.jar
│               ├── user-spec.properties
│               ├── user-spec2.properties
│               └── user.properties
├── context/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── com/
│       │           └── megaease/
│       │               └── easeagent/
│       │                   └── context/
│       │                       ├── AsyncContextImpl.java
│       │                       ├── ContextManager.java
│       │                       ├── GlobalContext.java
│       │                       ├── ProgressFieldsManager.java
│       │                       ├── RetBound.java
│       │                       ├── SessionContext.java
│       │                       └── log/
│       │                           ├── LoggerFactoryImpl.java
│       │                           ├── LoggerImpl.java
│       │                           └── LoggerMdc.java
│       └── test/
│           ├── java/
│           │   └── com/
│           │       └── megaease/
│           │           └── easeagent/
│           │               └── context/
│           │                   ├── AsyncContextImplTest.java
│           │                   ├── ContextManagerTest.java
│           │                   ├── GlobalContextTest.java
│           │                   ├── ProgressFieldsManagerTest.java
│           │                   ├── RetBoundTest.java
│           │                   ├── SessionContextTest.java
│           │                   └── log/
│           │                       ├── LoggerFactoryImplTest.java
│           │                       ├── LoggerImplTest.java
│           │                       └── LoggerMdcTest.java
│           └── resources/
│               └── log4j2.xml
├── core/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── megaease/
│       │   │           └── easeagent/
│       │   │               └── core/
│       │   │                   ├── AppendBootstrapClassLoaderSearch.java
│       │   │                   ├── Bootstrap.java
│       │   │                   ├── GlobalAgentHolder.java
│       │   │                   ├── config/
│       │   │                   │   ├── CanaryListUpdateAgentHttpHandler.java
│       │   │                   │   ├── CanaryUpdateAgentHttpHandler.java
│       │   │                   │   ├── ConfigsUpdateAgentHttpHandler.java
│       │   │                   │   ├── PluginPropertiesHttpHandler.java
│       │   │                   │   ├── PluginPropertyHttpHandler.java
│       │   │                   │   └── ServiceUpdateAgentHttpHandler.java
│       │   │                   ├── health/
│       │   │                   │   └── HealthProvider.java
│       │   │                   ├── info/
│       │   │                   │   ├── AgentInfoFactory.java
│       │   │                   │   └── AgentInfoProvider.java
│       │   │                   ├── plugin/
│       │   │                   │   ├── BaseLoader.java
│       │   │                   │   ├── BridgeDispatcher.java
│       │   │                   │   ├── CommonInlineAdvice.java
│       │   │                   │   ├── Dispatcher.java
│       │   │                   │   ├── PluginLoader.java
│       │   │                   │   ├── annotation/
│       │   │                   │   │   ├── EaseAgentInstrumented.java
│       │   │                   │   │   └── Index.java
│       │   │                   │   ├── interceptor/
│       │   │                   │   │   ├── InterceptorPluginDecorator.java
│       │   │                   │   │   ├── ProviderChain.java
│       │   │                   │   │   └── ProviderPluginDecorator.java
│       │   │                   │   ├── matcher/
│       │   │                   │   │   ├── ClassLoaderMatcherConvert.java
│       │   │                   │   │   ├── ClassMatcherConvert.java
│       │   │                   │   │   ├── ClassTransformation.java
│       │   │                   │   │   ├── Converter.java
│       │   │                   │   │   ├── MethodMatcherConvert.java
│       │   │                   │   │   └── MethodTransformation.java
│       │   │                   │   ├── registry/
│       │   │                   │   │   ├── AdviceRegistry.java
│       │   │                   │   │   └── PluginRegistry.java
│       │   │                   │   └── transformer/
│       │   │                   │       ├── AnnotationTransformer.java
│       │   │                   │       ├── CompoundPluginTransformer.java
│       │   │                   │       ├── DynamicFieldAdvice.java
│       │   │                   │       ├── DynamicFieldTransformer.java
│       │   │                   │       ├── ForAdviceTransformer.java
│       │   │                   │       ├── TypeFieldTransformer.java
│       │   │                   │       ├── advice/
│       │   │                   │       │   ├── AgentAdvice.java
│       │   │                   │       │   ├── AgentForAdvice.java
│       │   │                   │       │   ├── AgentJavaConstantValue.java
│       │   │                   │       │   ├── BypassMethodVisitor.java
│       │   │                   │       │   └── MethodIdentityJavaConstant.java
│       │   │                   │       └── classloader/
│       │   │                   │           └── CompoundClassloader.java
│       │   │                   └── utils/
│       │   │                       ├── AgentArray.java
│       │   │                       ├── ContextUtils.java
│       │   │                       ├── JsonUtil.java
│       │   │                       ├── MutableObject.java
│       │   │                       ├── ServletUtils.java
│       │   │                       └── TextUtils.java
│       │   └── resources/
│       │       ├── META-INF/
│       │       │   └── services/
│       │       │       └── com.megaease.easeagent.plugin.bean.BeanProvider
│       │       └── version.txt
│       └── test/
│           └── java/
│               └── com/
│                   └── megaease/
│                       └── easeagent/
│                           └── core/
│                               ├── AppendBootstrapClassLoaderSearchTest.java
│                               ├── BootstrapTest.java
│                               ├── HttpServerTest.java
│                               ├── info/
│                               │   └── AgentInfoFactoryTest.java
│                               ├── instrument/
│                               │   ├── ClinitMethodTransformTest.java
│                               │   ├── NewInstanceMethodTransformTest.java
│                               │   ├── NonStaticMethodTransformTest.java
│                               │   ├── OrchestrationTransformTest.java
│                               │   ├── StaticMethodTransformTest.java
│                               │   ├── TestContext.java
│                               │   ├── TestPlugin.java
│                               │   └── TransformTestBase.java
│                               ├── matcher/
│                               │   ├── ClassLoaderMatcherTest.java
│                               │   ├── ClassMatcherTest.java
│                               │   └── MethodMatcherTest.java
│                               ├── plugin/
│                               │   └── PluginLoaderTest.java
│                               └── utils/
│                                   └── AgentAttachmentRule.java
├── doc/
│   ├── add-plugin-demo.md
│   ├── benchmark.md
│   ├── context.md
│   ├── criteria-for-configuring-priorities.md
│   ├── development-guide.md
│   ├── how-to-use/
│   │   ├── megacloud-config.md
│   │   ├── use-in-docker.md
│   │   └── use-on-host.md
│   ├── matcher-DSL.md
│   ├── metric-api.md
│   ├── plugin-unit-test.md
│   ├── prometheus-metric-schedule.md
│   ├── report-development-guide.md
│   ├── spring-boot-3.x.x-demo.md
│   ├── spring-boot-upgrade.md
│   ├── spring-petclinic-demo.md
│   ├── tracing-api.md
│   └── user-manual.md
├── httpserver/
│   ├── pom.xml
│   └── src/
│       └── main/
│           └── java/
│               └── com/
│                   └── megaease/
│                       └── easeagent/
│                           └── httpserver/
│                               ├── HttpRequest.java
│                               ├── HttpResponse.java
│                               ├── IHttpHandler.java
│                               ├── IHttpServer.java
│                               ├── jdk/
│                               │   ├── AgentHttpServerV2.java
│                               │   ├── RootContextHandler.java
│                               │   └── UriResource.java
│                               ├── nano/
│                               │   ├── AgentHttpHandler.java
│                               │   ├── AgentHttpHandlerProvider.java
│                               │   └── AgentHttpServer.java
│                               └── nanohttpd/
│                                   ├── protocols/
│                                   │   └── http/
│                                   │       ├── ClientHandler.java
│                                   │       ├── HTTPSession.java
│                                   │       ├── IHTTPSession.java
│                                   │       ├── NanoHTTPD.java
│                                   │       ├── ServerRunnable.java
│                                   │       ├── content/
│                                   │       │   ├── ContentType.java
│                                   │       │   ├── Cookie.java
│                                   │       │   └── CookieHandler.java
│                                   │       ├── request/
│                                   │       │   └── Method.java
│                                   │       ├── response/
│                                   │       │   ├── ChunkedOutputStream.java
│                                   │       │   ├── IStatus.java
│                                   │       │   ├── Response.java
│                                   │       │   └── Status.java
│                                   │       ├── sockets/
│                                   │       │   ├── DefaultServerSocketFactory.java
│                                   │       │   └── SecureServerSocketFactory.java
│                                   │       ├── tempfiles/
│                                   │       │   ├── DefaultTempFile.java
│                                   │       │   ├── DefaultTempFileManager.java
│                                   │       │   ├── DefaultTempFileManagerFactory.java
│                                   │       │   ├── ITempFile.java
│                                   │       │   └── ITempFileManager.java
│                                   │       └── threading/
│                                   │           ├── DefaultAsyncRunner.java
│                                   │           └── IAsyncRunner.java
│                                   ├── router/
│                                   │   └── RouterNanoHTTPD.java
│                                   └── util/
│                                       ├── IFactory.java
│                                       ├── IFactoryThrowing.java
│                                       ├── IHandler.java
│                                       └── ServerRunner.java
├── loader/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       └── com/
│       │           └── megaease/
│       │               └── easeagent/
│       │                   ├── EaseAgentClassLoader.java
│       │                   ├── JarCache.java
│       │                   ├── Main.java
│       │                   └── StringSequence.java
│       └── test/
│           ├── java/
│           │   └── com/
│           │       └── megaease/
│           │           └── easeagent/
│           │               └── MainTest.java
│           └── resources/
│               └── test-mock-load.jar
├── log4j2/
│   ├── README.md
│   ├── log4j2-api/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── log4j2/
│   │                               ├── ClassLoaderUtils.java
│   │                               ├── ClassloaderSupplier.java
│   │                               ├── FinalClassloaderSupplier.java
│   │                               ├── Logger.java
│   │                               ├── LoggerFactory.java
│   │                               ├── MDC.java
│   │                               ├── api/
│   │                               │   ├── AgentLogger.java
│   │                               │   ├── AgentLoggerFactory.java
│   │                               │   ├── ILevel.java
│   │                               │   └── Mdc.java
│   │                               └── exception/
│   │                                   └── Log4j2Exception.java
│   ├── log4j2-impl/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── log4j2/
│   │                               └── impl/
│   │                                   ├── AgentLoggerProxy.java
│   │                                   ├── LoggerProxyFactory.java
│   │                                   ├── MdcProxy.java
│   │                                   └── Slf4jLogger.java
│   └── pom.xml
├── metrics/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── megaease/
│       │   │           └── easeagent/
│       │   │               └── metrics/
│       │   │                   ├── AgentScheduledReporter.java
│       │   │                   ├── AutoRefreshReporter.java
│       │   │                   ├── MetricBeanProviderImpl.java
│       │   │                   ├── MetricProviderImpl.java
│       │   │                   ├── MetricRegistryService.java
│       │   │                   ├── PrometheusAgentHttpHandler.java
│       │   │                   ├── config/
│       │   │                   │   ├── MetricsCollectorConfig.java
│       │   │                   │   ├── MetricsConfig.java
│       │   │                   │   └── PluginMetricsConfig.java
│       │   │                   ├── converter/
│       │   │                   │   ├── AbstractConverter.java
│       │   │                   │   ├── Converter.java
│       │   │                   │   ├── ConverterAdapter.java
│       │   │                   │   ├── EaseAgentPrometheusExports.java
│       │   │                   │   ├── IgnoreOutputException.java
│       │   │                   │   ├── KeyType.java
│       │   │                   │   └── MetricsAdditionalAttributes.java
│       │   │                   ├── impl/
│       │   │                   │   ├── CounterImpl.java
│       │   │                   │   ├── GaugeImpl.java
│       │   │                   │   ├── HistogramImpl.java
│       │   │                   │   ├── MeterImpl.java
│       │   │                   │   ├── MetricInstance.java
│       │   │                   │   ├── MetricRegistryImpl.java
│       │   │                   │   ├── SnapshotImpl.java
│       │   │                   │   └── TimerImpl.java
│       │   │                   ├── jvm/
│       │   │                   │   ├── JvmBeanProvider.java
│       │   │                   │   ├── gc/
│       │   │                   │   │   └── JVMGCMetricV2.java
│       │   │                   │   └── memory/
│       │   │                   │       └── JVMMemoryMetricV2.java
│       │   │                   └── model/
│       │   │                       └── JVMMemoryGaugeMetricModel.java
│       │   └── resources/
│       │       └── META-INF/
│       │           └── services/
│       │               └── com.megaease.easeagent.plugin.bean.BeanProvider
│       └── test/
│           ├── java/
│           │   └── com/
│           │       └── megaease/
│           │           └── easeagent/
│           │               └── metrics/
│           │                   ├── MetricProviderImplTest.java
│           │                   ├── MetricRegistryServiceTest.java
│           │                   ├── PrometheusAgentHttpHandlerTest.java
│           │                   ├── TestConst.java
│           │                   ├── config/
│           │                   │   └── PluginMetricsConfigTest.java
│           │                   ├── converter/
│           │                   │   ├── AbstractConverterTest.java
│           │                   │   ├── ConverterAdapterTest.java
│           │                   │   ├── IgnoreOutputExceptionTest.java
│           │                   │   └── MetricsAdditionalAttributesTest.java
│           │                   ├── impl/
│           │                   │   ├── CounterImplTest.java
│           │                   │   ├── GaugeImplTest.java
│           │                   │   ├── HistogramImplTest.java
│           │                   │   ├── MeterImplTest.java
│           │                   │   ├── MetricInstanceTest.java
│           │                   │   ├── MetricRegistryImplTest.java
│           │                   │   ├── MetricRegistryMock.java
│           │                   │   ├── MetricTestUtils.java
│           │                   │   ├── MockClock.java
│           │                   │   ├── SnapshotImplTest.java
│           │                   │   └── TimerImplTest.java
│           │                   └── jvm/
│           │                       └── memory/
│           │                           └── JVMMemoryMetricV2Test.java
│           └── resources/
│               ├── log4j2.xml
│               └── mock_agent.properties
├── mock/
│   ├── config-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   ├── config/
│   │       │                   │   └── MockConfigLoader.java
│   │       │                   └── mock/
│   │       │                       └── config/
│   │       │                           └── MockConfig.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── mock/
│   │           │                   └── config/
│   │           │                       └── MockConfigTest.java
│   │           └── resources/
│   │               ├── mock_agent.properties
│   │               └── mock_agent.yaml
│   ├── context-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── mock/
│   │                               └── context/
│   │                                   ├── MockContext.java
│   │                                   └── MockContextManager.java
│   ├── log4j2-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── megaease/
│   │       │   │           └── easeagent/
│   │       │   │               └── mock/
│   │       │   │                   └── log4j2/
│   │       │   │                       ├── AllUrlsSupplier.java
│   │       │   │                       ├── DirUrlsSupplier.java
│   │       │   │                       ├── JarPathUrlsSupplier.java
│   │       │   │                       ├── JarUrlsSupplier.java
│   │       │   │                       ├── URLClassLoaderSupplier.java
│   │       │   │                       └── UrlSupplier.java
│   │       │   └── resources/
│   │       │       └── META-INF/
│   │       │           └── services/
│   │       │               └── com.megaease.easeagent.log4j2.ClassloaderSupplier
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── log4j2/
│   │           │                   └── impl/
│   │           │                       ├── AgentLoggerFactoryTest.java
│   │           │                       └── MDCTest.java
│   │           └── resources/
│   │               └── log4j2.xml
│   ├── metrics-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── mock/
│   │           │                   └── metrics/
│   │           │                       ├── MetricTestUtils.java
│   │           │                       └── MockMetricProvider.java
│   │           └── resources/
│   │               └── META-INF/
│   │                   └── services/
│   │                       └── com.megaease.easeagent.mock.utils.MockProvider
│   ├── plugin-api-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── mock/
│   │       │                       └── plugin/
│   │       │                           └── api/
│   │       │                               ├── MockEaseAgent.java
│   │       │                               ├── junit/
│   │       │                               │   ├── AfterStatement.java
│   │       │                               │   ├── BeforeStatement.java
│   │       │                               │   ├── EaseAgentJunit4ClassRunner.java
│   │       │                               │   └── ScopeMustBeCloseException.java
│   │       │                               └── utils/
│   │       │                                   ├── ConfigTestUtils.java
│   │       │                                   ├── ContextUtils.java
│   │       │                                   ├── InterceptorTestUtils.java
│   │       │                                   ├── SpanTestUtils.java
│   │       │                                   └── TagVerifier.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── mock/
│   │           │                   └── plugin/
│   │           │                       └── api/
│   │           │                           ├── TestContext.java
│   │           │                           ├── TestEaseAgent.java
│   │           │                           ├── demo/
│   │           │                           │   ├── InterceptorTest.java
│   │           │                           │   ├── M1MetricCollect.java
│   │           │                           │   └── MockEaseAgentTest.java
│   │           │                           └── utils/
│   │           │                               └── ConfigTestUtilsTest.java
│   │           └── resources/
│   │               └── log4j2.xml
│   ├── pom.xml
│   ├── report-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── mock/
│   │       │                       └── report/
│   │       │                           ├── JsonReporter.java
│   │       │                           ├── MetricFlushable.java
│   │       │                           ├── MockAtomicReferenceReportSpanReport.java
│   │       │                           ├── MockReport.java
│   │       │                           ├── MockSpan.java
│   │       │                           ├── MockSpanReport.java
│   │       │                           └── impl/
│   │       │                               ├── LastJsonReporter.java
│   │       │                               └── ZipkinMockSpanImpl.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── mock/
│   │           │                   └── report/
│   │           │                       └── MockReportTest.java
│   │           └── resources/
│   │               └── log4j2.xml
│   ├── utils-mock/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── mock/
│   │                               └── utils/
│   │                                   ├── JdkHttpServer.java
│   │                                   ├── MockProvider.java
│   │                                   └── MockSystemEnv.java
│   └── zipkin-mock/
│       ├── pom.xml
│       └── src/
│           ├── main/
│           │   ├── java/
│           │   │   ├── brave/
│           │   │   │   ├── TracerTestUtils.java
│           │   │   │   └── internal/
│           │   │   │       └── collect/
│           │   │   │           └── WeakConcurrentMapTestUtils.java
│           │   │   └── com/
│           │   │       └── megaease/
│           │   │           └── easeagent/
│           │   │               └── mock/
│           │   │                   └── zipkin/
│           │   │                       └── MockTracingProvider.java
│           │   └── resources/
│           │       └── META-INF/
│           │           └── services/
│           │               └── com.megaease.easeagent.mock.utils.MockProvider
│           └── test/
│               └── java/
│                   └── com/
│                       └── megaease/
│                           └── easeagent/
│                               └── mock/
│                                   └── zipkin/
│                                       └── MockTracingProviderTest.java
├── plugin-api/
│   ├── README.md
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       ├── com/
│       │       │   └── megaease/
│       │       │       └── easeagent/
│       │       │           └── plugin/
│       │       │               ├── AgentPlugin.java
│       │       │               ├── AppendBootstrapLoader.java
│       │       │               ├── CodeVersion.java
│       │       │               ├── Ordered.java
│       │       │               ├── Points.java
│       │       │               ├── annotation/
│       │       │               │   ├── AdviceTo.java
│       │       │               │   ├── AdvicesTo.java
│       │       │               │   ├── DynamicField.java
│       │       │               │   └── Injection.java
│       │       │               ├── api/
│       │       │               │   ├── Cleaner.java
│       │       │               │   ├── Context.java
│       │       │               │   ├── InitializeContext.java
│       │       │               │   ├── ProgressFields.java
│       │       │               │   ├── Reporter.java
│       │       │               │   ├── config/
│       │       │               │   │   ├── AutoRefreshConfigSupplier.java
│       │       │               │   │   ├── AutoRefreshPluginConfig.java
│       │       │               │   │   ├── AutoRefreshPluginConfigImpl.java
│       │       │               │   │   ├── AutoRefreshPluginConfigRegistry.java
│       │       │               │   │   ├── ChangeItem.java
│       │       │               │   │   ├── Config.java
│       │       │               │   │   ├── ConfigChangeListener.java
│       │       │               │   │   ├── ConfigConst.java
│       │       │               │   │   ├── Const.java
│       │       │               │   │   ├── IConfigFactory.java
│       │       │               │   │   ├── IPluginConfig.java
│       │       │               │   │   └── PluginConfigChangeListener.java
│       │       │               │   ├── context/
│       │       │               │   │   ├── AsyncContext.java
│       │       │               │   │   ├── ContextCons.java
│       │       │               │   │   ├── ContextUtils.java
│       │       │               │   │   ├── IContextManager.java
│       │       │               │   │   └── RequestContext.java
│       │       │               │   ├── dispatcher/
│       │       │               │   │   └── IDispatcher.java
│       │       │               │   ├── health/
│       │       │               │   │   └── AgentHealth.java
│       │       │               │   ├── logging/
│       │       │               │   │   ├── AccessLogInfo.java
│       │       │               │   │   ├── ILoggerFactory.java
│       │       │               │   │   ├── Logger.java
│       │       │               │   │   └── Mdc.java
│       │       │               │   ├── metric/
│       │       │               │   │   ├── Counter.java
│       │       │               │   │   ├── Gauge.java
│       │       │               │   │   ├── Histogram.java
│       │       │               │   │   ├── Meter.java
│       │       │               │   │   ├── Metric.java
│       │       │               │   │   ├── MetricProvider.java
│       │       │               │   │   ├── MetricRegistry.java
│       │       │               │   │   ├── MetricRegistrySupplier.java
│       │       │               │   │   ├── MetricSupplier.java
│       │       │               │   │   ├── ServiceMetric.java
│       │       │               │   │   ├── ServiceMetricRegistry.java
│       │       │               │   │   ├── ServiceMetricSupplier.java
│       │       │               │   │   ├── Snapshot.java
│       │       │               │   │   ├── Timer.java
│       │       │               │   │   └── name/
│       │       │               │   │       ├── ConverterType.java
│       │       │               │   │       ├── MetricField.java
│       │       │               │   │       ├── MetricName.java
│       │       │               │   │       ├── MetricSubType.java
│       │       │               │   │       ├── MetricType.java
│       │       │               │   │       ├── MetricValueFetcher.java
│       │       │               │   │       ├── NameFactory.java
│       │       │               │   │       └── Tags.java
│       │       │               │   ├── middleware/
│       │       │               │   │   ├── MiddlewareConstants.java
│       │       │               │   │   ├── Redirect.java
│       │       │               │   │   ├── RedirectProcessor.java
│       │       │               │   │   ├── ResourceConfig.java
│       │       │               │   │   └── Type.java
│       │       │               │   ├── otlp/
│       │       │               │   │   └── common/
│       │       │               │   │       ├── AgentAttributes.java
│       │       │               │   │       ├── AgentInstrumentLibInfo.java
│       │       │               │   │       ├── AgentLogData.java
│       │       │               │   │       ├── AgentLogDataImpl.java
│       │       │               │   │       ├── LogMapper.java
│       │       │               │   │       ├── OtlpSpanContext.java
│       │       │               │   │       └── SemanticKey.java
│       │       │               │   └── trace/
│       │       │               │       ├── Extractor.java
│       │       │               │       ├── Getter.java
│       │       │               │       ├── ITracing.java
│       │       │               │       ├── Injector.java
│       │       │               │       ├── Message.java
│       │       │               │       ├── MessagingRequest.java
│       │       │               │       ├── MessagingTracing.java
│       │       │               │       ├── Request.java
│       │       │               │       ├── Response.java
│       │       │               │       ├── Scope.java
│       │       │               │       ├── Setter.java
│       │       │               │       ├── Span.java
│       │       │               │       ├── SpanContext.java
│       │       │               │       ├── Tracing.java
│       │       │               │       ├── TracingContext.java
│       │       │               │       ├── TracingProvider.java
│       │       │               │       └── TracingSupplier.java
│       │       │               ├── asm/
│       │       │               │   └── Modifier.java
│       │       │               ├── async/
│       │       │               │   ├── AgentThreadFactory.java
│       │       │               │   ├── ScheduleHelper.java
│       │       │               │   ├── ScheduleRunner.java
│       │       │               │   ├── ThreadLocalCurrentContext.java
│       │       │               │   └── ThreadUtils.java
│       │       │               ├── bean/
│       │       │               │   ├── AgentInitializingBean.java
│       │       │               │   └── BeanProvider.java
│       │       │               ├── bridge/
│       │       │               │   ├── AgentInfo.java
│       │       │               │   ├── EaseAgent.java
│       │       │               │   ├── NoOpAgentReporter.java
│       │       │               │   ├── NoOpCleaner.java
│       │       │               │   ├── NoOpConfigFactory.java
│       │       │               │   ├── NoOpContext.java
│       │       │               │   ├── NoOpDispatcher.java
│       │       │               │   ├── NoOpIPluginConfig.java
│       │       │               │   ├── NoOpLoggerFactory.java
│       │       │               │   ├── NoOpMetrics.java
│       │       │               │   ├── NoOpReporter.java
│       │       │               │   └── NoOpTracer.java
│       │       │               ├── enums/
│       │       │               │   ├── ClassMatch.java
│       │       │               │   ├── Operator.java
│       │       │               │   ├── Order.java
│       │       │               │   └── StringMatch.java
│       │       │               ├── field/
│       │       │               │   ├── AgentDynamicFieldAccessor.java
│       │       │               │   ├── AgentFieldReflectAccessor.java
│       │       │               │   ├── DynamicFieldAccessor.java
│       │       │               │   ├── NullObject.java
│       │       │               │   └── TypeFieldGetter.java
│       │       │               ├── interceptor/
│       │       │               │   ├── AgentInterceptorChain.java
│       │       │               │   ├── Interceptor.java
│       │       │               │   ├── InterceptorProvider.java
│       │       │               │   ├── MethodInfo.java
│       │       │               │   └── NonReentrantInterceptor.java
│       │       │               ├── matcher/
│       │       │               │   ├── ClassMatcher.java
│       │       │               │   ├── IClassMatcher.java
│       │       │               │   ├── IMethodMatcher.java
│       │       │               │   ├── Matcher.java
│       │       │               │   ├── MethodMatcher.java
│       │       │               │   ├── loader/
│       │       │               │   │   ├── ClassLoaderMatcher.java
│       │       │               │   │   ├── IClassLoaderMatcher.java
│       │       │               │   │   └── NegateClassLoaderMatcher.java
│       │       │               │   └── operator/
│       │       │               │       ├── AndClassMatcher.java
│       │       │               │       ├── AndMethodMatcher.java
│       │       │               │       ├── NegateClassMatcher.java
│       │       │               │       ├── NegateMethodMatcher.java
│       │       │               │       ├── Operator.java
│       │       │               │       ├── OrClassMatcher.java
│       │       │               │       └── OrMethodMatcher.java
│       │       │               ├── processor/
│       │       │               │   ├── BeanUtils.java
│       │       │               │   ├── ElementVisitor8.java
│       │       │               │   ├── GenerateProviderBean.java
│       │       │               │   ├── PluginProcessor.java
│       │       │               │   └── RepeatedAnnotationVisitor.java
│       │       │               ├── report/
│       │       │               │   ├── AgentReport.java
│       │       │               │   ├── ByteWrapper.java
│       │       │               │   ├── Call.java
│       │       │               │   ├── Callback.java
│       │       │               │   ├── EncodedData.java
│       │       │               │   ├── Encoder.java
│       │       │               │   ├── Packer.java
│       │       │               │   ├── Sender.java
│       │       │               │   ├── encoder/
│       │       │               │   │   └── JsonEncoder.java
│       │       │               │   ├── metric/
│       │       │               │   │   └── MetricReporterFactory.java
│       │       │               │   └── tracing/
│       │       │               │       ├── Annotation.java
│       │       │               │       ├── Endpoint.java
│       │       │               │       ├── ReportSpan.java
│       │       │               │       └── ReportSpanImpl.java
│       │       │               ├── tools/
│       │       │               │   ├── config/
│       │       │               │   │   └── NameAndSystem.java
│       │       │               │   ├── loader/
│       │       │               │   │   └── AgentHelperClassLoader.java
│       │       │               │   ├── matcher/
│       │       │               │   │   ├── ClassMatcherUtils.java
│       │       │               │   │   └── MethodMatcherUtils.java
│       │       │               │   ├── metrics/
│       │       │               │   │   ├── AccessLogServerInfo.java
│       │       │               │   │   ├── ErrorPercentModelGauge.java
│       │       │               │   │   ├── GaugeMetricModel.java
│       │       │               │   │   ├── HttpLog.java
│       │       │               │   │   ├── LastMinutesCounterGauge.java
│       │       │               │   │   ├── NameFactorySupplier.java
│       │       │               │   │   ├── RedisMetric.java
│       │       │               │   │   └── ServerMetric.java
│       │       │               │   └── trace/
│       │       │               │       ├── BaseHttpClientTracingInterceptor.java
│       │       │               │       ├── HttpRequest.java
│       │       │               │       ├── HttpResponse.java
│       │       │               │       ├── HttpUtils.java
│       │       │               │       └── TraceConst.java
│       │       │               └── utils/
│       │       │                   ├── AdditionalAttributes.java
│       │       │                   ├── ClassInstance.java
│       │       │                   ├── ClassUtils.java
│       │       │                   ├── ImmutableMap.java
│       │       │                   ├── NoNull.java
│       │       │                   ├── Pair.java
│       │       │                   ├── SystemClock.java
│       │       │                   ├── SystemEnv.java
│       │       │                   ├── common/
│       │       │                   │   ├── DataSize.java
│       │       │                   │   ├── DataUnit.java
│       │       │                   │   ├── ExceptionUtil.java
│       │       │                   │   ├── HostAddress.java
│       │       │                   │   ├── JsonUtil.java
│       │       │                   │   ├── StringUtils.java
│       │       │                   │   └── WeakConcurrentMap.java
│       │       │                   └── jackson/
│       │       │                       └── annotation/
│       │       │                           └── JsonProperty.java
│       │       └── io/
│       │           └── opentelemetry/
│       │               └── sdk/
│       │                   └── resources/
│       │                       └── EaseAgentResource.java
│       └── test/
│           └── java/
│               └── com/
│                   └── megaease/
│                       └── easeagent/
│                           └── plugin/
│                               ├── api/
│                               │   ├── MockSystemEnv.java
│                               │   ├── ProgressFieldsTest.java
│                               │   ├── metric/
│                               │   │   └── name/
│                               │   │       └── NameFactoryTest.java
│                               │   └── middleware/
│                               │       ├── RedirectProcessorTest.java
│                               │       ├── RedirectTest.java
│                               │       └── ResourceConfigTest.java
│                               ├── async/
│                               │   └── ThreadLocalCurrentContextTest.java
│                               └── tools/
│                                   └── config/
│                                       └── AutoRefreshConfigSupplierTest.java
├── plugins/
│   ├── async/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       ├── AsyncPlugin.java
│   │       │                       ├── advice/
│   │       │                       │   ├── CrossThreadAdvice.java
│   │       │                       │   └── ReactSchedulersAdvice.java
│   │       │                       └── interceptor/
│   │       │                           └── RunnableInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── interceptor/
│   │           │                       └── RunnableInterceptorTest.java
│   │           └── resources/
│   │               └── log4j2.xml
│   ├── dubbo/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── dubbo/
│   │       │                           ├── AlibabaDubboCtxUtils.java
│   │       │                           ├── ApacheDubboCtxUtils.java
│   │       │                           ├── DubboMetricTags.java
│   │       │                           ├── DubboPlugin.java
│   │       │                           ├── DubboTraceTags.java
│   │       │                           ├── advice/
│   │       │                           │   ├── AlibabaDubboAdvice.java
│   │       │                           │   ├── AlibabaDubboResponseFutureAdvice.java
│   │       │                           │   └── ApacheDubboAdvice.java
│   │       │                           ├── config/
│   │       │                           │   └── DubboTraceConfig.java
│   │       │                           └── interceptor/
│   │       │                               ├── DubboBaseInterceptor.java
│   │       │                               ├── metrics/
│   │       │                               │   ├── DubboBaseMetricsInterceptor.java
│   │       │                               │   ├── DubboMetrics.java
│   │       │                               │   ├── alibaba/
│   │       │                               │   │   ├── AlibabaDubboAsyncMetricsInterceptor.java
│   │       │                               │   │   ├── AlibabaDubboMetricsCallback.java
│   │       │                               │   │   └── AlibabaDubboMetricsInterceptor.java
│   │       │                               │   └── apache/
│   │       │                               │       ├── ApacheDubboMetricsAsyncCallback.java
│   │       │                               │       └── ApacheDubboMetricsInterceptor.java
│   │       │                               └── trace/
│   │       │                                   ├── alibaba/
│   │       │                                   │   ├── AlibabaDubboAsyncTraceInterceptor.java
│   │       │                                   │   ├── AlibabaDubboClientRequest.java
│   │       │                                   │   ├── AlibabaDubboServerRequest.java
│   │       │                                   │   ├── AlibabaDubboTraceCallback.java
│   │       │                                   │   └── AlibabaDubboTraceInterceptor.java
│   │       │                                   └── apache/
│   │       │                                       ├── ApacheDubboClientRequest.java
│   │       │                                       ├── ApacheDubboServerRequest.java
│   │       │                                       ├── ApacheDubboTraceCallback.java
│   │       │                                       └── ApacheDubboTraceInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── dubbo/
│   │           │                       └── interceptor/
│   │           │                           ├── AlibabaDubboBaseTest.java
│   │           │                           ├── ApacheDubboBaseTest.java
│   │           │                           ├── metrics/
│   │           │                           │   ├── alibaba/
│   │           │                           │   │   ├── AlibabaDubboAsyncMetricsInterceptorTest.java
│   │           │                           │   │   └── AlibabaDubboMetricsInterceptorTest.java
│   │           │                           │   └── apache/
│   │           │                           │       └── ApacheDubboMetricsInterceptorTest.java
│   │           │                           └── trace/
│   │           │                               ├── alibaba/
│   │           │                               │   ├── AlibabaDubboAsyncTraceInterceptorTest.java
│   │           │                               │   └── AlibabaDubboTraceInterceptorTest.java
│   │           │                               └── apache/
│   │           │                                   └── ApacheDubboTraceInterceptorTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── elasticsearch/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── elasticsearch/
│   │       │                           ├── ElasticsearchPlugin.java
│   │       │                           ├── ElasticsearchRedirectPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   └── SpringElasticsearchAdvice.java
│   │       │                           ├── interceptor/
│   │       │                           │   ├── AsyncResponse4MetricsListener.java
│   │       │                           │   ├── AsyncResponse4TraceListener.java
│   │       │                           │   ├── ElasticsearchBaseInterceptor.java
│   │       │                           │   ├── ElasticsearchBaseMetricsInterceptor.java
│   │       │                           │   ├── ElasticsearchBaseTraceInterceptor.java
│   │       │                           │   ├── ElasticsearchCtxUtils.java
│   │       │                           │   ├── ElasticsearchMetric.java
│   │       │                           │   ├── ElasticsearchPerformRequestAsync4MetricsInterceptor.java
│   │       │                           │   ├── ElasticsearchPerformRequestAsync4TraceInterceptor.java
│   │       │                           │   ├── ElasticsearchPerformRequestMetricsInterceptor.java
│   │       │                           │   ├── ElasticsearchPerformRequestTraceInterceptor.java
│   │       │                           │   └── redirect/
│   │       │                           │       └── SpringElasticsearchInterceptor.java
│   │       │                           └── points/
│   │       │                               ├── ElasticsearchPerformRequestAsyncPoints.java
│   │       │                               └── ElasticsearchPerformRequestPoints.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── plugin/
│   │                               └── elasticsearch/
│   │                                   └── interceptor/
│   │                                       ├── ElasticsearchBaseTest.java
│   │                                       ├── ElasticsearchCtxUtilsTest.java
│   │                                       ├── ElasticsearchPerformRequestAsyncMetricsInterceptorTest.java
│   │                                       ├── ElasticsearchPerformRequestAsyncTraceInterceptorTest.java
│   │                                       ├── ElasticsearchPerformRequestMetricsInterceptorTest.java
│   │                                       └── ElasticsearchPerformRequestTraceInterceptorTest.java
│   ├── healthy/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── healthy/
│   │       │                           ├── HealthPlugin.java
│   │       │                           ├── OnApplicationEventInterceptor.java
│   │       │                           └── SpringApplicationAdminMXBeanRegistrarAdvice.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── plugin/
│   │                               └── healthy/
│   │                                   └── OnApplicationEventInterceptorTest.java
│   ├── httpclient/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── httpclient/
│   │       │                           ├── ForwardedPlugin.java
│   │       │                           ├── HttpClientPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   ├── HttpClient5AsyncAdvice.java
│   │       │                           │   ├── HttpClient5DoExecuteAdvice.java
│   │       │                           │   └── HttpClientDoExecuteAdvice.java
│   │       │                           └── interceptor/
│   │       │                               ├── HttpClient5AsyncForwardedInterceptor.java
│   │       │                               ├── HttpClient5AsyncTracingInterceptor.java
│   │       │                               ├── HttpClient5DoExecuteForwardedInterceptor.java
│   │       │                               ├── HttpClient5DoExecuteInterceptor.java
│   │       │                               ├── HttpClientDoExecuteForwardedInterceptor.java
│   │       │                               └── HttpClientDoExecuteInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── httpclient/
│   │           │                       └── interceptor/
│   │           │                           ├── HttpClient5AsyncForwardedInterceptorTest.java
│   │           │                           ├── HttpClient5AsyncTracingInterceptorTest.java
│   │           │                           ├── HttpClient5DoExecuteForwardedInterceptorTest.java
│   │           │                           ├── HttpClient5DoExecuteInterceptorTest.java
│   │           │                           ├── HttpClientDoExecuteForwardedInterceptorTest.java
│   │           │                           ├── HttpClientDoExecuteInterceptorTest.java
│   │           │                           └── TestConst.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── httpservlet/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── httpservlet/
│   │       │                           ├── AccessPlugin.java
│   │       │                           ├── ForwardedPlugin.java
│   │       │                           ├── HttpServletPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   └── DoFilterPoints.java
│   │       │                           ├── interceptor/
│   │       │                           │   ├── BaseServletInterceptor.java
│   │       │                           │   ├── DoFilterForwardedInterceptor.java
│   │       │                           │   ├── DoFilterMetricInterceptor.java
│   │       │                           │   ├── DoFilterTraceInterceptor.java
│   │       │                           │   ├── HttpServerRequest.java
│   │       │                           │   ├── ServletAccessLogServerInfo.java
│   │       │                           │   └── ServletHttpLogInterceptor.java
│   │       │                           └── utils/
│   │       │                               ├── InternalAsyncListener.java
│   │       │                               └── ServletUtils.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── httpservlet/
│   │           │                       └── interceptor/
│   │           │                           ├── BaseServletInterceptorTest.java
│   │           │                           ├── DoFilterForwardedInterceptorTest.java
│   │           │                           ├── DoFilterMetricInterceptorTest.java
│   │           │                           ├── DoFilterTraceInterceptorTest.java
│   │           │                           ├── HttpServerRequestTest.java
│   │           │                           ├── ServletAccessLogInfoServerInfoTest.java
│   │           │                           ├── ServletHttpLogInterceptorTest.java
│   │           │                           ├── TestConst.java
│   │           │                           └── TestServletUtils.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── httpurlconnection/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── httpurlconnection/
│   │       │                           ├── ForwardedPlugin.java
│   │       │                           ├── HttpURLConnectionPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   └── HttpURLConnectionGetResponseCodeAdvice.java
│   │       │                           └── interceptor/
│   │       │                               ├── HttpURLConnectionGetResponseCodeForwardedInterceptor.java
│   │       │                               └── HttpURLConnectionGetResponseCodeInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── httpurlconnection/
│   │           │                       └── interceptor/
│   │           │                           ├── HttpURLConnectionGetResponseCodeForwardedInterceptorTest.java
│   │           │                           ├── HttpURLConnectionGetResponseCodeInterceptorTest.java
│   │           │                           └── TestUtils.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── httpurlconnection-jdk17/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── httpurlconnection/
│   │       │                           └── jdk17/
│   │       │                               ├── ForwardedPlugin.java
│   │       │                               ├── HttpURLConnectionPlugin.java
│   │       │                               ├── advice/
│   │       │                               │   └── HttpURLConnectionAdvice.java
│   │       │                               └── interceptor/
│   │       │                                   ├── DynamicFieldUtils.java
│   │       │                                   ├── HttpURLConnectionForwardedInterceptor.java
│   │       │                                   ├── HttpURLConnectionInterceptor.java
│   │       │                                   └── HttpURLConnectionUtils.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── httpurlconnection/
│   │           │                       └── jdk17/
│   │           │                           └── interceptor/
│   │           │                               ├── HttpURLConnectionForwardedInterceptorTest.java
│   │           │                               ├── HttpURLConnectionInterceptorTest.java
│   │           │                               └── TestUtils.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── jdbc/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── jdbc/
│   │       │                           ├── JdbcConnectionMetricPlugin.java
│   │       │                           ├── JdbcDataSourceMetricPlugin.java
│   │       │                           ├── JdbcRedirectPlugin.java
│   │       │                           ├── JdbcTracingPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   ├── HikariDataSourceAdvice.java
│   │       │                           │   ├── JdbcConnectionAdvice.java
│   │       │                           │   ├── JdbcDataSourceAdvice.java
│   │       │                           │   └── JdbcStatementAdvice.java
│   │       │                           ├── common/
│   │       │                           │   ├── DatabaseInfo.java
│   │       │                           │   ├── JdbcUtils.java
│   │       │                           │   ├── MD5DictionaryItem.java
│   │       │                           │   ├── MD5ReportConsumer.java
│   │       │                           │   ├── MD5SQLCompression.java
│   │       │                           │   ├── SQLCompression.java
│   │       │                           │   ├── SQLCompressionFactory.java
│   │       │                           │   ├── SQLCompressionWrapper.java
│   │       │                           │   └── SqlInfo.java
│   │       │                           └── interceptor/
│   │       │                               ├── JdbConPrepareOrCreateStmInterceptor.java
│   │       │                               ├── JdbcStmPrepareSqlInterceptor.java
│   │       │                               ├── metric/
│   │       │                               │   ├── JdbcDataSourceMetricInterceptor.java
│   │       │                               │   ├── JdbcMetric.java
│   │       │                               │   └── JdbcStmMetricInterceptor.java
│   │       │                               ├── redirect/
│   │       │                               │   └── HikariSetPropertyInterceptor.java
│   │       │                               └── tracing/
│   │       │                                   └── JdbcStmTracingInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── jdbc/
│   │           │                       ├── MockJDBCStatement.java
│   │           │                       ├── TestUtils.java
│   │           │                       ├── common/
│   │           │                       │   ├── DatabaseInfoTest.java
│   │           │                       │   ├── JdbcUtilsTest.java
│   │           │                       │   ├── MD5DictionaryItemTest.java
│   │           │                       │   ├── MD5ReportConsumerTest.java
│   │           │                       │   ├── MD5SQLCompressionTest.java
│   │           │                       │   └── SqlInfoTest.java
│   │           │                       └── interceptor/
│   │           │                           ├── JdbConPrepareOrCreateStmInterceptorTest.java
│   │           │                           ├── JdbcStmPrepareSqlInterceptorTest.java
│   │           │                           ├── metric/
│   │           │                           │   ├── JdbcDataSourceMetricInterceptorTest.java
│   │           │                           │   ├── JdbcMetricTest.java
│   │           │                           │   └── JdbcStmMetricInterceptorTest.java
│   │           │                           ├── redirect/
│   │           │                           │   └── HikariSetPropertyInterceptorTest.java
│   │           │                           └── tracing/
│   │           │                               └── JdbcStmTracingInterceptorTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── kafka/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── kafka/
│   │       │                           ├── KafkaPlugin.java
│   │       │                           ├── KafkaRedirectPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   ├── KafkaConsumerAdvice.java
│   │       │                           │   ├── KafkaConsumerConfigAdvice.java
│   │       │                           │   ├── KafkaConsumerRecordAdvice.java
│   │       │                           │   ├── KafkaMessageListenerAdvice.java
│   │       │                           │   ├── KafkaProducerAdvice.java
│   │       │                           │   └── KafkaProducerConfigAdvice.java
│   │       │                           └── interceptor/
│   │       │                               ├── AsyncCallback.java
│   │       │                               ├── KafkaUtils.java
│   │       │                               ├── initialize/
│   │       │                               │   ├── ConsumerRecordInterceptor.java
│   │       │                               │   ├── KafkaConsumerConstructInterceptor.java
│   │       │                               │   ├── KafkaConsumerPollInterceptor.java
│   │       │                               │   └── KafkaProducerConstructInterceptor.java
│   │       │                               ├── metric/
│   │       │                               │   ├── KafkaConsumerMetricInterceptor.java
│   │       │                               │   ├── KafkaMessageListenerMetricInterceptor.java
│   │       │                               │   ├── KafkaMetric.java
│   │       │                               │   ├── KafkaProducerMetricInterceptor.java
│   │       │                               │   └── MetricCallback.java
│   │       │                               ├── redirect/
│   │       │                               │   ├── KafkaAbstractConfigConstructInterceptor.java
│   │       │                               │   ├── KafkaConsumerConfigConstructInterceptor.java
│   │       │                               │   └── KafkaProducerConfigConstructInterceptor.java
│   │       │                               └── tracing/
│   │       │                                   ├── KafkaConsumerRequest.java
│   │       │                                   ├── KafkaConsumerTracingInterceptor.java
│   │       │                                   ├── KafkaHeaders.java
│   │       │                                   ├── KafkaMessageListenerTracingInterceptor.java
│   │       │                                   ├── KafkaProducerDoSendInterceptor.java
│   │       │                                   ├── KafkaProducerRequest.java
│   │       │                                   ├── KafkaTags.java
│   │       │                                   └── TraceCallback.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── kafka/
│   │           │                       └── interceptor/
│   │           │                           ├── AsyncCallbackTest.java
│   │           │                           ├── KafkaTestUtils.java
│   │           │                           ├── KafkaUtilsTest.java
│   │           │                           ├── MockConsumerRecord.java
│   │           │                           ├── MockKafkaConsumer.java
│   │           │                           ├── MockKafkaProducer.java
│   │           │                           ├── TestConst.java
│   │           │                           ├── initialize/
│   │           │                           │   ├── ConsumerRecordInterceptorTest.java
│   │           │                           │   ├── KafkaConsumerConstructInterceptorTest.java
│   │           │                           │   ├── KafkaConsumerPollInterceptorTest.java
│   │           │                           │   ├── KafkaProducerConstructInterceptorTest.java
│   │           │                           │   └── MockDynamicFieldAccessor.java
│   │           │                           ├── metric/
│   │           │                           │   ├── KafkaConsumerMetricInterceptorTest.java
│   │           │                           │   ├── KafkaMessageListenerMetricInterceptorTest.java
│   │           │                           │   ├── KafkaMetricTest.java
│   │           │                           │   ├── KafkaProducerMetricInterceptorTest.java
│   │           │                           │   └── MetricCallbackTest.java
│   │           │                           ├── redirect/
│   │           │                           │   └── KafkaAbstractConfigConstructInterceptorTest.java
│   │           │                           └── tracing/
│   │           │                               ├── KafkaConsumerRequestTest.java
│   │           │                               ├── KafkaConsumerTracingInterceptorTest.java
│   │           │                               ├── KafkaHeadersTest.java
│   │           │                               ├── KafkaMessageListenerTracingInterceptorTest.java
│   │           │                               ├── KafkaProducerDoSendInterceptorTest.java
│   │           │                               ├── KafkaProducerRequestTest.java
│   │           │                               └── TraceCallbackTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── log4j2-log-plugin/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── log4j2/
│   │                               ├── Log4j2Plugin.java
│   │                               ├── interceptor/
│   │                               │   └── Log4j2AppenderInterceptor.java
│   │                               ├── log/
│   │                               │   └── Log4jLogMapper.java
│   │                               └── points/
│   │                                   └── AbstractLoggerPoints.java
│   ├── logback/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── logback/
│   │                               ├── LogbackPlugin.java
│   │                               ├── interceptor/
│   │                               │   └── LogbackAppenderInterceptor.java
│   │                               ├── log/
│   │                               │   └── LogbackLogMapper.java
│   │                               └── points/
│   │                                   └── LoggerPoints.java
│   ├── mongodb/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── mongodb/
│   │       │                           ├── MongoPlugin.java
│   │       │                           ├── MongoRedirectPlugin.java
│   │       │                           ├── MongoUtils.java
│   │       │                           ├── interceptor/
│   │       │                           │   ├── InterceptorHelper.java
│   │       │                           │   ├── MetricHelper.java
│   │       │                           │   ├── MongoBaseInterceptor.java
│   │       │                           │   ├── MongoBaseMetricInterceptor.java
│   │       │                           │   ├── MongoBaseTraceInterceptor.java
│   │       │                           │   ├── MongoClientConstruct4MetricInterceptor.java
│   │       │                           │   ├── MongoClientConstruct4TraceInterceptor.java
│   │       │                           │   ├── MongoCtx.java
│   │       │                           │   ├── MongoDbRedirectInterceptor.java
│   │       │                           │   ├── MongoInternalConnectionSendAndReceiveAsync4MetricInterceptor.java
│   │       │                           │   ├── MongoInternalConnectionSendAndReceiveAsync4TraceInterceptor.java
│   │       │                           │   ├── MongoMetric.java
│   │       │                           │   ├── MongoReactiveInitMetricInterceptor.java
│   │       │                           │   ├── MongoReactiveInitTraceInterceptor.java
│   │       │                           │   ├── TraceHelper.java
│   │       │                           │   └── listener/
│   │       │                           │       ├── MongoBaseCommandListener.java
│   │       │                           │       ├── MongoBaseMetricCommandListener.java
│   │       │                           │       ├── MongoBaseTraceCommandListener.java
│   │       │                           │       ├── MongoMetricCommandListener.java
│   │       │                           │       ├── MongoReactiveMetricCommandListener.java
│   │       │                           │       ├── MongoReactiveTraceCommandListener.java
│   │       │                           │       └── MongoTraceCommandListener.java
│   │       │                           └── points/
│   │       │                               ├── MongoAsyncMongoClientsPoints.java
│   │       │                               ├── MongoClientImplPoints.java
│   │       │                               ├── MongoDBInternalConnectionPoints.java
│   │       │                               └── MongoRedirectPoints.java
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── megaease/
│   │                       └── easeagent/
│   │                           └── plugin/
│   │                               └── mongodb/
│   │                                   ├── MongoBaseTest.java
│   │                                   ├── MongoMetricTest.java
│   │                                   ├── MongoReactiveMetricTest.java
│   │                                   ├── MongoReactiveTraceTest.java
│   │                                   ├── MongoTraceTest.java
│   │                                   └── TraceHelperTest.java
│   ├── motan/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── motan/
│   │       │                           ├── MotanPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   ├── MotanConsumerAdvice.java
│   │       │                           │   └── MotanProviderAdvice.java
│   │       │                           ├── config/
│   │       │                           │   └── MotanPluginConfig.java
│   │       │                           └── interceptor/
│   │       │                               ├── MotanClassUtils.java
│   │       │                               ├── MotanCtxUtils.java
│   │       │                               ├── metrics/
│   │       │                               │   ├── MetricsFutureListener.java
│   │       │                               │   ├── MotanBaseMetricsInterceptor.java
│   │       │                               │   ├── MotanMetric.java
│   │       │                               │   ├── MotanMetricTags.java
│   │       │                               │   └── MotanMetricsInterceptor.java
│   │       │                               └── trace/
│   │       │                                   ├── MotanBaseInterceptor.java
│   │       │                                   ├── MotanTags.java
│   │       │                                   ├── consumer/
│   │       │                                   │   ├── MotanConsumerRequest.java
│   │       │                                   │   ├── MotanConsumerTraceInterceptor.java
│   │       │                                   │   └── TraceFutureListener.java
│   │       │                                   └── provider/
│   │       │                                       ├── MotanProviderRequest.java
│   │       │                                       └── MotanProviderTraceInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── motan/
│   │           │                       └── interceptor/
│   │           │                           ├── metrics/
│   │           │                           │   └── MotanMetricsInterceptorTest.java
│   │           │                           └── trace/
│   │           │                               ├── MotanInterceptorTest.java
│   │           │                               ├── consumer/
│   │           │                               │   └── MotanConsumerInterceptorTest.java
│   │           │                               └── provider/
│   │           │                                   └── MotanProviderInterceptorTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── okhttp/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── okhttp/
│   │       │                           ├── ForwardedPlugin.java
│   │       │                           ├── OkHttpPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   └── OkHttpAdvice.java
│   │       │                           └── interceptor/
│   │       │                               ├── ForwardedRequest.java
│   │       │                               ├── InternalRequest.java
│   │       │                               ├── InternalResponse.java
│   │       │                               ├── OkHttpAsyncTracingInterceptor.java
│   │       │                               ├── OkHttpForwardedInterceptor.java
│   │       │                               └── OkHttpTracingInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── okhttp/
│   │           │                       └── interceptor/
│   │           │                           ├── OkHttpAsyncTracingInterceptorTest.java
│   │           │                           ├── OkHttpForwardedInterceptorTest.java
│   │           │                           ├── OkHttpTestUtils.java
│   │           │                           ├── OkHttpTracingInterceptorTest.java
│   │           │                           └── TestConst.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── pom.xml
│   ├── rabbitmq/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── rabbitmq/
│   │       │                           ├── RabbitMqConsumerMetric.java
│   │       │                           ├── RabbitMqPlugin.java
│   │       │                           ├── RabbitMqProducerMetric.java
│   │       │                           ├── RabbitMqRedirectPlugin.java
│   │       │                           ├── spring/
│   │       │                           │   ├── RabbitMqMessageListenerAdvice.java
│   │       │                           │   └── interceptor/
│   │       │                           │       ├── RabbitMqMessageListenerOnMessageInterceptor.java
│   │       │                           │       ├── RabbitMqOnMessageMetricInterceptor.java
│   │       │                           │       └── RabbitMqOnMessageTracingInterceptor.java
│   │       │                           └── v5/
│   │       │                               ├── advice/
│   │       │                               │   ├── RabbitMqChannelAdvice.java
│   │       │                               │   ├── RabbitMqConfigFactoryAdvice.java
│   │       │                               │   ├── RabbitMqConsumerAdvice.java
│   │       │                               │   └── RabbitMqPropertyAdvice.java
│   │       │                               └── interceptor/
│   │       │                                   ├── RabbitMqChannelConsumeInterceptor.java
│   │       │                                   ├── RabbitMqChannelConsumerDeliveryInterceptor.java
│   │       │                                   ├── RabbitMqChannelPublishInterceptor.java
│   │       │                                   ├── RabbitMqConsumerHandleDeliveryInterceptor.java
│   │       │                                   ├── metirc/
│   │       │                                   │   ├── RabbitMqConsumerMetricInterceptor.java
│   │       │                                   │   └── RabbitMqProducerMetricInterceptor.java
│   │       │                                   ├── redirect/
│   │       │                                   │   ├── RabbitMqConfigFactoryInterceptor.java
│   │       │                                   │   └── RabbitMqPropertyInterceptor.java
│   │       │                                   └── tracing/
│   │       │                                       ├── RabbitMqChannelPublishTracingInterceptor.java
│   │       │                                       └── RabbitMqConsumerTracingInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── rabbitmq/
│   │           │                       ├── RabbitMqConsumerMetricTest.java
│   │           │                       ├── RabbitMqProducerMetricTest.java
│   │           │                       ├── TestUtils.java
│   │           │                       ├── spring/
│   │           │                       │   └── interceptor/
│   │           │                       │       ├── RabbitMqMessageListenerOnMessageInterceptorTest.java
│   │           │                       │       ├── RabbitMqOnMessageMetricInterceptorTest.java
│   │           │                       │       └── RabbitMqOnMessageTracingInterceptorTest.java
│   │           │                       └── v5/
│   │           │                           └── interceptor/
│   │           │                               ├── MockConsumer.java
│   │           │                               ├── RabbitMqChannelConsumeInterceptorTest.java
│   │           │                               ├── RabbitMqChannelConsumerDeliveryInterceptorTest.java
│   │           │                               ├── RabbitMqChannelPublishInterceptorTest.java
│   │           │                               ├── RabbitMqConsumerHandleDeliveryInterceptorTest.java
│   │           │                               ├── metirc/
│   │           │                               │   ├── RabbitMqConsumerMetricInterceptorTest.java
│   │           │                               │   └── RabbitMqProducerMetricInterceptorTest.java
│   │           │                               ├── redirect/
│   │           │                               │   └── RabbitMqPropertyInterceptorTest.java
│   │           │                               └── tracing/
│   │           │                                   ├── RabbitMqChannelPublishTracingInterceptorTest.java
│   │           │                                   └── RabbitMqConsumerTracingInterceptorTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── redis/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── redis/
│   │       │                           ├── RedisPlugin.java
│   │       │                           ├── RedisRedirectPlugin.java
│   │       │                           ├── advice/
│   │       │                           │   ├── JedisAdvice.java
│   │       │                           │   ├── JedisConstructorAdvice.java
│   │       │                           │   ├── LettuceRedisClientAdvice.java
│   │       │                           │   ├── RedisChannelWriterAdvice.java
│   │       │                           │   ├── RedisClusterClientAdvice.java
│   │       │                           │   ├── RedisPropertiesAdvice.java
│   │       │                           │   ├── RedisPropertiesClusterAdvice.java
│   │       │                           │   └── StatefulRedisConnectionAdvice.java
│   │       │                           └── interceptor/
│   │       │                               ├── RedisClassUtils.java
│   │       │                               ├── RedisClientUtils.java
│   │       │                               ├── initialize/
│   │       │                               │   ├── CommonRedisClientInterceptor.java
│   │       │                               │   ├── CompletableFutureWrapper.java
│   │       │                               │   ├── ConnectionFutureWrapper.java
│   │       │                               │   ├── RedisClientInterceptor.java
│   │       │                               │   └── RedisClusterClientInterceptor.java
│   │       │                               ├── metric/
│   │       │                               │   ├── CommonRedisMetricInterceptor.java
│   │       │                               │   ├── JedisMetricInterceptor.java
│   │       │                               │   └── LettuceMetricInterceptor.java
│   │       │                               ├── redirect/
│   │       │                               │   ├── JedisConstructorInterceptor.java
│   │       │                               │   ├── LettuceRedisClientConstructInterceptor.java
│   │       │                               │   ├── RedisPropertiesClusterSetNodesInterceptor.java
│   │       │                               │   └── RedisPropertiesSetPropertyInterceptor.java
│   │       │                               └── tracing/
│   │       │                                   ├── CommonRedisTracingInterceptor.java
│   │       │                                   ├── JedisTracingInterceptor.java
│   │       │                                   ├── LettuceTracingInterceptor.java
│   │       │                                   └── StatefulRedisConnectionInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── redis/
│   │           │                       └── interceptor/
│   │           │                           ├── RedisUtils.java
│   │           │                           ├── TestConst.java
│   │           │                           ├── initialize/
│   │           │                           │   ├── CommonRedisClientInterceptorTest.java
│   │           │                           │   ├── CompletableFutureWrapperTest.java
│   │           │                           │   ├── ConnectionFutureWrapperTest.java
│   │           │                           │   └── DynamicFieldAccessorObj.java
│   │           │                           ├── metric/
│   │           │                           │   ├── CommonRedisMetricInterceptorTest.java
│   │           │                           │   ├── JedisMetricInterceptorTest.java
│   │           │                           │   └── LettuceMetricInterceptorTest.java
│   │           │                           ├── redirect/
│   │           │                           │   ├── JedisConstructorInterceptorTest.java
│   │           │                           │   ├── LettuceRedisClientConstructInterceptorTest.java
│   │           │                           │   ├── RedisPropertiesClusterSetNodesInterceptorTest.java
│   │           │                           │   └── RedisPropertiesSetPropertyInterceptorTest.java
│   │           │                           └── tracing/
│   │           │                               ├── CommonRedisTracingInterceptorTest.java
│   │           │                               ├── JedisTracingInterceptorTest.java
│   │           │                               └── LettuceTracingInterceptorTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── servicename/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── servicename/
│   │       │                           ├── Const.java
│   │       │                           ├── ReflectionTool.java
│   │       │                           ├── ServiceNamePlugin.java
│   │       │                           ├── ServiceNamePluginConfig.java
│   │       │                           ├── advice/
│   │       │                           │   ├── FeignBlockingLoadBalancerClientAdvice.java
│   │       │                           │   ├── FeignLoadBalancerAdvice.java
│   │       │                           │   ├── FilteringWebHandlerAdvice.java
│   │       │                           │   ├── LoadBalancerFeignClientAdvice.java
│   │       │                           │   ├── RestTemplateInterceptAdvice.java
│   │       │                           │   └── WebClientFilterAdvice.java
│   │       │                           └── interceptor/
│   │       │                               ├── BaseServiceNameInterceptor.java
│   │       │                               ├── FeignBlockingLoadBalancerClientInterceptor.java
│   │       │                               ├── FeignLoadBalancerInterceptor.java
│   │       │                               ├── FilteringWebHandlerInterceptor.java
│   │       │                               ├── LoadBalancerFeignClientInterceptor.java
│   │       │                               ├── RestTemplateInterceptInterceptor.java
│   │       │                               └── WebClientFilterInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   ├── com/
│   │           │   │   └── megaease/
│   │           │   │       └── easeagent/
│   │           │   │           └── plugin/
│   │           │   │               └── servicename/
│   │           │   │                   ├── ReflectionToolTest.java
│   │           │   │                   └── interceptor/
│   │           │   │                       ├── BaseServiceNameInterceptorTest.java
│   │           │   │                       ├── CheckUtils.java
│   │           │   │                       ├── FeignBlockingLoadBalancerClientInterceptorTest.java
│   │           │   │                       ├── FeignLoadBalancerInterceptorTest.java
│   │           │   │                       ├── FilteringWebHandlerInterceptorTest.java
│   │           │   │                       ├── LoadBalancerFeignClientInterceptorTest.java
│   │           │   │                       ├── RestTemplateInterceptInterceptorTest.java
│   │           │   │                       ├── TestConst.java
│   │           │   │                       └── WebClientFilterInterceptorTest.java
│   │           │   └── org/
│   │           │       └── springframework/
│   │           │           ├── cloud/
│   │           │           │   └── openfeign/
│   │           │           │       └── ribbon/
│   │           │           │           └── MockRibbonRequest.java
│   │           │           └── web/
│   │           │               └── reactive/
│   │           │                   └── function/
│   │           │                       └── client/
│   │           │                           └── MockClientRequest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── sofarpc/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── com/
│   │       │           └── megaease/
│   │       │               └── easeagent/
│   │       │                   └── plugin/
│   │       │                       └── sofarpc/
│   │       │                           ├── SofaRpcCtxUtils.java
│   │       │                           ├── SofaRpcMetricsTags.java
│   │       │                           ├── SofaRpcPlugin.java
│   │       │                           ├── SofaRpcTraceTags.java
│   │       │                           ├── adivce/
│   │       │                           │   ├── BoltFutureInvokeCallbackConstructAdvice.java
│   │       │                           │   ├── ConsumerAdvice.java
│   │       │                           │   ├── FutureInvokeCallbackConstructAdvice.java
│   │       │                           │   ├── ProviderAdvice.java
│   │       │                           │   ├── ResponseCallbackAdvice.java
│   │       │                           │   └── ResponseFutureAdvice.java
│   │       │                           ├── config/
│   │       │                           │   └── SofaRpcTraceConfig.java
│   │       │                           └── interceptor/
│   │       │                               ├── initalize/
│   │       │                               │   └── SofaRpcFutureInvokeCallbackConstructInterceptor.java
│   │       │                               ├── metrics/
│   │       │                               │   ├── SofaRpcMetrics.java
│   │       │                               │   ├── SofaRpcMetricsBaseInterceptor.java
│   │       │                               │   ├── callback/
│   │       │                               │   │   ├── SofaRpcResponseCallbackMetrics.java
│   │       │                               │   │   └── SofaRpcResponseCallbackMetricsInterceptor.java
│   │       │                               │   ├── common/
│   │       │                               │   │   └── SofaRpcMetricsInterceptor.java
│   │       │                               │   └── future/
│   │       │                               │       └── SofaRpcResponseFutureMetricsInterceptor.java
│   │       │                               └── trace/
│   │       │                                   ├── SofaRpcTraceBaseInterceptor.java
│   │       │                                   ├── callback/
│   │       │                                   │   ├── SofaRpcResponseCallbackTrace.java
│   │       │                                   │   └── SofaRpcResponseCallbackTraceInterceptor.java
│   │       │                                   ├── common/
│   │       │                                   │   ├── SofaClientTraceRequest.java
│   │       │                                   │   ├── SofaRpcConsumerTraceInterceptor.java
│   │       │                                   │   ├── SofaRpcProviderTraceInterceptor.java
│   │       │                                   │   └── SofaServerTraceRequest.java
│   │       │                                   └── future/
│   │       │                                       └── SofaRpcResponseFutureTraceInterceptor.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── megaease/
│   │           │           └── easeagent/
│   │           │               └── plugin/
│   │           │                   └── sofarpc/
│   │           │                       └── interceptor/
│   │           │                           ├── BaseInterceptorTest.java
│   │           │                           ├── MockBoltResponseFuture.java
│   │           │                           ├── metrics/
│   │           │                           │   ├── BaseMetricsInterceptorTest.java
│   │           │                           │   ├── callback/
│   │           │                           │   │   ├── MockSofaResponseCallback.java
│   │           │                           │   │   └── SofaRpcResponseCallbackMetricsInterceptorTest.java
│   │           │                           │   ├── common/
│   │           │                           │   │   └── SofaRpcMetricsInterceptorTest.java
│   │           │                           │   └── future/
│   │           │                           │       └── SofaRpcResponseFutureMetricsInterceptorTest.java
│   │           │                           └── trace/
│   │           │                               ├── callback/
│   │           │                               │   ├── MockSofaResponseCallback.java
│   │           │                               │   └── SofaRpcResponseCallbackTraceInterceptorTest.java
│   │           │                               ├── common/
│   │           │                               │   ├── SofaRpcConsumerTraceInterceptorTest.java
│   │           │                               │   └── SofaRpcProviderTraceInterceptorTest.java
│   │           │                               └── future/
│   │           │                                   └── SofaRpcResponseFutureTraceInterceptorTest.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── spring-boot-3.5.3/
│   │   ├── pom.xml
│   │   ├── spring-boot-gateway-3.5.3/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   └── java/
│   │   │       │       └── easeagent/
│   │   │       │           └── plugin/
│   │   │       │               └── spring353/
│   │   │       │                   └── gateway/
│   │   │       │                       ├── AccessPlugin.java
│   │   │       │                       ├── ForwardedPlugin.java
│   │   │       │                       ├── GatewayCons.java
│   │   │       │                       ├── SpringGatewayPlugin.java
│   │   │       │                       ├── advice/
│   │   │       │                       │   ├── AgentGlobalFilterAdvice.java
│   │   │       │                       │   ├── HttpHeadersFilterAdvice.java
│   │   │       │                       │   └── InitGlobalFilterAdvice.java
│   │   │       │                       ├── interceptor/
│   │   │       │                       │   ├── TimeUtils.java
│   │   │       │                       │   ├── forwarded/
│   │   │       │                       │   │   └── GatewayServerForwardedInterceptor.java
│   │   │       │                       │   ├── initialize/
│   │   │       │                       │   │   ├── AgentGlobalFilter.java
│   │   │       │                       │   │   └── GlobalFilterInterceptor.java
│   │   │       │                       │   ├── log/
│   │   │       │                       │   │   ├── GatewayAccessLogInterceptor.java
│   │   │       │                       │   │   └── SpringGatewayAccessLogServerInfo.java
│   │   │       │                       │   ├── metric/
│   │   │       │                       │   │   └── GatewayMetricsInterceptor.java
│   │   │       │                       │   └── tracing/
│   │   │       │                       │       ├── FluxHttpServerRequest.java
│   │   │       │                       │       ├── FluxHttpServerResponse.java
│   │   │       │                       │       ├── GatewayServerTracingInterceptor.java
│   │   │       │                       │       └── HttpHeadersFilterTracingInterceptor.java
│   │   │       │                       └── reactor/
│   │   │       │                           ├── AgentCoreSubscriber.java
│   │   │       │                           └── AgentMono.java
│   │   │       └── test/
│   │   │           ├── java/
│   │   │           │   └── easeagent/
│   │   │           │       └── plugin/
│   │   │           │           └── spring353/
│   │   │           │               └── gateway/
│   │   │           │                   ├── TestConst.java
│   │   │           │                   ├── TestServerWebExchangeUtils.java
│   │   │           │                   ├── interceptor/
│   │   │           │                   │   ├── TimeUtilsTest.java
│   │   │           │                   │   ├── forwarded/
│   │   │           │                   │   │   └── GatewayServerForwardedInterceptorTest.java
│   │   │           │                   │   ├── initialize/
│   │   │           │                   │   │   ├── AgentGlobalFilterTest.java
│   │   │           │                   │   │   └── GlobalFilterInterceptorTest.java
│   │   │           │                   │   ├── log/
│   │   │           │                   │   │   ├── GatewayAccessLogInfoInterceptorTest.java
│   │   │           │                   │   │   └── SpringGatewayAccessLogInfoServerInfoTest.java
│   │   │           │                   │   ├── metric/
│   │   │           │                   │   │   ├── GatewayMetricsInterceptorTest.java
│   │   │           │                   │   │   └── MockRouteBuilder.java
│   │   │           │                   │   └── tracing/
│   │   │           │                   │       ├── FluxHttpServerRequestTest.java
│   │   │           │                   │       ├── FluxHttpServerResponseTest.java
│   │   │           │                   │       ├── GatewayServerTracingInterceptorTest.java
│   │   │           │                   │       └── HttpHeadersFilterTracingInterceptorTest.java
│   │   │           │                   └── reactor/
│   │   │           │                       ├── AgentCoreSubscriberTest.java
│   │   │           │                       ├── AgentMonoTest.java
│   │   │           │                       └── MockCoreSubscriber.java
│   │   │           └── resources/
│   │   │               └── mock_agent.properties
│   │   ├── spring-boot-rest-template-3.5.3/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       ├── main/
│   │   │       │   └── java/
│   │   │       │       └── com/
│   │   │       │           └── megaease/
│   │   │       │               └── easeagent/
│   │   │       │                   └── plugin/
│   │   │       │                       └── rest/
│   │   │       │                           └── template/
│   │   │       │                               ├── ForwardedPlugin.java
│   │   │       │                               ├── RestTemplatePlugin.java
│   │   │       │                               ├── advice/
│   │   │       │                               │   └── ClientHttpRequestAdvice.java
│   │   │       │                               └── interceptor/
│   │   │       │                                   ├── forwarded/
│   │   │       │                                   │   └── RestTemplateForwardedInterceptor.java
│   │   │       │                                   └── tracing/
│   │   │       │                                       └── ClientHttpRequestInterceptor.java
│   │   │       └── test/
│   │   │           ├── java/
│   │   │           │   ├── com/
│   │   │           │   │   └── megaease/
│   │   │           │   │       └── easeagent/
│   │   │           │   │           └── plugin/
│   │   │           │   │               └── rest/
│   │   │           │   │                   └── template/
│   │   │           │   │                       └── interceptor/
│   │   │           │   │                           ├── TestConst.java
│   │   │           │   │                           ├── forwarded/
│   │   │           │   │                           │   └── RestTemplateForwardedInterceptorTest.java
│   │   │           │   │                           └── tracing/
│   │   │           │   │                               └── ClientHttpRequestInterceptorTest.java
│   │   │           │   └── org/
│   │   │           │       └── springframework/
│   │   │           │           └── http/
│   │   │           │               └── client/
│   │   │           │                   └── SimpleClientHttpResponseFactory.java
│   │   │           └── resources/
│   │   │               └── mock_agent.properties
│   │   └── spring-boot-servicename-3.5.3/
│   │       ├── pom.xml
│   │       └── src/
│   │           ├── main/
│   │           │   └── java/
│   │           │       └── com/
│   │           │           └── megaease/
│   │           │               └── easeagent/
│   │           │                   └── plugin/
│   │           │                       └── servicename/
│   │           │                           └── springboot353/
│   │           │                               ├── Const.java
│   │           │                               ├── ReflectionTool.java
│   │           │                               ├── ServiceNamePlugin.java
│   │           │                               ├── ServiceNamePluginConfig.java
│   │           │                               ├── advice/
│   │           │                               │   ├── FeignClientLoadBalancerClientAdvice.java
│   │           │                               │   ├── FilteringWebHandlerAdvice.java
│   │           │                               │   ├── RestTemplateInterceptAdvice.java
│   │           │                               │   └── WebClientFilterAdvice.java
│   │           │                               └── interceptor/
│   │           │                                   ├── BaseServiceNameInterceptor.java
│   │           │                                   ├── FeignClientLoadBalancerClientInterceptor.java
│   │           │                                   ├── FilteringWebHandlerInterceptor.java
│   │           │                                   ├── RestTemplateInterceptInterceptor.java
│   │           │                                   └── WebClientFilterInterceptor.java
│   │           └── test/
│   │               ├── java/
│   │               │   └── com/
│   │               │       └── megaease/
│   │               │           └── easeagent/
│   │               │               └── plugin/
│   │               │                   └── servicename/
│   │               │                       └── springboot353/
│   │               │                           ├── ReflectionToolTest.java
│   │               │                           └── interceptor/
│   │               │                               ├── BaseServiceNameInterceptorTest.java
│   │               │                               ├── CheckUtils.java
│   │               │                               ├── FeignBlockingLoadBalancerClientInterceptorTest.java
│   │               │                               ├── FilteringWebHandlerInterceptorTest.java
│   │               │                               ├── RestTemplateInterceptInterceptorTest.java
│   │               │                               ├── TestConst.java
│   │               │                               └── WebClientFilterInterceptorTest.java
│   │               └── resources/
│   │                   └── mock_agent.properties
│   ├── spring-gateway/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   └── java/
│   │       │       └── easeagent/
│   │       │           └── plugin/
│   │       │               └── spring/
│   │       │                   └── gateway/
│   │       │                       ├── AccessPlugin.java
│   │       │                       ├── ForwardedPlugin.java
│   │       │                       ├── SpringGatewayPlugin.java
│   │       │                       ├── advice/
│   │       │                       │   ├── AgentGlobalFilterAdvice.java
│   │       │                       │   ├── CodeCons.java
│   │       │                       │   ├── HttpHeadersFilterAdvice.java
│   │       │                       │   └── InitGlobalFilterAdvice.java
│   │       │                       ├── interceptor/
│   │       │                       │   ├── GatewayCons.java
│   │       │                       │   ├── initialize/
│   │       │                       │   │   ├── AgentGlobalFilter.java
│   │       │                       │   │   ├── GatewayServerForwardedInterceptor.java
│   │       │                       │   │   └── GlobalFilterInterceptor.java
│   │       │                       │   ├── metric/
│   │       │                       │   │   ├── GatewayMetricsInterceptor.java
│   │       │                       │   │   ├── TimeUtils.java
│   │       │                       │   │   └── log/
│   │       │                       │   │       ├── GatewayAccessLogInterceptor.java
│   │       │                       │   │       └── SpringGatewayAccessLogServerInfo.java
│   │       │                       │   └── tracing/
│   │       │                       │       ├── FluxHttpServerRequest.java
│   │       │                       │       ├── FluxHttpServerResponse.java
│   │       │                       │       ├── GatewayServerTracingInterceptor.java
│   │       │                       │       └── HttpHeadersFilterTracingInterceptor.java
│   │       │                       └── reactor/
│   │       │                           ├── AgentCoreSubscriber.java
│   │       │                           └── AgentMono.java
│   │       └── test/
│   │           ├── java/
│   │           │   └── easeagent/
│   │           │       └── plugin/
│   │           │           └── spring/
│   │           │               └── gateway/
│   │           │                   ├── TestConst.java
│   │           │                   ├── TestServerWebExchangeUtils.java
│   │           │                   ├── interceptor/
│   │           │                   │   ├── initialize/
│   │           │                   │   │   ├── AgentGlobalFilterTest.java
│   │           │                   │   │   ├── GatewayServerForwardedInterceptorTest.java
│   │           │                   │   │   └── GlobalFilterInterceptorTest.java
│   │           │                   │   ├── metric/
│   │           │                   │   │   ├── GatewayMetricsInterceptorTest.java
│   │           │                   │   │   ├── MockRouteBuilder.java
│   │           │                   │   │   ├── TimeUtilsTest.java
│   │           │                   │   │   └── log/
│   │           │                   │   │       ├── GatewayAccessLogInfoInterceptorTest.java
│   │           │                   │   │       └── SpringGatewayAccessLogInfoServerInfoTest.java
│   │           │                   │   └── tracing/
│   │           │                   │       ├── FluxHttpServerRequestTest.java
│   │           │                   │       ├── FluxHttpServerResponseTest.java
│   │           │                   │       ├── GatewayServerTracingInterceptorTest.java
│   │           │                   │       └── HttpHeadersFilterTracingInterceptorTest.java
│   │           │                   └── reactor/
│   │           │                       ├── AgentCoreSubscriberTest.java
│   │           │                       ├── AgentMonoTest.java
│   │           │                       └── MockCoreSubscriber.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   ├── springweb/
│   │   ├── README.md
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── megaease/
│   │       │   │           ├── easeagent/
│   │       │   │           │   └── plugin/
│   │       │   │           │       └── springweb/
│   │       │   │           │           ├── FeignClientPlugin.java
│   │       │   │           │           ├── ForwardedPlugin.java
│   │       │   │           │           ├── RestTemplatePlugin.java
│   │       │   │           │           ├── SpringWebPlugin.java
│   │       │   │           │           ├── WebClientPlugin.java
│   │       │   │           │           ├── advice/
│   │       │   │           │           │   ├── ClientHttpRequestAdvice.java
│   │       │   │           │           │   ├── FeignClientAdvice.java
│   │       │   │           │           │   ├── WebClientBuilderAdvice.java
│   │       │   │           │           │   └── WebClientFilterAdvice.java
│   │       │   │           │           ├── interceptor/
│   │       │   │           │           │   ├── HeadersFieldFinder.java
│   │       │   │           │           │   ├── forwarded/
│   │       │   │           │           │   │   ├── FeignClientForwardedInterceptor.java
│   │       │   │           │           │   │   ├── RestTemplateForwardedInterceptor.java
│   │       │   │           │           │   │   └── WebClientFilterForwardedInterceptor.java
│   │       │   │           │           │   ├── initialize/
│   │       │   │           │           │   │   └── WebClientBuildInterceptor.java
│   │       │   │           │           │   └── tracing/
│   │       │   │           │           │       ├── ClientHttpRequestInterceptor.java
│   │       │   │           │           │       ├── FeignClientTracingInterceptor.java
│   │       │   │           │           │       └── WebClientFilterTracingInterceptor.java
│   │       │   │           │           └── reactor/
│   │       │   │           │               ├── AgentCoreSubscriber.java
│   │       │   │           │               └── AgentMono.java
│   │       │   │           └── plugin/
│   │       │   │               └── easeagent/
│   │       │   │                   └── springweb/
│   │       │   │                       └── interceptor/
│   │       │   │                           └── tracing/
│   │       │   │                               └── WebClientTracingFilter.java
│   │       │   └── resources/
│   │       │       └── application.yaml
│   │       └── test/
│   │           ├── java/
│   │           │   ├── com/
│   │           │   │   └── megaease/
│   │           │   │       └── easeagent/
│   │           │   │           └── plugin/
│   │           │   │               └── springweb/
│   │           │   │                   ├── interceptor/
│   │           │   │                   │   ├── HeadersFieldFinderTest.java
│   │           │   │                   │   ├── RequestUtils.java
│   │           │   │                   │   ├── TestConst.java
│   │           │   │                   │   ├── forwarded/
│   │           │   │                   │   │   ├── FeignClientForwardedInterceptorTest.java
│   │           │   │                   │   │   ├── RestTemplateForwardedInterceptorTest.java
│   │           │   │                   │   │   └── WebClientFilterForwardedInterceptorTest.java
│   │           │   │                   │   ├── initialize/
│   │           │   │                   │   │   └── WebClientBuildInterceptorTest.java
│   │           │   │                   │   └── tracing/
│   │           │   │                   │       ├── ClientHttpRequestInterceptorTest.java
│   │           │   │                   │       ├── FeignClientTracingInterceptorTest.java
│   │           │   │                   │       └── WebClientFilterTracingInterceptorTest.java
│   │           │   │                   └── reactor/
│   │           │   │                       ├── AgentCoreSubscriberTest.java
│   │           │   │                       ├── AgentMonoTest.java
│   │           │   │                       ├── MockCoreSubscriber.java
│   │           │   │                       └── MockMono.java
│   │           │   └── org/
│   │           │       └── springframework/
│   │           │           ├── http/
│   │           │           │   └── client/
│   │           │           │       └── SimpleClientHttpResponseFactory.java
│   │           │           └── web/
│   │           │               └── reactive/
│   │           │                   └── function/
│   │           │                       └── client/
│   │           │                           ├── MockClientRequest.java
│   │           │                           └── MockDefaultClientResponse.java
│   │           └── resources/
│   │               └── mock_agent.properties
│   └── tomcat-jdk17/
│       ├── pom.xml
│       └── src/
│           ├── main/
│           │   └── java/
│           │       └── com/
│           │           └── megaease/
│           │               └── easeagent/
│           │                   └── plugin/
│           │                       └── tomcat/
│           │                           ├── AccessPlugin.java
│           │                           ├── ForwardedPlugin.java
│           │                           ├── TomcatPlugin.java
│           │                           ├── advice/
│           │                           │   └── FilterChainPoints.java
│           │                           ├── interceptor/
│           │                           │   ├── BaseServletInterceptor.java
│           │                           │   ├── FilterChainForwardedInterceptor.java
│           │                           │   ├── FilterChainMetricInterceptor.java
│           │                           │   ├── FilterChainTraceInterceptor.java
│           │                           │   ├── HttpServerRequest.java
│           │                           │   ├── TomcatAccessLogServerInfo.java
│           │                           │   └── TomcatHttpLogInterceptor.java
│           │                           └── utils/
│           │                               ├── InternalAsyncListener.java
│           │                               └── ServletUtils.java
│           └── test/
│               ├── java/
│               │   └── com/
│               │       └── megaease/
│               │           └── easeagent/
│               │               └── plugin/
│               │                   └── tomcat/
│               │                       └── interceptor/
│               │                           ├── BaseServletInterceptorTest.java
│               │                           ├── FilterChainForwardedInterceptorTest.java
│               │                           ├── FilterChainMetricInterceptorTest.java
│               │                           ├── FilterChainTraceInterceptorTest.java
│               │                           ├── HttpServerRequestTest.java
│               │                           ├── ServletAccessLogInfoServerInfoTest.java
│               │                           ├── TestConst.java
│               │                           ├── TestServletUtils.java
│               │                           └── TomcatHttpLogInterceptorTest.java
│               └── resources/
│                   └── mock_agent.properties
├── pom.xml
├── release
├── report/
│   ├── pom.xml
│   └── src/
│       ├── main/
│       │   └── java/
│       │       ├── com/
│       │       │   └── megaease/
│       │       │       └── easeagent/
│       │       │           └── report/
│       │       │               ├── AgentReportAware.java
│       │       │               ├── DefaultAgentReport.java
│       │       │               ├── GlobalExtractor.java
│       │       │               ├── OutputProperties.java
│       │       │               ├── ReportConfigChange.java
│       │       │               ├── async/
│       │       │               │   ├── AsyncProps.java
│       │       │               │   ├── AsyncReporter.java
│       │       │               │   ├── AsyncReporterMetrics.java
│       │       │               │   ├── DefaultAsyncReporter.java
│       │       │               │   ├── log/
│       │       │               │   │   ├── AccessLogReporter.java
│       │       │               │   │   ├── ApplicationLogReporter.java
│       │       │               │   │   └── LogAsyncProps.java
│       │       │               │   ├── trace/
│       │       │               │   │   ├── SDKAsyncReporter.java
│       │       │               │   │   └── TraceAsyncProps.java
│       │       │               │   └── zipkin/
│       │       │               │       ├── AgentBufferNextMessage.java
│       │       │               │       ├── AgentByteBoundedQueue.java
│       │       │               │       └── WithSizeConsumer.java
│       │       │               ├── encoder/
│       │       │               │   ├── PackedMessage.java
│       │       │               │   ├── log/
│       │       │               │   │   ├── AccessLogJsonEncoder.java
│       │       │               │   │   ├── AccessLogWriter.java
│       │       │               │   │   ├── LogDataJsonEncoder.java
│       │       │               │   │   ├── LogDataWriter.java
│       │       │               │   │   └── pattern/
│       │       │               │   │       ├── LogDataDatePatternConverterDelegate.java
│       │       │               │   │       ├── LogDataLevelPatternConverter.java
│       │       │               │   │       ├── LogDataLineSeparatorPatternConverter.java
│       │       │               │   │       ├── LogDataLoggerPatternConverter.java
│       │       │               │   │       ├── LogDataMdcPatternConverter.java
│       │       │               │   │       ├── LogDataPatternConverter.java
│       │       │               │   │       ├── LogDataPatternFormatter.java
│       │       │               │   │       ├── LogDataSimpleLiteralPatternConverter.java
│       │       │               │   │       ├── LogDataThreadNamePatternConverter.java
│       │       │               │   │       ├── LogDataThrowablePatternConverter.java
│       │       │               │   │       ├── NamePatternConverter.java
│       │       │               │   │       ├── NoOpPatternConverter.java
│       │       │               │   │       └── SimpleMessageConverter.java
│       │       │               │   ├── metric/
│       │       │               │   │   └── MetricJsonEncoder.java
│       │       │               │   └── span/
│       │       │               │       ├── AbstractAgentV2SpanEndpointWriter.java
│       │       │               │       ├── AgentV2SpanAnnotationsWriter.java
│       │       │               │       ├── AgentV2SpanBaseWriter.java
│       │       │               │       ├── AgentV2SpanGlobalWriter.java
│       │       │               │       ├── AgentV2SpanLocalEndpointWriter.java
│       │       │               │       ├── AgentV2SpanRemoteEndpointWriter.java
│       │       │               │       ├── AgentV2SpanTagsWriter.java
│       │       │               │       ├── AgentV2SpanWriter.java
│       │       │               │       ├── GlobalExtrasSupplier.java
│       │       │               │       ├── SpanJsonEncoder.java
│       │       │               │       └── okhttp/
│       │       │               │           ├── HttpSpanJsonEncoder.java
│       │       │               │           └── OkHttpJsonRequestBody.java
│       │       │               ├── metric/
│       │       │               │   ├── MetricItem.java
│       │       │               │   ├── MetricProps.java
│       │       │               │   └── MetricReporterFactoryImpl.java
│       │       │               ├── plugin/
│       │       │               │   ├── NoOpCall.java
│       │       │               │   ├── NoOpEncoder.java
│       │       │               │   ├── ReporterLoader.java
│       │       │               │   └── ReporterRegistry.java
│       │       │               ├── sender/
│       │       │               │   ├── AgentKafkaSender.java
│       │       │               │   ├── AgentLoggerSender.java
│       │       │               │   ├── NoOpSender.java
│       │       │               │   ├── SenderConfigDecorator.java
│       │       │               │   ├── SenderWithEncoder.java
│       │       │               │   ├── ZipkinCallWrapper.java
│       │       │               │   ├── metric/
│       │       │               │   │   ├── KeySender.java
│       │       │               │   │   ├── MetricKafkaSender.java
│       │       │               │   │   └── log4j/
│       │       │               │   │       ├── AppenderManager.java
│       │       │               │   │       ├── LoggerFactory.java
│       │       │               │   │       ├── MetricRefreshableAppender.java
│       │       │               │   │       ├── RefreshableAppender.java
│       │       │               │   │       └── TestableAppender.java
│       │       │               │   └── okhttp/
│       │       │               │       ├── ByteRequestBody.java
│       │       │               │       ├── HttpCall.java
│       │       │               │       └── HttpSender.java
│       │       │               ├── trace/
│       │       │               │   ├── Platform.java
│       │       │               │   ├── RefreshableReporter.java
│       │       │               │   ├── ReportSpanBuilder.java
│       │       │               │   └── TraceReport.java
│       │       │               └── util/
│       │       │                   ├── SpanUtils.java
│       │       │                   ├── TextUtils.java
│       │       │                   └── Utils.java
│       │       └── zipkin2/
│       │           └── reporter/
│       │               ├── TracerConverter.java
│       │               ├── brave/
│       │               │   ├── ConvertSpanReporter.java
│       │               │   └── ConvertZipkinSpanHandler.java
│       │               └── kafka11/
│       │                   ├── SDKKafkaSender.java
│       │                   ├── SDKSender.java
│       │                   └── SimpleSender.java
│       └── test/
│           ├── java/
│           │   └── com/
│           │       └── megaease/
│           │           └── easeagent/
│           │               └── report/
│           │                   ├── HttpSenderTest.java
│           │                   ├── async/
│           │                   │   └── zipkin/
│           │                   │       └── AgentByteBoundedQueueTest.java
│           │                   ├── encoder/
│           │                   │   └── log/
│           │                   │       ├── LogDataJsonEncoderTest.java
│           │                   │       └── LogDataWriterTest.java
│           │                   ├── metric/
│           │                   │   ├── MetricPropsTest.java
│           │                   │   └── MetricReporterFactoryTest.java
│           │                   ├── sender/
│           │                   │   ├── AgentKafkaSenderTest.java
│           │                   │   └── metric/
│           │                   │       └── log4j/
│           │                   │           └── AppenderManagerTest.java
│           │                   ├── trace/
│           │                   │   └── TraceReportTest.java
│           │                   └── utils/
│           │                       └── UtilsTest.java
│           └── resources/
│               └── sender/
│                   ├── outputServer_disabled.json
│                   ├── outputServer_empty_bootstrapServer_disabled.json
│                   ├── outputServer_empty_bootstrapServer_enabled.json
│                   └── outputServer_enabled.json
├── resources/
│   ├── rootfs/
│   │   └── Dockerfile
│   └── scripts/
│       ├── Jenkinsfile
│       └── build-image.sh
└── zipkin/
    ├── pom.xml
    └── src/
        ├── main/
        │   ├── java/
        │   │   └── com/
        │   │       └── megaease/
        │   │           └── easeagent/
        │   │               └── zipkin/
        │   │                   ├── CustomTagsSpanHandler.java
        │   │                   ├── TracingProviderImpl.java
        │   │                   ├── impl/
        │   │                   │   ├── AsyncRequest.java
        │   │                   │   ├── MessageImpl.java
        │   │                   │   ├── RemoteGetterImpl.java
        │   │                   │   ├── RemoteSetterImpl.java
        │   │                   │   ├── RequestContextImpl.java
        │   │                   │   ├── ScopeImpl.java
        │   │                   │   ├── SpanContextImpl.java
        │   │                   │   ├── SpanImpl.java
        │   │                   │   ├── TracingImpl.java
        │   │                   │   └── message/
        │   │                   │       ├── MessagingTracingImpl.java
        │   │                   │       ├── ZipkinConsumerRequest.java
        │   │                   │       └── ZipkinProducerRequest.java
        │   │                   └── logging/
        │   │                       ├── AgentLogMDC.java
        │   │                       ├── AgentMDCScopeDecorator.java
        │   │                       └── LogUtils.java
        │   └── resources/
        │       └── META-INF/
        │           └── services/
        │               └── com.megaease.easeagent.plugin.bean.BeanProvider
        └── test/
            └── java/
                ├── brave/
                │   ├── TracerTestUtils.java
                │   └── internal/
                │       └── collect/
                │           └── WeakConcurrentMapTestUtils.java
                └── com/
                    └── megaease/
                        └── easeagent/
                            └── zipkin/
                                ├── CustomTagsSpanHandlerTest.java
                                ├── TracingProviderImplMock.java
                                ├── TracingProviderImplTest.java
                                ├── impl/
                                │   ├── AsyncRequestTest.java
                                │   ├── MessageImplTest.java
                                │   ├── MessagingRequestMock.java
                                │   ├── RemoteGetterImplTest.java
                                │   ├── RemoteSetterImplTest.java
                                │   ├── RequestContextImplTest.java
                                │   ├── RequestMock.java
                                │   ├── ScopeImplTest.java
                                │   ├── SpanContextImplTest.java
                                │   ├── SpanImplTest.java
                                │   ├── TracingImplTest.java
                                │   └── message/
                                │       ├── MessagingTracingImplTest.java
                                │       ├── ZipkinConsumerRequestTest.java
                                │       └── ZipkinProducerRequestTest.java
                                └── logging/
                                    ├── AgentLogMDCTest.java
                                    ├── AgentMDCScopeDecoratorTest.java
                                    └── LogUtilsTest.java
Download .txt
Showing preview only (748K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (9025 symbols across 1209 files)

FILE: build/src/main/java/com/megaease/easeagent/StartBootstrap.java
  class StartBootstrap (line 24) | public class StartBootstrap {
    method StartBootstrap (line 25) | private StartBootstrap() {}
    method premain (line 27) | public static void premain(String args, Instrumentation inst, String j...

FILE: config/src/main/java/com/megaease/easeagent/config/AutoRefreshConfigItem.java
  class AutoRefreshConfigItem (line 24) | public class AutoRefreshConfigItem<T> {
    method AutoRefreshConfigItem (line 27) | public AutoRefreshConfigItem(Config config, String name, BiFunction<Co...
    method getValue (line 31) | public T getValue() {

FILE: config/src/main/java/com/megaease/easeagent/config/CompatibilityConversion.java
  class CompatibilityConversion (line 28) | public class CompatibilityConversion {
    method transform (line 76) | public static Map<String, String> transform(Map<String, String> oldCon...
    method transformConversion (line 98) | private static Conversion<?> transformConversion(String key) {
    method metricConversion (line 109) | private static Conversion<?> metricConversion(String key) {
    method tracingConversion (line 118) | private static Conversion<?> tracingConversion(String key) {
    method conversion (line 129) | private static Conversion<?> conversion(String key, Set<String> skipSe...
    type Conversion (line 150) | interface Conversion<K> {
      method transform (line 151) | K transform(Map<String, String> configs, String value);
      method isChange (line 153) | boolean isChange();
    class FinalConversion (line 156) | static class FinalConversion implements Conversion<String> {
      method FinalConversion (line 160) | public FinalConversion(String key, boolean change) {
      method transform (line 165) | @Override
      method isChange (line 171) | public boolean isChange() {
    class MultipleFinalConversion (line 176) | static class MultipleFinalConversion implements Conversion<List<String...
      method MultipleFinalConversion (line 180) | MultipleFinalConversion(@Nonnull List<FinalConversion> conversions, ...
      method transform (line 185) | @Override
      method isChange (line 194) | @Override
    class SingleConversion (line 200) | static class SingleConversion implements Conversion<String> {
      method SingleConversion (line 206) | public SingleConversion(String domain, String namespace, String id, ...
      method transform (line 213) | @Override
      method isChange (line 220) | @Override
    class MultipleConversion (line 226) | static class MultipleConversion implements Conversion<List<String>> {
      method MultipleConversion (line 232) | public MultipleConversion(String domain, List<String> namespaces, St...
      method transform (line 239) | @Override
      method isChange (line 250) | @Override
    class SingleBuilder (line 256) | static class SingleBuilder implements BiFunction<String, String, Conve...
      method SingleBuilder (line 260) | public SingleBuilder(String domain, String namespace) {
      method apply (line 265) | @Override
      method observability (line 270) | static SingleBuilder observability(String namespace) {
    class MultipleBuilder (line 275) | static class MultipleBuilder implements BiFunction<String, String, Con...
      method MultipleBuilder (line 279) | public MultipleBuilder(String domain, List<String> namespaces) {
      method apply (line 284) | @Override
      method observability (line 289) | static MultipleBuilder observability(List<String> namespaces) {

FILE: config/src/main/java/com/megaease/easeagent/config/ConfigAware.java
  type ConfigAware (line 22) | public interface ConfigAware {
    method setConfig (line 23) | void setConfig(Config config);

FILE: config/src/main/java/com/megaease/easeagent/config/ConfigFactory.java
  class ConfigFactory (line 32) | public class ConfigFactory {
    method updateEnvCfg (line 74) | static Map<String, String> updateEnvCfg() {
    method ConfigFactory (line 108) | private ConfigFactory() {
    method getConfigPath (line 114) | public static String getConfigPath() {
    method loadConfigs (line 125) | public static GlobalConfigs loadConfigs(String pathname, ClassLoader l...
    method loadDefaultConfigs (line 153) | private static GlobalConfigs loadDefaultConfigs(ClassLoader loader, St...

FILE: config/src/main/java/com/megaease/easeagent/config/ConfigLoader.java
  class ConfigLoader (line 34) | public class ConfigLoader {
    method checkYaml (line 37) | private static boolean checkYaml(String filename) {
    method loadFromFile (line 41) | static GlobalConfigs loadFromFile(File file) {
    method loadFromStream (line 50) | static GlobalConfigs loadFromStream(InputStream in, String filename) t...
    method extractPropsMap (line 69) | private static HashMap<String, String> extractPropsMap(InputStream in)...
    method loadFromClasspath (line 79) | static GlobalConfigs loadFromClasspath(ClassLoader classLoader, String...

FILE: config/src/main/java/com/megaease/easeagent/config/ConfigManagerMXBean.java
  type ConfigManagerMXBean (line 24) | public interface ConfigManagerMXBean {
    method updateConfigs (line 25) | void updateConfigs(Map<String, String> configs);
    method updateService (line 27) | void updateService(String json, String version) throws IOException;
    method updateCanary (line 29) | void updateCanary(String json, String version) throws IOException;
    method updateService2 (line 31) | void updateService2(Map<String, String> configs, String version);
    method updateCanary2 (line 33) | void updateCanary2(Map<String, String> configs, String version);
    method getConfigs (line 35) | Map<String, String> getConfigs();
    method availableConfigNames (line 37) | List<String> availableConfigNames();
    method healthz (line 39) | default void healthz() {

FILE: config/src/main/java/com/megaease/easeagent/config/ConfigNotifier.java
  class ConfigNotifier (line 29) | public class ConfigNotifier {
    method ConfigNotifier (line 34) | public ConfigNotifier(String prefix) {
    method addChangeListener (line 38) | public Runnable addChangeListener(ConfigChangeListener listener) {
    method handleChanges (line 47) | public void handleChanges(List<ChangeItem> list) {
    method filterChanges (line 61) | private List<ChangeItem> filterChanges(List<ChangeItem> list) {

FILE: config/src/main/java/com/megaease/easeagent/config/ConfigPropertiesUtils.java
  class ConfigPropertiesUtils (line 28) | final class ConfigPropertiesUtils {
    method getBoolean (line 30) | public static boolean getBoolean(String propertyName, boolean defaultV...
    method getInt (line 35) | public static int getInt(String propertyName, int defaultValue) {
    method getString (line 47) | @Nullable
    method toEnvVarName (line 59) | public static String toEnvVarName(String propertyName) {
    method ConfigPropertiesUtils (line 63) | private ConfigPropertiesUtils() {

FILE: config/src/main/java/com/megaease/easeagent/config/ConfigUtils.java
  class ConfigUtils (line 34) | public class ConfigUtils {
    method ConfigUtils (line 35) | private ConfigUtils() {
    method bindProp (line 38) | public static <R> void bindProp(String name, Config configs, BiFunctio...
    method firstNotNull (line 55) | @SafeVarargs
    method bindProp (line 65) | public static <R> void bindProp(String name, Config configs, BiFunctio...
    method json2KVMap (line 69) | public static Map<String, String> json2KVMap(String json) throws IOExc...
    method extractKVs (line 76) | public static List<Map.Entry<String, String>> extractKVs(String prefix...
    method join (line 95) | private static String join(String prefix, String current) {
    method isGlobal (line 99) | public static boolean isGlobal(String namespace) {
    method isPluginConfig (line 103) | public static boolean isPluginConfig(String key) {
    method isPluginConfig (line 107) | public static boolean isPluginConfig(String key, String domain, String...
    method pluginProperty (line 111) | public static PluginProperty pluginProperty(String path) {
    method requireNonEmpty (line 127) | public static String requireNonEmpty(String obj, String message) {
    method buildPluginProperty (line 134) | public static String buildPluginProperty(String domain, String namespa...
    method buildCodeVersionKey (line 138) | public static String buildCodeVersionKey(String key) {
    method extractAndConvertPrefix (line 150) | public static Map<String, String> extractAndConvertPrefix(Map<String, ...
    method extractByPrefix (line 175) | public static Map<String, String> extractByPrefix(Config config, Strin...
    method extractByPrefix (line 179) | public static Map<String, String> extractByPrefix(Map<String, String> ...
    method isChanged (line 192) | public static int isChanged(String name, Map<String, String> map, Stri...

FILE: config/src/main/java/com/megaease/easeagent/config/Configs.java
  class Configs (line 30) | public class Configs implements Config {
    method Configs (line 35) | protected Configs() {
    method Configs (line 38) | public Configs(Map<String, String> source) {
    method updateConfigsNotNotify (line 43) | public void updateConfigsNotNotify(Map<String, String> changes) {
    method updateConfigs (line 47) | public void updateConfigs(Map<String, String> changes) {
    method hasText (line 64) | protected boolean hasText(String text) {
    method getConfigs (line 68) | @Override
    method toPrettyDisplay (line 73) | public String toPrettyDisplay() {
    method hasPath (line 77) | public boolean hasPath(String path) {
    method getString (line 82) | public String getString(String name) {
    method getString (line 86) | public String getString(String name, String defVal) {
    method getInt (line 92) | public Integer getInt(String name) {
    method getInt (line 104) | @Override
    method getBooleanNullForUnset (line 113) | public Boolean getBooleanNullForUnset(String name) {
    method getBoolean (line 121) | public Boolean getBoolean(String name) {
    method getBoolean (line 129) | @Override
    method getDouble (line 138) | public Double getDouble(String name) {
    method getDouble (line 150) | @Override
    method getLong (line 159) | public Long getLong(String name) {
    method getLong (line 171) | @Override
    method getStringList (line 180) | public List<String> getStringList(String name) {
    method addChangeListener (line 188) | @Override
    method keySet (line 193) | @Override

FILE: config/src/main/java/com/megaease/easeagent/config/GlobalConfigs.java
  class GlobalConfigs (line 29) | public class GlobalConfigs extends Configs implements ConfigManagerMXBean {
    method GlobalConfigs (line 32) | public GlobalConfigs(Map<String, String> source) {
    method getOriginalConfig (line 43) | public Configs getOriginalConfig() {
    method updateConfigsNotNotify (line 47) | @Override
    method updateConfigs (line 60) | @Override
    method mergeConfigs (line 73) | public void mergeConfigs(GlobalConfigs configs) {
    method availableConfigNames (line 82) | @Override
    method updateService (line 87) | @Override
    method updateCanary (line 92) | @Override
    method updateService2 (line 100) | @Override
    method updateCanary2 (line 105) | @Override

FILE: config/src/main/java/com/megaease/easeagent/config/JarFileConfigLoader.java
  class JarFileConfigLoader (line 30) | public class JarFileConfigLoader {
    method load (line 33) | static GlobalConfigs load(String file) {

FILE: config/src/main/java/com/megaease/easeagent/config/OtelSdkConfigs.java
  class OtelSdkConfigs (line 35) | public class OtelSdkConfigs {
    method getConfigPath (line 79) | static String getConfigPath() {
    method updateEnvCfg (line 89) | static Map<String, String> updateEnvCfg() {

FILE: config/src/main/java/com/megaease/easeagent/config/PluginConfig.java
  class PluginConfig (line 32) | public class PluginConfig implements IPluginConfig {
    method PluginConfig (line 42) | protected PluginConfig(@Nonnull String domain, @Nonnull String id, @No...
    method build (line 57) | public static PluginConfig build(@Nonnull String domain, @Nonnull Stri...
    method domain (line 69) | @Override
    method namespace (line 74) | @Override
    method id (line 79) | @Override
    method hasProperty (line 85) | @Override
    method getString (line 90) | @Override
    method getInt (line 100) | @Override
    method isTrue (line 113) | private boolean isTrue(String value) {
    method getBoolean (line 117) | @Override
    method enabled (line 132) | @Override
    method getDouble (line 137) | @Override
    method getLong (line 150) | @Override
    method getStringList (line 163) | @Override
    method getGlobal (line 174) | @Override
    method keySet (line 179) | @Override
    method addChangeListener (line 186) | @Override
    method foreachConfigChangeListener (line 193) | public void foreachConfigChangeListener(Consumer<PluginConfigChangeLis...
    class Global (line 207) | public class Global extends PluginConfig implements IPluginConfig {
      method Global (line 209) | public Global(String domain, String id, Map<String, String> global, ...
      method addChangeListener (line 213) | @Override
      method foreachConfigChangeListener (line 218) | @Override

FILE: config/src/main/java/com/megaease/easeagent/config/PluginConfigManager.java
  class PluginConfigManager (line 31) | public class PluginConfigManager implements IConfigFactory {
    method PluginConfigManager (line 38) | private PluginConfigManager(Configs configs, Map<Key, PluginSourceConf...
    method builder (line 44) | public static PluginConfigManager.Builder builder(Configs configs) {
    method getConfig (line 49) | @Override
    method getConfig (line 54) | @Override
    method getConfig (line 59) | @Override
    method getConfig (line 64) | public PluginConfig getConfig(String domain, String namespace, String ...
    method getConfig (line 68) | public synchronized PluginConfig getConfig(String domain, String names...
    method getGlobalConfig (line 81) | private Map<String, String> getGlobalConfig(String domain, String id) {
    method getCoverConfig (line 85) | private Map<String, String> getCoverConfig(String domain, String names...
    method getConfigSource (line 89) | private Map<String, String> getConfigSource(String domain, String name...
    method keys (line 98) | private Set<Key> keys(Set<String> keys) {
    method shutdown (line 112) | public void shutdown() {
    method onChange (line 116) | protected synchronized void onChange(Map<String, String> sources) {
    method buildNewSources (line 138) | private Map<String, String> buildNewSources(Set<Key> sourceKeys, Map<S...
    method buildChangeKeys (line 151) | private Set<Key> buildChangeKeys(Set<Key> sourceKeys) {
    class Key (line 167) | class Key {
      method Key (line 172) | public Key(String domain, String namespace, String id) {
      method getDomain (line 178) | public String getDomain() {
      method getNamespace (line 182) | public String getNamespace() {
      method getId (line 186) | public String getId() {
      method equals (line 190) | @Override
      method hashCode (line 200) | @Override
      method toString (line 206) | @Override
    class Builder (line 216) | public class Builder {
      method build (line 217) | public PluginConfigManager build() {
    class ChangeListener (line 233) | class ChangeListener implements ConfigChangeListener {
      method onChange (line 235) | @Override

FILE: config/src/main/java/com/megaease/easeagent/config/PluginProperty.java
  class PluginProperty (line 22) | public class PluginProperty {
    method PluginProperty (line 28) | public PluginProperty(String domain, String namespace, String id, Stri...
    method getDomain (line 35) | public String getDomain() {
    method getNamespace (line 39) | public String getNamespace() {
    method getId (line 43) | public String getId() {
    method getProperty (line 47) | public String getProperty() {
    method equals (line 51) | @Override
    method hashCode (line 62) | @Override

FILE: config/src/main/java/com/megaease/easeagent/config/PluginSourceConfig.java
  class PluginSourceConfig (line 24) | public class PluginSourceConfig {
    method PluginSourceConfig (line 31) | public PluginSourceConfig(String domain, String namespace, String id, ...
    method build (line 39) | public static PluginSourceConfig build(String domain, String namespace...
    method getSource (line 54) | public Map<String, String> getSource() {
    method getDomain (line 58) | public String getDomain() {
    method getNamespace (line 62) | public String getNamespace() {
    method getId (line 66) | public String getId() {
    method getProperties (line 70) | public Map<String, String> getProperties() {

FILE: config/src/main/java/com/megaease/easeagent/config/ValidateUtils.java
  class ValidateUtils (line 20) | public class ValidateUtils {
    class ValidException (line 21) | public static class ValidException extends RuntimeException {
      method ValidException (line 22) | public ValidException(String message) {
    type Validator (line 27) | public interface Validator {
      method validate (line 28) | void validate(String name, String value);
    method validate (line 31) | public static void validate(Configs configs, String name, Validator......

FILE: config/src/main/java/com/megaease/easeagent/config/WrappedConfigManager.java
  class WrappedConfigManager (line 26) | public class WrappedConfigManager implements ConfigManagerMXBean {
    method WrappedConfigManager (line 30) | public WrappedConfigManager(ClassLoader customClassLoader, ConfigManag...
    method updateConfigs (line 35) | @Override
    method updateService (line 43) | @Override
    method updateCanary (line 62) | @Override
    method updateService2 (line 81) | @Override
    method updateCanary2 (line 89) | @Override
    method getConfigs (line 97) | @Override
    method availableConfigNames (line 102) | @Override

FILE: config/src/main/java/com/megaease/easeagent/config/report/ReportConfigAdapter.java
  class ReportConfigAdapter (line 36) | @Slf4j
    method ReportConfigAdapter (line 38) | private ReportConfigAdapter() {}
    method convertConfig (line 40) | public static void convertConfig(Map<String, String> config) {
    method extractReporterConfig (line 45) | public static Map<String, String> extractReporterConfig(Config configs) {
    method getDefaultAppender (line 62) | public static String getDefaultAppender(Map<String, String> cfg) {
    method extractAndConvertReporterConfig (line 72) | private static Map<String, String> extractAndConvertReporterConfig(Map...
    method extractTracingConfig (line 99) | private static Map<String, String> extractTracingConfig(Map<String, St...
    method updateAccessLogCfg (line 142) | private static void updateAccessLogCfg(Map<String, String> outputCfg) {
    method extractMetricPluginConfig (line 167) | private static Map<String, String> extractMetricPluginConfig(Map<Strin...
    method extractGlobalMetricConfig (line 218) | private static Map<String, String> extractGlobalMetricConfig(Map<Strin...
    method extractLogPluginConfig (line 257) | private static Map<String, String> extractLogPluginConfig(Map<String, ...
    method extractGlobalLogConfig (line 315) | private static Map<String, String> extractGlobalLogConfig(Map<String, ...

FILE: config/src/main/java/com/megaease/easeagent/config/report/ReportConfigConst.java
  class ReportConfigConst (line 20) | @SuppressWarnings("unused")
    method ReportConfigConst (line 22) | private ReportConfigConst() {}
    method join (line 161) | public static String join(String... texts) {

FILE: config/src/main/java/com/megaease/easeagent/config/yaml/YamlReader.java
  class YamlReader (line 34) | public class YamlReader {
    method YamlReader (line 45) | public YamlReader() {
    method load (line 49) | public YamlReader load(InputStream in) {
    method getYaml (line 56) | public Map<String, Object> getYaml() {
    method merge (line 60) | public static YamlReader merge(YamlReader target, YamlReader source) {
    method merge (line 71) | @SuppressWarnings("unchecked")
    method compress (line 85) | public Map<String, String> compress() {
    method compress (line 98) | @SuppressWarnings("unchecked")

FILE: config/src/test/java/com/megaease/easeagent/config/CompatibilityConversionTest.java
  class CompatibilityConversionTest (line 30) | public class CompatibilityConversionTest {
    method transform (line 32) | @Test

FILE: config/src/test/java/com/megaease/easeagent/config/ConfigFactoryTest.java
  class ConfigFactoryTest (line 33) | public class ConfigFactoryTest {
    method test_yaml (line 35) | @Test
    method test_env (line 42) | @Test
    method test_loadConfigs (line 54) | @Test
    method test_loadConfigsFromUserSpec (line 73) | @Test
    method test_loadConfigsFromOtelUserSpec (line 85) | @Test

FILE: config/src/test/java/com/megaease/easeagent/config/ConfigPropertiesUtilsTest.java
  class ConfigPropertiesUtilsTest (line 24) | public class ConfigPropertiesUtilsTest {
    method beforeClass (line 34) | @BeforeClass
    method getString_systemProperty (line 43) | @Test
    method getString_environmentVariable (line 50) | @Test
    method getString_none (line 56) | @Test
    method getInt_systemProperty (line 61) | @Test
    method getInt_environmentVariable (line 68) | @Test
    method getInt_none (line 74) | @Test
    method getInt_invalidNumber (line 79) | @Test
    method getBoolean_systemProperty (line 85) | @Test
    method getBoolean_environmentVariable (line 92) | @Test
    method getBoolean_none (line 98) | @Test

FILE: config/src/test/java/com/megaease/easeagent/config/ConfigUtilsTest.java
  class ConfigUtilsTest (line 30) | public class ConfigUtilsTest {
    method test_bindProp (line 31) | @Test
    method test_json2KVMap (line 43) | @Test
    method test_json2KVMap_2 (line 78) | @Test
    method isGlobal (line 84) | @Test
    method isPluginConfig (line 90) | @Test
    method pluginProperty (line 101) | @Test

FILE: config/src/test/java/com/megaease/easeagent/config/ConfigsTest.java
  class ConfigsTest (line 30) | public class ConfigsTest {
    method test_check_change_count1 (line 32) | @Test
    method test_check_change_count (line 48) | @Test
    method test_check_old (line 63) | @Test
    method test_check_new (line 76) | @Test
    method addListener (line 89) | private List<ChangeItem> addListener(Config config) {

FILE: config/src/test/java/com/megaease/easeagent/config/IPluginConfigConstTest.java
  class IPluginConfigConstTest (line 26) | public class IPluginConfigConstTest {
    method testExtractHeaderName (line 27) | @Test

FILE: config/src/test/java/com/megaease/easeagent/config/JarFileConfigLoaderTest.java
  class JarFileConfigLoaderTest (line 29) | public class JarFileConfigLoaderTest {
    method after (line 31) | @After
    method load (line 37) | @Test

FILE: config/src/test/java/com/megaease/easeagent/config/OtelSdkConfigsTest.java
  class OtelSdkConfigsTest (line 29) | public class OtelSdkConfigsTest {
    method after (line 31) | @After
    method updateEnvCfg (line 45) | @Test

FILE: config/src/test/java/com/megaease/easeagent/config/PluginConfigManagerTest.java
  class PluginConfigManagerTest (line 31) | public class PluginConfigManagerTest {
    method build (line 40) | PluginConfigManager build() {
    method build (line 44) | PluginConfigManager build(Map<String, String> source) {
    method testBuild (line 49) | @Test
    method getConfig (line 55) | @Test
    method checkPluginConfigString (line 63) | private void checkPluginConfigString(PluginConfig pluginConfig, Map<St...
    method buildSource (line 69) | public static Map<String, String> buildSource() {
    method getSource (line 81) | public static Map<String, String> getSource(String namespace, String i...
    method getConfig1 (line 89) | @Test

FILE: config/src/test/java/com/megaease/easeagent/config/PluginConfigTest.java
  class PluginConfigTest (line 32) | public class PluginConfigTest {
    method globalSource (line 34) | public static Map<String, String> globalSource() {
    method coverSource (line 46) | public static Map<String, String> coverSource() {
    method build (line 57) | PluginConfig build() {
    method domain (line 66) | @Test
    method namespace (line 71) | @Test
    method id (line 76) | @Test
    method hasProperty (line 81) | @Test
    method checkHasProperty (line 87) | public static void checkHasProperty(PluginConfig config) {
    method getString (line 94) | @Test
    method checkString (line 99) | public static void checkString(PluginConfig config) {
    method getInt (line 108) | @Test
    method checkInt (line 113) | public static void checkInt(PluginConfig config) {
    method getBoolean (line 120) | @Test
    method checkBoolean (line 125) | public static void checkBoolean(PluginConfig config) {
    method getDouble (line 132) | @Test
    method checkDouble (line 138) | public static void checkDouble(PluginConfig config) {
    method getLong (line 144) | @Test
    method checkLong (line 149) | public static void checkLong(PluginConfig config) {
    method getStringList (line 155) | @Test
    method checkStringList (line 161) | public static void checkStringList(PluginConfig config) {
    method addChangeListener (line 170) | @Test
    method getConfigChangeListener (line 185) | @Test
    method keySet (line 190) | @Test
    method checkKeySet (line 195) | public static void checkKeySet(PluginConfig config) {
    method checkAllType (line 206) | public static void checkAllType(PluginConfig config) {

FILE: config/src/test/java/com/megaease/easeagent/config/PluginPropertyTest.java
  class PluginPropertyTest (line 27) | public class PluginPropertyTest {
    method build (line 29) | public PluginProperty build() {
    method getDomain (line 33) | @Test
    method getNamespace (line 38) | @Test
    method getId (line 43) | @Test
    method getProperty (line 48) | @Test
    method testEquals (line 53) | @Test
    method testHashCode (line 65) | @Test

FILE: config/src/test/java/com/megaease/easeagent/config/PluginSourceConfigTest.java
  class PluginSourceConfigTest (line 29) | public class PluginSourceConfigTest {
    method getSource (line 39) | public static Map<String, String> getSource(String namespace, String i...
    method getSource (line 48) | public static Map<String, String> getSource(String id) {
    method getGlobal (line 53) | public static Map<String, String> getGlobal() {
    method buildSource (line 57) | public static Map<String, String> buildSource() {
    method buildImpl (line 68) | PluginSourceConfig buildImpl(String namespace, String id) {
    method build (line 74) | @Test
    method getSource (line 81) | @Test
    method getDomain (line 89) | @Test
    method getNamespace (line 96) | @Test
    method getId (line 104) | @Test
    method getProperties (line 111) | @Test

FILE: config/src/test/java/com/megaease/easeagent/config/ValidateUtilsTest.java
  class ValidateUtilsTest (line 27) | public class ValidateUtilsTest {
    method test_hasText (line 28) | @Test
    method test_numberInt (line 39) | @Test
    method test_numberInt2 (line 50) | @Test
    method test_bool (line 60) | @Test
    method test_bool2 (line 71) | @Test

FILE: config/src/test/java/com/megaease/easeagent/config/report/ReportConfigAdapterTest.java
  class ReportConfigAdapterTest (line 29) | public class ReportConfigAdapterTest {
    method test_zipkin_target (line 30) | @Test
    method test_console_target (line 43) | @Test
    method test_kafka_target (line 61) | @Test
    method test_trace_output (line 73) | @Test
    method test_metric_global_v1 (line 102) | @Test
    method test_metric_async_update (line 120) | @Test
    method test_log_global (line 142) | @Test
    method test_access_in_metric (line 156) | @Test
    method test_access_log_update (line 176) | @Test
    method test_log_global_async (line 206) | @Test
    method test_log_async_update (line 229) | @Test

FILE: config/src/test/java/com/megaease/easeagent/config/yaml/YamlReaderTest.java
  class YamlReaderTest (line 30) | public class YamlReaderTest {
    method testCompress (line 35) | @Test
    method extractPropsMap (line 58) | private static Map<String, String> extractPropsMap(InputStream in) {

FILE: context/src/main/java/com/megaease/easeagent/context/AsyncContextImpl.java
  class AsyncContextImpl (line 30) | public class AsyncContextImpl implements AsyncContext {
    method AsyncContextImpl (line 35) | private AsyncContextImpl(SpanContext spanContext, Map<Object, Object> ...
    method build (line 41) | public static AsyncContextImpl build(SpanContext spanContext,
    method isNoop (line 48) | @Override
    method getSpanContext (line 53) | @Override
    method importToCurrent (line 58) | @Override
    method getAll (line 63) | @Override
    method get (line 68) | @Override
    method put (line 74) | @Override

FILE: context/src/main/java/com/megaease/easeagent/context/ContextManager.java
  class ContextManager (line 46) | public class ContextManager implements IContextManager {
    method ContextManager (line 56) | private ContextManager(@Nonnull Configs conf, @Nonnull PluginConfigMan...
    method build (line 62) | public static ContextManager build(Configs conf) {
    method getContext (line 82) | @Override
    method setTracing (line 87) | public void setTracing(@Nonnull TracingProvider tracing) {
    method setMetric (line 92) | public void setMetric(@Nonnull MetricProvider metricProvider) {
    class SessionContextSupplier (line 97) | private class SessionContextSupplier implements Supplier<InitializeCon...
      method get (line 98) | @Override
    class MetricRegistrySupplierImpl (line 112) | public class MetricRegistrySupplierImpl implements MetricRegistrySuppl...
      method newMetricRegistry (line 114) | @Override
      method reporter (line 119) | @Override

FILE: context/src/main/java/com/megaease/easeagent/context/GlobalContext.java
  class GlobalContext (line 27) | public class GlobalContext {
    method GlobalContext (line 33) | public GlobalContext(@Nonnull Configs conf, @Nonnull MetricRegistrySup...
    method getConf (line 41) | public Configs getConf() {
    method getMdc (line 45) | public Mdc getMdc() {
    method getLoggerFactory (line 50) | public ILoggerFactory getLoggerFactory() {
    method getMetric (line 54) | public MetricRegistrySupplier getMetric() {

FILE: context/src/main/java/com/megaease/easeagent/context/ProgressFieldsManager.java
  class ProgressFieldsManager (line 28) | public class ProgressFieldsManager {
    method ProgressFieldsManager (line 30) | private ProgressFieldsManager() {
    method init (line 33) | public static void init(Configs configs) {

FILE: context/src/main/java/com/megaease/easeagent/context/RetBound.java
  class RetBound (line 23) | public class RetBound  {
    method RetBound (line 27) | RetBound(int size) {
    method size (line 31) | public int size() {
    method get (line 35) | public Object get(String key) {
    method put (line 42) | public void put(String key, Object value) {

FILE: context/src/main/java/com/megaease/easeagent/context/SessionContext.java
  class SessionContext (line 38) | @SuppressWarnings("unused, unchecked")
    method isNoop (line 54) | @Override
    method getSupplier (line 59) | public Supplier<InitializeContext> getSupplier() {
    method setSupplier (line 63) | public void setSupplier(Supplier<InitializeContext> supplier) {
    method currentTracing (line 67) | @Override
    method get (line 72) | @Override
    method remove (line 77) | @Override
    method change (line 82) | @SuppressWarnings("unchecked")
    method put (line 87) | @Override
    method putLocal (line 93) | @Override
    method getLocal (line 100) | @Override
    method getConfig (line 106) | @Override
    method pushConfig (line 115) | @Override
    method popConfig (line 120) | @Override
    method enter (line 129) | @Override
    method exit (line 141) | @Override
    method exportAsync (line 151) | @Override
    method importAsync (line 156) | @Override
    method clientRequest (line 168) | @Override
    method serverReceive (line 173) | @Override
    method consumerSpan (line 178) | @Override
    method producerSpan (line 183) | @Override
    method nextSpan (line 188) | @Override
    method popToBound (line 196) | @Override
    method pushRetBound (line 207) | public void pushRetBound() {
    method popRetBound (line 214) | public void popRetBound() {
    method push (line 218) | @Override
    method pop (line 227) | @Override
    method peek (line 240) | @Override
    method wrap (line 252) | @Override
    method isWrapped (line 257) | @Override
    method isNecessaryKeys (line 262) | @Override
    method consumerInject (line 267) | @Override
    method producerInject (line 273) | @Override
    method injectForwardedHeaders (line 279) | @Override
    method importForwardedHeaders (line 293) | @Override
    method importForwardedHeaders (line 298) | private Cleaner importForwardedHeaders(Getter getter, Setter setter) {
    method getTracing (line 320) | public ITracing getTracing() {
    method setCurrentTracing (line 324) | @Override
    method clear (line 329) | @Override
    class CurrentContextRunnable (line 349) | public static class CurrentContextRunnable implements Runnable {
      method CurrentContextRunnable (line 353) | public CurrentContextRunnable(AsyncContext asyncContext, Runnable ta...
      method run (line 358) | @Override
    class FieldCleaner (line 366) | private class FieldCleaner implements Cleaner {
      method FieldCleaner (line 369) | public FieldCleaner(List<String> fields) {
      method close (line 373) | @Override
    class AsyncCleaner (line 381) | public class AsyncCleaner implements Cleaner {
      method AsyncCleaner (line 385) | public AsyncCleaner(Scope scope, boolean clearContext) {
      method close (line 390) | @Override

FILE: context/src/main/java/com/megaease/easeagent/context/log/LoggerFactoryImpl.java
  class LoggerFactoryImpl (line 27) | public class LoggerFactoryImpl implements ILoggerFactory {
    method LoggerFactoryImpl (line 30) | private LoggerFactoryImpl(@Nonnull AgentLoggerFactory<LoggerImpl> logg...
    method getLogger (line 34) | @Override
    method factory (line 39) | public AgentLoggerFactory<LoggerImpl> factory() {
    method build (line 43) | public static LoggerFactoryImpl build() {

FILE: context/src/main/java/com/megaease/easeagent/context/log/LoggerImpl.java
  class LoggerImpl (line 25) | public class LoggerImpl extends AgentLogger implements com.megaease.ease...
    method LoggerImpl (line 28) | public LoggerImpl(Logger logger) {

FILE: context/src/main/java/com/megaease/easeagent/context/log/LoggerMdc.java
  class LoggerMdc (line 22) | public class LoggerMdc implements Mdc {
    method LoggerMdc (line 25) | public LoggerMdc(com.megaease.easeagent.log4j2.api.Mdc mdc) {
    method put (line 29) | @Override
    method remove (line 34) | @Override
    method get (line 39) | @Override

FILE: context/src/test/java/com/megaease/easeagent/context/AsyncContextImplTest.java
  class AsyncContextImplTest (line 30) | public class AsyncContextImplTest {
    method build (line 32) | @Test
    method isNoop (line 51) | @Test
    method getSpanContext (line 57) | @Test
    method importToCurrent (line 63) | @Test
    method getAll (line 86) | @Test
    method get (line 95) | @Test
    method put (line 107) | @Test

FILE: context/src/test/java/com/megaease/easeagent/context/ContextManagerTest.java
  class ContextManagerTest (line 31) | public class ContextManagerTest {
    method build (line 33) | @Test
    method setTracing (line 40) | @Test
    method setMetric (line 47) | @Test

FILE: context/src/test/java/com/megaease/easeagent/context/GlobalContextTest.java
  class GlobalContextTest (line 32) | public class GlobalContextTest {
    method before (line 35) | @Before
    method getConf (line 46) | @Test
    method getMdc (line 51) | @Test
    method getLoggerFactory (line 56) | @Test
    method getMetric (line 61) | @Test

FILE: context/src/test/java/com/megaease/easeagent/context/ProgressFieldsManagerTest.java
  class ProgressFieldsManagerTest (line 32) | public class ProgressFieldsManagerTest {
    method init (line 34) | @Test
    method isEmpty (line 45) | @Test
    method getFields (line 52) | @Test

FILE: context/src/test/java/com/megaease/easeagent/context/RetBoundTest.java
  class RetBoundTest (line 24) | public class RetBoundTest {
    method size (line 26) | @Test
    method get (line 31) | @Test
    method put (line 41) | @Test

FILE: context/src/test/java/com/megaease/easeagent/context/SessionContextTest.java
  class SessionContextTest (line 47) | public class SessionContextTest {
    method before (line 49) | @Before
    method isNoop (line 55) | @Test
    method getSupplier (line 61) | @Test
    method setSupplier (line 69) | @Test
    method currentTracing (line 74) | @Test
    method get (line 83) | @Test
    method remove (line 95) | @Test
    method put (line 100) | @Test
    method getLocal (line 105) | @Test
    method putLocal (line 110) | @Test
    method getConfig (line 116) | @Test
    method pushConfig (line 151) | @Test
    method popConfig (line 156) | @Test
    method enter (line 161) | @Test
    method exit (line 187) | @Test
    method exportAsync (line 192) | @Test
    method importAsync (line 223) | @Test
    method clientRequest (line 228) | @Test
    method serverReceive (line 237) | @Test
    method consumerSpan (line 247) | @Test
    method producerSpan (line 257) | @Test
    method nextSpan (line 266) | @Test
    method popToBound (line 276) | @Test
    method pushRetBound (line 281) | @Test
    method popRetBound (line 286) | @Test
    method push (line 291) | @Test
    method pop (line 296) | @Test
    method peek (line 301) | @Test
    method wrap (line 306) | @Test
    method isWrapped (line 338) | @Test
    method isNecessaryKeys (line 343) | @Test
    method consumerInject (line 354) | @Test
    method producerInject (line 364) | @Test
    method injectForwardedHeaders (line 374) | @Test
    method getTracing (line 399) | @Test
    method setCurrentTracing (line 408) | @Test
    method clear (line 413) | @Test
    class EmptyRequest (line 427) | public static class EmptyRequest implements MessagingRequest {
      method operation (line 429) | @Override
      method channelKind (line 434) | @Override
      method channelName (line 439) | @Override
      method unwrap (line 444) | @Override
      method kind (line 449) | @Override
      method header (line 454) | @Override
      method name (line 459) | @Override
      method cacheScope (line 464) | @Override
      method setHeader (line 469) | @Override
    class MockITracing (line 476) | public static class MockITracing extends NoOpTracer.NoopTracing {
      method setPropagationKeys (line 487) | public MockITracing setPropagationKeys(List<String> propagationKeys) {
      method exportAsync (line 492) | @Override
      method importAsync (line 498) | @Override
      method clientRequest (line 504) | @Override
      method serverReceive (line 510) | @Override
      method consumerSpan (line 516) | @Override
      method producerSpan (line 522) | @Override
      method nextSpan (line 528) | @Override
      method propagationKeys (line 534) | @Override
      method messagingTracing (line 539) | @Override
      method isNoop (line 544) | @Override
    class MockMessagingTracing (line 551) | public static class MockMessagingTracing extends NoOpTracer.EmptyMessa...
      method producerInjector (line 555) | @Override
      method consumerInjector (line 560) | @Override

FILE: context/src/test/java/com/megaease/easeagent/context/log/LoggerFactoryImplTest.java
  class LoggerFactoryImplTest (line 27) | public class LoggerFactoryImplTest {
    method getLogger (line 30) | @Test
    method factory (line 39) | @Test
    method build (line 50) | @Test

FILE: context/src/test/java/com/megaease/easeagent/context/log/LoggerImplTest.java
  class LoggerImplTest (line 25) | public class LoggerImplTest {
    method test (line 26) | @Test

FILE: context/src/test/java/com/megaease/easeagent/context/log/LoggerMdcTest.java
  class LoggerMdcTest (line 24) | public class LoggerMdcTest {
    method put (line 28) | @Test
    method remove (line 35) | @Test
    method get (line 43) | @Test

FILE: core/src/main/java/com/megaease/easeagent/core/AppendBootstrapClassLoaderSearch.java
  class AppendBootstrapClassLoaderSearch (line 46) | public final class AppendBootstrapClassLoaderSearch {
    method run (line 50) | @Override
    method by (line 57) | static Set<String> by(Instrumentation inst, ClassInjector.UsingInstrum...
    method types (line 63) | private static Map<TypeDescription, byte[]> types(Set<String> names) {
    method findClassAnnotatedAutoService (line 79) | private static Set<String> findClassAnnotatedAutoService(Class<?> cls)...
    method AppendBootstrapClassLoaderSearch (line 105) | private AppendBootstrapClassLoaderSearch() {

FILE: core/src/main/java/com/megaease/easeagent/core/Bootstrap.java
  class Bootstrap (line 63) | @SuppressWarnings("unused")
    method Bootstrap (line 78) | private Bootstrap() {
    method start (line 81) | @SneakyThrows
    method initHttpServer (line 137) | private static void initHttpServer(Configs conf) {
    method loadProvider (line 163) | private static void loadProvider(final Configs conf, final AgentReport...
    method provider (line 168) | private static void provider(final BeanProvider beanProvider, final Co...
    method getAgentBuilder (line 192) | public static AgentBuilder getAgentBuilder(Configs config, boolean tes...
    method registerMBeans (line 230) | @SneakyThrows
    method protectedLoaders (line 241) | private static ElementMatcher<ClassLoader> protectedLoaders() {
    method wrapConfig (line 245) | private static void wrapConfig(GlobalConfigs configs) {
    method onDiscovery (line 252) | @Override
    method onTransformation (line 257) | @Override
    method onIgnored (line 262) | @Override
    method onError (line 267) | @Override
    method onComplete (line 274) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/GlobalAgentHolder.java
  class GlobalAgentHolder (line 26) | public class GlobalAgentHolder {
    method GlobalAgentHolder (line 32) | private GlobalAgentHolder() {}
    method setWrappedConfigManager (line 34) | public static void setWrappedConfigManager(WrappedConfigManager config) {
    method getWrappedConfigManager (line 38) | public static WrappedConfigManager getWrappedConfigManager() {
    method setAgentHttpServer (line 42) | public static void setAgentHttpServer(AgentHttpServer server) {
    method getAgentHttpServer (line 46) | public static AgentHttpServer getAgentHttpServer() {
    method setAgentReport (line 50) | public static void setAgentReport(AgentReport report) {
    method getAgentReport (line 54) | public static AgentReport getAgentReport() {
    method setAgentClassLoader (line 58) | public static void setAgentClassLoader(URLClassLoader loader) {
    method getAgentClassLoader (line 62) | public static URLClassLoader getAgentClassLoader() {

FILE: core/src/main/java/com/megaease/easeagent/core/config/CanaryListUpdateAgentHttpHandler.java
  class CanaryListUpdateAgentHttpHandler (line 32) | public class CanaryListUpdateAgentHttpHandler extends ConfigsUpdateAgent...
    method CanaryListUpdateAgentHttpHandler (line 36) | public CanaryListUpdateAgentHttpHandler() {
    method getPath (line 40) | @Override
    method processJsonConfig (line 45) | @Override
    method processConfig (line 67) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/config/CanaryUpdateAgentHttpHandler.java
  class CanaryUpdateAgentHttpHandler (line 25) | public class CanaryUpdateAgentHttpHandler extends ConfigsUpdateAgentHttp...
    method CanaryUpdateAgentHttpHandler (line 26) | public CanaryUpdateAgentHttpHandler() {
    method getPath (line 30) | @Override
    method processConfig (line 35) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/config/ConfigsUpdateAgentHttpHandler.java
  class ConfigsUpdateAgentHttpHandler (line 34) | public abstract class ConfigsUpdateAgentHttpHandler extends AgentHttpHan...
    method processConfig (line 35) | public abstract Response processConfig(Map<String, String> config, Map...
    method toConfigMap (line 39) | static Map<String, String> toConfigMap(Map<String, Object> map) {
    method process (line 45) | @SneakyThrows
    method processJsonConfig (line 59) | public Response processJsonConfig(Map<String, Object> map, Map<String,...

FILE: core/src/main/java/com/megaease/easeagent/core/config/PluginPropertiesHttpHandler.java
  class PluginPropertiesHttpHandler (line 30) | public class PluginPropertiesHttpHandler extends ConfigsUpdateAgentHttpH...
    method PluginPropertiesHttpHandler (line 31) | public PluginPropertiesHttpHandler() {
    method getPath (line 35) | @Override
    method processConfig (line 40) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/config/PluginPropertyHttpHandler.java
  class PluginPropertyHttpHandler (line 35) | public class PluginPropertyHttpHandler extends AgentHttpHandler {
    method PluginPropertyHttpHandler (line 38) | public PluginPropertyHttpHandler() {
    method getPath (line 44) | @Override
    method process (line 49) | @SneakyThrows

FILE: core/src/main/java/com/megaease/easeagent/core/config/ServiceUpdateAgentHttpHandler.java
  class ServiceUpdateAgentHttpHandler (line 26) | public class ServiceUpdateAgentHttpHandler extends ConfigsUpdateAgentHtt...
    method ServiceUpdateAgentHttpHandler (line 27) | public ServiceUpdateAgentHttpHandler() {
    method getPath (line 31) | @Override
    method processConfig (line 36) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/health/HealthProvider.java
  class HealthProvider (line 38) | public class HealthProvider implements AgentHttpHandlerProvider, ConfigA...
    method getAgentHttpHandlers (line 43) | @Override
    method setConfig (line 52) | @Override
    method afterPropertiesSet (line 57) | @Override
    class HealthAgentHttpHandler (line 63) | public static class HealthAgentHttpHandler extends AgentHttpHandler {
      method getPath (line 65) | @Override
      method process (line 70) | @Override
    class LivenessAgentHttpHandler (line 76) | public static class LivenessAgentHttpHandler extends HealthAgentHttpHa...
      method getPath (line 78) | @Override
    class ReadinessAgentHttpHandler (line 85) | public static class ReadinessAgentHttpHandler extends HealthAgentHttpH...
      method getPath (line 87) | @Override
      method process (line 92) | @Override
    type HStatus (line 106) | enum HStatus implements IStatus {
      method HStatus (line 117) | HStatus(int requestStatus, String description) {
      method getDescription (line 122) | @Override
      method getRequestStatus (line 127) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/info/AgentInfoFactory.java
  class AgentInfoFactory (line 29) | public class AgentInfoFactory {
    method loadAgentInfo (line 35) | public static AgentInfo loadAgentInfo(ClassLoader classLoader) {
    method loadVersion (line 40) | private static String loadVersion(ClassLoader classLoader, String file) {

FILE: core/src/main/java/com/megaease/easeagent/core/info/AgentInfoProvider.java
  class AgentInfoProvider (line 35) | public class AgentInfoProvider implements AgentHttpHandlerProvider, Bean...
    method getAgentHttpHandlers (line 37) | @Override
    class AgentInfoHttpHandler (line 44) | public static class AgentInfoHttpHandler extends AgentHttpHandler {
      method getPath (line 46) | @Override
      method process (line 51) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/BaseLoader.java
  class BaseLoader (line 30) | public class BaseLoader {
    method load (line 33) | public static <T> List<T> load(Class<T> serviceClass) {
    method loadOrdered (line 48) | public static <T extends Ordered> List<T> loadOrdered(Class<T> service...
    method BaseLoader (line 54) | private BaseLoader() {}

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/BridgeDispatcher.java
  class BridgeDispatcher (line 26) | public class BridgeDispatcher implements IDispatcher {
    method enter (line 27) | @Override
    method exit (line 37) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/CommonInlineAdvice.java
  class CommonInlineAdvice (line 33) | @SuppressWarnings("all")
    method enter (line 38) | @Advice.OnMethodEnter(suppress = NoExceptionHandler.class)
    method exit (line 64) | @Advice.OnMethodExit(onThrowable = Exception.class, suppress = NoExcep...
    method exit (line 82) | @Advice.OnMethodExit(suppress = NoExceptionHandler.class)

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/Dispatcher.java
  class Dispatcher (line 28) | @AutoService(AppendBootstrapLoader.class)
    method Dispatcher (line 31) | private Dispatcher() {
    method enter (line 41) | public static void enter(int index, MethodInfo info, InitializeContext...
    method exit (line 48) | public static Object exit(int index, MethodInfo info, InitializeContex...
    method register (line 55) | public static AgentInterceptorChain register(int index, AgentIntercept...
    method getChain (line 60) | public static AgentInterceptorChain getChain(int index) {
    method updateChain (line 64) | public static boolean updateChain(int index, AgentInterceptorChain cha...

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/PluginLoader.java
  class PluginLoader (line 44) | public class PluginLoader {
    method PluginLoader (line 46) | private PluginLoader() {
    method load (line 51) | public static AgentBuilder load(AgentBuilder ab, Configs conf) {
    method providerLoad (line 64) | public static void providerLoad() {
    method classTransformationLoad (line 88) | public static Set<ClassTransformation> classTransformationLoad() {
    method pluginLoad (line 105) | public static void pluginLoad() {
    method pointsLoad (line 126) | public static void pointsLoad(Configs conf) {
    method isCodeVersion (line 145) | public static boolean isCodeVersion(Points points, Configs conf) {
    method compound (line 172) | public static AgentBuilder.Transformer compound(boolean hasDynamicField,

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/interceptor/InterceptorPluginDecorator.java
  class InterceptorPluginDecorator (line 34) | public class InterceptorPluginDecorator implements Interceptor {
    method InterceptorPluginDecorator (line 40) | public InterceptorPluginDecorator(Interceptor interceptor, AgentPlugin...
    method getConfig (line 46) | public IPluginConfig getConfig() {
    method before (line 50) | @Override
    method after (line 63) | @Override
    method getType (line 81) | @Override
    method init (line 86) | @Override
    method init (line 91) | @Override
    method order (line 96) | @Override
    method getInterceptorSupplier (line 103) | public static Supplier<Interceptor> getInterceptorSupplier(final Agent...

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/interceptor/ProviderChain.java
  class ProviderChain (line 28) | public class ProviderChain {
    method ProviderChain (line 31) | ProviderChain(List<InterceptorProvider> providers) {
    method getSupplierChain (line 35) | public List<Supplier<Interceptor>> getSupplierChain() {
    method builder (line 41) | public static Builder builder() {
    class Builder (line 45) | @SuppressWarnings("all")
      method Builder (line 49) | Builder() {
      method providers (line 52) | public Builder providers(List<InterceptorProvider> providers) {
      method addProvider (line 57) | public Builder addProvider(InterceptorProvider supplier) {
      method build (line 62) | public ProviderChain build() {
      method toString (line 66) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/interceptor/ProviderPluginDecorator.java
  class ProviderPluginDecorator (line 26) | public class ProviderPluginDecorator implements InterceptorProvider {
    method ProviderPluginDecorator (line 30) | public ProviderPluginDecorator(AgentPlugin plugin, InterceptorProvider...
    method getInterceptorProvider (line 35) | @Override
    method getAdviceTo (line 43) | @Override
    method getPluginClassName (line 48) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/matcher/ClassLoaderMatcherConvert.java
  class ClassLoaderMatcherConvert (line 29) | public class ClassLoaderMatcherConvert implements Converter<IClassLoader...
    method convert (line 35) | @Override
    class NameMatcher (line 75) | static class NameMatcher implements ElementMatcher<ClassLoader> {
      method NameMatcher (line 78) | public NameMatcher(String name) {
      method matches (line 82) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/matcher/ClassMatcherConvert.java
  class ClassMatcherConvert (line 32) | public class ClassMatcherConvert
    method convert (line 36) | @Override
    method convert (line 65) | private Junction<TypeDescription> convert(ClassMatcher matcher) {
    method fromModifier (line 96) | Junction<TypeDescription> fromModifier(int modifier, boolean not) {

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/matcher/ClassTransformation.java
  class ClassTransformation (line 30) | @Data
    method ClassTransformation (line 39) | public ClassTransformation(int order,
    method builder (line 57) | public static Builder builder() {
    method order (line 61) | @Override
    class Builder (line 66) | public static class Builder {
      method Builder (line 75) | Builder() {
      method order (line 78) | public Builder order(int order) {
      method classloaderMatcher (line 83) | public Builder classloaderMatcher(ElementMatcher<ClassLoader> clmMat...
      method classMatcher (line 88) | public Builder classMatcher(Junction<TypeDescription> classMatcher) {
      method methodTransformations (line 93) | public Builder methodTransformations(Set<MethodTransformation> metho...
      method hasDynamicField (line 98) | public Builder hasDynamicField(boolean hasDynamicField) {
      method typeFieldAccessor (line 103) | public Builder typeFieldAccessor(String typeFieldAccessor) {
      method build (line 108) | public ClassTransformation build() {
      method toString (line 113) | public String toString() {

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/matcher/Converter.java
  type Converter (line 20) | public interface Converter<S, T> {
    method convert (line 21) | T convert(S source);

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/matcher/MethodMatcherConvert.java
  class MethodMatcherConvert (line 34) | public class MethodMatcherConvert
    method convert (line 39) | @Override
    method convert (line 68) | private Junction<MethodDescription> convert(MethodMatcher matcher) {
    method fromModifier (line 133) | Junction<MethodDescription> fromModifier(int modifier, boolean not) {

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/matcher/MethodTransformation.java
  class MethodTransformation (line 39) | @Data
    method MethodTransformation (line 48) | public MethodTransformation(int index,
    method getAgentInterceptorChain (line 56) | public AgentInterceptorChain getAgentInterceptorChain(final int unique...

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/registry/AdviceRegistry.java
  class AdviceRegistry (line 39) | public class AdviceRegistry {
    method AdviceRegistry (line 41) | private AdviceRegistry() {
    method check (line 48) | public static Integer check(TypeDescription instrumentedType,
    method getPointcutIndex (line 121) | static Integer getPointcutIndex(Dispatcher.Resolved resolved) {
    method updateStackManipulation (line 141) | static Integer updateStackManipulation(Dispatcher.Resolved resolved, I...
    method setCurrentClassLoader (line 167) | public static void setCurrentClassLoader(ClassLoader loader) {
    method getCurrentClassLoader (line 171) | public static ClassLoader getCurrentClassLoader() {
    method cleanCurrentClassLoader (line 175) | public static void cleanCurrentClassLoader() {
    class PointcutsUniqueId (line 179) | private static class PointcutsUniqueId {
      method PointcutsUniqueId (line 186) | public PointcutsUniqueId() {
      method checkPointcutExist (line 190) | public boolean checkPointcutExist(Integer pointcutIndex) {
      method getUniqueId (line 194) | public int getUniqueId() {
      method checkClassloaderExist (line 198) | public boolean checkClassloaderExist() {
      method lock (line 203) | public void lock() {
      method unlock (line 207) | public void unlock() {
      method tryRelease (line 214) | public void tryRelease() {

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/registry/PluginRegistry.java
  class PluginRegistry (line 42) | public class PluginRegistry {
    method PluginRegistry (line 54) | private PluginRegistry() {
    method register (line 57) | public static void register(AgentPlugin plugin) {
    method register (line 61) | public static void register(Points points) {
    method getPoints (line 65) | public static Collection<Points> getPoints() {
    method getPoints (line 69) | public static Points getPoints(String pointsClassName) {
    method getMethodQualifier (line 73) | private static String getMethodQualifier(String classname, String qual...
    method registerClassTransformation (line 77) | public static ClassTransformation registerClassTransformation(Points p...
    method register (line 117) | public static int register(InterceptorProvider provider) {
    method getPointsClassName (line 146) | public static String getPointsClassName(String name) {
    method getMethodTransformation (line 158) | public static MethodTransformation getMethodTransformation(int pointcu...
    method addMethodTransformation (line 162) | public static void addMethodTransformation(int pointcutIndex, MethodTr...

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/transformer/AnnotationTransformer.java
  class AnnotationTransformer (line 35) | public class AnnotationTransformer implements AgentBuilder.Transformer {
    method AnnotationTransformer (line 40) | public AnnotationTransformer(MethodTransformation info) {
    method transform (line 52) | @Override
    class ForMethodDelegate (line 57) | public static class ForMethodDelegate implements AsmVisitorWrapper.For...
      method ForMethodDelegate (line 62) | ForMethodDelegate(MemberAttributeExtension.ForMethod mForMethod,
      method wrap (line 70) | @Override
      method on (line 86) | public AsmVisitorWrapper on(ElementMatcher<? super MethodDescription...

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/transformer/CompoundPluginTransformer.java
  class CompoundPluginTransformer (line 28) | public class CompoundPluginTransformer implements AgentBuilder.Transform...
    method CompoundPluginTransformer (line 31) | public CompoundPluginTransformer(List<AgentBuilder.Transformer> transf...
    method transform (line 42) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/transformer/DynamicFieldAdvice.java
  class DynamicFieldAdvice (line 26) | public class DynamicFieldAdvice {
    method DynamicFieldAdvice (line 28) | private DynamicFieldAdvice() {
    class DynamicInstanceInit (line 33) | public static class DynamicInstanceInit {
      method DynamicInstanceInit (line 35) | private DynamicInstanceInit() {
      method exit (line 38) | @Advice.OnMethodExit
    class DynamicClassInit (line 49) | public static class DynamicClassInit {
      method DynamicClassInit (line 51) | private DynamicClassInit() {
      method exit (line 54) | @Advice.OnMethodExit

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/transformer/DynamicFieldTransformer.java
  class DynamicFieldTransformer (line 37) | public class DynamicFieldTransformer implements AgentBuilder.Transformer {
    method DynamicFieldTransformer (line 45) | public DynamicFieldTransformer(String fieldName) {
    method DynamicFieldTransformer (line 49) | public DynamicFieldTransformer(String fieldName, Class<?> accessor) {
    method transform (line 58) | @Override
    method check (line 82) | private static boolean check(TypeDescription td, Class<?> accessor, Cl...

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/transformer/ForAdviceTransformer.java
  class ForAdviceTransformer (line 36) | public class ForAdviceTransformer implements AgentBuilder.Transformer {
    method ForAdviceTransformer (line 41) | public ForAdviceTransformer(MethodTransformation methodTransformInfo) {
    method transform (line 59) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/transformer/TypeFieldTransformer.java
  class TypeFieldTransformer (line 17) | public class TypeFieldTransformer implements AgentBuilder.Transformer {
    method TypeFieldTransformer (line 24) | public TypeFieldTransformer(String fieldName) {
    method transform (line 32) | @Override
    method check (line 55) | private static boolean check(TypeDescription td, Class<?> accessor, Cl...

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/transformer/advice/AgentAdvice.java
  class AgentAdvice (line 67) | @SuppressWarnings("unused, rawtypes, unchecked")
    method AgentAdvice (line 164) | protected AgentAdvice(Dispatcher.Resolved.ForMethodEnter methodEnter,
    method AgentAdvice (line 172) | protected AgentAdvice(Dispatcher.Resolved.ForMethodEnter methodEnter,
    method AgentAdvice (line 191) | private AgentAdvice(Dispatcher.Resolved.ForMethodEnter methodEnter,
    method isNoExceptionHandler (line 206) | private static boolean isNoExceptionHandler(TypeDescription t) {
    method tto (line 221) | protected static AgentAdvice tto(TypeDescription advice,
    method withCustomMapping (line 259) | public static AgentAdvice.WithCustomMapping withCustomMapping() {
    method locate (line 263) | private static Dispatcher.Unresolved locate(Class<? extends Annotation...
    method withAssigner (line 286) | @Override
    method withExceptionHandler (line 299) | @Override
    class WithCustomMapping (line 308) | @HashCodeAndEqualsPlugin.Enhance
      method WithCustomMapping (line 328) | public WithCustomMapping() {
      method WithCustomMapping (line 340) | protected WithCustomMapping(PostProcessor.Factory postProcessorFactory,
      method bind (line 357) | @Override
      method bind (line 369) | public WithCustomMapping bind(OffsetMapping.Factory<?> offsetMapping) {
      method to (line 387) | @Override
    method doWrap (line 404) | @Override
    class AdviceVisitor (line 455) | protected abstract static class AdviceVisitor
      method AdviceVisitor (line 518) | protected AdviceVisitor(MethodVisitor methodVisitor,
      method onAfterExceptionTable (line 587) | @Override
      method onUserPrepare (line 605) | protected abstract void onUserPrepare();
      method onUserStart (line 610) | protected abstract void onUserStart();
      method onVisitVarInsn (line 612) | @Override
      method onVisitIincInsn (line 617) | @Override
      method onVisitFrame (line 622) | @Override
      method visitMaxs (line 627) | @Override
      method visitLocalVariable (line 633) | @Override
      method visitLocalVariableAnnotation (line 641) | @Override
      method onUserEnd (line 659) | protected abstract void onUserEnd();
    class WithoutExitAdvice (line 666) | protected static class WithoutExitAdvice extends AdviceVisitor {
      method WithoutExitAdvice (line 681) | protected WithoutExitAdvice(MethodVisitor methodVisitor,
      method apply (line 706) | public void apply(MethodVisitor methodVisitor) {
      method onUserPrepare (line 731) | @Override
      method onUserStart (line 736) | @Override
      method onUserEnd (line 741) | @Override
    class WithExitAdvice (line 750) | protected abstract static class WithExitAdvice extends AdviceVisitor {
      method WithExitAdvice (line 771) | protected WithExitAdvice(MethodVisitor methodVisitor,
      method apply (line 799) | public void apply(MethodVisitor methodVisitor) {
      method onVisitInsn (line 818) | @Override
      method onUserEnd (line 846) | @Override
      method onUserReturn (line 881) | protected abstract void onUserReturn();
      method onExitAdviceReturn (line 886) | protected abstract void onExitAdviceReturn();
      class WithoutExceptionHandling (line 891) | protected static class WithoutExceptionHandling extends WithExitAdvi...
        method WithoutExceptionHandling (line 907) | protected WithoutExceptionHandling(MethodVisitor methodVisitor,
        method onUserPrepare (line 932) | @Override
        method onUserStart (line 937) | @Override
        method onUserReturn (line 942) | @Override
        method onExitAdviceReturn (line 966) | @Override
      class WithExceptionHandling (line 975) | protected static class WithExceptionHandling extends WithExitAdvice {
        method WithExceptionHandling (line 1006) | protected WithExceptionHandling(MethodVisitor methodVisitor,
        method onUserPrepare (line 1035) | @Override
        method onUserStart (line 1040) | @Override
        method onUserReturn (line 1045) | @Override
        method onExitAdviceReturn (line 1094) | @Override
    type Dispatcher (line 1111) | public interface Dispatcher {
      method isAlive (line 1128) | boolean isAlive();
      method getAdviceType (line 1135) | TypeDefinition getAdviceType();
      type Unresolved (line 1140) | interface Unresolved extends Dispatcher {
        method isBinary (line 1147) | boolean isBinary();
        method getNamedTypes (line 1154) | Map<String, TypeDefinition> getNamedTypes();
        method asMethodEnter (line 1165) | Resolved.ForMethodEnter asMethodEnter(List<? extends OffsetMapping...
        method asMethodExit (line 1179) | Resolved.ForMethodExit asMethodExit(List<? extends OffsetMapping.F...
      type SuppressionHandler (line 1189) | interface SuppressionHandler {
        method bind (line 1197) | Bound bind(StackManipulation exceptionHandler);
        type Bound (line 1202) | interface Bound {
          method onPrepare (line 1209) | void onPrepare(MethodVisitor methodVisitor);
          method onStart (line 1216) | void onStart(MethodVisitor methodVisitor);
          method onEnd (line 1227) | void onEnd(MethodVisitor methodVisitor,
          method onEndWithSkip (line 1242) | void onEndWithSkip(MethodVisitor methodVisitor,
        type NoOp (line 1252) | enum NoOp implements SuppressionHandler, Bound {
          method bind (line 1262) | public Bound bind(StackManipulation exceptionHandler) {
          method onPrepare (line 1269) | public void onPrepare(MethodVisitor methodVisitor) {
          method onStart (line 1276) | public void onStart(MethodVisitor methodVisitor) {
          method onEnd (line 1283) | public void onEnd(MethodVisitor methodVisitor,
          method onEndWithSkip (line 1294) | public void onEndWithSkip(MethodVisitor methodVisitor,
        class Suppressing (line 1306) | @HashCodeAndEqualsPlugin.Enhance
          method Suppressing (line 1319) | protected Suppressing(TypeDescription suppressedType) {
          method of (line 1329) | protected static SuppressionHandler of(TypeDescription suppresse...
          method bind (line 1338) | public SuppressionHandler.Bound bind(StackManipulation exception...
          class Bound (line 1345) | protected static class Bound implements SuppressionHandler.Bound {
            method Bound (line 1373) | protected Bound(TypeDescription suppressedType, StackManipulat...
            method onPrepare (line 1383) | public void onPrepare(MethodVisitor methodVisitor) {
            method onStart (line 1390) | public void onStart(MethodVisitor methodVisitor) {
            method onEnd (line 1397) | public void onEnd(MethodVisitor methodVisitor,
            method onEndWithSkip (line 1425) | public void onEndWithSkip(MethodVisitor methodVisitor,
      type RelocationHandler (line 1443) | interface RelocationHandler {
        method bind (line 1452) | Bound bind(MethodDescription instrumentedMethod, Relocation reloca...
        type Relocation (line 1457) | interface Relocation {
          method apply (line 1464) | void apply(MethodVisitor methodVisitor);
          class ForLabel (line 1469) | @HashCodeAndEqualsPlugin.Enhance
            method ForLabel (line 1482) | public ForLabel(Label label) {
            method apply (line 1489) | public void apply(MethodVisitor methodVisitor) {
        type Bound (line 1498) | interface Bound {
          method apply (line 1512) | int apply(MethodVisitor methodVisitor, int offset);
        type Disabled (line 1518) | enum Disabled implements RelocationHandler, Bound {
          method bind (line 1528) | public Bound bind(MethodDescription instrumentedMethod, Relocati...
          method apply (line 1535) | public int apply(MethodVisitor methodVisitor, int offset) {
        type ForValue (line 1543) | enum ForValue implements RelocationHandler {
          method convertValue (line 1549) | @Override
          method convertValue (line 1559) | @Override
          method convertValue (line 1569) | @Override
          method convertValue (line 1580) | @Override
          method convertValue (line 1591) | @Override
          method ForValue (line 1625) | ForValue(int load, int defaultJump, int nonDefaultJump, int requ...
          method of (line 1639) | protected static RelocationHandler of(TypeDefinition typeDefinit...
          method convertValue (line 1664) | protected abstract void convertValue(MethodVisitor methodVisitor);
          method bind (line 1669) | public RelocationHandler.Bound bind(MethodDescription instrument...
          class Inverted (line 1676) | @HashCodeAndEqualsPlugin.Enhance(includeSyntheticFields = true)
            method bind (line 1682) | public Bound bind(MethodDescription instrumentedMethod, Reloca...
          class Bound (line 1690) | @HashCodeAndEqualsPlugin.Enhance(includeSyntheticFields = true)
            method Bound (line 1715) | protected Bound(MethodDescription instrumentedMethod, Relocati...
            method apply (line 1724) | public int apply(MethodVisitor methodVisitor, int offset) {
        class ForType (line 1744) | @HashCodeAndEqualsPlugin.Enhance
          method ForType (line 1757) | protected ForType(TypeDescription typeDescription) {
          method of (line 1768) | protected static RelocationHandler of(TypeDescription typeDescri...
          method bind (line 1785) | public RelocationHandler.Bound bind(MethodDescription instrument...
          class Bound (line 1792) | @HashCodeAndEqualsPlugin.Enhance(includeSyntheticFields = true)
            method Bound (line 1811) | protected Bound(MethodDescription instrumentedMethod, Relocati...
            method apply (line 1819) | public int apply(MethodVisitor methodVisitor, int offset) {
      type Resolved (line 1838) | interface Resolved extends Dispatcher {
        method getNamedTypes (line 1845) | Map<String, TypeDefinition> getNamedTypes();
        method bind (line 1862) | Bound bind(TypeDescription instrumentedType,
        method getOffsetMapping (line 1874) | Map<Integer, OffsetMapping> getOffsetMapping();
        type ForMethodEnter (line 1879) | interface ForMethodEnter extends Resolved {
          method isPrependLineNumber (line 1886) | boolean isPrependLineNumber();
          method getActualAdviceType (line 1893) | TypeDefinition getActualAdviceType();
        type ForMethodExit (line 1899) | interface ForMethodExit extends Resolved {
          method getThrowable (line 1907) | TypeDescription getThrowable();
          method getArgumentHandlerFactory (line 1914) | ArgumentHandler.Factory getArgumentHandlerFactory();
        class AbstractBase (line 1920) | @HashCodeAndEqualsPlugin.Enhance
          method AbstractBase (line 1958) | protected AbstractBase(MethodDescription.InDefinedShape adviceMe...
          method isAlive (line 1998) | public boolean isAlive() {
          method getOffsetMapping (line 2002) | @Override
      type Bound (line 2012) | interface Bound {
        method prepare (line 2017) | void prepare();
        method initialize (line 2022) | void initialize();
        method apply (line 2027) | void apply();
      type Inactive (line 2033) | enum Inactive implements Dispatcher.Unresolved, Resolved.ForMethodEn...
        method isAlive (line 2043) | public boolean isAlive() {
        method isBinary (line 2050) | public boolean isBinary() {
        method getAdviceType (line 2057) | public TypeDescription getAdviceType() {
        method isPrependLineNumber (line 2064) | public boolean isPrependLineNumber() {
        method getActualAdviceType (line 2071) | public TypeDefinition getActualAdviceType() {
        method getNamedTypes (line 2078) | public Map<String, TypeDefinition> getNamedTypes() {
        method getThrowable (line 2085) | public TypeDescription getThrowable() {
        method getArgumentHandlerFactory (line 2092) | public ArgumentHandler.Factory getArgumentHandlerFactory() {
        method asMethodEnter (line 2099) | public Resolved.ForMethodEnter asMethodEnter(List<? extends Offset...
        method asMethodExit (line 2109) | public Resolved.ForMethodExit asMethodExit(List<? extends OffsetMa...
        method prepare (line 2119) | public void prepare() {
        method initialize (line 2126) | public void initialize() {
        method apply (line 2133) | public void apply() {
        method bind (line 2140) | public Bound bind(TypeDescription instrumentedType,
        method getOffsetMapping (line 2153) | @Override
      class Inlining (line 2162) | @HashCodeAndEqualsPlugin.Enhance
        method Inlining (line 2180) | protected Inlining(MethodDescription.InDefinedShape adviceMethod) {
        method isAlive (line 2198) | public boolean isAlive() {
        method isBinary (line 2205) | public boolean isBinary() {
        method getAdviceType (line 2212) | public TypeDescription getAdviceType() {
        method getNamedTypes (line 2219) | public Map<String, TypeDefinition> getNamedTypes() {
        method asMethodEnter (line 2226) | public Dispatcher.Resolved.ForMethodEnter asMethodEnter(List<? ext...
        method asMethodExit (line 2242) | public Dispatcher.Resolved.ForMethodExit asMethodExit(List<? exten...
        method asMethodExitNonThrowable (line 2262) | public Dispatcher.Resolved.ForMethodExit asMethodExitNonThrowable(
        class Resolved (line 2286) | protected abstract static class Resolved extends Dispatcher.Resolv...
          method Resolved (line 2303) | protected Resolved(MethodDescription.InDefinedShape adviceMethod,
          method resolveInitializationTypes (line 2319) | protected abstract Map<Integer, TypeDefinition> resolveInitializ...
          method apply (line 2337) | protected abstract MethodVisitor apply(MethodVisitor methodVisitor,
          class AdviceMethodInliner (line 2353) | protected class AdviceMethodInliner extends ClassVisitor impleme...
            method AdviceMethodInliner (line 2436) | protected AdviceMethodInliner(TypeDescription instrumentedType,
            method prepare (line 2467) | public void prepare() {
            method initialize (line 2475) | public void initialize() {
            method apply (line 2504) | public void apply() {
            method visitMethod (line 2508) | @Override
            class ExceptionTableExtractor (line 2527) | protected class ExceptionTableExtractor extends ClassVisitor {
              method ExceptionTableExtractor (line 2532) | protected ExceptionTableExtractor() {
              method visitMethod (line 2536) | @Override
            class ExceptionTableCollector (line 2548) | protected class ExceptionTableCollector extends MethodVisitor {
              method ExceptionTableCollector (line 2560) | protected ExceptionTableCollector(MethodVisitor methodVisito...
              method visitTryCatchBlock (line 2565) | @Override
              method visitTryCatchAnnotation (line 2571) | @Override
            class ExceptionTableSubstitutor (line 2583) | protected class ExceptionTableSubstitutor extends MethodVisitor {
              method ExceptionTableSubstitutor (line 2600) | protected ExceptionTableSubstitutor(MethodVisitor methodVisi...
              method visitTryCatchBlock (line 2605) | @Override
              method visitTryCatchAnnotation (line 2614) | @Override
              method visitLabel (line 2619) | @Override
              method visitJumpInsn (line 2624) | @Override
              method visitTableSwitchInsn (line 2629) | @Override
              method visitLookupSwitchInsn (line 2634) | @Override
              method resolve (line 2645) | private Label[] resolve(Label[] label) {
              method resolve (line 2660) | private Label resolve(Label label) {
          class ForMethodEnter (line 2672) | @HashCodeAndEqualsPlugin.Enhance
            method ForMethodEnter (line 2695) | protected ForMethodEnter(MethodDescription.InDefinedShape advi...
            method of (line 2735) | protected static Resolved.ForMethodEnter of(MethodDescription....
            method resolveInitializationTypes (line 2747) | @Override
            method bind (line 2759) | public Bound bind(TypeDescription instrumentedType,
            method isPrependLineNumber (line 2786) | public boolean isPrependLineNumber() {
            method getActualAdviceType (line 2793) | public TypeDefinition getActualAdviceType() {
            method getNamedTypes (line 2800) | public Map<String, TypeDefinition> getNamedTypes() {
            method apply (line 2804) | @Override
            method doApply (line 2845) | protected MethodVisitor doApply(MethodVisitor methodVisitor,
            class WithRetainedEnterType (line 2884) | protected static class WithRetainedEnterType extends Inlining....
              method WithRetainedEnterType (line 2897) | protected WithRetainedEnterType(MethodDescription.InDefinedS...
              method getAdviceType (line 2909) | public TypeDefinition getAdviceType() {
            class WithDiscardedEnterType (line 2917) | protected static class WithDiscardedEnterType extends Inlining...
              method WithDiscardedEnterType (line 2929) | protected WithDiscardedEnterType(MethodDescription.InDefined...
              method getAdviceType (line 2941) | public TypeDefinition getAdviceType() {
              method doApply (line 2948) | @Override
          class ForMethodExit (line 2979) | @HashCodeAndEqualsPlugin.Enhance
            method ForMethodExit (line 3003) | protected ForMethodExit(MethodDescription.InDefinedShape advic...
            method of (line 3044) | protected static Resolved.ForMethodExit of(MethodDescription.I...
            method ofNonThrowable (line 3059) | protected static Resolved.ForMethodExit ofNonThrowable(MethodD...
            method getNamedTypes (line 3070) | @Override
            method resolveInitializationTypes (line 3075) | @Override
            method apply (line 3087) | @Override
            method doApply (line 3128) | private MethodVisitor doApply(MethodVisitor methodVisitor,
            method getArgumentHandlerFactory (line 3167) | public ArgumentHandler.Factory getArgumentHandlerFactory() {
            method getAdviceType (line 3176) | public TypeDefinition getAdviceType() {
            method bind (line 3183) | public Bound bind(TypeDescription instrumentedType,
            class WithExceptionHandler (line 3210) | @HashCodeAndEqualsPlugin.Enhance
              method WithExceptionHandler (line 3231) | protected WithExceptionHandler(MethodDescription.InDefinedSh...
              method getThrowable (line 3246) | public TypeDescription getThrowable() {
            class WithoutExceptionHandler (line 3254) | protected static class WithoutExceptionHandler extends Inlinin...
              method WithoutExceptionHandler (line 3268) | protected WithoutExceptionHandler(MethodDescription.InDefine...
              method getThrowable (line 3281) | public TypeDescription getThrowable() {
        class CodeTranslationVisitor (line 3291) | protected static class CodeTranslationVisitor extends MethodVisitor {
          method CodeTranslationVisitor (line 3392) | protected CodeTranslationVisitor(MethodVisitor methodVisitor,
          method propagateHandler (line 3432) | protected void propagateHandler(Label label) {
          method visitParameter (line 3436) | @Override
          method visitAnnotableParameterCount (line 3441) | @Override
          method visitAnnotationDefault (line 3446) | @Override
          method visitAnnotation (line 3451) | @Override
          method visitTypeAnnotation (line 3456) | @Override
          method visitParameterAnnotation (line 3461) | @Override
          method visitAttribute (line 3466) | @Override
          method visitCode (line 3471) | @Override
          method visitFrame (line 3476) | @Override
          method visitVarInsn (line 3481) | @Override
          method visitIincInsn (line 3516) | @Override
          method visitInsn (line 3526) | @Override
          method visitEnd (line 3554) | @Override
          method visitMaxs (line 3585) | @Override
      class Delegating (line 3595) | @HashCodeAndEqualsPlugin.Enhance
        method Delegating (line 3614) | protected Delegating(MethodDescription.InDefinedShape adviceMethod...
        method isAlive (line 3622) | public boolean isAlive() {
        method isBinary (line 3629) | public boolean isBinary() {
        method getAdviceType (line 3636) | public TypeDescription getAdviceType() {
        method getNamedTypes (line 3643) | public Map<String, TypeDefinition> getNamedTypes() {
        method asMethodEnter (line 3650) | public Dispatcher.Resolved.ForMethodEnter asMethodEnter(List<? ext...
        method asMethodExit (line 3660) | public Dispatcher.Resolved.ForMethodExit asMethodExit(List<? exten...
        class Resolved (line 3682) | protected abstract static class Resolved extends Dispatcher.Resolv...
          method Resolved (line 3699) | protected Resolved(MethodDescription.InDefinedShape adviceMethod,
          method getNamedTypes (line 3712) | public Map<String, TypeDefinition> getNamedTypes() {
          method bind (line 3719) | public Bound bind(TypeDescription instrumentedType,
          method resolve (line 3759) | protected abstract Bound resolve(TypeDescription instrumentedType,
          class AdviceMethodWriter (line 3774) | protected abstract static class AdviceMethodWriter implements Bo...
            method AdviceMethodWriter (line 3870) | protected AdviceMethodWriter(MethodDescription.InDefinedShape ...
            method prepare (line 3905) | public void prepare() {
            method apply (line 3912) | public void apply() {
            method isExitAdvice (line 3956) | protected abstract boolean isExitAdvice();
            class ForMethodEnter (line 3961) | protected static class ForMethodEnter extends AdviceMethodWrit...
              method ForMethodEnter (line 3982) | protected ForMethodEnter(MethodDescription.InDefinedShape ad...
              method initialize (line 4017) | public void initialize() {
              method isExitAdvice (line 4021) | @Override
            class ForMethodExit (line 4030) | protected static class ForMethodExit extends AdviceMethodWriter {
              method ForMethodExit (line 4051) | protected ForMethodExit(MethodDescription.InDefinedShape adv...
              method initialize (line 4086) | public void initialize() {
              method isExitAdvice (line 4110) | @Override
          class ForMethodEnter (line 4120) | @HashCodeAndEqualsPlugin.Enhance
            method ForMethodEnter (line 4137) | protected ForMethodEnter(MethodDescription.InDefinedShape advi...
            method of (line 4173) | protected static Resolved.ForMethodEnter of(MethodDescription....
            method isPrependLineNumber (line 4187) | public boolean isPrependLineNumber() {
            method getActualAdviceType (line 4194) | public TypeDefinition getActualAdviceType() {
            method resolve (line 4198) | @Override
            method doResolve (line 4238) | protected Bound doResolve(TypeDescription instrumentedType,
            class WithRetainedEnterType (line 4277) | protected static class WithRetainedEnterType extends Delegatin...
              method WithRetainedEnterType (line 4288) | protected WithRetainedEnterType(MethodDescription.InDefinedS...
              method getAdviceType (line 4299) | public TypeDefinition getAdviceType() {
            class WithDiscardedEnterType (line 4307) | protected static class WithDiscardedEnterType extends Delegati...
              method WithDiscardedEnterType (line 4318) | protected WithDiscardedEnterType(MethodDescription.InDefined...
              method getAdviceType (line 4329) | public TypeDefinition getAdviceType() {
              method doResolve (line 4336) | @Override
          class ForMethodExit (line 4367) | @HashCodeAndEqualsPlugin.Enhance
            method ForMethodExit (line 4385) | protected ForMethodExit(MethodDescription.InDefinedShape advic...
            method of (line 4423) | protected static Resolved.ForMethodExit of(MethodDescription.I...
            method resolve (line 4438) | @Override
            method doResolve (line 4478) | private Bound doResolve(TypeDescription instrumentedType,
            method getArgumentHandlerFactory (line 4517) | public ArgumentHandler.Factory getArgumentHandlerFactory() {
            method getAdviceType (line 4526) | public TypeDefinition getAdviceType() {
            class WithExceptionHandler (line 4533) | @HashCodeAndEqualsPlugin.Enhance
              method WithExceptionHandler (line 4553) | protected WithExceptionHandler(MethodDescription.InDefinedSh...
              method getThrowable (line 4567) | public TypeDescription getThrowable() {
            class WithoutExceptionHandler (line 4575) | protected static class WithoutExceptionHandler extends Delegat...
              method WithoutExceptionHandler (line 4588) | protected WithoutExceptionHandler(MethodDescription.InDefine...
              method getThrowable (line 4600) | public TypeDescription getThrowable() {
    type MethodSizeHandler (line 4613) | protected interface MethodSizeHandler {
      method requireStackSize (line 4625) | void requireStackSize(int stackSize);
      method requireLocalVariableLength (line 4632) | void requireLocalVariableLength(int localVariableLength);
      type ForInstrumentedMethod (line 4637) | interface ForInstrumentedMethod extends MethodSizeHandler {
        method bindEnter (line 4645) | ForAdvice bindEnter(MethodDescription.InDefinedShape adviceMethod);
        method bindExit (line 4653) | ForAdvice bindExit(MethodDescription.InDefinedShape adviceMethod);
        method compoundStackSize (line 4661) | int compoundStackSize(int stackSize);
        method compoundLocalVariableLength (line 4669) | int compoundLocalVariableLength(int localVariableLength);
      type ForAdvice (line 4675) | interface ForAdvice extends MethodSizeHandler {
        method requireStackSizePadding (line 4682) | void requireStackSizePadding(int stackSizePadding);
        method requireLocalVariableLengthPadding (line 4689) | void requireLocalVariableLengthPadding(int localVariableLengthPadd...
        method recordMaxima (line 4698) | void recordMaxima(int stackSize, int localVariableLength);
      type NoOp (line 4704) | enum NoOp implements ForInstrumentedMethod, ForAdvice {
        method bindEnter (line 4714) | public ForAdvice bindEnter(MethodDescription.InDefinedShape advice...
        method bindExit (line 4721) | public ForAdvice bindExit(MethodDescription.InDefinedShape adviceM...
        method compoundStackSize (line 4728) | public int compoundStackSize(int stackSize) {
        method compoundLocalVariableLength (line 4735) | public int compoundLocalVariableLength(int localVariableLength) {
        method requireStackSize (line 4742) | public void requireStackSize(int stackSize) {
        method requireLocalVariableLength (line 4749) | public void requireLocalVariableLength(int localVariableLength) {
        method requireStackSizePadding (line 4756) | public void requireStackSizePadding(int stackSizePadding) {
        method requireLocalVariableLengthPadding (line 4763) | public void requireLocalVariableLengthPadding(int localVariableLen...
        method recordMaxima (line 4770) | public void recordMaxima(int stackSize, int localVariableLength) {
      class Default (line 4778) | abstract class Default implements MethodSizeHandler.ForInstrumentedM...
        method Default (line 4818) | protected Default(MethodDescription instrumentedMethod,
        method of (line 4839) | protected static MethodSizeHandler.ForInstrumentedMethod of(Method...
        method bindEnter (line 4857) | public MethodSizeHandler.ForAdvice bindEnter(MethodDescription.InD...
        method requireStackSize (line 4864) | public void requireStackSize(int stackSize) {
        method requireLocalVariableLength (line 4871) | public void requireLocalVariableLength(int localVariableLength) {
        method compoundStackSize (line 4878) | public int compoundStackSize(int stackSize) {
        method compoundLocalVariableLength (line 4885) | public int compoundLocalVariableLength(int localVariableLength) {
        class WithRetainedArguments (line 4895) | protected static class WithRetainedArguments extends Default {
          method WithRetainedArguments (line 4905) | protected WithRetainedArguments(MethodDescription instrumentedMe...
          method bindExit (line 4915) | public MethodSizeHandler.ForAdvice bindExit(MethodDescription.In...
          method compoundLocalVariableLength (line 4925) | @Override
        class WithCopiedArguments (line 4937) | protected static class WithCopiedArguments extends Default {
          method WithCopiedArguments (line 4947) | protected WithCopiedArguments(MethodDescription instrumentedMethod,
          method bindExit (line 4957) | @Override
          method compoundLocalVariableLength (line 4968) | @Override
        class ForAdvice (line 4981) | protected class ForAdvice implements MethodSizeHandler.ForAdvice {
          method ForAdvice (line 5010) | protected ForAdvice(MethodDescription.InDefinedShape adviceMetho...
          method requireStackSize (line 5018) | public void requireStackSize(int stackSize) {
          method requireLocalVariableLength (line 5025) | public void requireLocalVariableLength(int localVariableLength) {
          method requireStackSizePadding (line 5032) | public void requireStackSizePadding(int stackSizePadding) {
          method requireLocalVariableLengthPadding (line 5039) | public void requireLocalVariableLengthPadding(int localVariableL...
          method recordMaxima (line 5046) | public void recordMaxima(int stackSize, int localVariableLength) {
    type StackMapFrameHandler (line 5060) | public interface StackMapFrameHandler {
      method translateFrame (line 5072) | void translateFrame(MethodVisitor methodVisitor, int type, int local...
      method injectReturnFrame (line 5079) | void injectReturnFrame(MethodVisitor methodVisitor);
      method injectExceptionFrame (line 5086) | void injectExceptionFrame(MethodVisitor methodVisitor);
      method injectCompletionFrame (line 5093) | void injectCompletionFrame(MethodVisitor methodVisitor);
      type ForPostProcessor (line 5099) | interface ForPostProcessor {
        method injectIntermediateFrame (line 5107) | void injectIntermediateFrame(MethodVisitor methodVisitor, List<? e...
      type ForInstrumentedMethod (line 5113) | interface ForInstrumentedMethod extends StackMapFrameHandler {
        method bindEnter (line 5121) | ForAdvice bindEnter(MethodDescription.InDefinedShape adviceMethod);
        method bindExit (line 5129) | ForAdvice bindExit(MethodDescription.InDefinedShape adviceMethod);
        method getReaderHint (line 5136) | int getReaderHint();
        method injectInitializationFrame (line 5143) | void injectInitializationFrame(MethodVisitor methodVisitor);
        method injectStartFrame (line 5150) | void injectStartFrame(MethodVisitor methodVisitor);
        method injectPostCompletionFrame (line 5157) | void injectPostCompletionFrame(MethodVisitor methodVisitor);
      type ForAdvice (line 5163) | interface ForAdvice extends StackMapFrameHandler, ForPostProcessor, ...
      type NoOp (line 5170) | enum NoOp implements ForInstrumentedMethod, ForAdvice {
        method bindEnter (line 5180) | public StackMapFrameHandler.ForAdvice bindEnter(MethodDescription....
        method bindExit (line 5187) | public StackMapFrameHandler.ForAdvice bindExit(MethodDescription.I...
        method getReaderHint (line 5194) | public int getReaderHint() {
        method translateFrame (line 5201) | public void translateFrame(MethodVisitor methodVisitor,
        method injectReturnFrame (line 5213) | public void injectReturnFrame(MethodVisitor methodVisitor) {
        method injectExceptionFrame (line 5220) | public void injectExceptionFrame(MethodVisitor methodVisitor) {
        method injectCompletionFrame (line 5227) | public void injectCompletionFrame(MethodVisitor methodVisitor) {
        method injectInitializationFrame (line 5234) | public void injectInitializationFrame(MethodVisitor methodVisitor) {
        method injectStartFrame (line 5241) | public void injectStartFrame(MethodVisitor methodVisitor) {
        method injectPostCompletionFrame (line 5248) | public void injectPostCompletionFrame(MethodVisitor methodVisitor) {
        method injectIntermediateFrame (line 5255) | public void injectIntermediateFrame(MethodVisitor methodVisitor, L...
      class Default (line 5263) | abstract class Default implements ForInstrumentedMethod {
        method Default (line 5321) | protected Default(TypeDescription instrumentedType,
        method of (line 5353) | protected static ForInstrumentedMethod of(TypeDescription instrume...
        method bindEnter (line 5395) | public StackMapFrameHandler.ForAdvice bindEnter(MethodDescription....
        method getReaderHint (line 5404) | public int getReaderHint() {
        method translateFrame (line 5423) | protected void translateFrame(MethodVisitor methodVisitor,
        method injectFullFrame (line 5497) | protected void injectFullFrame(MethodVisitor methodVisitor,
        type TranslationMode (line 5526) | protected enum TranslationMode {
          method copy (line 5532) | @Override
          method isPossibleThisFrameValue (line 5543) | @Override
          method copy (line 5553) | @Override
          method isPossibleThisFrameValue (line 5571) | @Override
          method copy (line 5583) | @Override
          method isPossibleThisFrameValue (line 5599) | @Override
          method copy (line 5615) | protected abstract int copy(TypeDescription instrumentedType,
          method isPossibleThisFrameValue (line 5629) | protected abstract boolean isPossibleThisFrameValue(TypeDescript...
        type Initialization (line 5635) | protected enum Initialization {
          method toFrame (line 5644) | protected Object toFrame(TypeDescription typeDescription) {
          method toFrame (line 5659) | protected Object toFrame(TypeDescription typeDescription) {
          method toFrame (line 5684) | protected abstract Object toFrame(TypeDescription typeDescription);
        class Trivial (line 5690) | protected static class Trivial extends Default {
          method Trivial (line 5700) | protected Trivial(TypeDescription instrumentedType, MethodDescri...
          method translateFrame (line 5713) | public void translateFrame(MethodVisitor methodVisitor,
          method bindExit (line 5725) | public StackMapFrameHandler.ForAdvice bindExit(MethodDescription...
          method injectReturnFrame (line 5732) | public void injectReturnFrame(MethodVisitor methodVisitor) {
          method injectExceptionFrame (line 5739) | public void injectExceptionFrame(MethodVisitor methodVisitor) {
          method injectCompletionFrame (line 5746) | public void injectCompletionFrame(MethodVisitor methodVisitor) {
          method injectPostCompletionFrame (line 5753) | public void injectPostCompletionFrame(MethodVisitor methodVisito...
          method injectInitializationFrame (line 5760) | public void injectInitializationFrame(MethodVisitor methodVisito...
          method injectStartFrame (line 5767) | public void injectStartFrame(MethodVisitor methodVisitor) {
        class WithPreservedArguments (line 5775) | protected abstract static class WithPreservedArguments extends Def...
          method WithPreservedArguments (line 5794) | protected WithPreservedArguments(TypeDescription instrumentedType,
          method translateFrame (line 5806) | @Override
          method bindExit (line 5826) | public StackMapFrameHandler.ForAdvice bindExit(MethodDescription...
          method injectReturnFrame (line 5838) | public void injectReturnFrame(MethodVisitor methodVisitor) {
          method injectExceptionFrame (line 5859) | public void injectExceptionFrame(MethodVisitor methodVisitor) {
          method injectCompletionFrame (line 5870) | public void injectCompletionFrame(MethodVisitor methodVisitor) {
          method injectPostCompletionFrame (line 5891) | public void injectPostCompletionFrame(MethodVisitor methodVisito...
          method injectInitializationFrame (line 5903) | public void injectInitializationFrame(MethodVisitor methodVisito...
          class WithoutArgumentCopy (line 5936) | protected static class WithoutArgumentCopy extends WithPreserved...
            method WithoutArgumentCopy (line 5950) | protected WithoutArgumentCopy(TypeDescription instrumentedType,
            method injectStartFrame (line 5964) | public void injectStartFrame(MethodVisitor methodVisitor) {
            method translateFrame (line 5971) | public void translateFrame(MethodVisitor methodVisitor,
          class WithArgumentCopy (line 5992) | protected static class WithArgumentCopy extends WithPreservedArg...
            method WithArgumentCopy (line 6005) | protected WithArgumentCopy(TypeDescription instrumentedType,
            method injectStartFrame (line 6018) | public void injectStartFrame(MethodVisitor methodVisitor) {
            method translateFrame (line 6071) | public void translateFrame(MethodVisitor methodVisitor,
        class ForAdvice (line 6134) | protected class ForAdvice implements StackMapFrameHandler.ForAdvice {
          method ForAdvice (line 6182) | protected ForAdvice(MethodDescription.InDefinedShape adviceMethod,
          method translateFrame (line 6200) | public void translateFrame(MethodVisitor methodVisitor,
          method injectReturnFrame (line 6220) | public void injectReturnFrame(MethodVisitor methodVisitor) {
          method injectExceptionFrame (line 6241) | public void injectExceptionFrame(MethodVisitor methodVisitor) {
          method injectCompletionFrame (line 6252) | public void injectCompletionFrame(MethodVisitor methodVisitor) {
          method injectIntermediateFrame (line 6279) | public void injectIntermediateFrame(MethodVisitor methodVisitor,...
    type ArgumentHandler (line 6321) | public interface ArgumentHandler {
      method argument (line 6334) | int argument(int offset);
      method exit (line 6341) | int exit();
      method enter (line 6348) | int enter();
      method named (line 6356) | int named(String name);
      method returned (line 6363) | int returned();
      method thrown (line 6370) | int thrown();
      type ForInstrumentedMethod (line 6375) | interface ForInstrumentedMethod extends ArgumentHandler {
        method variable (line 6383) | int variable(int index);
        method prepare (line 6391) | int prepare(MethodVisitor methodVisitor);
        method bindEnter (line 6399) | ForAdvice bindEnter(MethodDescription adviceMethod);
        method bindExit (line 6408) | ForAdvice bindExit(MethodDescription adviceMethod, boolean skipThr...
        method isCopyingArguments (line 6415) | boolean isCopyingArguments();
        method getNamedTypes (line 6422) | List<TypeDescription> getNamedTypes();
        class Default (line 6427) | abstract class Default implements ForInstrumentedMethod {
          method Default (line 6457) | protected Default(MethodDescription instrumentedMethod,
          method exit (line 6470) | public int exit() {
          method named (line 6477) | public int named(String name) {
          method enter (line 6486) | public int enter() {
          method returned (line 6495) | public int returned() {
          method thrown (line 6505) | public int thrown() {
          method bindEnter (line 6516) | public ForAdvice bindEnter(MethodDescription adviceMethod) {
          method bindExit (line 6523) | public ForAdvice bindExit(MethodDescription adviceMethod, boolea...
          method getNamedTypes (line 6535) | public List<TypeDescription> getNamedTypes() {
          class Simple (line 6546) | @HashCodeAndEqualsPlugin.Enhance
            method Simple (line 6557) | protected Simple(MethodDescription instrumentedMethod,
            method argument (line 6567) | public int argument(int offset) {
            method variable (line 6576) | public int variable(int index) {
            method isCopyingArguments (line 6585) | public boolean isCopyingArguments() {
            method prepare (line 6592) | public int prepare(MethodVisitor methodVisitor) {
          class Copying (line 6600) | @HashCodeAndEqualsPlugin.Enhance
            method Copying (line 6611) | protected Copying(MethodDescription instrumentedMethod,
            method argument (line 6621) | public int argument(int offset) {
            method variable (line 6632) | public int variable(int index) {
            method isCopyingArguments (line 6644) | public boolean isCopyingArguments() {
            method prepare (line 6651) | public int prepare(MethodVisitor methodVisitor) {
      type ForAdvice (line 6682) | interface ForAdvice extends ArgumentHandler, Advice.ArgumentHandler {
        method mapped (line 6690) | int mapped(int offset);
        class Default (line 6695) | abstract class Default implements ArgumentHandler.ForAdvice {
          method Default (line 6725) | protected Default(MethodDescription instrumentedMethod,
          method argument (line 6738) | public int argument(int offset) {
          method exit (line 6745) | public int exit() {
          method named (line 6752) | public int named(String name) {
          method enter (line 6761) | public int enter() {
          class ForMethodEnter (line 6770) | @HashCodeAndEqualsPlugin.Enhance
            method ForMethodEnter (line 6781) | protected ForMethodEnter(MethodDescription instrumentedMethod,
            method returned (line 6791) | public int returned() {
            method thrown (line 6798) | public int thrown() {
            method mapped (line 6805) | public int mapped(int offset) {
          class ForMethodExit (line 6816) | @HashCodeAndEqualsPlugin.Enhance
            method ForMethodExit (line 6839) | protected ForMethodExit(MethodDescription instrumentedMethod,
            method returned (line 6853) | public int returned() {
            method thrown (line 6863) | public int thrown() {
            method mapped (line 6874) | public int mapped(int offset) {
      type Factory (line 6891) | enum Factory {
        method resolve (line 6897) | @Override
        method resolve (line 6913) | @Override
        method resolve (line 6934) | protected abstract ForInstrumentedMethod resolve(MethodDescription...
    type OffsetMapping (line 6945) | public interface OffsetMapping {
      method resolve (line 6957) | Target resolve(TypeDescription instrumentedType,
      type Target (line 6966) | interface Target {
        method resolveRead (line 6973) | StackManipulation resolveRead();
        method resolveWrite (line 6980) | StackManipulation resolveWrite();
        method resolveIncrement (line 6988) | StackManipulation resolveIncrement(int value);
        class AbstractReadOnlyAdapter (line 6993) | abstract class AbstractReadOnlyAdapter implements Target {
          method resolveWrite (line 6998) | public StackManipulation resolveWrite() {
          method resolveIncrement (line 7005) | public StackManipulation resolveIncrement(int value) {
        class ForDefaultValue (line 7014) | @HashCodeAndEqualsPlugin.Enhance
          method ForDefaultValue (line 7033) | protected ForDefaultValue(TypeDefinition typeDefinition, StackMa...
          method resolveRead (line 7041) | public StackManipulation resolveRead() {
          class ReadOnly (line 7048) | public static class ReadOnly extends ForDefaultValue {
            method ReadOnly (line 7055) | public ReadOnly(TypeDefinition typeDefinition) {
            method ReadOnly (line 7065) | public ReadOnly(TypeDefinition typeDefinition, StackManipulati...
            method resolveWrite (line 7072) | public StackManipulation resolveWrite() {
            method resolveIncrement (line 7079) | public StackManipulation resolveIncrement(int value) {
          class ReadWrite (line 7087) | public static class ReadWrite extends ForDefaultValue {
            method ReadWrite (line 7094) | public ReadWrite(TypeDefinition typeDefinition) {
            method ReadWrite (line 7104) | public ReadWrite(TypeDefinition typeDefinition, StackManipulat...
            method resolveWrite (line 7111) | public StackManipulation resolveWrite() {
            method resolveIncrement (line 7118) | public StackManipulation resolveIncrement(int value) {
        class ForVariable (line 7127) | @HashCodeAndEqualsPlugin.Enhance
          method ForVariable (line 7152) | protected ForVariable(TypeDefinition typeDefinition, int offset,...
          method resolveRead (line 7161) | public StackManipulation resolveRead() {
          class ReadOnly (line 7168) | public static class ReadOnly extends ForVariable {
            method ReadOnly (line 7176) | public ReadOnly(TypeDefinition typeDefinition, int offset) {
            method ReadOnly (line 7187) | public ReadOnly(TypeDefinition typeDefinition, int offset, Sta...
            method resolveWrite (line 7194) | public StackManipulation resolveWrite() {
            method resolveIncrement (line 7201) | public StackManipulation resolveIncrement(int value) {
          class ReadWrite (line 7209) | @HashCodeAndEqualsPlugin.Enhance
            method ReadWrite (line 7223) | public ReadWrite(TypeDefinition typeDefinition, int offset) {
            method ReadWrite (line 7235) | public ReadWrite(TypeDefinition typeDefinition, int offset, St...
            method resolveWrite (line 7243) | public StackManipulation resolveWrite() {
            method resolveIncrement (line 7250) | public StackManipulation resolveIncrement(int value) {
        class ForArray (line 7261) | @HashCodeAndEqualsPlugin.Enhance
          method ForArray (line 7280) | protected ForArray(TypeDescription.Generic target, List<? extend...
          method resolveRead (line 7288) | public StackManipulation resolveRead() {
          method resolveIncrement (line 7295) | public StackManipulation resolveIncrement(int value) {
          class ReadOnly (line 7302) | public static class ReadOnly extends ForArray {
            method ReadOnly (line 7310) | public ReadOnly(TypeDescription.Generic target, List<? extends...
            method resolveWrite (line 7317) | public StackManipulation resolveWrite() {
          class ReadWrite (line 7325) | @HashCodeAndEqualsPlugin.Enhance
            method ReadWrite (line 7340) | public ReadWrite(TypeDescription.Generic target,
            method resolveWrite (line 7350) | public StackManipulation resolveWrite() {
        class ForField (line 7359) | @HashCodeAndEqualsPlugin.Enhance
          method ForField (line 7378) | protected ForField(FieldDescription fieldDescription, StackManip...
          method resolveRead (line 7386) | public StackManipulation resolveRead() {
          class ReadOnly (line 7395) | public static class ReadOnly extends ForField {
            method ReadOnly (line 7402) | public ReadOnly(FieldDescription fieldDescription) {
            method ReadOnly (line 7412) | public ReadOnly(FieldDescription fieldDescription, StackManipu...
            method resolveWrite (line 7419) | public StackManipulation resolveWrite() {
            method resolveIncrement (line 7426) | public StackManipulation resolveIncrement(int value) {
          class ReadWrite (line 7434) | @HashCodeAndEqualsPlugin.Enhance
            method ReadWrite (line 7447) | public ReadWrite(FieldDescription fieldDescription) {
            method ReadWrite (line 7458) | public ReadWrite(FieldDescription fieldDescription,
            method resolveWrite (line 7467) | public StackManipulation resolveWrite() {
            method resolveIncrement (line 7484) | public StackManipulation resolveIncrement(int value) {
        class ForStackManipulation (line 7498) | @HashCodeAndEqualsPlugin.Enhance
          method ForStackManipulation (line 7511) | public ForStackManipulation(StackManipulation stackManipulation) {
          method of (line 7521) | public static Target of(MethodDescription.InDefinedShape methodD...
          method of (line 7531) | public static Target of(TypeDescription typeDescription) {
          method of (line 7541) | public static Target of(Object value) {
          method resolveRead (line 7585) | public StackManipulation resolveRead() {
          method resolveWrite (line 7592) | public StackManipulation resolveWrite() {
          method resolveIncrement (line 7599) | public StackManipulation resolveIncrement(int value) {
          class Writable (line 7606) | @HashCodeAndEqualsPlugin.Enhance
            method Writable (line 7625) | public Writable(StackManipulation read, StackManipulation writ...
            method resolveRead (line 7633) | public StackManipulation resolveRead() {
            method resolveWrite (line 7640) | public StackManipulation resolveWrite() {
            method resolveIncrement (line 7647) | public StackManipulation resolveIncrement(int value) {
      type Factory (line 7659) | interface Factory<T extends Annotation> {
        method getAnnotationType (line 7666) | Class<T> getAnnotationType();
        method make (line 7676) | OffsetMapping make(ParameterDescription.InDefinedShape target,
        type AdviceType (line 7682) | enum AdviceType {
          method AdviceType (line 7704) | AdviceType(boolean delegation) {
          method isDelegation (line 7713) | public boolean isDelegation() {
        class Simple (line 7723) | @HashCodeAndEqualsPlugin.Enhance
          method Simple (line 7742) | public Simple(Class<T> annotationType, OffsetMapping offsetMappi...
          method getAnnotationType (line 7750) | public Class<T> getAnnotationType() {
          method make (line 7757) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
        class Illegal (line 7768) | @HashCodeAndEqualsPlugin.Enhance
          method Illegal (line 7781) | public Illegal(Class<T> annotationType) {
          method getAnnotationType (line 7788) | public Class<T> getAnnotationType() {
          method make (line 7795) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
      type Sort (line 7804) | enum Sort {
        method isPremature (line 7810) | @Override
        method isPremature (line 7820) | @Override
        method isPremature (line 7833) | public abstract boolean isPremature(MethodDescription methodDescri...
      class ForArgument (line 7839) | @HashCodeAndEqualsPlugin.Enhance
        method ForArgument (line 7864) | protected ForArgument(TypeDescription.Generic target, boolean read...
        method resolve (line 7873) | public Target resolve(TypeDescription instrumentedType,
        method resolve (line 7899) | protected abstract ParameterDescription resolve(MethodDescription ...
        class Unresolved (line 7904) | @HashCodeAndEqualsPlugin.Enhance
          method Unresolved (line 7923) | protected Unresolved(TypeDescription.Generic target, AnnotationD...
          method Unresolved (line 7936) | protected Unresolved(ParameterDescription parameterDescription) {
          method Unresolved (line 7949) | public Unresolved(TypeDescription.Generic target,
          method Unresolved (line 7963) | public Unresolved(TypeDescription.Generic target,
          method resolve (line 7970) | @Override
          method resolve (line 7983) | @Override
          type Factory (line 8000) | protected enum Factory implements OffsetMapping.Factory<Argument> {
            method getAnnotationType (line 8042) | public Class<Argument> getAnnotationType() {
            method make (line 8049) | public OffsetMapping make(ParameterDescription.InDefinedShape ...
        class Resolved (line 8066) | @HashCodeAndEqualsPlugin.Enhance
          method Resolved (line 8082) | public Resolved(TypeDescription.Generic target, boolean readOnly...
          method resolve (line 8087) | @Override
          class Factory (line 8100) | @HashCodeAndEqualsPlugin.Enhance
            method Factory (line 8129) | public Factory(Class<T> annotationType, ParameterDescription p...
            method Factory (line 8141) | public Factory(Class<T> annotationType, ParameterDescription p...
            method getAnnotationType (line 8152) | public Class<T> getAnnotationType() {
            method make (line 8159) | public OffsetMapping make(ParameterDescription.InDefinedShape ...
      class ForThisReference (line 8171) | @HashCodeAndEqualsPlugin.Enhance
        method ForThisReference (line 8200) | protected ForThisReference(TypeDescription.Generic target, Annotat...
        method ForThisReference (line 8215) | public ForThisReference(TypeDescription.Generic target,
        method resolve (line 8226) | public Target resolve(TypeDescription instrumentedType,
        type Factory (line 8260) | protected enum Factory implements OffsetMapping.Factory<This> {
          method getAnnotationType (line 8295) | public Class<This> getAnnotationType() {
          method make (line 8302) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
      class ForAllArguments (line 8317) | @HashCodeAndEqualsPlugin.Enhance
        method ForAllArguments (line 8347) | protected ForAllArguments(TypeDescription.Generic target,
        method ForAllArguments (line 8364) | public ForAllArguments(TypeDescription.Generic target, boolean rea...
        method resolve (line 8374) | public Target resolve(TypeDescription instrumentedType,
        type Factory (line 8413) | protected enum Factory implements OffsetMapping.Factory<AllArgumen...
          method getAnnotationType (line 8448) | public Class<AllArguments> getAnnotationType() {
          method make (line 8455) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
      type ForInstrumentedType (line 8474) | enum ForInstrumentedType implements OffsetMapping {
        method resolve (line 8484) | public Target resolve(TypeDescription instrumentedType,
      type ForInstrumentedMethod (line 8496) | enum ForInstrumentedMethod implements OffsetMapping {
        method isRepresentable (line 8502) | @Override
        method isRepresentable (line 8512) | @Override
        method isRepresentable (line 8522) | @Override
        method resolve (line 8531) | public Target resolve(TypeDescription instrumentedType,
        method isRepresentable (line 8548) | protected abstract boolean isRepresentable(MethodDescription instr...
      class ForField (line 8554) | @HashCodeAndEqualsPlugin.Enhance
        method ForField (line 8611) | public ForField(TypeDescription.Generic target, boolean readOnly, ...
        method resolve (line 8620) | public Target resolve(TypeDescription instrumentedType,
        method resolve (line 8652) | protected abstract FieldDescription resolve(TypeDescription instru...
        class Unresolved (line 8657) | @HashCodeAndEqualsPlugin.Enhance
          method Unresolved (line 8678) | public Unresolved(TypeDescription.Generic target, boolean readOn...
          method resolve (line 8683) | @Override
          method resolveAccessor (line 8703) | private static FieldLocator.Resolution resolveAccessor(FieldLoca...
          method fieldLocator (line 8721) | protected abstract FieldLocator fieldLocator(TypeDescription ins...
          class WithImplicitType (line 8726) | public static class WithImplicitType extends Unresolved {
            method WithImplicitType (line 8734) | protected WithImplicitType(TypeDescription.Generic target, Ann...
            method WithImplicitType (line 8749) | public WithImplicitType(TypeDescription.Generic target, boolea...
            method fieldLocator (line 8753) | @Override
          class WithExplicitType (line 8762) | @HashCodeAndEqualsPlugin.Enhance
            method WithExplicitType (line 8777) | protected WithExplicitType(TypeDescription.Generic target,
            method WithExplicitType (line 8796) | public WithExplicitType(TypeDescription.Generic target,
            method fieldLocator (line 8805) | @Override
          type Factory (line 8817) | protected enum Factory implements OffsetMapping.Factory<FieldVal...
            method getAnnotationType (line 8827) | public Class<FieldValue> getAnnotationType() {
            method make (line 8834) | public OffsetMapping make(ParameterDescription.InDefinedShape ...
        class Resolved (line 8852) | @HashCodeAndEqualsPlugin.Enhance
          method Resolved (line 8868) | public Resolved(TypeDescription.Generic target, boolean readOnly...
          method resolve (line 8873) | @Override
          class Factory (line 8888) | @HashCodeAndEqualsPlugin.Enhance
            method Factory (line 8917) | public Factory(Class<T> annotationType, FieldDescription field...
            method Factory (line 8929) | public Factory(Class<T> annotationType, FieldDescription field...
            method getAnnotationType (line 8939) | public Class<T> getAnnotationType() {
            method make (line 8946) | public OffsetMapping make(ParameterDescription.InDefinedShape ...
      class ForOrigin (line 8958) | @HashCodeAndEqualsPlugin.Enhance
        method ForOrigin (line 8981) | public ForOrigin(List<Renderer> renderers) {
        method parse (line 8991) | public static OffsetMapping parse(String pattern) {
        method resolve (line 9038) | public Target resolve(TypeDescription instrumentedType,
        type Renderer (line 9053) | public interface Renderer {
          method apply (line 9062) | String apply(TypeDescription instrumentedType, MethodDescription...
          type ForMethodName (line 9067) | enum ForMethodName implements Renderer {
            method apply (line 9082) | public String apply(TypeDescription instrumentedType, MethodDe...
          type ForTypeName (line 9090) | enum ForTypeName implements Renderer {
            method apply (line 9105) | public String apply(TypeDescription instrumentedType, MethodDe...
          type ForDescriptor (line 9113) | enum ForDescriptor implements Renderer {
            method apply (line 9128) | public String apply(TypeDescription instrumentedType, MethodDe...
          type ForJavaSignature (line 9136) | enum ForJavaSignature implements Renderer {
            method apply (line 9151) | public String apply(TypeDescription instrumentedType, MethodDe...
          type ForReturnTypeName (line 9169) | enum ForReturnTypeName implements Renderer {
            method apply (line 9184) | public String apply(TypeDescription instrumentedType, MethodDe...
          type ForStringRepresentation (line 9192) | enum ForStringRepresentation implements Renderer {
            method apply (line 9202) | public String apply(TypeDescription instrumentedType, MethodDe...
          class ForConstantValue (line 9210) | @HashCodeAndEqualsPlugin.Enhance
            method ForConstantValue (line 9223) | public ForConstantValue(String value) {
            method apply (line 9230) | public String apply(TypeDescription instrumentedType, MethodDe...
          type ForPropertyName (line 9238) | enum ForPropertyName implements Renderer {
            method apply (line 9253) | public String apply(TypeDescription instrumentedType, MethodDe...
        type Factory (line 9262) | protected enum Factory implements OffsetMapping.Factory<Origin> {
          method getAnnotationType (line 9280) | public Class<Origin> getAnnotationType() {
          method make (line 9287) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
      class ForUnusedValue (line 9310) | @HashCodeAndEqualsPlugin.Enhance
        method ForUnusedValue (line 9323) | public ForUnusedValue(TypeDefinition target) {
        method resolve (line 9330) | public Target resolve(TypeDescription instrumentedType,
        type Factory (line 9341) | protected enum Factory implements OffsetMapping.Factory<Unused> {
          method getAnnotationType (line 9351) | public Class<Unused> getAnnotationType() {
          method make (line 9358) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
      type ForStubValue (line 9370) | enum ForStubValue implements OffsetMapping, Factory<StubValue> {
        method resolve (line 9380) | public Target resolve(TypeDescription instrumentedType,
        method getAnnotationType (line 9393) | public Class<StubValue> getAnnotationType() {
        method make (line 9400) | public OffsetMapping make(ParameterDescription.InDefinedShape target,
      class ForEnterValue (line 9414) | @HashCodeAndEqualsPlugin.Enhance
        method ForEnterValue (line 9444) | protected ForEnterValue(TypeDescription.Generic target, TypeDescri...
        method ForEnterValue (line 9459) | public ForEnterValue(TypeDescription.Generic target, TypeDescripti...
        method resolve (line 9469) | public Target resolve(TypeDescription instrumentedType,
        class Factory (line 9491) | @HashCodeAndEqualsPlugin.Enhance
          method Factory (line 9523) | protected Factory(TypeDefinition enterType) {
          method of (line 9533) | protected static OffsetMapping.Factory<Enter> of(TypeDefinition ...
          method getAnnotationType (line 9542) | public Class<Enter> getAnnotationType() {
          method make (line 9549) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
      class ForExitValue (line 9564) | @HashCodeAndEqualsPlugin.Enhance
        method ForExitValue (line 9594) | protected ForExitValue(TypeDescription.Generic target, TypeDescrip...
        method ForExitValue (line 9609) | public ForExitValue(TypeDescription.Generic target, TypeDescriptio...
        method resolve (line 9619) | public Target resolve(TypeDescription instrumentedType,
        class Factory (line 9641) | @HashCodeAndEqualsPlugin.Enhance
          method Factory (line 9673) | protected Factory(TypeDefinition exitType) {
          method of (line 9683) | protected static OffsetMapping.Factory<Exit> of(TypeDefinition t...
          method getAnnotationType (line 9692) | public Class<Exit> getAnnotationType() {
          method make (line 9699) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
      class ForLocalValue (line 9714) | @HashCodeAndEqualsPlugin.Enhance
        method ForLocalValue (line 9739) | public ForLocalValue(TypeDescription.Generic target, TypeDescripti...
        method resolve (line 9748) | public Target resolve(TypeDescription instrumentedType,
        class Factory (line 9765) | @HashCodeAndEqualsPlugin.Enhance
          method Factory (line 9786) | protected Factory(Map<String, TypeDefinition> namedTypes) {
          method getAnnotationType (line 9793) | public Class<Local> getAnnotationType() {
          method make (line 9800) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
      class ForReturnValue (line 9816) | @HashCodeAndEqualsPlugin.Enhance
        method ForReturnValue (line 9840) | protected ForReturnValue(TypeDescription.Generic target, Annotatio...
        method ForReturnValue (line 9853) | public ForReturnValue(TypeDescription.Generic target, boolean read...
        method resolve (line 9862) | public Target resolve(TypeDescription instrumentedType,
        type Factory (line 9888) | protected enum Factory implements OffsetMapping.Factory<Return> {
          method getAnnotationType (line 9917) | public Class<Return> getAnnotationType() {
          method make (line 9924) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
      class ForThrowable (line 9939) | @HashCodeAndEqualsPlugin.Enhance
        method ForThrowable (line 9963) | protected ForThrowable(TypeDescription.Generic target, AnnotationD...
        method ForThrowable (line 9976) | public ForThrowable(TypeDescription.Generic target, boolean readOn...
        method resolve (line 9985) | public Target resolve(TypeDescription instrumentedType,
        type Factory (line 10007) | protected enum Factory implements OffsetMapping.Factory<Thrown> {
          method of (line 10039) | @SuppressWarnings("unchecked") // In absence of @SafeVarargs
          method getAnnotationType (line 10051) | public Class<Thrown> getAnnotationType() {
          method make (line 10058) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
      class ForStackManipulation (line 10073) | @HashCodeAndEqualsPlugin.Enhance
        method ForStackManipulation (line 10104) | public ForStackManipulation(StackManipulation stackManipulation,
        method resolve (line 10117) | public Target resolve(TypeDescription instrumentedType,
        method with (line 10129) | public ForStackManipulation with(StackManipulation stackManipulati...
        method getStackManipulation (line 10133) | public StackManipulation getStackManipulation() {
        class Factory (line 10142) | @HashCodeAndEqualsPlugin.Enhance
          method Factory (line 10166) | public Factory(Class<T> annotationType, TypeDescription typeDesc...
          method Factory (line 10176) | public Factory(Class<T> annotationType, EnumerationDescription e...
          method Factory (line 10187) | public Factory(Class<T> annotationType, StackManipulation stackM...
          method of (line 10201) | public static <S extends Annotation> OffsetMapping.Factory<S> of...
          method getAnnotationType (line 10265) | public Class<T> getAnnotationType() {
          method make (line 10272) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
        class OfDefaultValue (line 10284) | @HashCodeAndEqualsPlugin.Enhance
          method OfDefaultValue (line 10297) | public OfDefaultValue(Class<T> annotationType) {
          method getAnnotationType (line 10304) | public Class<T> getAnnotationType() {
          method make (line 10311) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
        class OfAnnotationProperty (line 10321) | @HashCodeAndEqualsPlugin.Enhance
          method OfAnnotationProperty (line 10340) | protected OfAnnotationProperty(Class<T> annotationType, MethodDe...
          method of (line 10353) | public static <S extends Annotation> OffsetMapping.Factory<S> of...
          method getAnnotationType (line 10367) | public Class<T> getAnnotationType() {
          method make (line 10374) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
        class OfDynamicInvocation (line 10395) | @HashCodeAndEqualsPlugin.Enhance
          method OfDynamicInvocation (line 10420) | public OfDynamicInvocation(Class<T> annotationType,
          method getAnnotationType (line 10431) | public Class<T> getAnnotationType() {
          method make (line 10438) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
      class ForSerializedValue (line 10461) | @HashCodeAndEqualsPlugin.Enhance
        method ForSerializedValue (line 10486) | public ForSerializedValue(TypeDescription.Generic target, TypeDesc...
        method resolve (line 10495) | public Target resolve(TypeDescription instrumentedType,
        class Factory (line 10512) | @HashCodeAndEqualsPlugin.Enhance
          method Factory (line 10537) | protected Factory(Class<T> annotationType,
          method of (line 10553) | public static <S extends Annotation> OffsetMapping.Factory<S> of...
          method getAnnotationType (line 10566) | public Class<T> getAnnotationType() {
          method make (line 10573) | public OffsetMapping make(ParameterDescription.InDefinedShape ta...
    class NoExceptionHandler (line 10658) | public static class NoExceptionHandler extends Throwable {
      method NoExceptionHandler (line 10673) | private NoExceptionHandler() {

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/transformer/advice/AgentForAdvice.java
  class AgentForAdvice (line 38) | @SuppressWarnings("unused")
    method AgentForAdvice (line 75) | public AgentForAdvice() {
    method AgentForAdvice (line 79) | public AgentForAdvice(AgentAdvice.WithCustomMapping advice) {
    method AgentForAdvice (line 89) | protected AgentForAdvice(AgentAdvice.WithCustomMapping advice,
    method include (line 112) | @Override
    method include (line 128) | @Override
    method include (line 140) | @Override
    method advice (line 158) | @Override
    method advice (line 170) | @Override
    method transform (line 181) | @Override
    class Entry (line 200) | @HashCodeAndEqualsPlugin.Enhance
      method Entry (line 212) | protected Entry(LatentMatcher<? super MethodDescription> matcher) {
      method getMatcher (line 221) | protected LatentMatcher<? super MethodDescription> getMatcher() {
      method resolve (line 233) | protected abstract AgentAdvice resolve(AgentAdvice.WithCustomMapping...
    class ForUnifiedAdvice (line 237) | @HashCodeAndEqualsPlugin.Enhance
      method ForUnifiedAdvice (line 250) | protected ForUnifiedAdvice(LatentMatcher<? super MethodDescription> ...
      method resolve (line 255) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/transformer/advice/AgentJavaConstantValue.java
  class AgentJavaConstantValue (line 25) | public class AgentJavaConstantValue extends JavaConstantValue {
    method AgentJavaConstantValue (line 34) | public AgentJavaConstantValue(MethodIdentityJavaConstant constant, int...
    method apply (line 43) | @Override
    method getConstant (line 50) | public MethodIdentityJavaConstant getConstant() {
    method getPointcutIndex (line 54) | public int getPointcutIndex() {

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/transformer/advice/BypassMethodVisitor.java
  class BypassMethodVisitor (line 26) | public class BypassMethodVisitor extends MethodVisitor {
    method BypassMethodVisitor (line 27) | public BypassMethodVisitor(MethodVisitor visitor, Map<Integer, OffsetM...

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/transformer/advice/MethodIdentityJavaConstant.java
  class MethodIdentityJavaConstant (line 24) | @Data
    method MethodIdentityJavaConstant (line 28) | public MethodIdentityJavaConstant(int value) {
    method toDescription (line 32) | @Override
    method getTypeDescription (line 37) | @Override
    method accept (line 42) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/plugin/transformer/classloader/CompoundClassloader.java
  class CompoundClassloader (line 26) | public class CompoundClassloader {
    method checkClassloaderExist (line 31) | public static boolean checkClassloaderExist(ClassLoader loader) {
    method compound (line 39) | public static ClassLoader compound(ClassLoader parent, ClassLoader ext...

FILE: core/src/main/java/com/megaease/easeagent/core/utils/AgentArray.java
  class AgentArray (line 30) | @AutoService(AppendBootstrapLoader.class)
    method AgentArray (line 38) | public AgentArray() {
    method AgentArray (line 42) | public AgentArray(int capacity) {
    method size (line 49) | public int size() {
    method toArray (line 53) | public Object[] toArray() {
    method add (line 57) | public int add(E element) {
    method get (line 68) | public E get(int index) {
    method getUncheck (line 75) | public E getUncheck(int index) {
    method putIfAbsent (line 84) | public E putIfAbsent(int index, E element) {
    method replace (line 116) | public E replace(int index, E element) {
    method indexOf (line 131) | public int indexOf(Object o) {
    method contains (line 153) | public boolean contains(Object o) {
    method spliterator (line 157) | public Spliterator<E> spliterator() {
    method forEach (line 161) | public void forEach(Consumer<? super E> action) {
    method grow (line 178) | private synchronized void grow(int minCapacity) {
    method hugeCapacity (line 192) | private static int hugeCapacity(int minCapacity) {
    method ensureCapacity (line 209) | private void ensureCapacity(int minCapacity) {
    method outOfBoundsMsg (line 215) | private String outOfBoundsMsg(int index) {

FILE: core/src/main/java/com/megaease/easeagent/core/utils/ContextUtils.java
  class ContextUtils (line 28) | @AutoService(AppendBootstrapLoader.class)
    method ContextUtils (line 31) | private ContextUtils() {
    method setBeginTime (line 37) | private static void setBeginTime(Map<Object, Object> context) {
    method setEndTime (line 41) | public static void setEndTime(Map<Object, Object> context) {
    method getBeginTime (line 45) | public static Long getBeginTime(Map<Object, Object> context) {
    method getEndTime (line 49) | public static Long getEndTime(Map<Object, Object> context) {
    method getDuration (line 58) | public static long getDuration(Map<Object, Object> context) {
    method setBeginTime (line 62) | public static void setBeginTime(Context context) {
    method setEndTime (line 66) | public static void setEndTime(Context context) {
    method getBeginTime (line 70) | public static Long getBeginTime(Context context) {
    method getEndTime (line 74) | public static Long getEndTime(Context context) {
    method createContext (line 83) | public static Map<Object, Object> createContext() {
    method getFromContext (line 97) | @SuppressWarnings("unchecked")

FILE: core/src/main/java/com/megaease/easeagent/core/utils/JsonUtil.java
  class JsonUtil (line 30) | public class JsonUtil {
    method JsonUtil (line 32) | private JsonUtil() {
    method toJson (line 43) | public static String toJson(Object obj) {
    method toMap (line 52) | @SuppressWarnings("unchecked")
    method toObject (line 61) | public static <T> T toObject(String json, TypeReference<T> valueTypeRe...

FILE: core/src/main/java/com/megaease/easeagent/core/utils/MutableObject.java
  type MutableObject (line 20) | public interface MutableObject<T> {
    method wrap (line 22) | static <S> MutableObject<S> wrap(S object) {
    method nullMutableObject (line 26) | static <S> MutableObject<S> nullMutableObject() {
    method getValue (line 30) | T getValue();
    method setValue (line 32) | void setValue(T t);
    class DefaultMutableObject (line 34) | class DefaultMutableObject<T> implements MutableObject<T> {
      method DefaultMutableObject (line 37) | protected DefaultMutableObject(T t) {
      method getValue (line 41) | public T getValue() {
      method setValue (line 45) | public void setValue(T value) {
      method equals (line 61) | @Override
      method hashCode (line 81) | @Override
      method toString (line 92) | @Override

FILE: core/src/main/java/com/megaease/easeagent/core/utils/ServletUtils.java
  class ServletUtils (line 26) | public class ServletUtils {
    method ServletUtils (line 30) | private ServletUtils() {
    method getHttpRouteAttributeFromRequest (line 35) | public static String getHttpRouteAttributeFromRequest(HttpServletReque...
    method getRemoteHost (line 40) | public static String getRemoteHost(HttpServletRequest request) {
    method getHeaders (line 57) | public static Map<String, String> getHeaders(HttpServletRequest httpSe...
    method getQueries (line 68) | @SneakyThrows
    method getQueries4SingleValue (line 88) | public static Map<String, String> getQueries4SingleValue(HttpServletRe...

FILE: core/src/main/java/com/megaease/easeagent/core/utils/TextUtils.java
  class TextUtils (line 24) | public class TextUtils {
    method TextUtils (line 26) | private TextUtils() {
    method cutStrByDataSize (line 29) | public static String cutStrByDataSize(String str, DataSize size) {
    method hasText (line 43) | public static boolean hasText(String val) {

FILE: core/src/test/java/com/megaease/easeagent/core/AppendBootstrapClassLoaderSearchTest.java
  class AppendBootstrapClassLoaderSearchTest (line 30) | public class AppendBootstrapClassLoaderSearchTest {
    method should_inject_classes (line 31) | @Test

FILE: core/src/test/java/com/megaease/easeagent/core/BootstrapTest.java
  class BootstrapTest (line 40) | public class BootstrapTest {
    method beforeClass (line 47) | @BeforeClass
    method afterClass (line 53) | @AfterClass
    method should_work (line 59) | @Test
    method getUpdateConfigsOperationInfo (line 89) | @SneakyThrows
    method mxBeanSetConfigs (line 112) | @SneakyThrows
    method mxBeanGetConfigs (line 119) | @SneakyThrows

FILE: core/src/test/java/com/megaease/easeagent/core/HttpServerTest.java
  class HttpServerTest (line 50) | public class HttpServerTest {
    method before (line 54) | @BeforeClass
    method after (line 60) | @AfterClass
    method setWrappedConfigManager (line 67) | private static void setWrappedConfigManager(WrappedConfigManager wrapp...
    method runUpHttpServer (line 71) | private static String runUpHttpServer() throws Exception {
    method getPort (line 76) | private static int getPort() throws IOException {
    method isPortUsing (line 87) | private static boolean isPortUsing(int port) throws UnknownHostExcepti...
    method runUpHttpServer (line 107) | private static String runUpHttpServer(int port) {
    method httpServer (line 119) | @Test
    method get (line 197) | static String get(String urlStr) throws IOException {
    method post (line 211) | static String post(String urlStr, String body) throws IOException {
    class PluginConfigChange (line 234) | static class PluginConfigChange implements PluginConfigChangeListener {
      method PluginConfigChange (line 238) | public PluginConfigChange(AtomicInteger count, String name) {
      method onChange (line 243) | @Override
      method printConfig (line 255) | public void printConfig(IPluginConfig config) {

FILE: core/src/test/java/com/megaease/easeagent/core/info/AgentInfoFactoryTest.java
  class AgentInfoFactoryTest (line 27) | public class AgentInfoFactoryTest {
    method loadAgentInfo (line 29) | @Test

FILE: core/src/test/java/com/megaease/easeagent/core/instrument/ClinitMethodTransformTest.java
  class ClinitMethodTransformTest (line 55) | @SuppressWarnings("all")
    method setUp (line 66) | @BeforeClass
    method testTypeInitialAdviceTransformer (line 86) | public void testTypeInitialAdviceTransformer() throws Exception {
    class Foo (line 112) | @SuppressWarnings("unused")
      method fooStatic (line 116) | public static String fooStatic(String a) {
      method foo (line 120) | public String foo(String a) {
    class FooClassInitInterceptor (line 125) | public static class FooClassInitInterceptor implements Interceptor {
      method before (line 126) | @Override
      method after (line 131) | @Override
      method order (line 136) | @Override
    class FooClsInitProvider (line 142) | static class FooClsInitProvider implements InterceptorProvider {
      method getInterceptorProvider (line 143) | @Override
      method getAdviceTo (line 148) | @Override
      method getPluginClassName (line 153) | @Override

FILE: core/src/test/java/com/megaease/easeagent/core/instrument/NewInstanceMethodTransformTest.java
  class NewInstanceMethodTransformTest (line 54) | public class NewInstanceMethodTransformTest extends TransformTestBase {
    method setUp (line 62) | @BeforeClass
    method testClassInstanceTransformer (line 78) | @Test
    class Foo (line 126) | @SuppressWarnings("unused")
      method fooStatic (line 132) | public static String fooStatic(String a) {
      method Foo (line 136) | public Foo(String a) {
      method Foo (line 141) | public Foo(CharSequence a) {
      method Foo (line 146) | public Foo(String a, String b) {
      method getInstanceT (line 151) | public String getInstanceT() {
      method foo (line 155) | public String foo(String a) {
      method baz (line 159) | public int baz() {
    type FooInterface (line 164) | public interface FooInterface {
      method foo (line 165) | String foo(String a);
    class FooBase (line 168) | public static class FooBase implements FooInterface {
      method foo (line 169) | public String foo(String a) {

FILE: core/src/test/java/com/megaease/easeagent/core/instrument/NonStaticMethodTransformTest.java
  class NonStaticMethodTransformTest (line 52) | @SuppressWarnings("unused")
    method setUp (line 61) | @BeforeClass
    method testAdviceTransformer (line 76) | @Test
    class Foo (line 106) | @SuppressWarnings("unused")
      method fooStatic (line 112) | public static String fooStatic(String a) {
      method Foo (line 116) | public Foo(String a) {
      method getInstanceT (line 121) | public String getInstanceT() {
      method foo (line 125) | public String foo(String a) {
      method baz (line 129) | public int baz() {
    type FooInterface (line 134) | public interface FooInterface {
      method foo (line 135) | String foo(String a);
    class FooBase (line 138) | public static class FooBase implements FooInterface {
      method foo (line 139) | public String foo(String a) {

FILE: core/src/test/java/com/megaease/easeagent/core/instrument/OrchestrationTransformTest.java
  class OrchestrationTransformTest (line 52) | @SuppressWarnings("unused")
    method setUp (line 61) | @BeforeClass
    method testOrchestration (line 76) | @Test
    class Foo (line 111) | @SuppressWarnings("unused")
      method fooStatic (line 115) | public static String fooStatic(String a) {
      method foo (line 119) | public String foo(String a) {
      method baz (line 123) | public int baz() {
    type FooInterface (line 128) | public interface FooInterface {
      method foo (line 129) | String foo(String a);
    class FooBase (line 132) | public static class FooBase implements FooInterface {
      method foo (line 133) | public String foo(String a) {

FILE: core/src/test/java/com/megaease/easeagent/core/instrument/StaticMethodTransformTest.java
  class StaticMethodTransformTest (line 55) | public class StaticMethodTransformTest extends TransformTestBase {
    method setUp (line 63) | @BeforeClass
    method testStaticAdviceTransformer (line 78) | @Test
    method testTypeInitialAdviceTransformer (line 106) | @Test
    class Foo (line 132) | @SuppressWarnings("unused")
      method fooStatic (line 136) | public static String fooStatic(String a) {
      method foo (line 140) | public String foo(String a) {
    class FooClassInitInterceptor (line 145) | public static class FooClassInitInterceptor implements Interceptor {
      method before (line 146) | @Override
      method after (line 150) | @Override
      method order (line 155) | @Override
    class FooClsInitProvider (line 161) | static class FooClsInitProvider implements InterceptorProvider {
      method getInterceptorProvider (line 162) | @Override
      method getAdviceTo (line 167) | @Override
      method getPluginClassName (line 172) | @Override

FILE: core/src/test/java/com/megaease/easeagent/core/instrument/TestContext.java
  class TestContext (line 22) | public class TestContext extends NoOpContext.NoopContext {
    method isNoop (line 23) | @Override

FILE: core/src/test/java/com/megaease/easeagent/core/instrument/TestPlugin.java
  class TestPlugin (line 22) | public class TestPlugin implements AgentPlugin {
    method getNamespace (line 23) | @Override
    method getDomain (line 28) | @Override

FILE: core/src/test/java/com/megaease/easeagent/core/instrument/TransformTestBase.java
  class TransformTestBase (line 37) | public class TransformTestBase {
    method getMethodTransformations (line 44) | @SuppressWarnings("all")
    method getMethodTransformations (line 52) | @SuppressWarnings("all")
    class FooInstInterceptor (line 70) | public static class FooInstInterceptor implements Interceptor {
      method before (line 71) | @Override
      method after (line 78) | @Override
      method order (line 82) | @Override
    class FooInterceptor (line 88) | public static class FooInterceptor implements Interceptor {
      method before (line 89) | @Override
      method after (line 96) | @Override
      method order (line 101) | @Override
    class FooSecondInterceptor (line 107) | public static class FooSecondInterceptor implements Interceptor {
      method before (line 108) | @Override
      method after (line 115) | @Override
      method order (line 120) | @Override
    class FooProvider (line 126) | static class FooProvider implements InterceptorProvider {
      method getInterceptorProvider (line 127) | @Override
      method getAdviceTo (line 132) | @Override
      method getPluginClassName (line 137) | @Override
    class FooInstProvider (line 143) | static class FooInstProvider implements InterceptorProvider {
      method getInterceptorProvider (line 144) | @Override
      method getAdviceTo (line 149) | @Override
      method getPluginClassName (line 154) | @Override
    class FooSecProvider (line 160) | static class FooSecProvider implements InterceptorProvider {
      method getInterceptorProvider (line 161) | @Override
      method getAdviceTo (line 166) | @Override
      method getPluginClassName (line 171) | @Override

FILE: core/src/test/java/com/megaease/easeagent/core/matcher/ClassLoaderMatcherTest.java
  class ClassLoaderMatcherTest (line 30) | public class ClassLoaderMatcherTest {
    method test_convert (line 31) | @Test
    class TestClassLoader (line 64) | static class TestClassLoader extends URLClassLoader {
      method TestClassLoader (line 65) | public TestClassLoader(URL[] urls) {

FILE: core/src/test/java/com/megaease/easeagent/core/matcher/ClassMatcherTest.java
  class ClassMatcherTest (line 29) | public class ClassMatcherTest {
    class TestBaseClass (line 30) | public static class TestBaseClass {
    type TestInterface (line 33) | public interface TestInterface {
    type TestInterface2 (line 36) | public interface TestInterface2 extends TestInterface {
    class TestClass (line 39) | @Index
    class TestClass2 (line 43) | public static class TestClass2 extends TestBaseClass implements TestIn...
    method testMatch (line 46) | @Test

FILE: core/src/test/java/com/megaease/easeagent/core/matcher/MethodMatcherTest.java
  class MethodMatcherTest (line 33) | public class MethodMatcherTest {
    type FooInterface (line 34) | @SuppressWarnings("unused")
      method basicPublish (line 36) | void basicPublish(int a1, int a2, int a3, int a4);
    class Foo (line 39) | @SuppressWarnings("unused")
      method basicPublish (line 41) | @Override
      method basicPublish (line 46) | public String basicPublish(int a2, int a3, int a4) {
      method basicConsume (line 50) | void basicConsume(int a1, int a2, int a3, int a4) {
      method basicConsume (line 54) | int basicConsume(char a1, int a2, int a3, int a4) {
    method named (line 60) | private IClassMatcher named(String name) {
    method testIsOverriddenFrom (line 65) | @Test
    method testMatcher (line 89) | @Test

FILE: core/src/test/java/com/megaease/easeagent/core/plugin/PluginLoaderTest.java
  class PluginLoaderTest (line 23) | public class PluginLoaderTest {
    method isVersion (line 25) | @Test
    class TestAgentPlugin (line 53) | class TestAgentPlugin implements AgentPlugin {
      method getNamespace (line 54) | @Override
      method getDomain (line 59) | @Override
    class TestPoints (line 65) | class TestPoints implements Points {
      method codeVersions (line 68) | @Override
      method getClassMatcher (line 77) | @Override
      method getMethodMatcher (line 82) | @Override

FILE: core/src/test/java/com/megaease/easeagent/core/utils/AgentAttachmentRule.java
  class AgentAttachmentRule (line 36) | public class AgentAttachmentRule implements MethodRule {
    method AgentAttachmentRule (line 39) | public AgentAttachmentRule() {
    method apply (line 43) | public Statement apply(Statement base, FrameworkMethod method, Object ...
    class NoOpStatement (line 72) | private static class NoOpStatement extends Statement {
      method NoOpStatement (line 76) | private NoOpStatement(String reason) {
      method evaluate (line 80) | public void evaluate() {

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/HttpRequest.java
  class HttpRequest (line 26) | @Data

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/HttpResponse.java
  class HttpResponse (line 23) | @Data

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/IHttpHandler.java
  type IHttpHandler (line 22) | public interface IHttpHandler {
    method getPath (line 23) | String getPath();
    method process (line 25) | HttpResponse process(HttpRequest request, Map<String, String> uriParams);
    method priority (line 27) | default int priority() {

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/IHttpServer.java
  type IHttpServer (line 22) | public interface IHttpServer {
    method start (line 23) | void start(int port);
    method addHttpRoutes (line 25) | void addHttpRoutes(List<IHttpHandler> agentHttpHandlers);
    method stop (line 27) | void stop();

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/jdk/AgentHttpServerV2.java
  class AgentHttpServerV2 (line 31) | public class AgentHttpServerV2 implements IHttpServer {
    method start (line 35) | @Override
    method addHttpRoutes (line 50) | @Override
    method stop (line 59) | @Override

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/jdk/RootContextHandler.java
  class RootContextHandler (line 32) | public class RootContextHandler implements HttpHandler {
    method handle (line 36) | @Override
    method addRoute (line 45) | public void addRoute(IHttpHandler handler) {
    class DefaultRoutes (line 49) | public static class DefaultRoutes {
      method DefaultRoutes (line 52) | public DefaultRoutes() {
      method addRoute (line 56) | public void addRoute(String url, int priority, Class<?> handler, Obj...
      method addRoute (line 64) | public void addRoute(IHttpHandler handler) {
      method removeRoute (line 68) | public void removeRoute(String url) {
      method getPrioritizedRoutes (line 80) | public Collection<UriResource> getPrioritizedRoutes() {
      method newMappingCollection (line 84) | protected Collection<UriResource> newMappingCollection() {

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/jdk/UriResource.java
  class UriResource (line 27) | @SuppressWarnings("all")
    method UriResource (line 49) | public UriResource(String uri, int priority, Class<?> handler, Object....
    method UriResource (line 54) | public UriResource(String uri, Class<?> handler, Object... initParamet...
    method parse (line 67) | private void parse() {
    method createUriPattern (line 70) | private Pattern createUriPattern() {
    method toString (line 85) | @Override
    method getUri (line 93) | public String getUri() {
    method initParameter (line 97) | public <T> T initParameter(Class<T> paramClazz) {
    method initParameter (line 101) | public <T> T initParameter(int parameterIndex, Class<T> paramClazz) {
    method match (line 109) | public Map<String, String> match(String url) {
    method compareTo (line 125) | @Override
    method setPriority (line 138) | public void setPriority(int priority) {
    method normalizeUri (line 143) | public static String normalizeUri(String value) {

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nano/AgentHttpHandler.java
  class AgentHttpHandler (line 34) | public abstract class AgentHttpHandler extends RouterNanoHTTPD.DefaultHa...
    method getPath (line 36) | public abstract String getPath();
    method getText (line 41) | @Override
    method buildRequestBody (line 46) | @SneakyThrows
    method getStatus (line 63) | @Override
    method getMimeType (line 68) | @Override
    method process (line 73) | public abstract Response process(RouterNanoHTTPD.UriResource uriResour...
    method get (line 75) | @Override

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nano/AgentHttpHandlerProvider.java
  type AgentHttpHandlerProvider (line 22) | public interface AgentHttpHandlerProvider {
    method getAgentHttpHandlers (line 24) | List<AgentHttpHandler> getAgentHttpHandlers();

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nano/AgentHttpServer.java
  class AgentHttpServer (line 25) | public class AgentHttpServer extends RouterNanoHTTPD {
    method AgentHttpServer (line 29) | public AgentHttpServer(int port) {
    method addHttpRoutes (line 35) | public void addHttpRoutes(List<AgentHttpHandler> agentHttpHandlers) {
    method addHttpRoute (line 41) | public void addHttpRoute(AgentHttpHandler handler) {
    method startServer (line 45) | @SneakyThrows

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/ClientHandler.java
  class ClientHandler (line 65) | public class ClientHandler implements Runnable {
    method ClientHandler (line 73) | public ClientHandler(NanoHTTPD httpd, InputStream inputStream, Socket ...
    method close (line 79) | public void close() {
    method run (line 84) | @Override

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/HTTPSession.java
  class HTTPSession (line 73) | public class HTTPSession implements IHTTPSession {
    method HTTPSession (line 113) | public HTTPSession(NanoHTTPD httpd, ITempFileManager tempFileManager, ...
    method HTTPSession (line 120) | public HTTPSession(NanoHTTPD httpd, ITempFileManager tempFileManager, ...
    method decodeHeader (line 132) | private void decodeHeader(BufferedReader in, Map<String, String> pre, ...
    method decodeMultipartFormData (line 190) | private void decodeMultipartFormData(ContentType contentType, ByteBuff...
    method scipOverNewLine (line 294) | private int scipOverNewLine(byte[] partHeaderBuff, int index) {
    method decodeParms (line 305) | private void decodeParms(String parms, Map<String, List<String>> p) {
    method execute (line 337) | @Override
    method findHeaderEnd (line 466) | private int findHeaderEnd(final byte[] buf, int rlen) {
    method getBoundaryPositions (line 489) | private int[] getBoundaryPositions(ByteBuffer b, byte[] boundary) {
    method getCookies (line 530) | @Override
    method getHeaders (line 535) | @Override
    method getInputStream (line 540) | @Override
    method getMethod (line 545) | @Override
    method getParams (line 553) | @Override
    method getParameters (line 564) | @Override
    method getQueryParameterString (line 569) | @Override
    method getTmpBucket (line 574) | private RandomAccessFile getTmpBucket() {
    method getUri (line 583) | @Override
    method getBodySize (line 592) | public long getBodySize() {
    method parseBody (line 601) | @Override
    method saveTmpFile (line 672) | private String saveTmpFile(ByteBuffer b, int offset, int len, String f...
    method getRemoteIpAddress (line 693) | @Override

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/IHTTPSession.java
  type IHTTPSession (line 64) | public interface IHTTPSession {
    method execute (line 66) | void execute() throws IOException;
    method getCookies (line 68) | CookieHandler getCookies();
    method getHeaders (line 70) | Map<String, String> getHeaders();
    method getInputStream (line 72) | InputStream getInputStream();
    method getMethod (line 74) | Method getMethod();
    method getParams (line 83) | @Deprecated
    method getParameters (line 86) | Map<String, List<String>> getParameters();
    method getQueryParameterString (line 88) | String getQueryParameterString();
    method getUri (line 93) | String getUri();
    method parseBody (line 101) | void parseBody(Map<String, String> files) throws IOException, NanoHTTP...
    method getRemoteIpAddress (line 108) | String getRemoteIpAddress();

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/NanoHTTPD.java
  class NanoHTTPD (line 131) | public abstract class NanoHTTPD {
    class ResponseException (line 145) | public static final class ResponseException extends Exception {
      method ResponseException (line 151) | public ResponseException(Status status, String message) {
      method ResponseException (line 156) | public ResponseException(Status status, String message, Exception e) {
      method getStatus (line 161) | public Status getStatus() {
    method mimeTypes (line 199) | public static Map<String, String> mimeTypes() {
    method loadMimeTypes (line 211) | @SuppressWarnings({
    method makeSSLSocketFactory (line 242) | public static SSLServerSocketFactory makeSSLSocketFactory(KeyStore loa...
    method makeSSLSocketFactory (line 261) | public static SSLServerSocketFactory makeSSLSocketFactory(KeyStore loa...
    method makeSSLSocketFactory (line 273) | public static SSLServerSocketFactory makeSSLSocketFactory(String keyAn...
    method getMimeTypeForFile (line 298) | public static String getMimeTypeForFile(String uri) {
    method safeClose (line 307) | public static final void safeClose(Object closeable) {
    method getMyServerSocket (line 331) | public ServerSocket getMyServerSocket() {
    method NanoHTTPD (line 356) | public NanoHTTPD(int port) {
    method NanoHTTPD (line 371) | public NanoHTTPD(String hostname, int port) {
    method setHTTPHandler (line 387) | public void setHTTPHandler(IHandler<IHTTPSession, Response> handler) {
    method addHTTPInterceptor (line 391) | public void addHTTPInterceptor(IHandler<IHTTPSession, Response> interc...
    method closeAllConnections (line 398) | public synchronized void closeAllConnections() {
    method createClientHandler (line 412) | protected ClientHandler createClientHandler(final Socket finalAccept, ...
    method createServerRunnable (line 424) | protected ServerRunnable createServerRunnable(final int timeout) {
    method decodeParameters (line 439) | protected static Map<String, List<String>> decodeParameters(Map<String...
    method decodeParameters (line 456) | protected static Map<String, List<String>> decodeParameters(String que...
    method decodePercent (line 484) | public static String decodePercent(String str) {
    method getListeningPort (line 494) | public final int getListeningPort() {
    method isAlive (line 498) | public final boolean isAlive() {
    method getServerSocketFactory (line 502) | public IFactoryThrowing<ServerSocket, IOException> getServerSocketFact...
    method setServerSocketFactory (line 506) | public void setServerSocketFactory(IFactoryThrowing<ServerSocket, IOEx...
    method getHostname (line 510) | public String getHostname() {
    method getTempFileManagerFactory (line 514) | public IFactory<ITempFileManager> getTempFileManagerFactory() {
    method makeSecure (line 521) | public void makeSecure(SSLServerSocketFactory sslServerSocketFactory, ...
    method handle (line 535) | public Response handle(IHTTPSession session) {
    method serve (line 554) | @Deprecated
    method setAsyncRunner (line 565) | public void setAsyncRunner(IAsyncRunner asyncRunner) {
    method setTempFileManagerFactory (line 575) | public void setTempFileManagerFactory(IFactory<ITempFileManager> tempF...
    method start (line 585) | public void start() throws IOException {
    method start (line 592) | public void start(final int timeout) throws IOException {
    method start (line 606) | public void start(final int timeout, boolean daemon) throws IOException {
    method stop (line 632) | public void stop() {
    method wasStarted (line 644) | public final boolean wasStarted() {

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/ServerRunnable.java
  class ServerRunnable (line 62) | public class ServerRunnable implements Runnable {
    method ServerRunnable (line 72) | public ServerRunnable(NanoHTTPD httpd, int timeout) {
    method run (line 77) | @Override
    method getBindException (line 100) | public IOException getBindException() {
    method hasBinded (line 104) | public boolean hasBinded() {

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/content/ContentType.java
  class ContentType (line 56) | public class ContentType {
    method ContentType (line 82) | public ContentType(String contentTypeHeader) {
    method getDetailFromContentHeader (line 98) | private String getDetailFromContentHeader(String contentTypeHeader, Pa...
    method getContentTypeHeader (line 103) | public String getContentTypeHeader() {
    method getContentType (line 107) | public String getContentType() {
    method getEncoding (line 111) | public String getEncoding() {
    method getBoundary (line 115) | public String getBoundary() {
    method isMultipart (line 119) | public boolean isMultipart() {
    method tryUTF8 (line 123) | public ContentType tryUTF8() {

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/content/Cookie.java
  class Cookie (line 63) | public class Cookie {
    method getHTTPTime (line 65) | public static String getHTTPTime(int days) {
    method Cookie (line 75) | public Cookie(String name, String value) {
    method Cookie (line 79) | public Cookie(String name, String value, int numDays) {
    method Cookie (line 85) | public Cookie(String name, String value, String expires) {
    method getHTTPHeader (line 91) | public String getHTTPHeader() {

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/content/CookieHandler.java
  class CookieHandler (line 67) | public class CookieHandler implements Iterable<String> {
    method CookieHandler (line 73) | public CookieHandler(Map<String, String> httpHeaders) {
    method delete (line 93) | public void delete(String name) {
    method iterator (line 97) | @Override
    method read (line 109) | public String read(String name) {
    method set (line 113) | public void set(Cookie cookie) {
    method set (line 127) | public void set(String name, String value, int expires) {
    method unloadQueue (line 139) | public void unloadQueue(Response response) {

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/request/Method.java
  type Method (line 57) | public enum Method {
    method lookup (line 77) | public static Method lookup(String method) {

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/response/ChunkedOutputStream.java
  class ChunkedOutputStream (line 62) | public class ChunkedOutputStream extends FilterOutputStream {
    method ChunkedOutputStream (line 64) | public ChunkedOutputStream(OutputStream out) {
    method write (line 68) | @Override
    method write (line 76) | @Override
    method write (line 81) | @Override
    method finish (line 90) | public void finish() throws IOException {

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/response/IStatus.java
  type IStatus (line 53) | public interface IStatus {
    method getDescription (line 55) | String getDescription();
    method getRequestStatus (line 57) | int getRequestStatus();

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/response/Response.java
  class Response (line 69) | public class Response implements Closeable {
    method put (line 95) | public String put(String key, String value) {
    type GzipUsage (line 122) | private static enum GzipUsage {
    method Response (line 131) | @SuppressWarnings({
    method close (line 150) | @Override
    method addCookieHeader (line 161) | public void addCookieHeader(String cookie) {
    method getCookieHeaders (line 171) | public List<String> getCookieHeaders() {
    method addHeader (line 178) | public void addHeader(String name, String value) {
    method closeConnection (line 189) | public void closeConnection(boolean close) {
    method isCloseConnection (line 200) | public boolean isCloseConnection() {
    method getData (line 204) | public InputStream getData() {
    method getHeader (line 208) | public String getHeader(String name) {
    method getMimeType (line 212) | public String getMimeType() {
    method getRequestMethod (line 216) | public Method getRequestMethod() {
    method getStatus (line 220) | public IStatus getStatus() {
    method setKeepAlive (line 224) | public void setKeepAlive(boolean useKeepAlive) {
    method send (line 231) | public void send(OutputStream outputStream) {
    method printHeader (line 279) | @SuppressWarnings("static-method")
    method sendContentLengthHeaderIfNotAlreadyPresent (line 284) | protected long sendContentLengthHeaderIfNotAlreadyPresent(PrintWriter ...
    method sendBodyWithCorrectTransferAndEncoding (line 299) | private void sendBodyWithCorrectTransferAndEncoding(OutputStream outpu...
    method sendBodyWithCorrectEncoding (line 315) | private void sendBodyWithCorrectEncoding(OutputStream outputStream, lo...
    method sendBody (line 347) | private void sendBody(OutputStream outputStream, long pending) throws ...
    method setChunkedTransfer (line 370) | public void setChunkedTransfer(boolean chunkedTransfer) {
    method setData (line 374) | public void setData(InputStream data) {
    method setMimeType (line 378) | public void setMimeType(String mimeType) {
    method setRequestMethod (line 382) | public void setRequestMethod(Method requestMethod) {
    method setStatus (line 386) | public void setStatus(IStatus status) {
    method newChunkedResponse (line 393) | public static Response newChunkedResponse(IStatus status, String mimeT...
    method newFixedLengthResponse (line 397) | public static Response newFixedLengthResponse(IStatus status, String m...
    method newFixedLengthResponse (line 404) | public static Response newFixedLengthResponse(IStatus status, String m...
    method newFixedLengthResponse (line 411) | public static Response newFixedLengthResponse(IStatus status, String m...
    method newFixedLengthResponse (line 434) | public static Response newFixedLengthResponse(String msg) {
    method setUseGzip (line 438) | public Response setUseGzip(boolean useGzip) {
    method useGzipWhenAccepted (line 445) | public boolean useGzipWhenAccepted() {

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/response/Status.java
  type Status (line 56) | public enum Status implements IStatus {
    method Status (line 105) | Status(int requestStatus, String description) {
    method lookup (line 110) | public static Status lookup(int requestStatus) {
    method getDescription (line 119) | @Override
    method getRequestStatus (line 124) | @Override

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/sockets/DefaultServerSocketFactory.java
  class DefaultServerSocketFactory (line 61) | public class DefaultServerSocketFactory implements IFactoryThrowing<Serv...
    method create (line 63) | @Override

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/sockets/SecureServerSocketFactory.java
  class SecureServerSocketFactory (line 63) | public class SecureServerSocketFactory implements IFactoryThrowing<Serve...
    method SecureServerSocketFactory (line 69) | public SecureServerSocketFactory(SSLServerSocketFactory sslServerSocke...
    method create (line 74) | @Override

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/tempfiles/DefaultTempFile.java
  class DefaultTempFile (line 68) | public class DefaultTempFile implements ITempFile {
    method DefaultTempFile (line 74) | public DefaultTempFile(File tempdir) throws IOException {
    method delete (line 79) | @Override
    method getName (line 87) | @Override
    method open (line 92) | @Override

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/tempfiles/DefaultTempFileManager.java
  class DefaultTempFileManager (line 70) | public class DefaultTempFileManager implements ITempFileManager {
    method DefaultTempFileManager (line 76) | public DefaultTempFileManager() {
    method clear (line 84) | @Override
    method createTempFile (line 96) | @Override

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/tempfiles/DefaultTempFileManagerFactory.java
  class DefaultTempFileManagerFactory (line 58) | public class DefaultTempFileManagerFactory implements IFactory<ITempFile...
    method create (line 60) | @Override

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/tempfiles/ITempFile.java
  type ITempFile (line 63) | public interface ITempFile {
    method delete (line 65) | public void delete() throws Exception;
    method getName (line 67) | public String getName();
    method open (line 69) | public OutputStream open() throws Exception;

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/tempfiles/ITempFileManager.java
  type ITempFileManager (line 61) | public interface ITempFileManager {
    method clear (line 63) | void clear();
    method createTempFile (line 65) | public ITempFile createTempFile(String filename_hint) throws Exception;

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/threading/DefaultAsyncRunner.java
  class DefaultAsyncRunner (line 68) | public class DefaultAsyncRunner implements IAsyncRunner {
    method getRunning (line 77) | public List<ClientHandler> getRunning() {
    method closeAll (line 81) | @Override
    method closed (line 89) | @Override
    method exec (line 94) | @Override
    method createThread (line 101) | protected Thread createThread(ClientHandler clientHandler) {

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/threading/IAsyncRunner.java
  type IAsyncRunner (line 58) | public interface IAsyncRunner {
    method closeAll (line 60) | void closeAll();
    method closed (line 62) | void closed(ClientHandler clientHandler);
    method exec (line 64) | void exec(ClientHandler code);

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/router/RouterNanoHTTPD.java
  class RouterNanoHTTPD (line 70) | public class RouterNanoHTTPD extends NanoHTTPD {
    type UriResponder (line 77) | public interface UriResponder {
      method get (line 79) | public Response get(UriResource uriResource, Map<String, String> url...
      method put (line 81) | public Response put(UriResource uriResource, Map<String, String> url...
      method post (line 83) | public Response post(UriResource uriResource, Map<String, String> ur...
      method delete (line 85) | public Response delete(UriResource uriResource, Map<String, String> ...
      method other (line 87) | public Response other(String method, UriResource uriResource, Map<St...
    class DefaultStreamHandler (line 94) | public static abstract class DefaultStreamHandler implements UriRespon...
      method getMimeType (line 96) | public abstract String getMimeType();
      method getStatus (line 98) | public abstract IStatus getStatus();
      method getData (line 100) | public abstract InputStream getData();
      method get (line 102) | public Response get(UriResource uriResource, Map<String, String> url...
      method post (line 106) | public Response post(UriResource uriResource, Map<String, String> ur...
      method put (line 110) | public Response put(UriResource uriResource, Map<String, String> url...
      method delete (line 114) | public Response delete(UriResource uriResource, Map<String, String> ...
      method other (line 118) | public Response other(String method, UriResource uriResource, Map<St...
    class DefaultHandler (line 127) | public static abstract class DefaultHandler extends DefaultStreamHandl...
      method getText (line 129) | public abstract String getText();
      method getStatus (line 131) | public abstract IStatus getStatus();
      method get (line 133) | public Response get(UriResource uriResource, Map<String, String> url...
      method getData (line 137) | @Override
    class GeneralHandler (line 146) | public static class GeneralHandler extends DefaultHandler {
      method getText (line 148) | @Override
      method getMimeType (line 153) | @Override
      method getStatus (line 158) | @Override
      method cleanXSS (line 170) | private String cleanXSS(String value) {
      method get (line 182) | public Response get(UriResource uriResource, Map<String, String> url...
    class StaticPageHandler (line 215) | public static class StaticPageHandler extends DefaultHandler {
      method getPathArray (line 217) | private static String[] getPathArray(String uri) {
      method getText (line 230) | @Override
      method getMimeType (line 235) | @Override
      method getStatus (line 240) | @Override
      method get (line 245) | public Response get(UriResource uriResource, Map<String, String> url...
      method fileToInputStream (line 275) | protected BufferedInputStream fileToInputStream(File fileOrdirectory...
    class Error404UriHandler (line 283) | public static class Error404UriHandler extends DefaultHandler {
      method getText (line 285) | public String getText() {
      method getMimeType (line 289) | @Override
      method getStatus (line 294) | @Override
    class IndexHandler (line 303) | public static class IndexHandler extends DefaultHandler {
      method getText (line 305) | public String getText() {
      method getMimeType (line 309) | @Override
      method getStatus (line 314) | @Override
    class NotImplementedHandler (line 321) | public static class NotImplementedHandler extends DefaultHandler {
      method getText (line 323) | public String getText() {
      method getMimeType (line 327) | @Override
      method getStatus (line 332) | @Override
    method normalizeUri (line 338) | public static String normalizeUri(String value) {
    class UriResource (line 352) | public static class UriResource implements Comparable<UriResource> {
      method UriResource (line 372) | public UriResource(String uri, int priority, Class<?> handler, Objec...
      method UriResource (line 377) | public UriResource(String uri, Class<?> handler, Object... initParam...
      method parse (line 390) | private void parse() {
      method createUriPattern (line 393) | private Pattern createUriPattern() {
      method process (line 408) | public Response process(Map<String, String> urlParams, IHTTPSession ...
      method toString (line 443) | @Override
      method getUri (line 451) | public String getUri() {
      method initParameter (line 455) | public <T> T initParameter(Class<T> paramClazz) {
      method initParameter (line 459) | public <T> T initParameter(int parameterIndex, Class<T> paramClazz) {
      method match (line 467) | public Map<String, String> match(String url) {
      method compareTo (line 483) | @Override
      method setPriority (line 496) | public void setPriority(int priority) {
    type IRoutePrioritizer (line 502) | public static interface IRoutePrioritizer {
      method addRoute (line 504) | void addRoute(String url, int priority, Class<?> handler, Object... ...
      method removeRoute (line 506) | void removeRoute(String url);
      method getPrioritizedRoutes (line 508) | Collection<UriResource> getPrioritizedRoutes();
      method setNotImplemented (line 510) | void setNotImplemented(Class<?> notImplemented);
    class BaseRoutePrioritizer (line 513) | public static abstract class BaseRoutePrioritizer implements IRoutePri...
      method BaseRoutePrioritizer (line 519) | public BaseRoutePrioritizer() {
      method addRoute (line 524) | @Override
      method removeRoute (line 535) | public void removeRoute(String url) {
      method getPrioritizedRoutes (line 547) | @Override
      method setNotImplemented (line 552) | @Override
      method newMappingCollection (line 557) | protected abstract Collection<UriResource> newMappingCollection();
    class ProvidedPriorityRoutePrioritizer (line 560) | public static class ProvidedPriorityRoutePrioritizer extends BaseRoute...
      method addRoute (line 562) | @Override
      method newMappingCollection (line 577) | @Override
    class DefaultRoutePrioritizer (line 584) | public static class DefaultRoutePrioritizer extends BaseRoutePrioritiz...
      method newMappingCollection (line 586) | protected Collection<UriResource> newMappingCollection() {
    class InsertionOrderRoutePrioritizer (line 591) | public static class InsertionOrderRoutePrioritizer extends BaseRoutePr...
      method newMappingCollection (line 593) | protected Collection<UriResource> newMappingCollection() {
    class UriRouter (line 598) | public static class UriRouter {
      method UriRouter (line 604) | public UriRouter() {
      method process (line 615) | public Response process(IHTTPSession session) {
      method addRoute (line 629) | private void addRoute(String url, int priority, Class<?> handler, Ob...
      method removeRoute (line 633) | private void removeRoute(String url) {
      method setNotFoundHandler (line 637) | public void setNotFoundHandler(Class<?> handler) {
      method setNotImplemented (line 641) | public void setNotImplemented(Class<?> handler) {
      method setRoutePrioritizer (line 645) | public void setRoutePrioritizer(IRoutePrioritizer routePrioritizer) {
    method RouterNanoHTTPD (line 653) | public RouterNanoHTTPD(int port) {
    method RouterNanoHTTPD (line 658) | public RouterNanoHTTPD(String hostname, int port) {
    method addMappings (line 671) | public void addMappings() {
    method addRoute (line 678) | public void addRoute(String url, Class<?> handler, Object... initParam...
    method setNotImplementedHandler (line 682) | public <T extends UriResponder> void setNotImplementedHandler(Class<T>...
    method setNotFoundHandler (line 686) | public <T extends UriResponder> void setNotFoundHandler(Class<T> handl...
    method removeRoute (line 690) | public void removeRoute(String url) {
    method setRoutePrioritizer (line 694) | public void setRoutePrioritizer(IRoutePrioritizer routePrioritizer) {
    method serve (line 698) | @Override

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/util/IFactory.java
  type IFactory (line 60) | public interface IFactory<T> {
    method create (line 62) | T create();

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/util/IFactoryThrowing.java
  type IFactoryThrowing (line 63) | public interface IFactoryThrowing<T, E extends Throwable> {
    method create (line 65) | T create() throws E;

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/util/IHandler.java
  type IHandler (line 63) | public interface IHandler<I, O> {
    method handle (line 65) | public O handle(I input);

FILE: httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/util/ServerRunner.java
  class ServerRunner (line 59) | public class ServerRunner {
    method executeInstance (line 66) | public static void executeInstance(NanoHTTPD server) {
    method run (line 85) | public static <T extends NanoHTTPD> void run(Class<T> serverClass) {

FILE: loader/src/main/java/com/megaease/easeagent/EaseAgentClassLoader.java
  class EaseAgentClassLoader (line 30) | public class EaseAgentClassLoader extends URLClassLoader {
    method EaseAgentClassLoader (line 37) | public EaseAgentClassLoader(URL[] urls, ClassLoader parent) {
    method add (line 41) | @SuppressWarnings("unused")
    method loadClass (line 48) | @Override
    method findResource (line 73) | @Override

FILE: loader/src/main/java/com/megaease/easeagent/JarCache.java
  class JarCache (line 39) | public class JarCache {
    method JarCache (line 47) | public JarCache(JarFile jarFile, Map<String, JarFile> childJars, Map<S...
    method nestJarUrls (line 53) | public ArrayList<URL> nestJarUrls(String prefix) {
    method nestJarFiles (line 63) | public ArrayList<JarFile> nestJarFiles(String prefix) {
    method getManifest (line 73) | public Manifest getManifest() throws IOException {
    method build (line 78) | static JarCache build(File file) throws IOException {
    method createTempJarFile (line 99) | private static File createTempJarFile(String tmpDir, InputStream input...
    method copy (line 118) | public static void copy(InputStream input, OutputStream output) throws...
    method getTmpDir (line 126) | public static String getTmpDir(JarFile jarFile) throws IOException {
    method getAttribute (line 136) | public static String getAttribute(JarFile jarFile, String key) throws ...

FILE: loader/src/main/java/com/megaease/easeagent/Main.java
  class Main (line 35) | public class Main {
    method premain (line 48) | public static void premain(final String args, final Instrumentation in...
    method initAgentSlf4jMDC (line 81) | private static void initAgentSlf4jMDC(ClassLoader loader) {
    method installBootstrapJar (line 94) | private static void installBootstrapJar(JarFile file, Instrumentation ...
    method initEaseAgentSlf4j2Dir (line 98) | private static void initEaseAgentSlf4j2Dir(JarCache archive, final Cla...
    method switchLoggingProperty (line 110) | private static void switchLoggingProperty(ClassLoader loader, String h...
    method getLogConfigPath (line 137) | private static String getLogConfigPath() {
    method directoryPluginUrls (line 151) | private static ArrayList<URL> directoryPluginUrls(File directory) {
    method getArchiveFileContains (line 177) | private static File getArchiveFileContains() throws URISyntaxException {
    method buildClassLoader (line 194) | static ClassLoader buildClassLoader(URL[] urls) {
    method main (line 198) | @SneakyThrows

FILE: loader/src/main/java/com/megaease/easeagent/StringSequence.java
  class StringSequence (line 25) | @SuppressWarnings({"unused", "SameParameterValue"})
    method StringSequence (line 35) | public StringSequence(String source) {
    method StringSequence (line 39) | public StringSequence(String source, int start, int end) {
    method subSequence (line 52) | StringSequence subSequence(int start) {
    method subSequence (line 56) | @Override
    method isEmpty (line 77) | public boolean isEmpty() {
    method length (line 81) | @Override
    method charAt (line 86) | @Override
    method indexOf (line 91) | int indexOf(char ch) {
    method indexOf (line 95) | int indexOf(String str) {
    method indexOf (line 99) | int indexOf(String str, int fromIndex) {
    method startsWith (line 103) | boolean startsWith(String prefix) {
    method startsWith (line 107) | boolean startsWith(String prefix, int offset) {
    method equals (line 116) | @Override
    method hashCode (line 139) | @Override
    method toString (line 151) | @Override

FILE: loader/src/test/java/com/megaease/easeagent/MainTest.java
  class MainTest (line 29) | public class MainTest {
    method buildClassLoader (line 31) | @Test

FILE: log4j2/log4j2-api/src/main/java/com/megaease/easeagent/log4j2/ClassLoaderUtils.java
  class ClassLoaderUtils (line 30) | public class ClassLoaderUtils {
    method getAllUrls (line 31) | public static URL[] getAllUrls(ClassLoader classLoader) {
    method getAllUrls (line 35) | public static URL[] getAllUrls(ClassLoader classLoader, Function<URL, ...
    method filter (line 51) | private static boolean filter(Function<URL, Boolean> filter, URL url) {
    method fillUrls (line 57) | private static void fillUrls(List<URL> list, Enumeration<URL> enumerat...

FILE: log4j2/log4j2-api/src/main/java/com/megaease/easeagent/log4j2/ClassloaderSupplier.java
  type ClassloaderSupplier (line 23) | public interface ClassloaderSupplier {
    method get (line 25) | ClassLoader get();
    class ClassloaderSupplierImpl (line 27) | class ClassloaderSupplierImpl implements ClassloaderSupplier {
      method get (line 29) | @Override

FILE: log4j2/log4j2-api/src/main/java/com/megaease/easeagent/log4j2/FinalClassloaderSupplier.java
  class FinalClassloaderSupplier (line 22) | @SuppressWarnings("all")
    method get (line 27) | @Override

FILE: log4j2/log4j2-api/src/main/java/com/megaease/easeagent/log4j2/Logger.java
  type Logger (line 23) | public interface Logger {
    method getName (line 29) | public String getName();
    method isTraceEnabled (line 37) | public boolean isTraceEnabled();
    method trace (line 44) | public void trace(String msg);
    method trace (line 56) | public void trace(String format, Object arg);
    method trace (line 69) | public void trace(String format, Object arg1, Object arg2);
    method trace (line 84) | public void trace(String format, Object... arguments);
    method trace (line 93) | public void trace(String msg, Throwable t);
    method isDebugEnabled (line 101) | public boolean isDebugEnabled();
    method debug (line 108) | public void debug(String msg);
    method debug (line 120) | public void debug(String format, Object arg);
    method debug (line 133) | public void debug(String format, Object arg1, Object arg2);
    method debug (line 149) | public void debug(String format, Object... arguments);
    method debug (line 158) | public void debug(String msg, Throwable t);
    method isInfoEnabled (line 166) | public boolean isInfoEnabled();
    method info (line 173) | public void info(String msg);
    method info (line 185) | public void info(String format, Object arg);
    method info (line 198) | public void info(String format, Object arg1, Object arg2);
    method info (line 214) | public void info(String format, Object... arguments);
    method info (line 223) | public void info(String msg, Throwable t);
    method isWarnEnabled (line 231) | public boolean isWarnEnabled();
    method warn (line 238) | public void warn(String msg);
    method warn (line 250) | public void warn(String format, Object arg);
    method warn (line 266) | public void warn(String format, Object... arguments);
    method warn (line 279) | public void warn(String format, Object arg1, Object arg2);
    method warn (line 288) | public void warn(String msg, Throwable t);
    method isErrorEnabled (line 296) | public boolean isErrorEnabled();
    method error (line 303) | public void error(String msg);
    method error (line 315) | public void error(String format, Object arg);
    method error (line 328) | public void error(String format, Object arg1, Object arg2);
    method error (line 344) | public void error(String format, Object... arguments);
    method error (line 353) | public void error(String msg, Throwable t);

FILE: log4j2/log4j2-api/src/main/java/com/megaease/easeagent/log4j2/LoggerFactory.java
  class LoggerFactory (line 26) | public class LoggerFactory {
    method classLoaderSupplier (line 44) | private static ClassloaderSupplier classLoaderSupplier() {
    method newFactory (line 48) | public static <N extends AgentLogger> AgentLoggerFactory<N> newFactory...
    method getLogger (line 55) | public static Logger getLogger(String name) {
    method getLogger (line 63) | public static Logger getLogger(Class<?> clazz) {
    class NoopLogger (line 68) | public static class NoopLogger implements Logger {
      method NoopLogger (line 71) | public NoopLogger(String name) {
      method getName (line 75) | @Override
      method isTraceEnabled (line 80) | @Override
      method trace (line 85) | @Override
      method trace (line 90) | @Override
      method trace (line 95) | @Override
      method trace (line 100) | @Override
      method trace (line 105) | @Override
      method isDebugEnabled (line 110) | @Override
      method debug (line 115) | @Override
      method debug (line 120) | @Override
      method debug (line 125) | @Override
      method debug (line 130) | @Override
      method debug (line 135) | @Override
      method isInfoEnabled (line 140) | @Override
      method info (line 145) | @Override
      method info (line 150) | @Override
      method info (line 155) | @Override
      method info (line 160) | @Override
      method info (line 165) | @Override
      method isWarnEnabled (line 170) | @Override
      method warn (line 175) | @Override
      method warn (line 180) | @Override
      method warn (line 185) | @Override
      method warn (line 190) | @Override
      method warn (line 195) | @Override
      method isErrorEnabled (line 200) | @Override
      method error (line 205) | @Override
      method error (line 210) | @Override
      method error (line 215) | @Override
      method error (line 220) | @Override
      method error (line 225) | @Override

FILE: log4j2/log4j2-api/src/main/java/com/megaease/easeagent/log4j2/MDC.java
  class MDC (line 22) | public class MDC {
    method put (line 25) | public static void put(String key, String value) {
    method remove (line 29) | public static void remove(String key) {
    method get (line 33) | public static String get(String key) {

FILE: log4j2/log4j2-api/src/main/java/com/megaease/easeagent/log4j2/api/AgentLogger.java
  class AgentLogger (line 23) | public class AgentLogger implements com.megaease.easeagent.log4j2.Logger {
    method AgentLogger (line 28) | public AgentLogger(Logger logger) {
    method getLogger (line 32) | public Logger getLogger() {
    method getName (line 36) | @Override
    method isTraceEnabled (line 41) | @Override
    method trace (line 46) | @Override
    method trace (line 51) | @Override
    method trace (line 56) | @Override
    method trace (line 61) | @Override
    method trace (line 66) | @Override
    method isDebugEnabled (line 71) | @Override
    method debug (line 76) | @Override
    method debug (line 81) | @Override
    method debug (line 86) | @Override
    method debug (line 91) | @Override
    method debug (line 96) | @Override
    method isInfoEnabled (line 101) | @Override
    method info (line 106) | @Override
    method info (line 111) | @Override
    method info (line 116) | @Override
    method info (line 121) | @Override
    method info (line 126) | @Override
    method isWarnEnabled (line 131) | @Override
    method warn (line 136) | @Override
    method warn (line 141) | @Override
    method warn (line 147) | @Override
    method warn (line 152) | @Override
    method warn (line 158) | @Override
    method isErrorEnabled (line 163) | @Override
    method error (line 168) | @Override
    method error (line 173) | @Override
    method error (line 179) | @Override
    method error (line 184) | @Override
    method error (line 189) | @Override

FILE: log4j2/log4j2-api/src/main/java/com/megaease/easeagent/log4j2/api/AgentLoggerFactory.java
  class AgentLoggerFactory (line 33) | public class AgentLoggerFactory<T extends AgentLogger> {
    method AgentLoggerFactory (line 41) | private AgentLoggerFactory(@Nonnull ClassLoader classLoader,
    method builder (line 52) | public static <T extends AgentLogger> Builder<T> builder(ClassloaderSu...
    method newFactory (line 59) | public <N extends AgentLogger> AgentLoggerFactory<N> newFactory(Functi...
    method getLogger (line 69) | public T getLogger(String name) {
    method mdc (line 85) | public Mdc mdc() {
    class Builder (line 89) | public static class Builder<T extends AgentLogger> {
      method Builder (line 94) | public Builder(@Nonnull ClassLoader classLoader, @Nonnull Function<L...
      method build (line 100) | public AgentLoggerFactory<T> build() throws ClassNotFoundException, ...
      method buildMdc (line 118) | @SuppressWarnings("unchecked")

FILE: log4j2/log4j2-api/src/main/java/com/megaease/easeagent/log4j2/api/ILevel.java
  class ILevel (line 20) | public class ILevel extends java.util.logging.Level {
    method ILevel (line 41) | protected ILevel(String name, int value) {

FILE: log4j2/log4j2-api/src/main/java/com/megaease/easeagent/log4j2/api/Mdc.java
  class Mdc (line 24) | public class Mdc {
    method Mdc (line 29) | public Mdc(@Nonnull BiFunction<String, String, Void> putFunction, @Non...
    method put (line 35) | public void put(String key, String value) {
    method remove (line 39) | public void remove(String key) {
    method get (line 43) | public String get(String key) {

FILE: log4j2/log4j2-api/src/main/java/com/megaease/easeagent/log4j2/exception/Log4j2Exception.java
  class Log4j2Exception (line 20) | public class Log4j2Exception extends RuntimeException {
    method Log4j2Exception (line 21) | public Log4j2Exception(Throwable cause) {

FILE: log4j2/log4j2-impl/src/main/java/com/megaease/easeagent/log4j2/impl/AgentLoggerProxy.java
  class AgentLoggerProxy (line 44) | public class AgentLoggerProxy implements LocationAwareLogger, Serializab...
    method AgentLoggerProxy (line 55) | public AgentLoggerProxy(final ExtendedLogger logger, final String name...
    method trace (line 62) | @Override
    method trace (line 67) | @Override
    method trace (line 72) | @Override
    method trace (line 77) | @Override
    method trace (line 82) | @Override
    method isTraceEnabled (line 87) | @Override
    method isTraceEnabled (line 92) | @Override
    method trace (line 97) | @Override
    method trace (line 102) | @Override
    method trace (line 107) | @Override
    method trace (line 112) | @Override
    method trace (line 117) | @Override
    method debug (line 122) | @Override
    method debug (line 127) | @Override
    method debug (line 132) | @Override
    method debug (line 137) | @Override
    method debug (line 142) | @Override
    method isDebugEnabled (line 147) | @Override
    method isDebugEnabled (line 152) | @Override
    method debug (line 157) | @Override
    method debug (line 162) | @Override
    method debug (line 167) | @Override
    method debug (line 172) | @Override
    method debug (line 177) | @Override
    method info (line 182) | @Override
    method info (line 187) | @Override
    method info (line 192) | @Override
    method info (line 197) | @Override
    method info (line 202) | @Override
    method isInfoEnabled (line 207) | @Override
    method isInfoEnabled (line 212) | @Override
    method info (line 217) | @Override
    method info (line 222) | @Override
    method info (line 227) | @Override
    method info (line 232) | @Override
    method info (line 237) | @Override
    method warn (line 242) | @Override
    method warn (line 247) | @Override
    method warn (line 252) | @Override
    method warn (line 257) | @Override
    method warn (line 262) | @Override
    method isWarnEnabled (line 267) | @Override
    method isWarnEnabled (line 272) | @Override
    method warn (line 277) | @Override
    method warn (line 282) | @Override
    method warn (line 287) | @Override
    method warn (line 292) | @Override
    method warn (line 297) | @Override
    method error (line 302) | @Override
    method error (line 307) | @Override
    method error (line 312) | @Override
    method error (line 317) | @Override
    method error (line 322) | @Override
    method isErrorEnabled (line 327) | @Override
    method isErrorEnabled (line 332) | @Override
    method error (line 337) | @Override
    method error (line 342) | @Override
    method error (line 347) | @Override
    method error (line 352) | @Override
    method error (line 357) | @Override
    method log (line 362) | @Override
    method getMarker (line 384) | private static org.apache.logging.log4j.Marker getMarker(final Marker ...
    method getName (line 395) | @Override
    method readObject (line 404) | private void readObject(final ObjectInputStream aInputStream) throws C...
    method writeObject (line 413) | private void writeObject(final ObjectOutputStream aOutputStream) throw...
    method createConverter (line 418) | private static EventDataConverter createConverter() {
    method getLevel (line 427) | private static Level getLevel(final int i) {

FILE: log4j2/log4j2-impl/src/main/java/com/megaease/easeagent/log4j2/impl/LoggerProxyFactory.java
  class LoggerProxyFactory (line 31) | public class LoggerProxyFactory extends AbstractLoggerAdapter<AgentLogge...
    method LoggerProxyFactory (line 40) | public LoggerProxyFactory() {
    method LoggerProxyFactory (line 44) | public LoggerProxyFactory(String loggerFqcn) {
    method getAgentLogger (line 48) | public static Slf4jLogger getAgentLogger(String name) {
    method newLogger (line 52) | @Override
    method getContext (line 58) | @Override
    method validateContext (line 64) | private LoggerContext validateContext(final LoggerContext context) {

FILE: log4j2/log4j2-impl/src/main/java/com/megaease/easeagent/log4j2/impl/MdcProxy.java
  class MdcProxy (line 25) | public class MdcProxy {
    class MdcPut (line 30) | private static class MdcPut implements BiFunction<String, String, Void> {
      method apply (line 32) | @Override
    class MdcRemove (line 39) | private static class MdcRemove implements Function<String, Void> {
      method apply (line 41) | @Override
    class MdcGet (line 48) | private static class MdcGet implements Function<String, String> {
      method apply (line 50) | @Override

FILE: log4j2/log4j2-impl/src/main/java/com/megaease/easeagent/log4j2/impl/Slf4jLogger.java
  class Slf4jLogger (line 27) | public class Slf4jLogger extends java.util.logging.Logger {
    method Slf4jLogger (line 30) | public Slf4jLogger(Logger logger) {
    method getName (line 35) | @Override
    method info (line 40) | @Override
    method isLoggable (line 45) | @Override
    method log (line 63) | @Override
    method log (line 85) | @Override
    method log (line 107) | @Override
    method log (line 130) | @Override

FILE: metrics/src/main/java/com/megaease/easeagent/metrics/AgentScheduledReporter.java
  class AgentScheduledReporter (line 40) | @SuppressWarnings("unused")
    method AgentScheduledReporter (line 47) | @SuppressWarnings("all")
    method forRegistry (line 76) | public static Builder forRegistry(MetricRegistry registry) {
    method report (line 81) | @SneakyThrows
    method getRateUnit (line 101) | @Override
    method getConverter (line 107) | public Converter getConverter() {
    method setConverter (line 116) | public void setConverter(Converter converter) {
    class Builder (line 125) | public static class Builder {
      method Builder (line 137) | private Builder(MetricRegistry registry) {
      method shutdownExecutorOnStop (line 155) | public Builder shutdownExecutorOnStop(boolean shutdownExecutorOnStop) {
      method scheduleOn (line 168) | public Builder scheduleOn(ScheduledExecutorService executor) {
      method converter (line 173) | public Builder converter(Converter converter) {
      method outputTo (line 183) | public Builder outputTo(Consumer<EncodedData> dataConsumer) {
      method enabled (line 188) | public Builder enabled(Supplier<Boolean> enabled) {
      method convertRatesTo (line 199) | public Builder convertRatesTo(TimeUnit rateUnit) {
      method convertDurationsTo (line 210) | public Builder convertDurationsTo(TimeUnit durationUnit) {
      method filter (line 221) | public Builder filter(MetricFilter filter) {
Condensed preview — 1354 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,175K chars).
[
  {
    "path": ".editorconfig",
    "chars": 188,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 4\ntrim_trailing_whitespace = true\ninsert_final_newli"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 842,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n---\nname: 🐞 Bug "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 737,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n---\nname: 🚀 F"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 1569,
    "preview": "# This is a basic workflow to help you get started with Actions\n\nname: Build & Test\n\n# Controls when the workflow will r"
  },
  {
    "path": ".github/workflows/license-checker.yml",
    "chars": 529,
    "preview": "name: License checker\n\non:\n  push:\n    branches:\n      - maste\n    paths-ignore:\n      - 'doc/**'\n      - 'resources/**'"
  },
  {
    "path": ".gitignore",
    "chars": 162,
    "preview": ".idea/\n*.iml\ntarget/\ndependency-reduced-pom.xml\n*.class\n*.swp\n**/*.versionsBackup\n\n.patch\n.classpath\n.factorypath\n.proje"
  },
  {
    "path": ".licenserc.yaml",
    "chars": 1097,
    "preview": "header:\n  license:\n    content: |\n      Copyright (c) 2022, MegaEase\n      All rights reserved.\n      \n      Licensed un"
  },
  {
    "path": "AOSP-Checkstyles.xml",
    "chars": 17646,
    "preview": "<?xml version=\"1.0\"?>\n<!DOCTYPE module PUBLIC\n          \"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN\"\n          "
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 5222,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nWe as members, contributors, and leaders pledge to make participa"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "README.md",
    "chars": 10043,
    "preview": "# EaseAgent\n\nA lightweight & opening Java Agent for Cloud-Native and APM system\n\n- [EaseAgent](#easeagent)\n  - [Overview"
  },
  {
    "path": "build/pom.xml",
    "chars": 9088,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  Copyright (c) 2017, MegaEase\n  All rights reserved.\n\n  Licensed under the "
  },
  {
    "path": "build/src/assembly/src.xml",
    "chars": 3364,
    "preview": "<assembly xmlns=\"http://maven.apache.org/ASSEMBLY/2.0.0\"\n          xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
  },
  {
    "path": "build/src/main/java/com/megaease/easeagent/StartBootstrap.java",
    "chars": 967,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "build/src/main/resources/agent-to-cloud_1.0.properties",
    "chars": 524,
    "preview": "# for v2.0 agent send to megacloud-v1.0 kafka topic setting\n\nplugin.observability.global.metric.topic=application-meter\n"
  },
  {
    "path": "build/src/main/resources/agent.properties",
    "chars": 16554,
    "preview": "name=demo-service\nsystem=demo-system\n### http server\n# When the enabled value = false, agent will not start the http ser"
  },
  {
    "path": "build/src/main/resources/easeagent-log4j2.xml",
    "chars": 816,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configuration status=\"WARN\">\n    <Appenders>\n        <RollingFile name=\"RollingF"
  },
  {
    "path": "build/src/main/resources/user-minimal-cfg.properties",
    "chars": 1214,
    "preview": "## This a minimal configuration required to start the EaseAgent.\n## In most cases, this is all the configuration items t"
  },
  {
    "path": "config/pom.xml",
    "chars": 2469,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright (c) 2021, MegaEase\n  ~ All rights reserved.\n  ~\n  ~ Licensed u"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/AutoRefreshConfigItem.java",
    "chars": 1062,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/CompatibilityConversion.java",
    "chars": 12085,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/ConfigAware.java",
    "chars": 787,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/ConfigFactory.java",
    "chars": 6226,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/ConfigLoader.java",
    "chars": 3234,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/ConfigManagerMXBean.java",
    "chars": 1233,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/ConfigNotifier.java",
    "chars": 2367,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/ConfigPropertiesUtils.java",
    "chars": 1978,
    "preview": "/*\n * Copyright (c) 2022, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/ConfigUtils.java",
    "chars": 7156,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/Configs.java",
    "chars": 5494,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/GlobalConfigs.java",
    "chars": 3884,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/JarFileConfigLoader.java",
    "chars": 1904,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/OtelSdkConfigs.java",
    "chars": 4608,
    "preview": "/*\n * Copyright (c) 2022, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/PluginConfig.java",
    "chars": 6833,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/PluginConfigManager.java",
    "chars": 9080,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/PluginProperty.java",
    "chars": 1853,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/PluginSourceConfig.java",
    "chars": 2899,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/ValidateUtils.java",
    "chars": 1962,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/WrappedConfigManager.java",
    "chars": 3399,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/report/ReportConfigAdapter.java",
    "chars": 14252,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/report/ReportConfigConst.java",
    "chars": 9254,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/main/java/com/megaease/easeagent/config/yaml/YamlReader.java",
    "chars": 3722,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/CompatibilityConversionTest.java",
    "chars": 4976,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/ConfigFactoryTest.java",
    "chars": 3860,
    "preview": "/*\n * Copyright (c) 2022, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/ConfigPropertiesUtilsTest.java",
    "chars": 3535,
    "preview": "/*\n * Copyright (c) 2022, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/ConfigUtilsTest.java",
    "chars": 5284,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/ConfigsTest.java",
    "chars": 3434,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/IPluginConfigConstTest.java",
    "chars": 1479,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/JarFileConfigLoaderTest.java",
    "chars": 2196,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/OtelSdkConfigsTest.java",
    "chars": 2592,
    "preview": "/*\n * Copyright (c) 2022, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/PluginConfigManagerTest.java",
    "chars": 7005,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/PluginConfigTest.java",
    "chars": 6272,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/PluginPropertyTest.java",
    "chars": 2247,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/PluginSourceConfigTest.java",
    "chars": 4449,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/ValidateUtilsTest.java",
    "chars": 2749,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/report/ReportConfigAdapterTest.java",
    "chars": 12272,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/java/com/megaease/easeagent/config/yaml/YamlReaderTest.java",
    "chars": 2466,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "config/src/test/resources/agent.properties",
    "chars": 13145,
    "preview": "name=demo-service\nsystem=demo-system\n\nuser.list=a,b\n\n### http server\n# When the enabled value = false, agent will not st"
  },
  {
    "path": "config/src/test/resources/agent.yaml",
    "chars": 11509,
    "preview": "name: test-service\nsystem: demo-system\n\nuser:\n    list:\n        - \"a\"\n        - \"b\"\n\n### http server\neaseagent:\n    serv"
  },
  {
    "path": "config/src/test/resources/user-spec.properties",
    "chars": 34,
    "preview": "name=user-spec\nsystem=system-spec\n"
  },
  {
    "path": "config/src/test/resources/user-spec2.properties",
    "chars": 36,
    "preview": "name=user-spec2\nsystem=system-spec2\n"
  },
  {
    "path": "config/src/test/resources/user.properties",
    "chars": 184,
    "preview": "name=demo-user\nsystem=demo-system\n\n## topic for kafka use\nreporter.metric.sender.topic=application-meter\n\n#reporter.metr"
  },
  {
    "path": "context/pom.xml",
    "chars": 2169,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright (c) 2021, MegaEase\n  ~ All rights reserved.\n  ~\n  ~ Licensed u"
  },
  {
    "path": "context/src/main/java/com/megaease/easeagent/context/AsyncContextImpl.java",
    "chars": 2642,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/main/java/com/megaease/easeagent/context/ContextManager.java",
    "chars": 5704,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/main/java/com/megaease/easeagent/context/GlobalContext.java",
    "chars": 1674,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/main/java/com/megaease/easeagent/context/ProgressFieldsManager.java",
    "chars": 1600,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/main/java/com/megaease/easeagent/context/RetBound.java",
    "chars": 1207,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/main/java/com/megaease/easeagent/context/SessionContext.java",
    "chars": 11008,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/main/java/com/megaease/easeagent/context/log/LoggerFactoryImpl.java",
    "chars": 1707,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/main/java/com/megaease/easeagent/context/log/LoggerImpl.java",
    "chars": 1057,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/main/java/com/megaease/easeagent/context/log/LoggerMdc.java",
    "chars": 1189,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/test/java/com/megaease/easeagent/context/AsyncContextImplTest.java",
    "chars": 4272,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/test/java/com/megaease/easeagent/context/ContextManagerTest.java",
    "chars": 2231,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/test/java/com/megaease/easeagent/context/GlobalContextTest.java",
    "chars": 1957,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/test/java/com/megaease/easeagent/context/ProgressFieldsManagerTest.java",
    "chars": 2765,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/test/java/com/megaease/easeagent/context/RetBoundTest.java",
    "chars": 1176,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/test/java/com/megaease/easeagent/context/SessionContextTest.java",
    "chars": 18401,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/test/java/com/megaease/easeagent/context/log/LoggerFactoryImplTest.java",
    "chars": 1843,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/test/java/com/megaease/easeagent/context/log/LoggerImplTest.java",
    "chars": 1061,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/test/java/com/megaease/easeagent/context/log/LoggerMdcTest.java",
    "chars": 1537,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "context/src/test/resources/log4j2.xml",
    "chars": 508,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Configuration status=\"WARN\">\n    <Appenders>\n        <Console name=\"Console\" tar"
  },
  {
    "path": "core/pom.xml",
    "chars": 5247,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  Copyright (c) 2017, MegaEase\n  All rights reserved.\n\n  Licensed under the "
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/AppendBootstrapClassLoaderSearch.java",
    "chars": 4109,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/Bootstrap.java",
    "chars": 12097,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/GlobalAgentHolder.java",
    "chars": 1969,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/config/CanaryListUpdateAgentHttpHandler.java",
    "chars": 2931,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/config/CanaryUpdateAgentHttpHandler.java",
    "chars": 1334,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/config/ConfigsUpdateAgentHttpHandler.java",
    "chars": 3103,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/config/PluginPropertiesHttpHandler.java",
    "chars": 2801,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/config/PluginPropertyHttpHandler.java",
    "chars": 3300,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/config/ServiceUpdateAgentHttpHandler.java",
    "chars": 1427,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/health/HealthProvider.java",
    "chars": 4520,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/info/AgentInfoFactory.java",
    "chars": 1858,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/info/AgentInfoProvider.java",
    "chars": 2177,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/BaseLoader.java",
    "chars": 1993,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/BridgeDispatcher.java",
    "chars": 1883,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/CommonInlineAdvice.java",
    "chars": 4108,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/Dispatcher.java",
    "chars": 2428,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/PluginLoader.java",
    "chars": 7652,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/annotation/EaseAgentInstrumented.java",
    "chars": 870,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/annotation/Index.java",
    "chars": 827,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/interceptor/InterceptorPluginDecorator.java",
    "chars": 4104,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/interceptor/ProviderChain.java",
    "chars": 2136,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/interceptor/ProviderPluginDecorator.java",
    "chars": 1727,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/matcher/ClassLoaderMatcherConvert.java",
    "chars": 3152,
    "preview": "/*\n * Copyright (c) 2022, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/matcher/ClassMatcherConvert.java",
    "chars": 5074,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/matcher/ClassTransformation.java",
    "chars": 4062,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/matcher/Converter.java",
    "chars": 737,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/matcher/MethodMatcherConvert.java",
    "chars": 6649,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/matcher/MethodTransformation.java",
    "chars": 3417,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/registry/AdviceRegistry.java",
    "chars": 8956,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/registry/PluginRegistry.java",
    "chars": 7271,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/transformer/AnnotationTransformer.java",
    "chars": 4040,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/transformer/CompoundPluginTransformer.java",
    "chars": 2039,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/transformer/DynamicFieldAdvice.java",
    "chars": 1852,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/transformer/DynamicFieldTransformer.java",
    "chars": 4058,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/transformer/ForAdviceTransformer.java",
    "chars": 3176,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/transformer/TypeFieldTransformer.java",
    "chars": 2948,
    "preview": "package com.megaease.easeagent.core.plugin.transformer;\n\nimport com.google.common.cache.Cache;\nimport com.google.common."
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/transformer/advice/AgentAdvice.java",
    "chars": 530534,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/transformer/advice/AgentForAdvice.java",
    "chars": 10417,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/transformer/advice/AgentJavaConstantValue.java",
    "chars": 1942,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/transformer/advice/BypassMethodVisitor.java",
    "chars": 1107,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/transformer/advice/MethodIdentityJavaConstant.java",
    "chars": 1317,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/plugin/transformer/classloader/CompoundClassloader.java",
    "chars": 1868,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/utils/AgentArray.java",
    "chars": 6040,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/utils/ContextUtils.java",
    "chars": 3144,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/utils/JsonUtil.java",
    "chars": 2234,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/utils/MutableObject.java",
    "chars": 2913,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/utils/ServletUtils.java",
    "chars": 3730,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/java/com/megaease/easeagent/core/utils/TextUtils.java",
    "chars": 1477,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/main/resources/META-INF/services/com.megaease.easeagent.plugin.bean.BeanProvider",
    "chars": 101,
    "preview": "com.megaease.easeagent.core.health.HealthProvider\ncom.megaease.easeagent.core.info.AgentInfoProvider\n"
  },
  {
    "path": "core/src/main/resources/version.txt",
    "chars": 19,
    "preview": "${project.version}\n"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/AppendBootstrapClassLoaderSearchTest.java",
    "chars": 1454,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/BootstrapTest.java",
    "chars": 4780,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/HttpServerTest.java",
    "chars": 11793,
    "preview": "/*\n * Copyright (c) 2017, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/info/AgentInfoFactoryTest.java",
    "chars": 1201,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/instrument/ClinitMethodTransformTest.java",
    "chars": 5869,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/instrument/NewInstanceMethodTransformTest.java",
    "chars": 6373,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/instrument/NonStaticMethodTransformTest.java",
    "chars": 5387,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/instrument/OrchestrationTransformTest.java",
    "chars": 5409,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/instrument/StaticMethodTransformTest.java",
    "chars": 6665,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/instrument/TestContext.java",
    "chars": 862,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/instrument/TestPlugin.java",
    "chars": 936,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/instrument/TransformTestBase.java",
    "chars": 5882,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/matcher/ClassLoaderMatcherTest.java",
    "chars": 2894,
    "preview": "/*\n * Copyright (c) 2022, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/matcher/ClassMatcherTest.java",
    "chars": 3230,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/matcher/MethodMatcherTest.java",
    "chars": 4841,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/plugin/PluginLoaderTest.java",
    "chars": 3093,
    "preview": "package com.megaease.easeagent.core.plugin;\n\nimport com.megaease.easeagent.config.Configs;\nimport com.megaease.easeagent"
  },
  {
    "path": "core/src/test/java/com/megaease/easeagent/core/utils/AgentAttachmentRule.java",
    "chars": 3175,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "doc/add-plugin-demo.md",
    "chars": 3761,
    "preview": "# Add Plugin Demo\n\nYou need Java 1.8+ and easeagent:\n\nIf you don't already have easeagent, get it and set $EASE_AGENT_PA"
  },
  {
    "path": "doc/benchmark.md",
    "chars": 12059,
    "preview": "# Benchmark\nWe use [spring-petclinic applications](https://github.com/spring-petclinic/spring-petclinic-microservices) a"
  },
  {
    "path": "doc/context.md",
    "chars": 17618,
    "preview": "#  Context\n\nBetween plugin and plugin, there is data transfer, such as jdbc uri, span and key, etc.\n\nIn order to solve t"
  },
  {
    "path": "doc/criteria-for-configuring-priorities.md",
    "chars": 2095,
    "preview": "# Criteria For Configuring Priorities\n\nIn EaseAgent, there are the configuration of global variables and the configurati"
  },
  {
    "path": "doc/development-guide.md",
    "chars": 34836,
    "preview": "# Plugin Development Guide\n- [Plugin Development Guide](#plugin-development-guide)\n  - [Overview](#overview)\n    - [Arch"
  },
  {
    "path": "doc/how-to-use/megacloud-config.md",
    "chars": 1916,
    "preview": "### First: Download and install the agent\n[see our doc](https://github.com/megaease/easeagent#get-and-set-environment-va"
  },
  {
    "path": "doc/how-to-use/use-in-docker.md",
    "chars": 834,
    "preview": "# Get the agent\n\nDownload the agent, [see our doc](https://github.com/megaease/easeagent#get-and-set-environment-variabl"
  },
  {
    "path": "doc/how-to-use/use-on-host.md",
    "chars": 2708,
    "preview": "# Install the agent\n\nDownload the agent, [see our doc](https://github.com/megaease/easeagent#get-and-set-environment-var"
  },
  {
    "path": "doc/matcher-DSL.md",
    "chars": 10163,
    "preview": "# Matcher DSL\n- [Overview](#Overview)\n- [ClassMatcher](#ClassMatcher)\n- [MethodMatcher](#MethodMatcher)\n\n## Overview\nEas"
  },
  {
    "path": "doc/metric-api.md",
    "chars": 27042,
    "preview": "# Metric API\n\nIn Easeagent, Metric is inspired by Dropwizard, but Dropwizard is just the basis of Metric.\n\nThe use of ti"
  },
  {
    "path": "doc/plugin-unit-test.md",
    "chars": 5294,
    "preview": "# Plugin Unit Test\n\nThis guide walks you through the process of unit testing a Plugin with Mock.\n\n## Add Mock jar\n\nFor M"
  },
  {
    "path": "doc/prometheus-metric-schedule.md",
    "chars": 59420,
    "preview": "# Prometheus Metric Schedule\n\nPrometheus Exports Rules: [Prometheus Exports](./metric-api.md#7prometheusexports)\n\n## Com"
  },
  {
    "path": "doc/report-development-guide.md",
    "chars": 11,
    "preview": "# \nToDo...\n"
  },
  {
    "path": "doc/spring-boot-3.x.x-demo.md",
    "chars": 3620,
    "preview": "# Spring Boot 3.5.3 Demo\n\nYou need Java 17+, Maven 3.9.10 and easeagent:\n\nIf you don't already have easeagent, get it an"
  },
  {
    "path": "doc/spring-boot-upgrade.md",
    "chars": 2491,
    "preview": "# Spring Boot upgrade\n\n## Background\n\nDifferent versions of spring-boot may use different technologies, depend on differ"
  },
  {
    "path": "doc/spring-petclinic-demo.md",
    "chars": 3708,
    "preview": "# Spring Petclinic Demo\n\nYou need Java 1.8+ and easeagent:\n\nIf you haven't `easeagent`, get it and set $EASE_AGENT_PATH:"
  },
  {
    "path": "doc/tracing-api.md",
    "chars": 10028,
    "preview": "#  Tracing API\n\nIn Easeagent, Tracing is inspired by Dapper, using Zipkin as the implementation, but Dapper is only the "
  },
  {
    "path": "doc/user-manual.md",
    "chars": 90489,
    "preview": "\n# User Manual\n\n- [User Manual](#user-manual)\n  - [Configuration](#configuration)\n    - [Getting the configuration file]"
  },
  {
    "path": "httpserver/pom.xml",
    "chars": 2283,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n  ~ Copyright (c) 2021, MegaEase\n  ~ All rights reserved.\n  ~\n  ~ Licensed u"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/HttpRequest.java",
    "chars": 959,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/HttpResponse.java",
    "chars": 830,
    "preview": "/*\n *   Copyright (c) 2017, MegaEase\n *   All rights reserved.\n *\n *   Licensed under the Apache License, Version 2.0 (t"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/IHttpHandler.java",
    "chars": 882,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/IHttpServer.java",
    "chars": 832,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/jdk/AgentHttpServerV2.java",
    "chars": 2017,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/jdk/RootContextHandler.java",
    "chars": 3044,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/jdk/UriResource.java",
    "chars": 4866,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nano/AgentHttpHandler.java",
    "chars": 2746,
    "preview": "/*\n *   Copyright (c) 2017, MegaEase\n *   All rights reserved.\n *\n *   Licensed under the Apache License, Version 2.0 (t"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nano/AgentHttpHandlerProvider.java",
    "chars": 815,
    "preview": "/*\n *   Copyright (c) 2017, MegaEase\n *   All rights reserved.\n *\n *   Licensed under the Apache License, Version 2.0 (t"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nano/AgentHttpServer.java",
    "chars": 1561,
    "preview": "/*\n *   Copyright (c) 2017, MegaEase\n *   All rights reserved.\n *\n *   Licensed under the Apache License, Version 2.0 (t"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/ClientHandler.java",
    "chars": 4521,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/HTTPSession.java",
    "chars": 28390,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/IHTTPSession.java",
    "chars": 3696,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/NanoHTTPD.java",
    "chars": 23931,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/ServerRunnable.java",
    "chars": 3926,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/content/ContentType.java",
    "chars": 4875,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/content/Cookie.java",
    "chars": 3488,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/content/CookieHandler.java",
    "chars": 4906,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/request/Method.java",
    "chars": 2910,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/response/ChunkedOutputStream.java",
    "chars": 3349,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/response/IStatus.java",
    "chars": 2389,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/response/Response.java",
    "chars": 15592,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/response/Status.java",
    "chars": 4753,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/sockets/DefaultServerSocketFactory.java",
    "chars": 2701,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/sockets/SecureServerSocketFactory.java",
    "chars": 3476,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/tempfiles/DefaultTempFile.java",
    "chars": 3453,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/tempfiles/DefaultTempFileManager.java",
    "chars": 3799,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/tempfiles/DefaultTempFileManagerFactory.java",
    "chars": 2633,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/tempfiles/ITempFile.java",
    "chars": 2659,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/tempfiles/ITempFileManager.java",
    "chars": 2640,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/threading/DefaultAsyncRunner.java",
    "chars": 3880,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  },
  {
    "path": "httpserver/src/main/java/com/megaease/easeagent/httpserver/nanohttpd/protocols/http/threading/IAsyncRunner.java",
    "chars": 2592,
    "preview": "/*\n * Copyright (c) 2021, MegaEase\n * All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Li"
  }
]

// ... and 1154 more files (download for full content)

About this extraction

This page contains the full source code of the megaease/easeagent GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1354 files (4.6 MB), approximately 1.3M tokens, and a symbol index with 9025 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!