本系列文章講講述阿裡雲服務網格ASM的一些擴充能力:
- 阿裡雲服務網格ASM之擴充能力(1):在ASM中通過EnvoyFilter添加HTTP請求頭
- 阿裡雲服務網格ASM之擴充能力(2):在ASM中支援自定義外部授權
- 阿裡雲服務網格ASM之擴充能力(3):在ASM中使用開放政策代理OPA
- 阿裡雲服務網格ASM之擴充能力(4):在ASM中實作分布式跟蹤
歡迎掃碼入群進一步交流:

服務網格與分布式跟蹤
根據
Open Tracing網站的介紹,分布式跟蹤(也稱為分布式請求跟蹤)是一種用于對應用程式進行概要分析和監視的方法,尤其是針對使用微服務架構建構的應用程式。分布式跟蹤有助于查明哪裡發生故障以及什麼原因導緻性能下降。
常見的誤解是在使用服務網格進行服務跟蹤實作時,不需要任何代碼的更改。實際上,根據
Istio的官方介紹,盡管Istio代理能夠自動發送Span,但是應用程式仍然需要傳播适當的HTTP标頭,以便在代理發送Span資訊時,可以将Span正确地關聯到單個跟蹤中。為此,應用程式需要收集以下标頭并将其從傳入請求傳播到任何傳出請求。
-
x-request-id
-
x-b3-traceid
-
x-b3-spanid
-
x-b3-parentspanid
-
x-b3-sampled
-
x-b3-flags
-
x-ot-span-context
該
x-b3
頭起源于Zipkin項目,标頭的B3部分是以Zipkin的原始名稱BigBrotherBird命名。在服務調用之間傳遞這些标頭稱之為B3傳播。根據
Zipkin的原理,這些屬性通常通過HTTP标頭進行傳播,并最終傳播到下遊,以確定将源自同一根的所有活動收集在一起。
阿裡雲鍊路追蹤服務
阿裡雲鍊路追蹤 Tracing Analysis 為分布式應用的開發者提供了完整的調用鍊路還原、調用請求量統計、鍊路拓撲、應用依賴分析等工具,可以幫助開發者快速分析和診斷分布式應用架構下的性能瓶頸,提高微服務時代下的開發診斷效率。
使用鍊路追蹤之前,首先需要開通鍊路追蹤服務。由于鍊路追蹤依賴日志服務 LOG 和通路控制 RAM 服務,是以也需要開通這兩項服務,并授權鍊路追蹤讀寫您的日志服務資料。
關于開通相關服務和授權的方法,請參見
開通相關服務并授權。
為ASM執行個體啟用鍊路追蹤
服務網格ASM內建了阿裡雲鍊路追蹤服務,為分布式應用的開發者提供了完整的調用鍊路還原、調用請求量統計、鍊路拓撲、應用依賴分析等能力,可以幫助開發者快速分析和診斷分布式應用架構下的性能瓶頸,提升開發診斷效率。
在建立ASM執行個體時啟用鍊路追蹤
使用者在建立網格時,可以通過勾選“啟用鍊路追蹤”來啟用ASM的鍊路追蹤能力,在勾選後,還使用者還可以設定追蹤流量的百分比,設定範圍為0.01 - 100.00。
說明:啟用該配置時,使用者需要提前開通
為已有ASM執行個體啟用鍊路追蹤或調整追蹤比例
使用者可以随時開啟ASM執行個體的追蹤能力或調整鍊路追蹤的百分比。
如果在建立服務網格ASM執行個體時沒有勾選啟用OPA插件,可以通過如下方式重新開機開啟。
登入服務網格控制台,在ASM執行個體詳情頁的右上角,點選功能設定按鈕。
- 在彈出的視窗中,可以重新勾選啟用或者禁用鍊路追蹤(當然,如果啟用的話,仍然是需要確定已經開通了鍊路服務)。
部署示例
按照
文檔部署應用到一個ASM服務網格中。檢視示例中的以Python 語言實作的
productpage
服務,則會發現該應用程式使用了
OpenTracing庫從HTTP請求中提取了所需的标頭:
def getForwardHeaders(request):
headers = {}
# x-b3-*** headers can be populated using the opentracing span
span = get_current_span()
carrier = {}
tracer.inject(
span_context=span.context,
format=Format.HTTP_HEADERS,
carrier=carrier)
headers.update(carrier)
# ...
incoming_headers = ['x-request-id']
# ...
for ihdr in incoming_headers:
val = request.headers.get(ihdr)
if val is not None:
headers[ihdr] = val
return headers
同樣地,檢視以Java語言實作的reviews服務:
@GET
@Path("/reviews/{productId}")
public Response bookReviewsById(@PathParam("productId") int productId,
@HeaderParam("end-user") String user,
@HeaderParam("x-request-id") String xreq,
@HeaderParam("x-b3-traceid") String xtraceid,
@HeaderParam("x-b3-spanid") String xspanid,
@HeaderParam("x-b3-parentspanid") String xparentspanid,
@HeaderParam("x-b3-sampled") String xsampled,
@HeaderParam("x-b3-flags") String xflags,
@HeaderParam("x-ot-span-context") String xotspan) {
if (ratings_enabled) {
JsonObject ratingsResponse = getRatings(Integer.toString(productId), user, xreq, xtraceid, xspanid, xparentspanid, xsampled, xflags, xotspan);
通路示例
在浏覽器位址欄輸入_
http://{__入口網關服務的IP位址__}/__productpage_,可以看到如下類似頁面,重新整理頁面以實作多次通路效果。
檢視應用清單
應用清單頁面展示了所有被監控應用的健康度得分、本日請求數、本日錯誤數等關鍵名額。您還可以為應用設定自定義标簽并使用标簽來篩選。
請按照以下步驟進入應用清單頁面。
- 登入 鍊路追蹤 Tracing Analysis 控制台
- 在左側導航欄中單擊應用清單,并在應用清單頁面頂部選擇目标地域。
檢視應用詳情
應用詳情頁面可展示應用在所部屬的每一台機器上的關鍵性能名額、調用拓撲圖和調用鍊路。
- 在左側導航欄中單擊應用清單,并在應用清單頁面頂部選擇地域,然後單擊應用名稱。
- 在左側導航欄中單擊應用詳情,在左側的機器清單中單擊全部或一台機器,然後在概覽頁簽上檢視調用拓撲圖和關鍵性能名額。應用詳情頁面的調用鍊路頁簽列出了該應用在所選機器上耗時最長的 100 個調用鍊路。
阿裡雲服務網格ASM之擴充能力(4):在ASM中實作分布式跟蹤
檢視調用鍊瀑布圖
- 在調用鍊路頁簽上單擊 TraceID,即可在新視窗中打開調用鍊路頁面,并檢視該調用鍊路的瀑布圖。
- 在新視窗中的調用鍊路頁面上,您可以看到調用鍊路的日志産生時間、狀态、IP 位址/機器名稱、服務名、時間軸等資訊。
- 注意: IP 位址字段顯示的是 IP 位址還是機器名稱,取決于應用設定頁面上的顯示配置。詳情請參見 管理應用和标簽
将滑鼠懸浮于服務名上,還可以檢視該服務的時長、開始時間、Tag 和日志事件等資訊。
其他具體操作可以參考
鍊路跟蹤文檔