Serverless 可觀測性終極實戰:鏈路追蹤 + 彈性監控一網打盡!
在 Serverless 架構興起的背景下,微服務與函數計算的組合為開發帶來極大便利。但與此同時,可觀測性也面臨全新的挑戰——無固定主機、調用鏈斷裂、動態伸縮頻繁、上下文信息丟失……傳統的監控與追蹤方式難以滿足需求。
本文將帶你從底層實踐出發,結合 Spring Boot 3、SkyWalking 與 Prometheus,打造一套指標、日志、追蹤一體化的 Serverless Observability 方案。
Serverless 應用的監控與可視化挑戰
傳統服務部署在固定主機上,可通過 Agent、端口探針等方式收集指標與日志。但 Serverless 最大的特征就是:
- 無固定節點容器啟動與銷毀隨調用頻次動態波動;
- 鏈路不完整執行時間短暫,調用鏈常因網關或異步中斷;
- 可觀測性工具失效常規的主機監控、Agent 插樁難以落地。
這使得 Serverless 更加依賴代碼層可觀測性埋點,尤其是指標采集(Metrics)、日志聚合(Logs)與鏈路追蹤(Traces)的三位一體能力。
Spring Boot 3 × SkyWalking / Prometheus 集成指南
我們以國產優秀的可觀測性解決方案 SkyWalking(鏈路追蹤)與 Prometheus(指標采集)為例,為 Spring Boot 3 Serverless 應用建立可觀測性能力。
項目結構建議
src/
├── main/
│ ├── java/com/icoderoad/
│ │ ├── ServerlessApplication.java
│ │ ├── controller/
│ │ │ ├── TraceController.java
│ │ │ └── MetricsController.java
│ │ ├── config/
│ │ │ └── SkyWalkingContextConfig.java
│ │ └── metrics/
│ │ └── CustomMetrics.java
│ └── resources/
│ ├── application.yml
│ └── logback-spring.xml
完整代碼示例
啟動類
package com.icoderoad;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ServerlessApplication {
public static void main(String[] args) {
SpringApplication.run(ServerlessApplication.class, args);
}
}
鏈路追蹤控制器:TraceController
package com.icoderoad.controller;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.slf4j.MDC;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TraceController {
@GetMapping("/trace")
public String trace(@RequestHeader(value = "sw8", required = false) String sw8) {
String traceId = TraceContext.traceId();
MDC.put("traceId", traceId);
return "當前 TraceId: " + traceId;
}
}
指標采集控制器:MetricsController
package com.icoderoad.controller;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MetricsController {
private final Counter requestCounter;
public MetricsController(MeterRegistry meterRegistry) {
this.requestCounter = meterRegistry.counter("custom_requests_total", "endpoint", "metrics");
}
@GetMapping("/metrics")
public String metrics() {
requestCounter.increment();
return "請求已記錄";
}
}
自定義指標注冊:CustomMetrics
package com.icoderoad.metrics;
import io.micrometer.core.instrument.MeterRegistry;
import jakarta.annotation.PostConstruct;
import org.springframework.stereotype.Component;
@Component
public class CustomMetrics {
private final MeterRegistry meterRegistry;
public CustomMetrics(MeterRegistry meterRegistry) {
this.meterRegistry = meterRegistry;
}
@PostConstruct
public void init() {
meterRegistry.gauge("custom_gauge_metric", 100);
}
}
SkyWalking Trace ID 注入配置
package com.icoderoad.config;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.slf4j.MDC;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@Configuration
public class SkyWalkingContextConfig implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String traceId = TraceContext.traceId();
MDC.put("traceId", traceId);
return true;
}
}
Prometheus 配置(application.yml)
management:
endpoints:
web:
exposure:
include: prometheus
metrics:
export:
prometheus:
enabled: true
日志 TraceID 輸出格式(logback-spring.xml)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%X{traceId}] %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="console"/>
</root>
</configuration>
部署與驗證
SkyWalking 部署
推薦使用官方 Docker 鏡像:
docker run -d--name skywalking-oap \
-eSW_STORAGE=elasticsearch \
-eSW_STORAGE_ES_CLUSTER_NODES=127.0.0.1:9200 \
-p11800:11800 -p12800:12800 \
apache/skywalking-oap-server
docker run -d--name skywalking-ui \
-eSW_OAP_ADDRESS=http://host.docker.internal:12800 \
-p8081:8080 \
apache/skywalking-ui
應用中使用官方 Java Agent:
-javaagent:/path/to/skywalking-agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=spring-serverless \
-Dskywalking.collector.backend_service=localhost:11800
構建完備的 Serverless Observability 方案
Serverless 可觀測性最佳實踐:
類型 | 技術棧 | 功能 |
Traces | SkyWalking | 分布式鏈路追蹤 |
Metrics | Prometheus + Micrometer | 自定義指標采集與導出 |
Logs | Logback + MDC | 統一日志記錄帶 traceId |
你可以通過 SkyWalking UI 查看完整調用鏈,通過 Prometheus + Grafana 構建監控面板,通過日志聚合(ELK)實現全局日志檢索。
總結
Serverless 是云原生時代的重要演進方向,而其可觀測性體系則是穩定性保障的核心。通過 SkyWalking 和 Prometheus,我們可以為 Spring Boot Serverless 應用構建一套“日志 + 指標 + 鏈路”一體化的 Observability 方案,既具實時性,也兼具彈性與可插拔能力。