摘要:那個(gè)配置文件將來(lái)自應(yīng)用程序的信息以格式記錄到文件中。以下清單顯示了使用的集成測(cè)試設(shè)置代碼添加到項(xiàng)目本節(jié)介紹如何使用或?qū)⑻砑拥巾?xiàng)目中。以下示例顯示了如何為執(zhí)行此操作建議你通過(guò)添加依賴關(guān)系管理,這樣你就無(wú)需自行管理版本。
Spring Cloud Sleuth介紹
Spring Cloud Sleuth為Spring Cloud實(shí)現(xiàn)了分布式追蹤解決方案。
術(shù)語(yǔ)Spring Cloud Sleuth借用了Dapper的術(shù)語(yǔ)。
Span:基本工作單元,例如,發(fā)送RPC是一個(gè)新的span,就像向RPC發(fā)送響應(yīng)一樣,Span由span的唯一64位ID標(biāo)識(shí),另一個(gè)64位ID標(biāo)識(shí)其所屬的Trace。Span還有其他數(shù)據(jù),例如描述、帶時(shí)間戳的事件、鍵值annotations(標(biāo)簽),導(dǎo)致它們的span的ID以及進(jìn)程ID(通常是IP地址)。
span可以啟動(dòng)和停止,它們可以追蹤自己的時(shí)間信息,創(chuàng)建span后,必須在將來(lái)的某個(gè)時(shí)刻停止它。
啟動(dòng)Trace的初始span稱為root span,該span的ID值等于trace ID。
Trace:一組span形成的樹狀結(jié)構(gòu),例如,如果運(yùn)行分布式大數(shù)據(jù)存儲(chǔ),則可能由PUT請(qǐng)求形成trace。
Annotation:用于及時(shí)記錄事件的存在,使用Brave工具,不再需要為Zipkin設(shè)置特殊的事件來(lái)了解客戶端和服務(wù)器是誰(shuí)、請(qǐng)求在哪里開始以及在哪里結(jié)束,然而,出于學(xué)習(xí)目的,標(biāo)記這些事件以突出發(fā)生了什么類型的操作。
cs:Client Sent,客戶端發(fā)起了一個(gè)請(qǐng)求,這個(gè)annotation表示span的開始。
sr:Server Received,服務(wù)器端獲得了請(qǐng)求并開始處理它,從此時(shí)間戳中減去cs時(shí)間戳?xí)@示網(wǎng)絡(luò)延遲。
ss:Server Sent,在請(qǐng)求處理完成時(shí)注釋(當(dāng)響應(yīng)被發(fā)送回客戶端時(shí)),從此時(shí)間戳中減去sr時(shí)間戳?xí)@示服務(wù)器端處理請(qǐng)求所需的時(shí)間。
cr:Client Received,表示span的結(jié)束,客戶端已成功從服務(wù)器端收到響應(yīng),從此時(shí)間戳中減去cs時(shí)間戳?xí)@示客戶端從服務(wù)器接收響應(yīng)所需的全部時(shí)間。
下圖顯示了系統(tǒng)中的Span和Trace,以及Zipkin annotations:
標(biāo)記的每種顏色表示一個(gè)span(有七個(gè)span — 從A到G),請(qǐng)考慮以下標(biāo)記:
Trace Id = X Span Id = D Client Sent
此標(biāo)記表示當(dāng)前span的Trace Id設(shè)置為X,Span Id設(shè)置為D,此外,還發(fā)生了Client Sent事件。
下圖顯示了span的父—子關(guān)系:
用途以下部分參考上圖中顯示的示例。
使用Zipkin進(jìn)行分布式追蹤這個(gè)例子有七個(gè)span,如果你進(jìn)入Zipkin中的trace,你可以在第二個(gè)trace中看到這個(gè)數(shù)字,如下圖所示:
但是,如果選擇特定trace,則可以看到四個(gè)span,如下圖所示:
選擇特定trace時(shí),你會(huì)看到合并的span,這意味著,如果通過(guò)Server Received和Server Sent或Client Received和Client Sent annotations向Zipkin發(fā)送了兩個(gè)span,則它們將顯示為單個(gè)span。
在這種情況下,為什么七個(gè)和四個(gè)span之間存在差異?
一個(gè)span來(lái)自http:/start span,它具有Server Received(sr)和Server Sent(ss)annotations。
兩個(gè)span來(lái)自從service1到service2的http:/foo端點(diǎn)的RPC調(diào)用,Client Sent(cs)和Client Received(cr)事件發(fā)生在service1端,Server Received(sr)和Server Sent(ss)事件發(fā)生在service2端,這兩個(gè)span形成一個(gè)與RPC調(diào)用相關(guān)的邏輯span。
兩個(gè)span來(lái)自從service2到service3的http:/bar端點(diǎn)的RPC調(diào)用,Client Sent(cs)和Client Received(cr)事件發(fā)生在service2端,Server Received(sr)和Server Sent(ss)事件發(fā)生在service3端,這兩個(gè)span形成一個(gè)與RPC調(diào)用相關(guān)的邏輯span。
兩個(gè)span來(lái)自從service2到service4的http:/baz端點(diǎn)的RPC調(diào)用,Client Sent(cs)和Client Received(cr)事件發(fā)生在service2端,Server Received(sr)和Server Sent(ss)事件發(fā)生在service4端,這兩個(gè)span形成一個(gè)與RPC調(diào)用相關(guān)的邏輯span。
因此,如果我們計(jì)算物理span,我們有一個(gè)來(lái)自http:/start,兩個(gè)來(lái)自service1調(diào)用service2,兩個(gè)來(lái)自service2調(diào)用service3,兩個(gè)來(lái)自service2調(diào)用service4,總之,我們總共有七個(gè)span。
從邏輯上講,我們看到四個(gè)總Span的信息,因?yàn)槲覀冇幸粋€(gè)與傳入請(qǐng)求到service1相關(guān)的span和三個(gè)與RPC調(diào)用相關(guān)的span。
可視化錯(cuò)誤Zipkin允許你可視化trace中的錯(cuò)誤,當(dāng)拋出異常而沒有被捕獲時(shí),在span上設(shè)置了適當(dāng)?shù)臉?biāo)簽,然后Zipkin可以正確地著色,你可以在trace列表中看到一條紅色的trace,出現(xiàn)這種情況是因?yàn)閽伋隽水惓!?/p>
如果單擊該trace,則會(huì)看到類似的圖片,如下所示:
如果你隨后單擊其中一個(gè)span,則會(huì)看到以下內(nèi)容:
span顯示錯(cuò)誤的原因以及與之相關(guān)的整個(gè)堆棧追蹤。
Brave的分布式追蹤從版本2.0.0開始,Spring Cloud Sleuth使用Brave作為追蹤庫(kù),因此,Sleuth不再負(fù)責(zé)存儲(chǔ)上下文,而是將該工作委托給Brave。
由于Sleuth與Brave有不同的命名和標(biāo)記約定,Spring決定從現(xiàn)在開始遵循Brave的約定,但是,如果要使用遺留的Sleuth方法,可以將spring.sleuth.http.legacy.enabled屬性設(shè)置為true。
實(shí)例點(diǎn)擊這里查看實(shí)例!
Zipkin中的依賴關(guān)系圖應(yīng)類似于以下圖像:
日志相關(guān)當(dāng)使用grep通過(guò)掃描等于(例如)2485ec27856c56f4的trace ID來(lái)讀取這四個(gè)應(yīng)用程序的日志時(shí),你將獲得類似于以下內(nèi)容的輸出:
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等),你可以排序發(fā)生的事件,Kibana的一個(gè)例子類似于下圖:
如果要使用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一起使用
通常,你不希望將日志存儲(chǔ)在文本文件中,而是存儲(chǔ)在Logstash可以立即選擇的JSON文件中,為此,你必須執(zhí)行以下操作(為了便于閱讀,在groupId:artifactId:version notation中傳遞依賴項(xiàng))。
依賴關(guān)系設(shè)置
確保Logback位于類路徑上(ch.qos.logback:logback-core)。
添加Logstash Logback encode,例如,要使用版本4.6,請(qǐng)?zhí)砑?b>net.logstash.logback:logstash-logback-encoder:4.6。
Logback設(shè)置
請(qǐng)考慮以下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" }
那個(gè)Logback配置文件:
將來(lái)自應(yīng)用程序的信息以JSON格式記錄到build/${spring.application.name}.json文件中。
已注釋掉兩個(gè)額外的appender:控制臺(tái)和標(biāo)準(zhǔn)日志文件。
具有與上一節(jié)中介紹的相同的日志記錄模式。
如果使用自定義logback-spring.xml,則必須在bootstrap而不是application屬性文件中傳遞spring.application.name,否則,你的自定義logback文件無(wú)法正確讀取該屬性。傳播span上下文
span上下文是必須傳播到跨進(jìn)程邊界的任何子span的狀態(tài),span上下文的一部分是Baggage,trace和span ID是span上下文的必需部分,Baggage是可選部分。
Baggage是一組存儲(chǔ)在span上下文中的鍵:值對(duì),Baggage隨著trace一起移動(dòng),并附在每一個(gè)span上,Spring Cloud Sleuth了解如果HTTP header以baggage-為前綴,則標(biāo)題與行李相關(guān),并且對(duì)于消息,它以baggage_開頭。
目前對(duì)baggage條目的數(shù)量或大小沒有限制,但是,請(qǐng)記住,太多可能會(huì)降低系統(tǒng)吞吐量或增加RPC延遲,在極端情況下,由于超出傳輸級(jí)別的消息或header容量,過(guò)多的baggage可能會(huì)使應(yīng)用程序崩潰。
以下示例顯示了在span上設(shè)置baggage:
Span initialSpan = this.tracer.nextSpan().name("span").start(); ExtraFieldPropagation.set(initialSpan.context(), "foo", "bar"); ExtraFieldPropagation.set(initialSpan.context(), "UPPER_CASE", "someValue");Baggage與Span標(biāo)簽
Baggage隨trace而行(每個(gè)子span包含其父級(jí)的baggage),Zipkin不知道baggage,也不接收這些信息。
從Sleuth 2.0.0開始,你必須在項(xiàng)目配置中明確傳遞baggage鍵名稱。
標(biāo)簽附加到特定span,換句話說(shuō),它們僅針對(duì)特定span呈現(xiàn),但是,你可以按標(biāo)記搜索以查找trace,假設(shè)存在具有搜索標(biāo)記值的span。
如果你希望能夠根據(jù)baggage查找span,則應(yīng)在根span中添加相應(yīng)的條目作為標(biāo)記。
span必須在scope內(nèi)。
以下清單顯示了使用baggage的集成測(cè)試:
設(shè)置
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到項(xiàng)目
本節(jié)介紹如何使用Maven或Gradle將Sleuth添加到項(xiàng)目中。
要確保你的應(yīng)用程序名稱在Zipkin中正確顯示,請(qǐng)?jiān)?b>bootstrap.yml中設(shè)置spring.application.name屬性。只有Sleuth(log相關(guān))
如果你想在沒有Zipkin集成的情況下僅使用Spring Cloud Sleuth,請(qǐng)將spring-cloud-starter-sleuth模塊添加到你的項(xiàng)目中。
以下示例顯示如何使用Maven添加Sleuth:
Maven
org.springframework.cloud spring-cloud-dependencies ${release.train.version} pom import org.springframework.cloud spring-cloud-starter-sleuth
建議你通過(guò)Spring BOM添加依賴關(guān)系管理,這樣你就無(wú)需自行管理版本。
添加依賴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" }
建議你通過(guò)Spring BOM添加依賴關(guān)系管理,這樣你就無(wú)需自行管理版本。
添加依賴spring-cloud-starter-sleuth。
通過(guò)HTTP Sleuth與Zipkin一起使用如果你想要Sleuth和Zipkin,請(qǐng)?zhí)砑?b>spring-cloud-starter-zipkin依賴項(xiàng)。
以下示例顯示了如何為Maven執(zhí)行此操作:
Maven
org.springframework.cloud spring-cloud-dependencies ${release.train.version} pom import org.springframework.cloud spring-cloud-starter-zipkin
以下示例顯示了如何為Gradle執(zhí)行此操作:
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依賴項(xiàng),默認(rèn)目標(biāo)名稱是zipkin。
如果使用Kafka,則必須相應(yīng)地設(shè)置屬性spring.zipkin.sender.type屬性:
spring.zipkin.sender.type: kafka
spring-cloud-sleuth-stream已棄用且與這些目標(biāo)不兼容。
如果你想在RabbitMQ上使用Sleuth,請(qǐng)?zhí)砑?b>spring-cloud-starter-zipkin和spring-rabbit依賴項(xiàng)。
以下示例顯示了如何為Maven執(zhí)行此操作:
Maven
org.springframework.cloud spring-cloud-dependencies ${release.train.version} pom import org.springframework.cloud spring-cloud-starter-zipkin org.springframework.amqp spring-rabbit
建議你通過(guò)Spring BOM添加依賴關(guān)系管理,這樣你就無(wú)需自行管理版本。
添加依賴spring-cloud-starter-zipkin,這樣,所有嵌套的依賴項(xiàng)都會(huì)被下載。
要自動(dòng)配置RabbitMQ,請(qǐng)?zhí)砑?b>spring-rabbit依賴項(xiàng)。
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的自動(dòng)配置
Spring Cloud Sleuth從2.1.0版開始支持向多個(gè)追蹤系統(tǒng)發(fā)送trace,為了使其工作,每個(gè)追蹤系統(tǒng)都需要有一個(gè)Reporter和Sender,如果要覆蓋提供的bean,則需要為它們指定一個(gè)特定的名稱,為此,你可以分別使用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); } } }
你可以點(diǎn)擊這里觀看Reshmi Krishna和Marcin Grzejszczak關(guān)于Spring Cloud Sleuth和Zipkin的視頻。
你可以在openzipkin/sleuth-webmvc-example存儲(chǔ)庫(kù)中檢查Sleuth和Brave的不同設(shè)置。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74293.html
摘要:介紹從版本開始,使用作為追蹤庫(kù),為方便起見,在此處嵌入了的部分文檔。具有一個(gè)上下文,其中包含標(biāo)識(shí)符,該標(biāo)識(shí)符將放置在表示分布式操作的樹中的正確位置。追蹤通常由攔截器自動(dòng)完成,在幕后,他們添加與他們?cè)诓僮髦械慕巧嚓P(guān)的標(biāo)簽和事件。 Spring Cloud Sleuth特性 將trace和span ID添加到Slf4J MDC,因此你可以在日志聚合器中從給定的trace或span提取...
摘要:抽樣采樣可用于減少收集和報(bào)告的進(jìn)程外數(shù)據(jù),如果未對(duì)進(jìn)行抽樣,則不會(huì)增加任何開銷。默認(rèn)情況下,全局抽樣器將單個(gè)速率應(yīng)用于所有跟蹤的操作,控制此設(shè)置,默認(rèn)為跟蹤每個(gè)請(qǐng)求。 Spring Cloud Sleuth抽樣 采樣可用于減少收集和報(bào)告的進(jìn)程外數(shù)據(jù),如果未對(duì)span進(jìn)行抽樣,則不會(huì)增加任何開銷(noop)。 抽樣是一個(gè)前期決策,這意味著報(bào)告數(shù)據(jù)的決定是在trace中的第一個(gè)操作中做出的...
摘要:腳本位置依賴內(nèi)采樣率,默認(rèn)即如需測(cè)試時(shí)每次都看到則修改為,但對(duì)性能有影響,注意上線時(shí)修改為合理值運(yùn)行查詢參考規(guī)范推薦推薦谷歌的大規(guī)模分布式跟蹤系統(tǒng)分布式服務(wù)的 zipkin-server pom io.zipkin zipkin-ui 1.39.3 or...
摘要:一系列組成的一個(gè)樹狀結(jié)構(gòu),例如,如果你正在跑一個(gè)分布式大數(shù)據(jù)工程,你可能需要?jiǎng)?chuàng)建一個(gè)。開發(fā)者或運(yùn)維人員可以輕松地執(zhí)行高級(jí)數(shù)據(jù)分析,并在各種圖表表格和地圖中可視化數(shù)據(jù)。 快速構(gòu)建spring-cloud + sleuth + rabbit + zipkin + es + kibana + grafana日志跟蹤平臺(tái) 簡(jiǎn)介 Spring-Cloud-Sleuth Spring-Cloud-...
閱讀 931·2021-11-08 13:22
閱讀 2856·2021-09-29 09:45
閱讀 2835·2021-09-09 11:52
閱讀 2268·2019-08-30 13:20
閱讀 3751·2019-08-29 13:28
閱讀 1372·2019-08-29 12:32
閱讀 2732·2019-08-29 11:10
閱讀 1653·2019-08-26 13:34