All Downloads are FREE. Search and download functionalities are using the official Maven repository.

club.zhcs.lina.starter.apm.APMConfiguration Maven / Gradle / Ivy

package club.zhcs.lina.starter.apm;

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 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;
import jakarta.servlet.http.HttpServletRequest;

/**
 * 
 * @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
    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