知識庫 / Spring / Spring Boot RSS 訂閱

Spring Boot 啓動 Actuator 端點

Spring Boot
HongKong
4
12:28 PM · Dec 06 ,2025

1. 引言

Spring Boot 應用可能具有複雜的組件圖、啓動階段和資源初始化步驟。

在本文中,我們將探討如何通過 Spring Boot Actuator 端點跟蹤和監控這些啓動信息。

2. 應用程序啓動跟蹤

跟蹤應用程序啓動期間的各個步驟可以提供有用的信息,幫助我們瞭解各個階段在應用程序啓動中花費的時間。 這種儀器化還可以提高我們對上下文生命週期和應用程序啓動序列的理解

Spring Framework 提供功能,用於記錄應用程序啓動並繪製初始化圖。 此外,Spring Boot Actuator 通過 HTTP 或 JMX 提供多個生產級監控和管理功能。

截至 Spring Boot 2.4應用程序啓動跟蹤指標現在可通過 /actuator/startup 端點提供

3. 設置

要啓用 Spring Boot Actuator,請將 <a href="https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator"><em >spring-boot-starter-actuator</em></a > 依賴添加到我們的 POM 中:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

我們還會添加 spring-boot-starter-web 依賴項,因為這被要求用於通過 HTTP 訪問端點:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.1.2</version>
</dependency>

此外,我們還將通過在我們的 application.properties文件中設置配置屬性來暴露所需的端點,該端點將通過 HTTP 進行訪問:

management.endpoints.web.exposure.include=startup

最後,我們將使用 curljq 來查詢 actuator 的 HTTP 端點並解析 JSON 響應,分別由它們處理。

4. Actuator 端點

為了捕獲啓動事件,我們需要配置應用程序,使其實現 <em >@ApplicationStartup</em> 接口。 默認情況下,管理應用程序生命週期的 <em >ApplicationContext</em> 使用一個空實現。 這顯然不會進行任何啓動的儀器化和跟蹤,以實現最小的開銷。

因此,與其它 actuator 端點不同,我們需要進行一些額外的配置

4.1. 使用 BufferingApplicationStartup

我們需要將應用程序的啓動配置設置為 BufferingApplicationStartup 實例。這是一種 Spring Boot 提供的 ApplicationStartup 接口的內存實現。它 捕獲 Spring 啓動過程中的事件並將其存儲在內部緩衝區中

@SpringBootApplication
public class StartupTrackingApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(StartupTrackingApplication.class);
        app.setApplicationStartup(new BufferingApplicationStartup(2048));
        app.run(args);
    }
}

在此,我們還指定了內部緩衝區的容量為 2048。當緩衝區達到該容量時,將不再記錄任何事件數據。因此,重要的是選擇合適的數值,以便根據應用程序的複雜度和啓動過程中執行的各個步驟來存儲事件。

至關重要的是,該執行器端點僅在配置完成後可用

4.2. 啓動端點</h3

現在,我們可以啓動應用程序並查詢 啓動端點。

我們使用 curl 調用此 POST 端點,並使用 jq 格式化 JSON 輸出:

> curl 'http://localhost:8080/actuator/startup' -X POST | jq
{
  "springBootVersion": "2.5.4",
  "timeline": {
    "startTime": "2021-10-17T21:08:00.931660Z",
    "events": [
      {
        "endTime": "2021-10-17T21:08:00.989076Z",
        "duration": "PT0.038859S",
        "startTime": "2021-10-17T21:08:00.950217Z",
        "startupStep": {
          "name": "spring.boot.application.starting",
          "id": 0,
          "tags": [
            {
              "key": "mainApplicationClass",
              "value": "com.baeldung.startup.StartupTrackingApplication"
            }
          ],
          "parentId": null
        }
      },
      {
        "endTime": "2021-10-17T21:08:01.454239Z",
        "duration": "PT0.344867S",
        "startTime": "2021-10-17T21:08:01.109372Z",
        "startupStep": {
          "name": "spring.boot.application.environment-prepared",
          "id": 1,
          "tags": [],
          "parentId": null
        }
      },
      ... other steps not shown
      {
        "endTime": "2021-10-17T21:08:12.199369Z",
        "duration": "PT0.00055S",
        "startTime": "2021-10-17T21:08:12.198819Z",
        "startupStep": {
          "name": "spring.boot.application.running",
          "id": 358,
          "tags": [],
          "parentId": null
        }
      }
    ]
  }
}

如我們所見,詳細的 JSON 響應包含了一系列儀器化啓動事件的列表。 它包含有關每個步驟的各種詳細信息,例如步驟名稱、開始時間、結束時間,以及步驟計時詳細信息

有關響應結構的詳細信息,請參閲 Spring Boot Actuator Web API 文檔。

此外,核心容器中定義的步驟列表以及每個步驟的詳細信息,可參見 Spring reference documentation

需要注意的是,後續對端點的調用不會提供詳細的 JSON 響應。 這是因為啓動端點調用會清除內部緩衝區。 因此,我們需要重啓應用程序才能調用相同的端點並再次接收完整的響應。

如果需要,我們應該保存負載以供進一步分析

4.3. 過濾啓動事件

正如我們所見,緩衝機制具有固定的內存事件存儲容量。因此,不應將大量事件存儲在緩衝區中。

我們可以過濾已標記的事件,僅存儲對我們有意義的事件:

BufferingApplicationStartup startup = new BufferingApplicationStartup(2048);
startup.addFilter(startupStep -> startupStep.getName().matches("spring.beans.instantiate");

在此,我們使用了 addFilter 方法僅對指定名稱的步驟進行儀器化。

4.4. 自定義 Instrumentation

我們可以通過擴展 BufferingApplicationStartup 來提供自定義的啓動跟蹤行為,以滿足我們特定的 Instrumentation 需求。

由於該 Instrumentation 在測試環境中比在生產環境中更有價值,因此使用系統屬性切換到 no-op 或緩衝/自定義實現非常簡單。

5. 分析啓動時間

作為實際示例,讓我們嘗試識別在啓動過程中可能花費相對較長時間進行的所有 Bean 實例化。例如,這可能包括緩存加載、數據庫連接池或啓動應用程序期間的其他昂貴初始化。

我們可以像之前一樣調用該端點,但這次我們將使用 jq 來處理輸出。

由於響應內容相當冗長,我們應該過濾掉名稱匹配 spring.beans.instantiate 的步驟,並按持續時間排序:

> curl 'http://localhost:8080/actuator/startup' -X POST \
| jq '[.timeline.events
 | sort_by(.duration) | reverse[]
 | select(.startupStep.name | match("spring.beans.instantiate"))
 | {beanName: .startupStep.tags[0].value, duration: .duration}]'

上述表達式處理響應 JSON 以提取時間信息:

  • timeline.events 數組降序排序。
  • 從排序後的數組中選擇所有名稱匹配 spring.beans.instantiate 的步驟。
  • 創建一個新的 JSON 對象,其中包含每個匹配步驟的 beanNameduration

結果顯示了應用程序啓動期間實例化各種 Bean 的簡潔、有序和過濾後的視圖。

[
  {
    "beanName": "resourceInitializer",
    "duration": "PT6.003171S"
  },
  {
    "beanName": "tomcatServletWebServerFactory",
    "duration": "PT0.143958S"
  },
  {
    "beanName": "requestMappingHandlerAdapter",
    "duration": "PT0.14302S"
  },
  ...
]

在這裏,我們可以看到 resourceInitializer bean 在啓動過程中需要大約六秒鐘。 這可能被認為是總應用程序啓動時間中的一個重要因素。 採用這種方法,我們可以有效地識別此問題,並集中精力進行進一步調查和可能的解決方案.

重要的是要注意,ApplicationStartup 僅適用於應用程序啓動期間使用。 換句話説,它不替代 Java 剖析器和指標收集框架,用於應用程序的儀器化

6. 結論

在本文中,我們探討了如何在 Spring Boot 應用程序中獲取和分析詳細的啓動指標。

首先,我們瞭解瞭如何啓用和配置 Spring Boot Actuator 端點。然後,我們研究了從該端點獲取的有用信息。

最後,我們分析了一個示例,以瞭解應用程序啓動過程中的各種步驟。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.