鏈路追蹤sleuth and zipkin

1/ sleuth 入門

(1)修改微服務(wù)工程引入Sleuth依賴

<!--sleuth鏈路追蹤-->

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>

? ? ? ? ? ? <artifactId>spring-cloud-starter-sleuth</artifactId>

? ? ? ? </dependency>

(2)?修改配置文件?

修改application.yml添加日志級(jí)別

logging:

? level:

? ? root: info

? ? org.springframework.web.servlet.DispatcherServlet: DEBUG

? ? org.springframework.cloud.sleuth: DEBUG


sleuth日志配置

從網(wǎng)關(guān)到每個(gè)微服務(wù)都需要添加如上的配置撬呢。啟動(dòng)微服務(wù)无宿,調(diào)用之后懂拾,我們可以在控制臺(tái)觀察到sleuth的日志輸 出。


sleuth日志打印

其中 ff8ff8b803a3b558 是TraceId(我理解的是從網(wǎng)關(guān)開(kāi)始創(chuàng)建的一個(gè)總id)低滩,后面跟著的是SpanId(每條日志都要記錄調(diào)用鏈上一個(gè)微服務(wù)的spanid)佛点,依次調(diào)用有一個(gè)全局的TraceId灼捂,將調(diào)用鏈 路串起來(lái)。仔細(xì)分析每個(gè)微服務(wù)的日志佩谣,不難看出請(qǐng)求的具體過(guò)程。

查看日志文件并不是一個(gè)很好的方法实蓬,當(dāng)微服務(wù)越來(lái)越多日志文件也會(huì)越來(lái)越多茸俭,通過(guò)Zipkin可以將日 志聚合,并進(jìn)行可視化展示和全文檢索安皱。

2调鬓、加入zipkin

Zipkin 提供了可插拔數(shù)據(jù)存儲(chǔ)方式:InMemory、MySql酌伊、Cassandra 以及 Elasticsearch腾窝。

Zipkin 分為兩端,一個(gè)是 Zipkin 服務(wù)端居砖,一個(gè)是 Zipkin 客戶端虹脯,客戶端也就是微服務(wù)的應(yīng)用。 客戶端會(huì)配置服務(wù)端的 URL 地址奏候,一旦發(fā)生服務(wù)間的調(diào)用的時(shí)候循集,會(huì)被配置在微服務(wù)里面的 Sleuth 的 監(jiān)聽(tīng)器監(jiān)聽(tīng),并生成相應(yīng)的 Trace 和 Span 信息發(fā)送給服務(wù)端蔗草。 發(fā)送的方式主要有兩種暇榴,一種是 HTTP 報(bào)文的方式厚棵,還有一種是消息總線的方式如 RabbitMQ。

不論哪種方式蔼紧,我們都需要:

一個(gè) Eureka 服務(wù)注冊(cè)中心婆硬,這里我們就用之前的 eureka 項(xiàng)目來(lái)當(dāng)注冊(cè)中心。 一個(gè) Zipkin 服務(wù)端奸例。 多個(gè)微服務(wù)彬犯,這些微服務(wù)中配置Zipkin 客戶端。

(1) Zipkin Server下載查吊,可以從以下鏈接下載 https://repo1.maven.org/maven2/io/zipkin/java/zipkin-server/谐区,我們這里下載的是 zipkin-server-2.12.9-exec.jar

(2) 啟動(dòng) 在命令行輸入 java -jar zipkin-server-2.12.9-exec.jar 啟動(dòng) Zipkin Server


啟動(dòng)zipkin服務(wù)端

默認(rèn)Zipkin Server的請(qǐng)求端口為 9411?

Zipkin Server的啟動(dòng)參數(shù)可以通過(guò)官方提供的yml配置文件查找https://github.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/resources/zipkin-server-shared.yml
?在瀏覽器輸入 http://127.0.0.1:9411即可進(jìn)入到Zipkin Server的管理后

?客戶端Zipkin+Sleuth整合?

(1)客戶端添加依賴

客戶端指的是需要被追蹤的微服務(wù)

<!--sleuth鏈路追蹤-->

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>

? ? ? ? ? ? <artifactId>spring-cloud-starter-sleuth</artifactId>

? ? ? ? </dependency>

? ? ? ? <!--zipkin依賴-->

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>

? ? ? ? ? ? <artifactId>spring-cloud-starter-zipkin</artifactId>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>

? ? ? ? ? ? <artifactId>spring-cloud-sleuth-zipkin</artifactId>

? ? ? ? </dependency>

(2)修改客戶端配置文件


web方式日志信息目前存memery里

指定了zipkin server的地址,下面制定需采樣的百分比逻卖,默認(rèn)為0.1宋列,即10%,這里配置1评也,是記錄全部 的sleuth信息炼杖,是為了收集到更多的數(shù)據(jù)(僅供測(cè)試用)。在分布式系統(tǒng)中盗迟,過(guò)于頻繁的采樣會(huì)影響系 統(tǒng)性能坤邪,所以這里配置需要采用一個(gè)合適的值

(3) 測(cè)試

啟動(dòng)每個(gè)微服務(wù),啟動(dòng)Zipkin Service罚缕。通過(guò)瀏覽器發(fā)送一次微服務(wù)請(qǐng)求艇纺。打開(kāi) Zipkin Service 控制臺(tái)http://127.0.0.1:9411,我們可以根據(jù)條件追蹤每次請(qǐng)求調(diào)用過(guò)程

基于消息中間件日志收集數(shù)據(jù)邮弹,舉例RabbitMq

(1) rabbitmq 安裝和啟動(dòng)先準(zhǔn)備好黔衡。

(2)zipkin 服務(wù)端啟動(dòng)

java -jar zipkin-server-2.12.9-exec.jar --RABBIT_ADDRESSES=127.0.0.1:5672
?--RABBIT_USER:guest? --RABBIT_PASSWORD=guest

RABBIT_ADDRESSES : 指定RabbitMQ地址
RABBIT_USER: 用戶名(默認(rèn)guest)
RABBIT_PASSWORD : 密碼(默認(rèn)guest


官網(wǎng)提供的rabbitmq可配置啟動(dòng)參數(shù)


rabbitmq 隊(duì)列界面

(3)微服務(wù)中的配置

【3.1】引入依賴:


四個(gè)依賴

<!--sleuth鏈路追蹤-->

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>

? ? ? ? ? ? <artifactId>spring-cloud-starter-sleuth</artifactId>

? ? ? ? </dependency>

? ? ? ? <!--zipkin依賴-->

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>

? ? ? ? ? ? <artifactId>spring-cloud-starter-zipkin</artifactId>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.cloud</groupId>

? ? ? ? ? ? <artifactId>spring-cloud-sleuth-zipkin</artifactId>

? ? ? ? </dependency>

? ? ? ? <dependency>

? ? ? ? ? ? <groupId>org.springframework.amqp</groupId>

? ? ? ? ? ? <artifactId>spring-rabbit</artifactId>

? ? ? ? </dependency>

【3.2】yml配置文件中的更改


加入rabbitmq

【3.3】測(cè)試

關(guān)閉Zipkin Server,并隨意請(qǐng)求連接腌乡。打開(kāi)rabbitmq管理后臺(tái)可以看到员帮,消息已經(jīng)推送到rabbitmq。 當(dāng)Zipkin Server啟動(dòng)時(shí)导饲,會(huì)自動(dòng)的從rabbitmq獲取消息并消費(fèi)捞高,展示追蹤數(shù)據(jù)

可以看到如下效果:

請(qǐng)求的耗時(shí)時(shí)間不會(huì)出現(xiàn)突然耗時(shí)特長(zhǎng)的情況 當(dāng)ZipkinServer不可用時(shí)(比如關(guān)閉、網(wǎng)絡(luò)不通等)渣锦,追蹤信息不會(huì)丟失硝岗,因?yàn)檫@些信息會(huì)保存在 Rabbitmq服務(wù)器上,直到Zipkin服務(wù)器可用時(shí)袋毙,再?gòu)腞abbitmq中取出這段時(shí)間的信息

存儲(chǔ)跟蹤數(shù)據(jù)到mysql

Zipkin Server默認(rèn)時(shí)間追蹤數(shù)據(jù)信息保存到內(nèi)存型檀,這種方式不適合生產(chǎn)環(huán)境。Zipkin支持將追蹤數(shù)據(jù)持久化到mysql數(shù)據(jù)庫(kù)或者存儲(chǔ)到 elasticsearch中听盖。這里已mysql為例胀溺。

1裂七、準(zhǔn)備數(shù)據(jù)庫(kù)

可以從官網(wǎng)找到Zipkin Server持久mysql的數(shù)據(jù)庫(kù)腳本

/*

SQLyog Ultimate v11.33 (64 bit)

MySQL - 5.5.58 : Database - zipkin

*********************************************************************

*/

/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;

/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

CREATE DATABASE /*!32312 IF NOT EXISTS*/`zipkin` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `zipkin`;

/*Table structure for table `zipkin_annotations` */

DROP TABLE IF EXISTS `zipkin_annotations`;

CREATE TABLE `zipkin_annotations` (

? `trace_id_high` bigint(20) NOT NULL DEFAULT '0' COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',

? `trace_id` bigint(20) NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',

? `span_id` bigint(20) 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(11) NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',

? `a_timestamp` bigint(20) DEFAULT NULL COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',

? `endpoint_ipv4` int(11) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null',

? `endpoint_ipv6` binary(16) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',

? `endpoint_port` smallint(6) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null',

? `endpoint_service_name` varchar(255) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null',

? UNIQUE KEY `trace_id_high` (`trace_id_high`,`trace_id`,`span_id`,`a_key`,`a_timestamp`) COMMENT 'Ignore insert on duplicate',

? KEY `trace_id_high_2` (`trace_id_high`,`trace_id`,`span_id`) COMMENT 'for joining with zipkin_spans',

? KEY `trace_id_high_3` (`trace_id_high`,`trace_id`) COMMENT 'for getTraces/ByIds',

? KEY `endpoint_service_name` (`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames',

? KEY `a_type` (`a_type`) COMMENT 'for getTraces',

? KEY `a_key` (`a_key`) COMMENT 'for getTraces',

? KEY `trace_id` (`trace_id`,`span_id`,`a_key`) COMMENT 'for dependencies job'

) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;

/*Data for the table `zipkin_annotations` */

/*Table structure for table `zipkin_dependencies` */

DROP TABLE IF EXISTS `zipkin_dependencies`;

CREATE TABLE `zipkin_dependencies` (

? `day` date NOT NULL,

? `parent` varchar(255) NOT NULL,

? `child` varchar(255) NOT NULL,

? `call_count` bigint(20) DEFAULT NULL,

? UNIQUE KEY `day` (`day`,`parent`,`child`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;

/*Data for the table `zipkin_dependencies` */

/*Table structure for table `zipkin_spans` */

DROP TABLE IF EXISTS `zipkin_spans`;

CREATE TABLE `zipkin_spans` (

? `trace_id_high` bigint(20) NOT NULL DEFAULT '0' COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',

? `trace_id` bigint(20) NOT NULL,

? `id` bigint(20) NOT NULL,

? `name` varchar(255) NOT NULL,

? `parent_id` bigint(20) DEFAULT NULL,

? `debug` bit(1) DEFAULT NULL,

? `start_ts` bigint(20) DEFAULT NULL COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',

? `duration` bigint(20) DEFAULT NULL COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',

? UNIQUE KEY `trace_id_high` (`trace_id_high`,`trace_id`,`id`) COMMENT 'ignore insert on duplicate',

? KEY `trace_id_high_2` (`trace_id_high`,`trace_id`,`id`) COMMENT 'for joining with zipkin_annotations',

? KEY `trace_id_high_3` (`trace_id_high`,`trace_id`) COMMENT 'for getTracesByIds',

? KEY `name` (`name`) COMMENT 'for getTraces and getSpanNames',

? KEY `start_ts` (`start_ts`) COMMENT 'for getTraces ordering and range'

) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;

/*Data for the table `zipkin_spans` */

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;

/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;

/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;

/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;



mysql tabel part 1


mysql tabel part 2

2/ 配置啟動(dòng)服務(wù)端


zipkin mysql 參數(shù)啟動(dòng)


官網(wǎng)關(guān)于mysql的參數(shù)


storage 方式選擇

存到mysql 與默認(rèn)內(nèi)存方式比較,只是數(shù)據(jù)庫(kù)里增加了表仓坞,zipkin服務(wù)端啟動(dòng)增加了mysql 參數(shù)背零,微服務(wù)里添加mysql 驅(qū)動(dòng), 配置文件加入 mysql 數(shù)據(jù)源配置无埃。


可以同時(shí)配置rabbitmq 和mysql 啟動(dòng)參數(shù)徙瓶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嫉称,隨后出現(xiàn)的幾起案子侦镇,更是在濱河造成了極大的恐慌,老刑警劉巖织阅,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壳繁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荔棉,警方通過(guò)查閱死者的電腦和手機(jī)闹炉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)江耀,“玉大人剩胁,你說(shuō)我怎么就攤上這事诉植∠楣” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵晾腔,是天一觀的道長(zhǎng)舌稀。 經(jīng)常有香客問(wèn)我,道長(zhǎng)灼擂,這世上最難降的妖魔是什么壁查? 我笑而不...
    開(kāi)封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮剔应,結(jié)果婚禮上睡腿,老公的妹妹穿的比我還像新娘。我一直安慰自己峻贮,他們只是感情好席怪,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著纤控,像睡著了一般挂捻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上船万,一...
    開(kāi)封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天刻撒,我揣著相機(jī)與錄音骨田,去河邊找鬼。 笑死声怔,一個(gè)胖子當(dāng)著我的面吹牛态贤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捧搞,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼抵卫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了胎撇?” 一聲冷哼從身側(cè)響起介粘,我...
    開(kāi)封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晚树,沒(méi)想到半個(gè)月后姻采,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡爵憎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年慨亲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宝鼓。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刑棵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出愚铡,到底是詐尸還是另有隱情蛉签,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布沥寥,位于F島的核電站碍舍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏邑雅。R本人自食惡果不足惜片橡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淮野。 院中可真熱鬧捧书,春花似錦、人聲如沸骤星。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妈踊。三九已至了嚎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歪泳。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工萝勤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呐伞。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓敌卓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伶氢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子趟径,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361