Ver Fonte

接入Prometheus + Grafana搭建webchat基于网关的运维数据指标监控平台

wangqi49 há 3 meses atrás
pai
commit
21b1f50af7
20 ficheiros alterados com 160 adições e 9 exclusões
  1. 1 1
      webchat-act/src/main/java/com/webchat/gateway/WebchatPGCApplication.java
  2. 1 1
      webchat-act/src/main/java/com/webchat/gateway/controller/TestController.java
  3. 0 1
      webchat-aigc/src/main/resources/application.properties
  4. 1 0
      webchat-aigc/src/main/resources/application.yml
  5. 21 0
      webchat-aigc/src/main/resources/bootstrap.yml
  6. 8 0
      webchat-gateway/pom.xml
  7. 3 1
      webchat-gateway/src/main/java/com/webchat/gateway/WebchatGatewayApplication.java
  8. 99 0
      webchat-gateway/src/main/java/com/webchat/gateway/filter/GatewayMetricsFilter.java
  9. 1 1
      webchat-gateway/src/main/resources/application.yml
  10. 1 1
      webchat-gateway/target/classes/application.yml
  11. BIN
      webchat-gateway/target/classes/com/webchat/gateway/WebchatGatewayApplication.class
  12. BIN
      webchat-gateway/target/classes/com/webchat/gateway/filter/GatewayMetricsFilter.class
  13. 1 1
      webchat-pgc/src/main/java/com/webchat/gateway/WebchatPGCApplication.java
  14. 1 1
      webchat-pgc/src/main/java/com/webchat/gateway/controller/TestController.java
  15. BIN
      webchat-pgc/target/classes/com/webchat/gateway/WebchatPGCApplication.class
  16. BIN
      webchat-pgc/target/classes/com/webchat/gateway/controller/TestController.class
  17. 0 1
      webchat-ugc/src/main/resources/application.properties
  18. 1 0
      webchat-ugc/src/main/resources/application.yml
  19. 21 0
      webchat-ugc/src/main/resources/bootstrap.yml
  20. BIN
      webchat-user/target/classes/com/webchat/user/controller/UserServiceController.class

+ 1 - 1
webchat-act/src/main/java/com/webchat/pgc/WebchatPGCApplication.java → webchat-act/src/main/java/com/webchat/gateway/WebchatPGCApplication.java

@@ -1,4 +1,4 @@
-package com.webchat.pgc;
+package com.webchat.gateway;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;

+ 1 - 1
webchat-act/src/main/java/com/webchat/pgc/controller/TestController.java → webchat-act/src/main/java/com/webchat/gateway/controller/TestController.java

@@ -1,4 +1,4 @@
-package com.webchat.pgc.controller;
+package com.webchat.gateway.controller;
 
 import com.webchat.common.bean.APIResponseBean;
 import com.webchat.common.bean.APIResponseBeanUtil;

+ 0 - 1
webchat-aigc/src/main/resources/application.properties

@@ -1 +0,0 @@
-spring.application.name=webchat-aigc

+ 1 - 0
webchat-aigc/src/main/resources/application.yml

@@ -0,0 +1 @@
+server:
  port: 8019

+ 21 - 0
webchat-aigc/src/main/resources/bootstrap.yml

@@ -0,0 +1,21 @@
+spring:
+  application:
+    name: webchat-aigc-service
+  profiles:
+    active: dev
+  cloud:
+    nacos:
+      config:
+        server-addr: 127.0.0.1:8848
+        namespace: 2cdfb8e3-f127-4020-93df-2d4c3dc805b5
+        file-extension: yaml
+        group: DEFAULT_GROUP
+        refresh-enabled: true
+      discovery:
+        server-addr: 127.0.0.1:8848
+        namespace: 2cdfb8e3-f127-4020-93df-2d4c3dc805b5
+    sentinel:
+      transport:
+        port: 8719
+        dashboard: 127.0.0.1:8080
+      eager: true

+ 8 - 0
webchat-gateway/pom.xml

@@ -37,6 +37,14 @@
             <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
             <version>2023.0.1.2</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-registry-prometheus</artifactId>
+        </dependency>
 
     </dependencies>
     <build>

+ 3 - 1
webchat-gateway/src/main/java/com/webchat/pgc/WebchatGatewayApplication.java → webchat-gateway/src/main/java/com/webchat/gateway/WebchatGatewayApplication.java

@@ -1,8 +1,10 @@
-package com.webchat.pgc;
+package com.webchat.gateway;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.ComponentScan;
 
 @SpringBootApplication
 @EnableDiscoveryClient

+ 99 - 0
webchat-gateway/src/main/java/com/webchat/gateway/filter/GatewayMetricsFilter.java

@@ -0,0 +1,99 @@
+package com.webchat.gateway.filter;
+
+import io.micrometer.core.instrument.Counter;
+import java.time.Duration;
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
+import io.micrometer.core.instrument.Timer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.cloud.gateway.route.Route;
+import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
+import org.springframework.core.Ordered;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+@Component
+public class GatewayMetricsFilter implements GlobalFilter, Ordered {
+
+    private static final Logger logger = LoggerFactory.getLogger(GatewayMetricsFilter.class);
+
+    private final MeterRegistry meterRegistry;
+
+    public GatewayMetricsFilter(MeterRegistry meterRegistry) {
+        this.meterRegistry = meterRegistry;
+    }
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
+        if (route == null) {
+            logger.warn("Failed to get routeId for the request");
+            return chain.filter(exchange);
+        }
+        String routeId = route.getId();
+        // 创建或获取计数器,用于统计请求数量
+        Counter requestCounter = meterRegistry.counter("gateway_requests_total", "route", routeId);
+        requestCounter.increment();
+        // 创建或获取计时器,用于统计请求耗时
+        Timer.Sample timerSample = Timer.start(meterRegistry);
+        // 创建或获取计数器,用于统计请求错误数量
+        Counter errorCounter = meterRegistry.counter("gateway_requests_error_total", "route", routeId);
+        // 存储请求开始时的时间,用于计算请求带宽
+        long startTime = System.currentTimeMillis();
+        long requestSize = 0;
+        if (exchange.getRequest().getHeaders()!= null) {
+            requestSize = exchange.getRequest().getHeaders().getContentLength();
+        } else {
+            requestSize = 0;
+        }
+        long finalRequestSize = requestSize;
+        return chain.filter(exchange)
+                .doFinally(signalType -> {
+                    try {
+                        // 计算请求耗时
+                        long durationNanos = timerSample.stop(
+                                Timer.builder("gateway_request_duration")
+                                        .tags(Tags.of("route", routeId))
+                                        .register(meterRegistry));
+                        // 记录请求耗时
+                        meterRegistry.timer("gateway_request_duration", Tags.of("route", routeId))
+                                .record(Duration.ofNanos(durationNanos));
+                        // 获取 HTTP 状态码
+                        HttpStatus statusCode = (HttpStatus) exchange.getResponse().getStatusCode();
+                        if (statusCode!= null) {
+                            // 创建或获取计数器,用于统计不同状态码的请求数量
+                            Counter statusCodeCounter = meterRegistry.counter("gateway_requests_status",
+                                    Tags.of("route", routeId, "status", statusCode.value() + ""));
+                            statusCodeCounter.increment();
+                            // 检查是否为错误状态码,如果是,增加错误计数器
+                            if (statusCode.isError()) {
+                                errorCounter.increment();
+                            }
+                        }
+                        // 计算请求带宽
+                        long endTime = System.currentTimeMillis();
+                        long responseSize = 0;
+                        if (exchange.getResponse().getHeaders()!= null) {
+                            responseSize = exchange.getResponse().getHeaders().getContentLength();
+                        }
+                        long totalSize = finalRequestSize + responseSize;
+                        double bandwidth = (double) totalSize / (endTime - startTime);
+                        // 创建或获取计数器,用于统计请求带宽
+                        Counter bandwidthCounter = meterRegistry.counter("gateway_request_bandwidth", "route", routeId);
+                        bandwidthCounter.increment(bandwidth);
+                    } catch (Exception e) {
+                        logger.error("Failed to record metrics for request", e);
+                    }
+                });
+    }
+
+    @Override
+    public int getOrder() {
+        return Ordered.LOWEST_PRECEDENCE;
+    }
+}

+ 1 - 1
webchat-gateway/src/main/resources/application.yml

@@ -1 +1 @@
-server:
  port: 80
spring:
  main:
    web-application-type: reactive
  cloud:
    gateway:
      routes:
        - id: webchat-connect-service
          uri: lb://webchat-connect-service
          predicates:
            - Path=/connect-service/**
        - id: webchat-user-service
          uri: lb://webchat-user-service
          predicates:
            - Path=/user-service/**
        - id: webchat-pgc-service
          uri: lb://webchat-pgc-service
          predicates:
            - Path=/pgc-service/**
    sentinel:
      transport:
        port: 8719
        dashboard: 127.0.0.1:8080
      scg:
        fallback:
          mode: response
          response-status: 429
          response-body: '{"code":429,"message":"被限流了!"}'
      eager: true
+server:
  port: 8088
spring:
  main:
    web-application-type: reactive
  cloud:
    gateway:
      metrics:
        enabled: true
      routes:
        - id: webchat-connect-service
          uri: lb://webchat-connect-service
          predicates:
            - Path=/connect-service/**
        - id: webchat-user-service
          uri: lb://webchat-user-service
          predicates:
            - Path=/user-service/**
        - id: webchat-pgc-service
          uri: lb://webchat-pgc-service
          predicates:
            - Path=/pgc-service/**
        - id: webchat-ugc-service
          uri: lb://webchat-ugc-service
          predicates:
            - Path=/ugc-service/**
        - id: webchat-aigc-service
          uri: lb://webchat-aigc-service
          predicates:
            - Path=/aigc-service/**
    sentinel:
      transport:
        port: 8719
        dashboard: 127.0.0.1:8080
      scg:
        fallback:
          mode: response
          response-status: 429
          response-body: '{"code":429,"message":"被限流了!"}'
      eager: true

management:
  endpoints:
    web:
      exposure:
        include: "prometheus"
  metrics:
    tags:
      application: ${spring.application.name}  # 为所有指标添加应用名称标签

+ 1 - 1
webchat-gateway/target/classes/application.yml

@@ -1 +1 @@
-server:
  port: 80
spring:
  main:
    web-application-type: reactive
  cloud:
    gateway:
      routes:
        - id: webchat-connect-service
          uri: lb://webchat-connect-service
          predicates:
            - Path=/connect-service/**
        - id: webchat-user-service
          uri: lb://webchat-user-service
          predicates:
            - Path=/user-service/**
        - id: webchat-pgc-service
          uri: lb://webchat-pgc-service
          predicates:
            - Path=/pgc-service/**
    sentinel:
      transport:
        port: 8719
        dashboard: 127.0.0.1:8080
      scg:
        fallback:
          mode: response
          response-status: 429
          response-body: '{"code":429,"message":"被限流了!"}'
      eager: true
+server:
  port: 8088
spring:
  main:
    web-application-type: reactive
  cloud:
    gateway:
      metrics:
        enabled: true
      routes:
        - id: webchat-connect-service
          uri: lb://webchat-connect-service
          predicates:
            - Path=/connect-service/**
        - id: webchat-user-service
          uri: lb://webchat-user-service
          predicates:
            - Path=/user-service/**
        - id: webchat-pgc-service
          uri: lb://webchat-pgc-service
          predicates:
            - Path=/pgc-service/**
    sentinel:
      transport:
        port: 8719
        dashboard: 127.0.0.1:8080
      scg:
        fallback:
          mode: response
          response-status: 429
          response-body: '{"code":429,"message":"被限流了!"}'
      eager: true

management:
  endpoints:
    web:
      exposure:
        include: "prometheus"
  metrics:
    tags:
      application: ${spring.application.name}  # 为所有指标添加应用名称标签

BIN
webchat-gateway/target/classes/com/webchat/pgc/WebchatGatewayApplication.class → webchat-gateway/target/classes/com/webchat/gateway/WebchatGatewayApplication.class


BIN
webchat-gateway/target/classes/com/webchat/gateway/filter/GatewayMetricsFilter.class


+ 1 - 1
webchat-pgc/src/main/java/com/webchat/pgc/WebchatPGCApplication.java → webchat-pgc/src/main/java/com/webchat/gateway/WebchatPGCApplication.java

@@ -1,4 +1,4 @@
-package com.webchat.pgc;
+package com.webchat.gateway;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;

+ 1 - 1
webchat-pgc/src/main/java/com/webchat/pgc/controller/TestController.java → webchat-pgc/src/main/java/com/webchat/gateway/controller/TestController.java

@@ -1,4 +1,4 @@
-package com.webchat.pgc.controller;
+package com.webchat.gateway.controller;
 
 import com.webchat.common.bean.APIResponseBean;
 import com.webchat.common.bean.APIResponseBeanUtil;

BIN
webchat-pgc/target/classes/com/webchat/pgc/WebchatPGCApplication.class → webchat-pgc/target/classes/com/webchat/gateway/WebchatPGCApplication.class


BIN
webchat-pgc/target/classes/com/webchat/pgc/controller/TestController.class → webchat-pgc/target/classes/com/webchat/gateway/controller/TestController.class


+ 0 - 1
webchat-ugc/src/main/resources/application.properties

@@ -1 +0,0 @@
-spring.application.name=webchat-aigc

+ 1 - 0
webchat-ugc/src/main/resources/application.yml

@@ -0,0 +1 @@
+server:
  port: 8017

+ 21 - 0
webchat-ugc/src/main/resources/bootstrap.yml

@@ -0,0 +1,21 @@
+spring:
+  application:
+    name: webchat-ugc-service
+  profiles:
+    active: dev
+  cloud:
+    nacos:
+      config:
+        server-addr: 127.0.0.1:8848
+        namespace: 2cdfb8e3-f127-4020-93df-2d4c3dc805b5
+        file-extension: yaml
+        group: DEFAULT_GROUP
+        refresh-enabled: true
+      discovery:
+        server-addr: 127.0.0.1:8848
+        namespace: 2cdfb8e3-f127-4020-93df-2d4c3dc805b5
+    sentinel:
+      transport:
+        port: 8719
+        dashboard: 127.0.0.1:8080
+      eager: true

BIN
webchat-user/target/classes/com/webchat/user/controller/UserServiceController.class