掌握分佈式跟蹤:微服務和復雜系統性能分析

馮文輝

買這商品的人也買了...

商品描述

本書是作者基於其在Uber跟蹤團隊擔任技術主管時的個人經歷而寫的。本書分4部分共14章,內容包括:為什麽需要分佈式跟蹤、跟蹤一次HotROD之旅、分佈式跟蹤基礎、OpenTracing的埋點基礎、異步應用程序埋點、跟蹤標準與生態系統、使用服務網格進行跟蹤、關於採樣、跟蹤的價值、分佈式上下文傳播、集成指標與日誌、通過數據挖掘提煉洞見、在大型組織中實施跟蹤、分佈式跟蹤系統的底層架構。希望讀者能通過本書瞭解分佈式跟蹤及其相關應用的基本原則和設計思路,從而找到將其應用到自己的項目和系統中的有效方法。本書的目標讀者包括應用程序開發人員、SRE工程師、DevOps工程師、框架和基礎設施開發人員、技術經理和管理人員、跟蹤團隊等。

目錄大綱

I 引言1
1 為什麼需要分佈式跟踪2
微服務與雲原生應用程序3
什麼是可觀測性5
微服務的可觀測性挑戰7
傳統的監控工具9
指標10
日誌11
分佈式跟踪12
我在跟踪領域的經歷14
為何編寫本書17
總結18
參考資料19
2 跟踪一次HotROD之旅20
先決條件21
從預打包的二進製文件運行21
從Docker鏡像運行22
從源代碼運行22
啟動Jaeger 24
初識HotROD 26
架構29
數據流30
上下文日誌32
span標記與日誌35
確定延遲的來源37
資源使用屬性50
總結53
參考資料54
3 分佈式跟踪基礎55
想法56
請求相關性56
黑盒推理57
特定於域的模式57
元數據傳播57
剖析分佈式跟踪59
採樣60
保留因果關係60
請求間因果關係62
跟踪模型63
事件模型63
span模型65
時鐘偏差調整67
跟踪分析69
總結70
參考資料70
Ⅱ 數據收集問題73
4 OpenTracing的埋點基礎74
先決條件76
項目源代碼76
Go開發環境77
Java開發環境78
Python開發環境78
MySQL數據庫78
查詢工具(curl或wget) 79
跟踪後端(Jaeger) 79
OpenTracing 80
練習1:Hello應用程序83
用Go語言實現Hello應用程序84
用Java語言實現Hello應用程序88
用Python語言實現Hello應用程序92
練**結94
練習2:**個跟踪94
步驟1:創建跟踪器實例94
步驟2:啟動span 99
步驟3:註釋span 102
練**結107
練習3:跟踪函數和傳遞上下文108
步驟1:跟踪單個函數109
步驟2:將多個span合併為一個跟踪111
步驟3:傳播進程內上下文115
練**結123
練習4:跟踪RPC請求124
步驟1:拆解單體124
步驟2:在進程之間傳遞上下文127
步驟3:應用OpenTracing推薦的標記136
練**結141
練習5:使用baggage 141
在Go中使用baggage 142
在Java中使用baggage 142
在Python中使用baggage 143
練**結143
練習6:自動埋點143
Go中的開源埋點144
Java中的自動埋點146
Python中的自動埋點148
練習7:額外練習151
總結151
參考資料152
5 異步應用程序埋點153
先決條件154
項目源代碼154
Java 開發環境155
Kafka、ZooKeeper、Redis與Jaeger 155
Tracing Talk聊天應用程序156
實現158
運行應用程序162
觀察跟踪163
使用OpenTracing埋點166
Spring埋點167
tracer resolver 167
Redis埋點168
Kafka埋點170
埋點異步代碼178
總結183
參考資料183
6 跟踪標準與生態系統184
埋點形式185
分析跟踪部署和互操作性188
跟踪的五種含義190
了解受眾192
生態系統193
跟踪系統193
X-Ray、Stackdriver等194
標準項目194
總結200
參考資料201
7 使用服務網格進行跟踪202
服務網格203
服務網格的可觀測性206
先決條件207
項目源代碼207
Java開發環境208
Kubernetes 208
Istio 208
Hello應用程序210
使用Istio進行分佈式跟踪213
使用Istio生成服務圖223
分佈式上下文和路由225
總結228
參考資料228
8 關於採樣230
基於頭部的一致性採樣231
概率採樣231
速率限制採樣232
保證吞吐量的概率採樣234
自適應採樣235
上下文敏感的採樣244
實時採樣或調試採樣244
如何處理過採樣247
基於尾部的一致性採樣249
部分採樣253
總結253
參考資料253
Ⅲ 從跟踪中獲取價值255
9 跟踪的價值256
作為知識庫的跟踪257
服務圖257
深度,路徑感知服務圖259
檢測架構問題262
性能分析263
關鍵路徑分析263
識別跟踪模式265
範例269
延遲直方圖271
長期性能分析273
總結273
參考資料274
10 分佈式上下文傳播275
布朗跟踪平面276
Pivot Tracing 280
混沌工程283
流量標記285
生產環境測試286
生產環境調試287
在生產環境中進行開發288
總結289
參考資料289
11 集成指標與日誌291
可觀測性的三大支柱292
先決條件294
項目源代碼294
Java開發環境295
在Docker中運行服務器295
在Kibana中聲明索引模式296
運行客戶端297
Hello應用程序298
與指標集成299
通過跟踪埋點實現標準指標299
向標準指標中添加上下文303
上下文感知的指標API 308
與日誌集成309
結構化日誌記錄309
將日誌與跟踪上下文關聯起來311
上下文感知的日誌API 316
在跟踪系統中捕獲日誌316
是否需要單獨的日誌記錄和跟踪後端318
總結319
參考資料320
12 通過數據挖掘提煉洞見321
特徵提取322
數據挖掘管道的組件323
跟踪後端324
跟踪完成觸發器324
特徵提取器325
聚合器326
特徵提取練習326
先決條件328
項目源代碼328
在Docker中運行服務器329
在Elasticsearch中定義索引映射330
Java開發環境331
微服務模擬器331
在Kibana中定義索引模式334
span計數作業336
跟踪完成觸發器338
特徵提取器340
觀測趨勢341
謹防推斷349
歷史分析350
實時分析350
總結353
參考資料353
Ⅳ 部署和維護跟踪基礎設施355
13 在大型組織中實施跟踪356
為什麼很難部署跟踪埋點357
減少採用障礙358
標準框架359
內部適配器庫360
默認啟用跟踪361
monorepo 361
與現有的基礎設施集成362
從哪裡開始362
構建文化364
解釋價值364
與開發人員工作流集成365
跟踪質量指標366
故障排除指南369
跳出關鍵路徑369
總結369
參考資料370
14 分佈式跟踪系統的底層架構371
為什麼需要自己“造輪子” 372
定制和集成372
帶寬成本372
把控數據373
押注新興標準373
架構和部署模式374
基本架構:代理+收集器+查詢服務374
流式架構377
多租戶378
安全381
在多個數據中心運行382
監控和故障診斷384
彈性386
過採樣386
調試跟踪387
數據中心故障轉移導致的流量峰值387
無休止的跟踪387
長跟踪388
總結388
參考資料388
後記390
參考資料393