
club.zhcs.lina.starter.apm.APMConfiguration Maven / Gradle / Ivy
package club.zhcs.lina.starter.apm;
import javax.servlet.http.HttpServletRequest;
import org.springframework.aop.Pointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean;
import org.springframework.http.server.reactive.ServerHttpRequest;
import club.zhcs.lina.apm.APMInterceptor;
import club.zhcs.lina.apm.APMPointcut;
import club.zhcs.lina.apm.URLProvider;
import club.zhcs.lina.apm.UserCollector;
import club.zhcs.lina.apm.event.APMEventListener;
import club.zhcs.lina.apm.event.DefaultLogAPMEventListener;
import club.zhcs.lina.apm.event.WechatWorkRobotAPMEventListener;
import club.zhcs.lina.starter.apm.APMConfigurationProerties.Pointcut.Mode;
/**
*
* @author Kerbores([email protected])
*
*/
@AutoConfiguration
@ConditionalOnExpression("${lina.apm.enabled:true}")
@EnableConfigurationProperties(APMConfigurationProerties.class)
public class APMConfiguration {
@Bean
@ConditionalOnProperty(prefix = "lina.apm.listener.wechat", name = "webhook", matchIfMissing = false)
APMEventListener wechatWorkRobotAPMEventListener(APMConfigurationProerties config) {
return WechatWorkRobotAPMEventListener.builder().webhook(config.getListener().getWechat().getWebhook()).build();
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnExpression("${lina.apm.listener.default-log-enabled:true}")
APMEventListener defaultLogAPMEventListener(@Value("${spring.application.name}") String application) {
return new DefaultLogAPMEventListener(application);
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnWebApplication(type = Type.SERVLET)
URLProvider urlProvider(HttpServletRequest request) {
return request::getRequestURI;
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnWebApplication(type = Type.REACTIVE)
URLProvider reactiveUrlProvider(ServerHttpRequest request) {
return () -> request.getURI().toString();
}
@Bean
@ConditionalOnMissingBean
UserCollector userCollector() {
return () -> null;
}
@Bean
Pointcut apmPointcut(APMConfigurationProerties config) {
APMPointcut apmPointcut = new APMPointcut();
String execution = config.getPointcut().getMode() != Mode.CUSTOMER ? config.getPointcut().getMode().getExecution()
: config.getPointcut().getExecution();
apmPointcut.setExpression(execution);
return apmPointcut;
}
@Bean
APMInterceptor apmInterceptor(ApplicationEventPublisher applicationEventPublisher, UserCollector collector, URLProvider urlProvider) {
return new APMInterceptor(applicationEventPublisher, collector, urlProvider);
}
@Bean
DefaultPointcutAdvisor apmPointcutAdvisor(Pointcut apmPointcut, APMInterceptor apmInterceptor) {
DefaultPointcutAdvisor apmPointcutAdvisor = new DefaultPointcutAdvisor();
apmPointcutAdvisor.setPointcut(apmPointcut);
apmPointcutAdvisor.setAdvice(apmInterceptor);
return apmPointcutAdvisor;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy