From 4fe9047d116bc0a2afabd587d3979a475f3eb134 Mon Sep 17 00:00:00 2001 From: xuekang <914468783@qq.com> Date: 星期五, 10 五月 2024 20:44:48 +0800 Subject: [PATCH] 初始化 --- ruoyi-visual/ruoyi-monitor/src/main/resources/logback-plus.xml | 28 ++++ ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/RuoYiMonitorApplication.java | 17 ++ ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/notifier/CustomNotifier.java | 43 ++++++ ruoyi-visual/ruoyi-monitor/src/main/resources/application.yml | 31 ++++ ruoyi-visual/ruoyi-monitor/src/main/resources/banner.txt | 10 + ruoyi-visual/ruoyi-monitor/Dockerfile | 17 ++ ruoyi-visual/ruoyi-monitor/pom.xml | 74 ++++++++++ ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/AdminServerConfig.java | 31 ++++ ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/WebSecurityConfigurer.java | 56 ++++++++ ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/controller/PrometheusController.java | 67 +++++++++ 10 files changed, 374 insertions(+), 0 deletions(-) diff --git a/ruoyi-visual/ruoyi-monitor/Dockerfile b/ruoyi-visual/ruoyi-monitor/Dockerfile new file mode 100644 index 0000000..b335488 --- /dev/null +++ b/ruoyi-visual/ruoyi-monitor/Dockerfile @@ -0,0 +1,17 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/monitor/logs + +WORKDIR /ruoyi/monitor + +ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="" + +EXPOSE 9100 + +ADD ./target/ruoyi-monitor.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} diff --git a/ruoyi-visual/ruoyi-monitor/pom.xml b/ruoyi-visual/ruoyi-monitor/pom.xml new file mode 100644 index 0000000..7591c53 --- /dev/null +++ b/ruoyi-visual/ruoyi-monitor/pom.xml @@ -0,0 +1,74 @@ +<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> + <groupId>org.dromara</groupId> + <artifactId>ruoyi-visual</artifactId> + <version>${revision}</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>ruoyi-monitor</artifactId> + + <description> + ruoyi-monitor鐩戞帶涓績 + </description> + + <dependencies> + + <!-- SpringBoot Admin --> + <dependency> + <groupId>de.codecentric</groupId> + <artifactId>spring-boot-admin-starter-server</artifactId> + <version>${spring-boot-admin.version}</version> + </dependency> + + <!-- SpringCloud Alibaba Nacos --> + <dependency> + <groupId>com.alibaba.cloud</groupId> + <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> + </dependency> + + <!-- SpringCloud Alibaba Nacos Config --> + <dependency> + <groupId>com.alibaba.cloud</groupId> + <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> + </dependency> + + <dependency> + <groupId>org.dromara</groupId> + <artifactId>ruoyi-common-web</artifactId> + </dependency> + + <!-- Spring Security --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-security</artifactId> + </dependency> + + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + </dependency> + + </dependencies> + + <build> + <finalName>${project.artifactId}</finalName> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <version>${spring-boot.version}</version> + <executions> + <execution> + <goals> + <goal>repackage</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + +</project> diff --git a/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/RuoYiMonitorApplication.java b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/RuoYiMonitorApplication.java new file mode 100644 index 0000000..088098a --- /dev/null +++ b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/RuoYiMonitorApplication.java @@ -0,0 +1,17 @@ +package org.dromara.modules.monitor; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * 鐩戞帶涓績 + * + * @author ruoyi + */ +@SpringBootApplication +public class RuoYiMonitorApplication { + public static void main(String[] args) { + SpringApplication.run(RuoYiMonitorApplication.class, args); + System.out.println("(鈾モ棤鈥库棤)锞夛緸 鐩戞帶涓績鍚姩鎴愬姛 醿�(麓凇`醿�)锞� "); + } +} diff --git a/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/AdminServerConfig.java b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/AdminServerConfig.java new file mode 100644 index 0000000..6d68c5e --- /dev/null +++ b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/AdminServerConfig.java @@ -0,0 +1,31 @@ +package org.dromara.modules.monitor.config; + +import de.codecentric.boot.admin.server.config.EnableAdminServer; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration; +import org.springframework.boot.task.TaskExecutorBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; + +/** + * springboot-admin server閰嶇疆绫� + * + * @author Lion Li + */ +@Configuration +@EnableAdminServer +public class AdminServerConfig { + + @Lazy + @Bean(name = TaskExecutionAutoConfiguration.APPLICATION_TASK_EXECUTOR_BEAN_NAME) + @ConditionalOnMissingBean(Executor.class) + public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) { + return builder.build(); + } + + +} diff --git a/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/WebSecurityConfigurer.java b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/WebSecurityConfigurer.java new file mode 100644 index 0000000..686200b --- /dev/null +++ b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/config/WebSecurityConfigurer.java @@ -0,0 +1,56 @@ +package org.dromara.modules.monitor.config; + +import de.codecentric.boot.admin.server.config.AdminServerProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +/** + * admin 鐩戞帶 瀹夊叏閰嶇疆 + * + * @author Lion Li + */ +@EnableWebSecurity +@Configuration +public class WebSecurityConfigurer { + + private final String adminContextPath; + + public WebSecurityConfigurer(AdminServerProperties adminServerProperties) { + this.adminContextPath = adminServerProperties.getContextPath(); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { + SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); + successHandler.setTargetUrlParameter("redirectTo"); + successHandler.setDefaultTargetUrl(adminContextPath + "/"); + + return httpSecurity + .headers((header) -> + header.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) + .authorizeHttpRequests((authorize) -> + authorize.requestMatchers( + new AntPathRequestMatcher(adminContextPath + "/assets/**"), + new AntPathRequestMatcher(adminContextPath + "/login"), + new AntPathRequestMatcher("/actuator"), + new AntPathRequestMatcher("/actuator/**") + ).permitAll() + .anyRequest().authenticated()) + .formLogin((formLogin) -> + formLogin.loginPage(adminContextPath + "/login").successHandler(successHandler)) + .logout((logout) -> + logout.logoutUrl(adminContextPath + "/logout")) + .httpBasic(Customizer.withDefaults()) + .csrf(AbstractHttpConfigurer::disable) + .build(); + } + +} diff --git a/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/controller/PrometheusController.java b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/controller/PrometheusController.java new file mode 100644 index 0000000..300b5df --- /dev/null +++ b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/controller/PrometheusController.java @@ -0,0 +1,67 @@ +package org.dromara.modules.monitor.controller; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 瀵规帴 prometheus + * + * @author Lion Li + */ +@Slf4j +@RestController +@RequestMapping("/actuator/prometheus") +public class PrometheusController { + + @Autowired + private DiscoveryClient discoveryClient; + + /** + * 浠庢敞鍐屼腑蹇冭幏鍙栨墍鏈夋湇鍔$粍瑁呮垚 prometheus 鐨勬暟鎹粨鏋� + */ + @GetMapping("/sd") + public List<Map<String, Object>> sd() { + List<String> services = discoveryClient.getServices(); + if (services == null || services.isEmpty()) { + return new ArrayList<>(0); + } + List<Map<String, Object>> list = new ArrayList<>(); + for (String service : services) { + List<ServiceInstance> instances = discoveryClient.getInstances(service); + List<String> targets = instances.stream().map(i -> i.getHost() + ":" + i.getPort()).collect(Collectors.toList()); + + Map<String, String> labels = new HashMap<>(2); + // 鏁版嵁鏉ユ簮(鍖哄垎寮傚湴浣跨敤) + // labels.put("__meta_datacenter", "beijing"); + // 鏈嶅姟鍚� + labels.put("__meta_prometheus_job", service); + Map<String, Object> group = new HashMap<>(2); + group.put("targets", targets); + group.put("labels", labels); + list.add(group); + } + return list; + } + + /** + * 鎺ユ敹 prometheus 鎶ヨ娑堟伅 + * + * @param message 娑堟伅浣� + */ + @PostMapping("/alerts") + public ResponseEntity<Void> alerts(@RequestBody String message) { + log.info("[prometheus] alert =>" + message); + return ResponseEntity.ok().build(); + } + +} diff --git a/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/notifier/CustomNotifier.java b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/notifier/CustomNotifier.java new file mode 100644 index 0000000..165e28e --- /dev/null +++ b/ruoyi-visual/ruoyi-monitor/src/main/java/org/dromara/modules/monitor/notifier/CustomNotifier.java @@ -0,0 +1,43 @@ +package org.dromara.modules.monitor.notifier; + +import de.codecentric.boot.admin.server.domain.entities.Instance; +import de.codecentric.boot.admin.server.domain.entities.InstanceRepository; +import de.codecentric.boot.admin.server.domain.events.InstanceEvent; +import de.codecentric.boot.admin.server.domain.events.InstanceStatusChangedEvent; +import de.codecentric.boot.admin.server.domain.values.InstanceId; +import de.codecentric.boot.admin.server.notify.AbstractEventNotifier; +import io.micrometer.core.lang.NonNullApi; +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; + +/** + * 鑷畾涔変簨浠堕�氱煡澶勭悊 + * + * @author Lion Li + */ +@Slf4j +@Component +public class CustomNotifier extends AbstractEventNotifier { + + protected CustomNotifier(InstanceRepository repository) { + super(repository); + } + + @Override + @SuppressWarnings("all") + protected Mono<Void> doNotify(InstanceEvent event, Instance instance) { + return Mono.fromRunnable(() -> { + // 瀹炰緥鐘舵�佹敼鍙樹簨浠� + if (event instanceof InstanceStatusChangedEvent) { + String registName = instance.getRegistration().getName(); + String instanceId = event.getInstance().getValue(); + String status = ((InstanceStatusChangedEvent) event).getStatusInfo().getStatus(); + log.info("Instance Status Change: [{}],[{}],[{}]", registName, instanceId, status); + } + + }); + } + +} diff --git a/ruoyi-visual/ruoyi-monitor/src/main/resources/application.yml b/ruoyi-visual/ruoyi-monitor/src/main/resources/application.yml new file mode 100644 index 0000000..fe8b357 --- /dev/null +++ b/ruoyi-visual/ruoyi-monitor/src/main/resources/application.yml @@ -0,0 +1,31 @@ +# Tomcat +server: + port: 9100 + +# Spring +spring: + application: + # 搴旂敤鍚嶇О + name: ruoyi-monitor + profiles: + # 鐜閰嶇疆 + active: @profiles.active@ + +--- # nacos 閰嶇疆 +spring: + cloud: + nacos: + # nacos 鏈嶅姟鍦板潃 + server-addr: @nacos.server@ + discovery: + # 娉ㄥ唽缁� + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 閰嶇疆缁� + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:application-common.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-visual/ruoyi-monitor/src/main/resources/banner.txt b/ruoyi-visual/ruoyi-monitor/src/main/resources/banner.txt new file mode 100644 index 0000000..ecaf8a4 --- /dev/null +++ b/ruoyi-visual/ruoyi-monitor/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} + _ _ _ + (_) (_)| | + _ __ _ _ ___ _ _ _ ______ _ __ ___ ___ _ __ _ | |_ ___ _ __ +| '__|| | | | / _ \ | | | || ||______|| '_ ` _ \ / _ \ | '_ \ | || __| / _ \ | '__| +| | | |_| || (_) || |_| || | | | | | | || (_) || | | || || |_ | (_) || | +|_| \__,_| \___/ \__, ||_| |_| |_| |_| \___/ |_| |_||_| \__| \___/ |_| + __/ | + |___/ \ No newline at end of file diff --git a/ruoyi-visual/ruoyi-monitor/src/main/resources/logback-plus.xml b/ruoyi-visual/ruoyi-monitor/src/main/resources/logback-plus.xml new file mode 100644 index 0000000..caaa345 --- /dev/null +++ b/ruoyi-visual/ruoyi-monitor/src/main/resources/logback-plus.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration scan="true" scanPeriod="60 seconds" debug="false"> + <!-- 鏃ュ織瀛樻斁璺緞 --> + <property name="log.path" value="logs/${project.artifactId}" /> + <!-- 鏃ュ織杈撳嚭鏍煎紡 --> + <property name="console.log.pattern" + value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/> + + <!-- 鎺у埗鍙拌緭鍑� --> + <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>${console.log.pattern}</pattern> + <charset>utf-8</charset> + </encoder> + </appender> + + <include resource="logback-common.xml" /> + + <include resource="logback-logstash.xml" /> + + <!-- 寮�鍚� skywalking 鏃ュ織鏀堕泦 --> + <include resource="logback-skylog.xml" /> + + <!--绯荤粺鎿嶄綔鏃ュ織--> + <root level="info"> + <appender-ref ref="console" /> + </root> +</configuration> -- Gitblit v1.9.1