摘要:那個配置文件將來自應用程序的信息以格式記錄到文件中。以下清單顯示了使用的集成測試設置代碼添加到項目本節介紹如何使用或將添加到項目中。以下示例顯示了如何為執行此操作建議你通過添加依賴關系管理,這樣你就無需自行管理版本。
Spring Cloud Sleuth介紹
Spring Cloud Sleuth為Spring Cloud實現了分布式追蹤解決方案。
術語Spring Cloud Sleuth借用了Dapper的術語。
Span:基本工作單元,例如,發送RPC是一個新的span,就像向RPC發送響應一樣,Span由span的唯一64位ID標識,另一個64位ID標識其所屬的Trace。Span還有其他數據,例如描述、帶時間戳的事件、鍵值annotations(標簽),導致它們的span的ID以及進程ID(通常是IP地址)。
span可以啟動和停止,它們可以追蹤自己的時間信息,創建span后,必須在將來的某個時刻停止它。
啟動Trace的初始span稱為root span,該span的ID值等于trace ID。
Trace:一組span形成的樹狀結構,例如,如果運行分布式大數據存儲,則可能由PUT請求形成trace。
Annotation:用于及時記錄事件的存在,使用Brave工具,不再需要為Zipkin設置特殊的事件來了解客戶端和服務器是誰、請求在哪里開始以及在哪里結束,然而,出于學習目的,標記這些事件以突出發生了什么類型的操作。
cs:Client Sent,客戶端發起了一個請求,這個annotation表示span的開始。
sr:Server Received,服務器端獲得了請求并開始處理它,從此時間戳中減去cs時間戳會顯示網絡延遲。
ss:Server Sent,在請求處理完成時注釋(當響應被發送回客戶端時),從此時間戳中減去sr時間戳會顯示服務器端處理請求所需的時間。
cr:Client Received,表示span的結束,客戶端已成功從服務器端收到響應,從此時間戳中減去cs時間戳會顯示客戶端從服務器接收響應所需的全部時間。
下圖顯示了系統中的Span和Trace,以及Zipkin annotations:
標記的每種顏色表示一個span(有七個span — 從A到G),請考慮以下標記:
Trace Id = X Span Id = D Client Sent
此標記表示當前span的Trace Id設置為X,Span Id設置為D,此外,還發生了Client Sent事件。
下圖顯示了span的父—子關系:
用途以下部分參考上圖中顯示的示例。
使用Zipkin進行分布式追蹤這個例子有七個span,如果你進入Zipkin中的trace,你可以在第二個trace中看到這個數字,如下圖所示:
但是,如果選擇特定trace,則可以看到四個span,如下圖所示:
選擇特定trace時,你會看到合并的span,這意味著,如果通過Server Received和Server Sent或Client Received和Client Sent annotations向Zipkin發送了兩個span,則它們將顯示為單個span。
在這種情況下,為什么七個和四個span之間存在差異?
一個span來自http:/start span,它具有Server Received(sr)和Server Sent(ss)annotations。
兩個span來自從service1到service2的http:/foo端點的RPC調用,Client Sent(cs)和Client Received(cr)事件發生在service1端,Server Received(sr)和Server Sent(ss)事件發生在service2端,這兩個span形成一個與RPC調用相關的邏輯span。
兩個span來自從service2到service3的http:/bar端點的RPC調用,Client Sent(cs)和Client Received(cr)事件發生在service2端,Server Received(sr)和Server Sent(ss)事件發生在service3端,這兩個span形成一個與RPC調用相關的邏輯span。
兩個span來自從service2到service4的http:/baz端點的RPC調用,Client Sent(cs)和Client Received(cr)事件發生在service2端,Server Received(sr)和Server Sent(ss)事件發生在service4端,這兩個span形成一個與RPC調用相關的邏輯span。
因此,如果我們計算物理span,我們有一個來自http:/start,兩個來自service1調用service2,兩個來自service2調用service3,兩個來自service2調用service4,總之,我們總共有七個span。
從邏輯上講,我們看到四個總Span的信息,因為我們有一個與傳入請求到service1相關的span和三個與RPC調用相關的span。
可視化錯誤Zipkin允許你可視化trace中的錯誤,當拋出異常而沒有被捕獲時,在span上設置了適當的標簽,然后Zipkin可以正確地著色,你可以在trace列表中看到一條紅色的trace,出現這種情況是因為拋出了異常。
如果單擊該trace,則會看到類似的圖片,如下所示:
如果你隨后單擊其中一個span,則會看到以下內容:
span顯示錯誤的原因以及與之相關的整個堆棧追蹤。
Brave的分布式追蹤從版本2.0.0開始,Spring Cloud Sleuth使用Brave作為追蹤庫,因此,Sleuth不再負責存儲上下文,而是將該工作委托給Brave。
由于Sleuth與Brave有不同的命名和標記約定,Spring決定從現在開始遵循Brave的約定,但是,如果要使用遺留的Sleuth方法,可以將spring.sleuth.http.legacy.enabled屬性設置為true。
實例點擊這里查看實例!
Zipkin中的依賴關系圖應類似于以下圖像:
日志相關當使用grep通過掃描等于(例如)2485ec27856c56f4的trace ID來讀取這四個應用程序的日志時,你將獲得類似于以下內容的輸出:
service1.log:2016-02-26 11:15:47.561 INFO [service1,2485ec27856c56f4,2485ec27856c56f4,true] 68058 --- [nio-8081-exec-1] i.s.c.sleuth.docs.service1.Application : Hello from service1. Calling service2 service2.log:2016-02-26 11:15:47.710 INFO [service2,2485ec27856c56f4,9aa10ee6fbde75fa,true] 68059 --- [nio-8082-exec-1] i.s.c.sleuth.docs.service2.Application : Hello from service2. Calling service3 and then service4 service3.log:2016-02-26 11:15:47.895 INFO [service3,2485ec27856c56f4,1210be13194bfe5,true] 68060 --- [nio-8083-exec-1] i.s.c.sleuth.docs.service3.Application : Hello from service3 service2.log:2016-02-26 11:15:47.924 INFO [service2,2485ec27856c56f4,9aa10ee6fbde75fa,true] 68059 --- [nio-8082-exec-1] i.s.c.sleuth.docs.service2.Application : Got response from service3 [Hello from service3] service4.log:2016-02-26 11:15:48.134 INFO [service4,2485ec27856c56f4,1b1845262ffba49d,true] 68061 --- [nio-8084-exec-1] i.s.c.sleuth.docs.service4.Application : Hello from service4 service2.log:2016-02-26 11:15:48.156 INFO [service2,2485ec27856c56f4,9aa10ee6fbde75fa,true] 68059 --- [nio-8082-exec-1] i.s.c.sleuth.docs.service2.Application : Got response from service4 [Hello from service4] service1.log:2016-02-26 11:15:48.182 INFO [service1,2485ec27856c56f4,2485ec27856c56f4,true] 68058 --- [nio-8081-exec-1] i.s.c.sleuth.docs.service1.Application : Got response from service2 [Hello from service2, response from service3 [Hello from service3] and from service4 [Hello from service4]]
如果你使用日志聚合工具(例如Kibana、Splunk等),你可以排序發生的事件,Kibana的一個例子類似于下圖:
如果要使用Logstash,以下列表顯示Logstash的Grok模式:
filter { # pattern matching logback pattern grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp}s+%{LOGLEVEL:severity}s+[%{DATA:service},%{DATA:trace},%{DATA:span},%{DATA:exportable}]s+%{DATA:pid}s+---s+[%{DATA:thread}]s+%{DATA:class}s+:s+%{GREEDYDATA:rest}" } } }
如果要將Grok與Cloud Foundry中的日志一起使用,則必須使用以下模式:
filter { # pattern matching logback pattern grok { match => { "message" => "(?m)OUTs+%{TIMESTAMP_ISO8601:timestamp}s+%{LOGLEVEL:severity}s+[%{DATA:service},%{DATA:trace},%{DATA:span},%{DATA:exportable}]s+%{DATA:pid}s+---s+[%{DATA:thread}]s+%{DATA:class}s+:s+%{GREEDYDATA:rest}" } } }JSON化Logback與Logstash一起使用
通常,你不希望將日志存儲在文本文件中,而是存儲在Logstash可以立即選擇的JSON文件中,為此,你必須執行以下操作(為了便于閱讀,在groupId:artifactId:version notation中傳遞依賴項)。
依賴關系設置
確保Logback位于類路徑上(ch.qos.logback:logback-core)。
添加Logstash Logback encode,例如,要使用版本4.6,請添加net.logstash.logback:logstash-logback-encoder:4.6。
Logback設置
請考慮以下Logback配置文件示例(名為logback-spring.xml)。
? ? ? DEBUG ${CONSOLE_LOG_PATTERN} utf8 ? ${LOG_FILE} ${LOG_FILE}.%d{yyyy-MM-dd}.gz 7 ${CONSOLE_LOG_PATTERN} utf8 ? ${LOG_FILE}.json ${LOG_FILE}.json.%d{yyyy-MM-dd}.gz 7 UTC { "severity": "%level", "service": "${springAppName:-}", "trace": "%X{X-B3-TraceId:-}", "span": "%X{X-B3-SpanId:-}", "parent": "%X{X-B3-ParentSpanId:-}", "exportable": "%X{X-Span-Export:-}", "pid": "${PID:-}", "thread": "%thread", "class": "%logger{40}", "rest": "%message" }
那個Logback配置文件:
將來自應用程序的信息以JSON格式記錄到build/${spring.application.name}.json文件中。
已注釋掉兩個額外的appender:控制臺和標準日志文件。
具有與上一節中介紹的相同的日志記錄模式。
如果使用自定義logback-spring.xml,則必須在bootstrap而不是application屬性文件中傳遞spring.application.name,否則,你的自定義logback文件無法正確讀取該屬性。傳播span上下文
span上下文是必須傳播到跨進程邊界的任何子span的狀態,span上下文的一部分是Baggage,trace和span ID是span上下文的必需部分,Baggage是可選部分。
Baggage是一組存儲在span上下文中的鍵:值對,Baggage隨著trace一起移動,并附在每一個span上,Spring Cloud Sleuth了解如果HTTP header以baggage-為前綴,則標題與行李相關,并且對于消息,它以baggage_開頭。
目前對baggage條目的數量或大小沒有限制,但是,請記住,太多可能會降低系統吞吐量或增加RPC延遲,在極端情況下,由于超出傳輸級別的消息或header容量,過多的baggage可能會使應用程序崩潰。
以下示例顯示了在span上設置baggage:
Span initialSpan = this.tracer.nextSpan().name("span").start(); ExtraFieldPropagation.set(initialSpan.context(), "foo", "bar"); ExtraFieldPropagation.set(initialSpan.context(), "UPPER_CASE", "someValue");Baggage與Span標簽
Baggage隨trace而行(每個子span包含其父級的baggage),Zipkin不知道baggage,也不接收這些信息。
從Sleuth 2.0.0開始,你必須在項目配置中明確傳遞baggage鍵名稱。
標簽附加到特定span,換句話說,它們僅針對特定span呈現,但是,你可以按標記搜索以查找trace,假設存在具有搜索標記值的span。
如果你希望能夠根據baggage查找span,則應在根span中添加相應的條目作為標記。
span必須在scope內。
以下清單顯示了使用baggage的集成測試:
設置
spring.sleuth: baggage-keys: - baz - bizarrecase propagation-keys: - foo - upper_case
代碼
initialSpan.tag("foo", ExtraFieldPropagation.get(initialSpan.context(), "foo")); initialSpan.tag("UPPER_CASE", ExtraFieldPropagation.get(initialSpan.context(), "UPPER_CASE"));添加Sleuth到項目
本節介紹如何使用Maven或Gradle將Sleuth添加到項目中。
要確保你的應用程序名稱在Zipkin中正確顯示,請在bootstrap.yml中設置spring.application.name屬性。只有Sleuth(log相關)
如果你想在沒有Zipkin集成的情況下僅使用Spring Cloud Sleuth,請將spring-cloud-starter-sleuth模塊添加到你的項目中。
以下示例顯示如何使用Maven添加Sleuth:
Maven
org.springframework.cloud spring-cloud-dependencies ${release.train.version} pom import org.springframework.cloud spring-cloud-starter-sleuth
建議你通過Spring BOM添加依賴關系管理,這樣你就無需自行管理版本。
添加依賴spring-cloud-starter-sleuth。
以下示例顯示如何使用Gradle添加Sleuth:
Gradle
dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${releaseTrainVersion}" } } dependencies { compile "org.springframework.cloud:spring-cloud-starter-sleuth" }
建議你通過Spring BOM添加依賴關系管理,這樣你就無需自行管理版本。
添加依賴spring-cloud-starter-sleuth。
通過HTTP Sleuth與Zipkin一起使用如果你想要Sleuth和Zipkin,請添加spring-cloud-starter-zipkin依賴項。
以下示例顯示了如何為Maven執行此操作:
Maven
org.springframework.cloud spring-cloud-dependencies ${release.train.version} pom import org.springframework.cloud spring-cloud-starter-zipkin
以下示例顯示了如何為Gradle執行此操作:
Gradle
dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${releaseTrainVersion}" } } dependencies { compile "org.springframework.cloud:spring-cloud-starter-zipkin" }在RabbitMQ或Kafka上Sleuth與Zipkin一起使用
如果你想使用RabbitMQ或Kafka而不是HTTP,添加spring-rabbit或spring-kafka依賴項,默認目標名稱是zipkin。
如果使用Kafka,則必須相應地設置屬性spring.zipkin.sender.type屬性:
spring.zipkin.sender.type: kafka
spring-cloud-sleuth-stream已棄用且與這些目標不兼容。
如果你想在RabbitMQ上使用Sleuth,請添加spring-cloud-starter-zipkin和spring-rabbit依賴項。
以下示例顯示了如何為Maven執行此操作:
Maven
org.springframework.cloud spring-cloud-dependencies ${release.train.version} pom import org.springframework.cloud spring-cloud-starter-zipkin org.springframework.amqp spring-rabbit
建議你通過Spring BOM添加依賴關系管理,這樣你就無需自行管理版本。
添加依賴spring-cloud-starter-zipkin,這樣,所有嵌套的依賴項都會被下載。
要自動配置RabbitMQ,請添加spring-rabbit依賴項。
Gradle
dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:${releaseTrainVersion}" } } dependencies { compile "org.springframework.cloud:spring-cloud-starter-zipkin" 2 compile "org.springframework.amqp:spring-rabbit" 3 }覆蓋Zipkin的自動配置
Spring Cloud Sleuth從2.1.0版開始支持向多個追蹤系統發送trace,為了使其工作,每個追蹤系統都需要有一個Reporter和Sender,如果要覆蓋提供的bean,則需要為它們指定一個特定的名稱,為此,你可以分別使用ZipkinAutoConfiguration.REPORTER_BEAN_NAME和ZipkinAutoConfiguration.SENDER_BEAN_NAME。
@Configuration protected static class MyConfig { @Bean(ZipkinAutoConfiguration.REPORTER_BEAN_NAME) Reporter額外的資源myReporter() { return AsyncReporter.create(mySender()); } @Bean(ZipkinAutoConfiguration.SENDER_BEAN_NAME) MySender mySender() { return new MySender(); } static class MySender extends Sender { private boolean spanSent = false; boolean isSpanSent() { return this.spanSent; } @Override public Encoding encoding() { return Encoding.JSON; } @Override public int messageMaxBytes() { return Integer.MAX_VALUE; } @Override public int messageSizeInBytes(List encodedSpans) { return encoding().listSizeInBytes(encodedSpans); } @Override public Call sendSpans(List encodedSpans) { this.spanSent = true; return Call.create(null); } } }
你可以點擊這里觀看Reshmi Krishna和Marcin Grzejszczak關于Spring Cloud Sleuth和Zipkin的視頻。
你可以在openzipkin/sleuth-webmvc-example存儲庫中檢查Sleuth和Brave的不同設置。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74293.html
摘要:介紹從版本開始,使用作為追蹤庫,為方便起見,在此處嵌入了的部分文檔。具有一個上下文,其中包含標識符,該標識符將放置在表示分布式操作的樹中的正確位置。追蹤通常由攔截器自動完成,在幕后,他們添加與他們在操作中的角色相關的標簽和事件。 Spring Cloud Sleuth特性 將trace和span ID添加到Slf4J MDC,因此你可以在日志聚合器中從給定的trace或span提取...
摘要:抽樣采樣可用于減少收集和報告的進程外數據,如果未對進行抽樣,則不會增加任何開銷。默認情況下,全局抽樣器將單個速率應用于所有跟蹤的操作,控制此設置,默認為跟蹤每個請求。 Spring Cloud Sleuth抽樣 采樣可用于減少收集和報告的進程外數據,如果未對span進行抽樣,則不會增加任何開銷(noop)。 抽樣是一個前期決策,這意味著報告數據的決定是在trace中的第一個操作中做出的...
摘要:腳本位置依賴內采樣率,默認即如需測試時每次都看到則修改為,但對性能有影響,注意上線時修改為合理值運行查詢參考規范推薦推薦谷歌的大規模分布式跟蹤系統分布式服務的 zipkin-server pom io.zipkin zipkin-ui 1.39.3 or...
摘要:一系列組成的一個樹狀結構,例如,如果你正在跑一個分布式大數據工程,你可能需要創建一個。開發者或運維人員可以輕松地執行高級數據分析,并在各種圖表表格和地圖中可視化數據。 快速構建spring-cloud + sleuth + rabbit + zipkin + es + kibana + grafana日志跟蹤平臺 簡介 Spring-Cloud-Sleuth Spring-Cloud-...
閱讀 928·2021-11-08 13:22
閱讀 2853·2021-09-29 09:45
閱讀 2831·2021-09-09 11:52
閱讀 2264·2019-08-30 13:20
閱讀 3749·2019-08-29 13:28
閱讀 1366·2019-08-29 12:32
閱讀 2730·2019-08-29 11:10
閱讀 1650·2019-08-26 13:34