Spring Cloud Alibaba-06-Sleuth鏈路追蹤

Lison <dreamlison@163.com>, v1.0.0, 2024.4.03

Spring Cloud Alibaba-06-Sleuth鏈路追蹤

文章目錄

  • Spring Cloud Alibaba-06-Sleuth鏈路追蹤
    • 為什么使用鏈路追蹤
    • 常見鏈路追蹤解決方案
    • Sleuth概述
      • 概述
      • Sleuth術語
    • Sleuth + Zipkin 原理
      • Sleuth原理簡述
      • Zipkin 原理簡述
    • Sleuth快速上手
    • Zipkin客戶端集成
      • Zipkin服務端安裝(Docker方式持久化mysql、ES)
        • 持久化MySql
        • 持久化ES
      • 集成
    • 應用性能監控:通過 SkyWalking 實施鏈路追蹤
      • APM 與 SkyWalking
      • Sleuth+Zipkin 與 SkyWalking 對比
      • 部署 SkyWalking 服務端
      • 安裝 SkyWalking Java Agent
        • 集成skywalking
        • 使用探針方式啟動

為什么使用鏈路追蹤

隨著業務發展,微服務的數量也會越來越多,某個服務出現問題,問題很難排查

【問題】

1、鏈路梳理難:無法清晰地看到整個調用鏈路

2、故障難定位:無法快速定位到故障點、無法快速定位哪個環節比較費時
在這里插入圖片描述

因此,我們需要鏈路追蹤來梳理鏈路調用,方便快速定位問題。分布式鏈路追蹤(Distributed Tracing),就是將一次分布式請求還原成調用鏈路,進行日志記 錄,性能監控并將一次分布式請求的調用情況集中展示。比如各個服務節點上的耗時、請求具體到達哪 臺機器上、每個服務節點的請求狀態等等

常見鏈路追蹤解決方案

常見的有如下幾種解決方案,本文講解跟SpringCloud相關的Sleuth + Zipkin

【Zipkin】

Twitter開源的調用鏈分析工具,目前基于springcloud sleuth得到了廣泛的使用,特點是輕量,使用部署簡單

【Pinpoint】

韓國人開源的基于字節碼注入的調用鏈分析,以及應用監控分析工具。特點是支持多種插件,U功能強大,接入端無代碼侵入。

【SkyWalking】

本土開源的基于字節碼注入的調用鏈分析,以及應用監控分析工具。特點是支持多種插件,UI功能較強,接入端無代碼侵入。目前已加入Apache孵化器。

【CAT】

是大眾點評開源的基于編碼和配置的調用鏈分析,應用監控分析,日志采集,監控報警等一系列的監控平臺工具。

Sleuth概述

概述

sleuth是一個鏈路追蹤工具,通過它在日志中打印的信息可以分析出一個服務的調用鏈條,也可以得出鏈條中每個服務的耗時,這為我們在實際生產中,分析超時服務,分析服務調用關系,做服務治理提供幫助。

sleuth目前并不是對所有調用訪問都可以做鏈路追蹤,它目前支持的有:rxjava、feign、quartz、RestTemplate、zuul、hystrix、grpc、kafka、Opentracing、redis、Reator、circuitbreaker、spring的Scheduled。國內用的比較多的dubbo,sleuth無法對其提供支持。

Sleuth術語

請求一個微服務系統的API接口,這個API接口需要調用多個微服務單元,調用每個微服務單元都會產生一個新的Span,所有由這個請求產生的Span組成了這個Trace。整個過程使用Annotation(cs、sr、ss、cr)統計各個階段消耗的時長

在這里插入圖片描述

  • Span

    Span是基本工作單位。Span還包含了其他的信息,例如摘要、時間戳事件、Span的ID以及進程ID。SpanId用于唯一標識請求鏈路到達的各個服務組件。

  • Trace

    由一組具有相同TraceId的span組成的樹狀結構,即一個完整的請求鏈路

  • Annotation

    記錄一個請求的4個事件,用于計算各個環節消耗的時長

    • cs (Client Sent ):客戶端發送一個請求,開始一個請求的生命。
    • sr (Server Received ):服務端收到請求開始處理,sr - cs = 網絡延遲(服務調用的時間)
    • ss(Server Sent ):服務端處理完畢準備發送到客戶端,ss - sr = 服務器處理請求所用時間
    • cr (Client Received ):客戶端接收到服務端的響應,請求結束,cr - cs = 請求的總時間

Sleuth + Zipkin 原理

Sleuth原理簡述

在這里插入圖片描述

【AOP攔截器的思想】

Sleuth創建TraceFilter,對所有的網絡請求進行攔截,如果請求的header中沒有span信息,則創建Span對象,生成span id、trace id等當前調用鏈的Trace信息記錄到Http Headers中,如果header中有,則直接使用header中的數據創建Span對象,之后將span id、trace id設置到sl4j的MDC中。這樣,我們在日志中就能看到span信息。

我們通過日志看到的信息其實只是sleuth收集信息的一小部分,在運行過程中,sleuth還會收集服務調用時間、接收到請求的時間、發起http請求的方法、http請求的路徑,包括請求的IP端口等信息,這些信息都會存入Span對象,然后發送到zipkin中。

Zipkin 原理簡述

Zipkin 是 Twitter 的一個開源項目,它基于Google Dapper實現,它致力于收集服務的定時數據, 以解決微服務架構中的延遲問題,包括數據的收集、存儲、查找和展現。

我們可以使用它來收集各個服務器上請求鏈路的跟蹤數據,并通過它提供的REST API接口來輔助我 們查詢跟蹤數據以實現對分布式系統的監控程序,從而及時地發現系統中出現的延遲升高問題并找出系 統性能瓶頸的根源。

除了面向開發的 API 接口之外,它也提供了方便的UI組件來幫助我們直觀的搜索跟蹤信息和分析請 求鏈路明細,比如:可以查詢某段時間內各用戶請求的處理時間等。

Zipkin 提供了可插拔數據存儲方式:In-Memory、MySql、Cassandra 以及 Elasticsearch

在這里插入圖片描述

上圖展示了 Zipkin 的基礎架構,它主要由 4 個核心組件構成:

Collector:收集器組件,它主要用于處理從外部系統發送過來的跟蹤信息,將這些信息轉換為 Zipkin內部處理的 Span 格式,以支持后續的存儲、分析、展示等功能。

Storage:存儲組件,它主要對處理收集器接收到的跟蹤信息,默認會將這些信息存儲在內存中, 我們也可以修改此存儲策略,通過使用其他存儲組件將跟蹤信息存儲到數據庫中。

RESTful API:API 組件,它主要用來提供外部訪問接口。比如給客戶端展示跟蹤信息,或是外接 系統訪問以實現監控等。

Web UI:UI 組件, 基于API組件實現的上層應用。通過UI組件用戶可以方便而有直觀地查詢和分 析跟蹤信息。

Zipkin分為兩端,一個是 Zipkin服務端,一個是 Zipkin客戶端,客戶端也就是微服務的應用。 客戶端會 配置服務端的 URL 地址,一旦發生服務間的調用的時候,會被配置在微服務里面的 Sleuth 的監聽器監 聽,并生成相應的 Trace 和 Span 信息發送給服務端。

在這里插入圖片描述

【原理】

1、Sleuth采用Brave(trancer庫)追蹤采集trace(由一組包含span信息的調用鏈組成)

2、將信息通過Zipkin的Collector發送給Zipkin

3、zipkin拿到信息后,將數據通過Storage持久化到數據庫/es中

3、Zipkin通過API提供數據給UI進行可視化展示

Sleuth快速上手

1、在需要追蹤的微服務上添加依賴

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

2、編寫配置

sleuth: sampler:rate: 100 # 指定采樣比例,默認10%

3、增加測試接口

  @RequestMapping("/sentinel/message1")public String message1() {testSentinelMessage3Service.message();log.info("這是message1");return "message1";}

調用接口時,輸出以下日志:

2024-01-01 20:23:39.527  INFO [spring-cloud-service,9d701f5350d96c82,9d701f5350d96c82,true] 85218 --- [io-18001-exec-1] c.l.s.controller.TestSentinelController  : 這是message1

可以看到,日志里出現了[spring-cloud-service,9d701f5350d96c82,9d701f5350d96c82,true]信息,這個就是由Spring Cloud Sleuth生成,用于跟蹤微服務請求鏈路。

這些信息包含了4個部分的值,它們的含義如下:

1、spring-cloud-service 微服務的名稱,與spring.application.name對應;
2、9d701f5350d96c82 稱為Trace ID,在一條完整的請求鏈路中,這個值是固定的。觀察上面的日志即可證實這一點;
3、9d701f5350d96c82 稱為Span ID,它表示一個基本的工作單元;
4、true表示是否要將該信息輸出到Zipkin等服務中來收集和展示

Zipkin客戶端集成

雖然我們已經可以通過Trace ID來跟蹤整體請求鏈路了,但是我們還是得去各個系統中撈取日志。在并發較高得時候,日志是海量的,這個時候我們可以借助Zipkin來代替我們完成日志獲取與分析。Zipkin是Twitter的一個開源項目。

ZipKin客戶端和Sleuth的集成非常簡單,只需要在微服務中添加其依賴和配置即可。

Zipkin服務端安裝(Docker方式持久化mysql、ES)

持久化MySql

1、創建數據庫

如zipkin

2、建表

語句參考:https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql

或復制以下建表語句

--
-- Copyright The OpenZipkin Authors
-- SPDX-License-Identifier: Apache-2.0
--CREATE TABLE IF NOT EXISTS zipkin_spans (`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',`trace_id` BIGINT NOT NULL,`id` BIGINT NOT NULL,`name` VARCHAR(255) NOT NULL,`remote_service_name` VARCHAR(255),`parent_id` BIGINT,`debug` BIT(1),`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';CREATE TABLE IF NOT EXISTS zipkin_annotations (`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',`a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',`endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',`endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';CREATE TABLE IF NOT EXISTS zipkin_dependencies (`day` DATE NOT NULL,`parent` VARCHAR(255) NOT NULL,`child` VARCHAR(255) NOT NULL,`call_count` BIGINT,`error_count` BIGINT,PRIMARY KEY (`day`, `parent`, `child`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

3、修改啟動命令

Zipkin默認端口9411。

docker run \
--name zipkin-server -d \
--restart=always \
-p 9411:9411 \
-e MYSQL_USER=root \
-e MYSQL_PASS=123456 \
-e MYSQL_HOST=127.0.0.1 \
-e STORAGE_TYPE=mysql \
-e MYSQL_DB=zipkin \
-e MYSQL_TCP_PORT=3306 \
openzipkin/zipkin:2.21.7
持久化ES

若連接ES集群,–ES_HOSTS通過逗號分割,如:–ES_HOSTS=[http://192.168.0.1:9200,http://192.168.0.2:9200]

docker run \
--name zipkin-server -d \
-p 9411:9411 \
--restart=always \
-e STORAGE_TYPE=elasticsearch \
-e ES_HOSTS=localhost:9200
openzipkin/zipkin:2.21.7

連接ES參數

環境變量描述
ES_HOSTS連接ES地址,多個由逗號分隔。默認為http://localhost:9200
ES_PIPELINE指定span被索引之前的pipeline
ES_TIMEOUT連接ES的超時時間,單位ms。默認為10000(10S)
ES_INDEXZipkin持久化所使用的索引。默認為zipkin
ES_DATE_SEPARATORZipkin建立索引的日期分隔符。默認為-
ES_INDEX_SHARDS分片(shard)個數,默認為5個
ES_INDEX_REPLICAS副本(replica)個數,默認為1個
ES_HTTP_LOGGINGES的日志級別,可選值為BASIC, HEADERS, BODY
ES_USERNAME/ES_PASSWORD登錄ES的用戶名和密碼

在這里插入圖片描述

集成

1、在需要追蹤的微服務上添加依賴

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

2、編寫配置

spring:zipkin:base-url: http://127.0.0.1:9411/ #zipkin server的請求地址 discoveryClientEnabled: false #讓nacos把它當成一個URL,而不要當做服務名 sleuth: sampler:probability: 1.0 #采樣的百分比 

3、訪問微服務

http://127.0.0.1:18003/spring_building/naocs/consumer

4、訪問zipkin的UI界面,觀察效果

在這里插入圖片描述

應用性能監控:通過 SkyWalking 實施鏈路追蹤

我們掌握了基于 Sleuth+Zipkin 對微服務架構實施基于日志的鏈路追蹤,通過 Sleuth 在微服務應用中附加鏈路數據,再通過 Zipkin 實現鏈路數據收集與可視化,從而保證開發與運維人員在生產環境了解微服務的執行過程與具體細節,為產品運維提供了有力的保障。

圍繞鏈路追蹤這個話題,介紹另一款著名的鏈路追蹤產品 SkyWalking,掌握 SkyWalking 的使用方法。本講咱們將介紹三方面內容:

APM 與 SkyWalking

Spring Cloud Slueth、Zipkin、阿里鷹眼、大眾點評 Cat、SkyWalking,這些產品都有一個共同的名字:APM(Application Performance Management),即應用性能管理系統,SkyWalking 這款 APM 產品,理由很簡單,它在簡單易用的前提下實現了比 Zipkin 功能更強大的鏈路追蹤、同時擁有更加友好、更詳細的監控項,并能自動生成可視化圖表。相比 Sleuth+Zipkin 這種不同廠商間混搭組合,SkyWalking 更符合國內軟件業的“一站式解決方案”的設計理念。

SkyWalking 是中國人吳晟(華為)開源的應用性能管理系統(APM)工具,使用Java語言開發,后來吳晟將其貢獻給 Apache,在 Apache 的背書下 SkyWalking 發展迅速,現在已屬于 Apache 旗下頂級開源項目,它的官網:http://skywalking.apache.org/。

在這里插入圖片描述

SkyWalking 提供了分布式追蹤、服務網格遙測分析、度量聚合和可視化一體化解決方案。目前在 GitHub 上 SkyWaking 擁有 23.3K Star,最新版本為:9.7.0

鏈路追蹤視圖

指標監控全局視圖

Sleuth+Zipkin 與 SkyWalking 對比

Sleuth+ZipkinSkyWalking
鏈路追蹤可視化
聚合報表很少豐富
服務依賴圖簡單依賴圖展示形象直觀
監控埋點方式侵入式,需要修改源碼無侵入,采用Java Agent字節碼增強
Java VM指標監控不具備具備
支持報警不支持有,可以自定義報警方式
存儲機制內存、MySQL,ES…ES、Mysql、H2…
文檔支持文檔豐富,國外主流Apache支持,國內文檔更新滯后
國內案例京東、阿里定制不開源…華為、小米、微眾銀行…

通過比較我們可以發現,在易用性和使用體驗上,SkyWalking 明顯好于 Zipkin,功能更豐富的同時也更符合國人習慣,但因為迭代速度較快,社區文檔相對陳舊,這也導致很多技術問題需要程序員自己研究解決,因此在解決問題方面需要更多的時間。

部署 SkyWalking 服務端

skyWalkIng 架構圖

在這里插入圖片描述

SkyWalking 同樣采用客戶端與服務端架構模式,SkyWalking 服務端用于接收來自 Java Agent 客戶端發來的鏈路跟蹤與指標數據,匯總統計后由 SkyWalking UI 負責展現。SkyWalking 服務端同時支持 gRPC 與 HTTP 兩種上報方式。其中 gRPC 默認監聽服務器 11800 端口,HTTP 默認監聽 12800 端口,而 SKyWalking UI 應用則默認監聽 8080 端口,這三個端口在生產環境下要在防火墻做放行配置。在存儲層面,SkyWalking 底層支持 ElasticSearch 、MySQL、H2等多種數據源,官方優先推薦使用 ElasticSearch

本初采用Docker的安裝方式

version: '3.8'
services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:7.17.6container_name: elasticsearchrestart: alwaysports:- 9200:9200- 9300:9300environment:- discovery.type=single-node- TZ=Asia/Shanghai- bootstrap.memory_lock=true- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"volumes:- /opt/data/dockerData/skywalking/elasticsearch/data:/usr/share/elasticsearch/dataulimits:memlock:soft: -1hard: -1oap:image: docker.io/apache/skywalking-oap-server:9.4.0container_name: oapdepends_on:- elasticsearchrestart: alwaysports:- 11800:11800- 12800:12800environment:SW_CORE_RECORD_DATA_TTL: 15SW_CORE_METRICS_DATA_TTL: 15SW_STORAGE: elasticsearchSW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200SW_ENABLE_UPDATE_UI_TEMPLATE: trueTZ: Asia/ShanghaiJAVA_OPTS: "-Xms2048m -Xmx2048m"ui:image: docker.io/apache/skywalking-ui:9.4.0container_name: uidepends_on:- oaplinks:- oaprestart: alwaysports:- 8080:8080environment:SW_OAP_ADDRESS: http://oap:12800SW_ZIPKIN_ADDRESS: http://oap:9412
docker compose up -d

啟動后會產生兩個 Java 進程:

  • Skywalking-Collector 是數據收集服務,默認監聽 11800(gRPC)與 12800(HTTP) 端口。
  • Skywalking-Webapp 是 SkyWalking UI,用于展示數據,默認監聽 8080 端口,上面顯示的為8038。

Skywalking 應用已啟動

啟動成功后,訪問[http://127.0.0.1:8088/],如果看到 SkyWalking UI 首頁,則說明服務端配置成功。

在這里插入圖片描述

安裝 SkyWalking Java Agent

在前面提到,SkyWalking 可以在不修改應用源碼的前提下,無侵入的實現鏈路追蹤與 JVM 指標監控,它是怎么做到的?這里涉及一個 Java1.5 新增的特性,Java Agent 探針技術,想必對于很多工作多年 Java 工程師來說,Java Agent 也是一個陌生的東西。

Java Agent 探針說白了就是 Java 提供的一種“外掛”技術,允許在應用開發的時候在通過啟動時增加 javaagent 參數來外掛一些額外的程序。

Java Agent ,其擴展類有這嚴格的規范,必須創建名為 premain 的方法,該方法將在目標應用 main 方法前執行,下面就是最簡單的 Java Agent 擴展類。

public class SimpleAgent {public static void premain(String agentArgs, Instrumentation inst) {System.out.println("=========開始執行premain============");}
}

要完成 Java Agent,還需要提供正確的 MANIFEST.MF,以便 JVM 能夠選擇正確的類。在 META-INF 目錄下找到你的 MANIFEST.MF 文件:

Manifest-Version: 1.0
Premain-Class: com.lison.agent.SimpleAgent

之后我們將這個類打包為 agent.jar,假設原始應用為 test-agent.jar,在 test-agent.jar 啟動時需要在額外附加 javaagent 參數,如下所示:

java -javaagent:agent.jar -jar test-agent.jar

在應用啟動時 Java 控制臺會輸出如下日志。

=========開始執行 premain============
正在啟動 Agent測試服務...
....

SkyWalking 也是利用 Java Agent 的特性,在 premain 中通過字節碼增強技術對目標方法進行擴展,當目標方法執行時自動收集鏈路追蹤及監控數據并發往 SkyWalking 服務端。

SkyWalking Java Agent,我們還是以實例進行講解,因為 Java Agent 是無侵入的,并不需要源碼,這里我就直接給出調用關系圖幫助咱們理解。
在這里插入圖片描述

調用關系圖

簡單介紹下,用戶訪問 a 服務的 a 接口,a 服務通過 OpenFeign 遠程調用 b 服務的 b 接口,b 服務通過 OpenFeign 調用 c 服務的 c 接口,最后 c 接口通過 JDBC 將業務數據存儲到 MySQL 數據庫

集成skywalking

1、下載解壓 agent

注意:agent版本和oap版本需要適配,版本不適配可能會出現頁面無法訪問、agent上報不到頁面等問題。

下載地址: https://skywalking.apache.org/downloads/

作者用的skywalking版本為9.4.0,下載v9.1.0版本的client沒有問題,親測可用。

在這里插入圖片描述

需要配置skywalking-agent文件夾下,config/agent.config配置文件,列出最關鍵的兩個配置,其他配置大家可以自行探索。

agent.service_name=${SW_AGENT_NAME:HS}
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.54.53:11800}

2、日志對接

在skywalking的UI端有一個日志的模塊,用于收集客戶端的日志,默認是沒有數據的,那么需要如何將日志數據傳輸到skywalking中呢?

<!--打印skywalking的TraceId到日志--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>9.1.0</version></dependency><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-trace</artifactId><version>9.1.0</version></dependency>

新建一個logback-spring.xml放在resource目錄下,配置如下:

<configuration debug="false" scan="false"><springProperty scop="context" name="spring.application.name" source="spring.application.name" defaultValue=""/><property name="log.path" value="logs/${spring.application.name}"/><!-- 彩色日志格式 --><property name="CONSOLE_LOG_PATTERN"value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/><!-- 彩色日志依賴的渲染類 --><conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/><conversionRule conversionWord="wex"converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/><conversionRule conversionWord="wEx"converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/><!-- Console log output --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${CONSOLE_LOG_PATTERN}</pattern></encoder></appender><!-- Log file debug output --><appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/debug.log</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>50MB</maxFileSize><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern></encoder></appender><!-- Log file error output --><appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/error.log</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>50MB</maxFileSize><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern></encoder><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>ERROR</level></filter></appender><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><appender name="grpc" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><!--nacos 心跳 INFO 屏蔽--><logger name="com.alibaba.nacos" level="OFF"><appender-ref ref="error"/></logger><!-- Level: FATAL 0  ERROR 3  WARN 4  INFO 6  DEBUG 7 --><root level="INFO"><!-- <appender-ref ref="console"/>--><appender-ref ref="debug"/><appender-ref ref="error"/><appender-ref ref="stdout"/><appender-ref ref="grpc"/></root>
</configuration>

3、代碼中添加日志

  @RequestMapping("/fegin/test")public String feginTest() {iTestService.getServerPort();log.info("這是message1");return "message1";}
使用探針方式啟動

(1)使用idea啟動

配置VM options
在這里插入圖片描述

javaagent配置的參數即skywalking-agent的絕對路徑。

-Dskywalking.agent.service_name="spring-cloud-service"
-Dskywalking.collector.backend_service="opaip:11800"
-javaagent:/Users/lison/work/workspace/project/skywalking-agent/skywalking-agent.jar

日志:

在這里插入圖片描述

在這里插入圖片描述

除此之外,鏈路追蹤的展示也非常強大,服務間的 API 調用關系與執行時間、調用狀態清晰列出,而且因為 SkyWalking 是方法層面上的擴展,會提供更加詳細的方法間的調用過程

在這里插入圖片描述

提供不同維度的視圖
在這里插入圖片描述

服務監控JVM
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14339.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14339.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14339.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python庫之`lxml`的高級用法深度解析

Python庫之lxml的高級用法深度解析 簡介 lxml是一個功能強大的第三方庫&#xff0c;它提供了對XML和HTML文檔的高效處理能力。除了基本的解析和創建功能外&#xff0c;lxml還包含了一些高級用法&#xff0c;這些用法可以幫助開發者在處理復雜文檔時更加得心應手。 高級解析技…

代碼隨想錄——路徑總和(Leetcode113)需要回顧

題目鏈接 遞歸 本題遞歸需要遍歷整棵樹&#xff0c;所以遞歸沒有返回值 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* T…

蘋果M4性能分析:進步神速?還有多少空間?

2024年初&#xff0c;蘋果推出了M4處理器&#xff0c;令人意外的是&#xff0c;它的發布距離M3發布僅僅過去了半年時間。更讓人驚訝的是&#xff0c;M4首次亮相于iPad Pro。這一新處理器不僅僅是M3的簡單升級版本&#xff0c;而是一次全面的架構優化。本文將詳細分析M4處理器的…

Vue基礎(1)數據綁定

一. 文本插值 普通文本可以使用雙大括號 {{ }} &#xff0c;要想插入 HTML&#xff0c;需要使用 v-html 指令。 <template><h1>Message: {{ state.msg }}</h1><p>{{ state.count 1 }}</p><p>{{ state.rawHtml }}</p><p v-html…

【教學類-58-02】黑白三角拼圖02(3*3宮格)262144種

背景需求&#xff1a; 已知黑白三角拼圖2*2&#xff08;4個拼圖&#xff09;一共有256種排列方法 【教學類-58-01】黑白三角拼圖01&#xff08;2*2宮格&#xff09;256種-CSDN博客文章瀏覽閱讀142次&#xff0c;點贊5次&#xff0c;收藏12次。【教學類-58-01】黑白三角拼圖01…

深度學習之基于Matlab卷積神經網絡(CNN)手寫數字識別

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 手寫數字識別是計算機視覺領域的一個重要問題&#xff0c;也是深度學習應用的一個典型場景。卷…

什么是固態繼電器?

固態繼電器是不需要使用任何機械部件的開關繼電器。這通常使它們具有比普通機電繼電器壽命更長的優勢&#xff0c;然而&#xff0c;盡管固態繼電器速度快且耐用&#xff0c;但仍具有某些設計規定。 固態繼電器風靡全球&#xff0c;徹底改變了從農業自動化到航空航天等各個行業…

中國數學會發布數學期刊分級目錄

T1,T2,T3均是中國數學會的期刊分類 下載地址&#xff1a; 中國數學會發布數學期刊分級目錄-太原理工大學數學學院 (tyut.edu.cn)

銀行總部文件自動下發,如何保證不影響專線網絡使用?

銀行在我國金融體系中占據重要地位&#xff0c;是我國市場經濟的重要組成部分。我國商業銀行隨著自身不斷發展&#xff0c;規模日益擴大&#xff0c;形成了“總行-分行-支行-營業網點”的典型層級管理模式。在日常中&#xff0c;銀行總部存在文件下發的場景&#xff1a; 銀行總…

1.4 接入網和物理媒體

接入網絡和物理媒體 Q: 怎樣將端系統和邊緣路由器連接&#xff1f; 住宅接入網絡 單位接入網絡 &#xff08;學校、公司&#xff09; 無線接入網絡 注意&#xff1a; 接入網絡的帶寬 (bits persecond) &#xff1f; 共享/專用&#xff1f; 接入網: 這是指將端系統物理連接到其…

數學基礎 -- 條件概率、后驗概率與聯合概率

條件概率與后驗概率 技術背景 條件概率和后驗概率是概率論中的兩個重要概念&#xff0c;在機器學習和貝葉斯推理中尤為關鍵。理解這兩個概念對于處理不確定性和進行推理具有重要意義。本文將通過直觀的例子和數學解釋來詳細介紹條件概率與后驗概率。 條件概率 條件概率是指…

Linux rzsz安裝(在線安裝、離線安裝),用于上傳下載文件

在線安裝&#xff1a; yum -y install lrzsz 離線安裝&#xff1a; 1.下載安裝包地址&#xff1a;http://freshmeat.sourceforge.net/projects/lrzsz/ 2.通過同一網絡內可以上傳文件的機器&#xff08;B機&#xff1a;10.210.168.18&#xff09;先將lrzsz-0.12.20.tar.gz上傳至…

盤點Java中的排序操作方案

盤點Java中的排序操作方案 Comparable 接口-自然排序 類implements Comparable接口 類重寫 public int compareTo(Object obj)方法 如果返回值為正數&#xff0c;則表示當前對象(調用該方法的對象)比 obj 對象“大”&#xff1b;反之“小”&#xff1b;如果為零的話&#x…

多家知名媒體到訪“光子1號金融算力中心“ 交流AI與算力未來觀

5月23日&#xff0c;企商在線 “光子1號金融算力中心媒體參觀日”活動成功舉辦&#xff0c;十多家主流媒體、IT行業媒體及自媒體代表走進光子1號金融算力中心&#xff0c;深入了解企商業務發展、戰略規劃及“光子1號金融算力中心”等企商打造的新型數字基礎設施&#xff0c;共同…

Python條件分支與循環

大家好&#xff0c;當涉及到編寫高效和靈活的程序時&#xff0c;條件分支和循環是 Python 中至關重要的概念。它們允許我們根據不同的條件執行不同的代碼塊&#xff0c;或者重復執行一組語句。條件分支和循環是測試開發工程師在日常工作中經常使用的工具&#xff0c;無論是編寫…

光耦合器的特性和應用概述

光耦合器又稱光電耦合器&#xff0c;是現代電子學中必不可少的元件&#xff0c;確保隔離電路之間安全有效的信號傳輸。本文探討了光耦合器的特性及其多樣化應用&#xff0c;強調了它們在各種電子系統中的關鍵作用。 什么是光耦合器&#xff1f; 光耦合器是一種設計用于利用光傳…

Java 18新特性詳細介紹

Java作為一門廣泛使用的編程語言&#xff0c;一直在不斷地發展和更新。Java 18是Java的最新版本&#xff0c;它引入了許多新特性和改進&#xff0c;使得開發過程更加高效、安全和便捷。本文將詳細介紹Java 18的新特性&#xff0c;幫助開發者更好地了解和應用這些新功能。 JEP …

vue詳解(4)

1. v-model 原理 原理&#xff1a;v-model本質上是一個語法糖。例如應用在輸入框上&#xff0c;就是 value屬性 和 input事件 的合寫。作用&#xff1a;提供數據的雙向綁定。① 數據變&#xff0c;視圖跟著變 :value&#xff1b;② 視圖變&#xff0c;數據跟著變 input注意&am…

【MySQL數據庫】CRUD 增 刪 改 查 超詳解,有這一篇就夠了!

? ? &#x1f525;個人主頁&#xff1a; 中草藥 &#x1f525;專欄&#xff1a;【MySQL】探秘&#xff1a;數據庫世界的瑞士軍刀 目錄 ??一.CRUD &#x1f9ea;二.新增&#xff08;Create&#xff09; &#x1f9eb;1.基本操作 &#x1f9ec;2.使用SELECT插入 &#x…

長難句5.24

There is pressure for change from within the profession, but opponents of change among the regulators insist that keeping outsiders out of a law firm isolates lawyers from the pressure to make money rather than serve clients ethically. 在(律師)行業內部也有…