Service MeshASM整合了阿里雲可觀測鏈路OpenTelemetry版,為分布式應用的開發人員提供了完整的調用鏈路還原、調用請求量統計、鏈路拓撲、應用依賴分析等能力,可以協助開發人員快速分析和診斷分布式應用架構下的效能瓶頸,提升開發診斷效率。本文介紹如何在ASM中實現分布式跟蹤。
背景資訊
分布式跟蹤是一種用於對應用程式進行概要分析和監視的方法,尤其是適用於使用微服務架構構建的應用程式。使用服務網格時,Istio代理Envoy可以自動產生和發送Span資訊,但為了確保這些 Span 能正確關聯到同一個跟蹤中,應用程式仍然需要傳播相應的HTTP標題。在代理髮送Span時,應用程式必須收集特定的標題並將其從傳入請求傳播到所有傳出請求。OpenTelemetry支援不同的傳播器,在不同的傳播器中,特定的標題格式定義也有所不同,以下列出了OpenTelemetry支援的傳播器以及對應的標題。
B3傳播器
-
x-request-id -
x-b3-traceid -
x-b3-spanid -
x-b3-parentspanid -
x-b3-sampled -
x-b3-flags -
x-ot-span-context
W3C Trace Context傳播器
-
traceparent -
tracestate
ASM在1.18.0.124版本之前預設採用的B3傳播器,之後預設採用W3C Trace Context傳播器。
前提條件
-
阿里雲帳號已開通可觀測鏈路OpenTelemetry版。關於如何計費,請參見計費規則。
-
ASM執行個體已啟用鏈路追蹤。具體操作,請參見配置上報ASM鏈路追蹤資料。
樣本解析
在Bookinfo書評應用中,以Python語言實現的productpage服務使用了OpenTracing庫,並利用B3傳播器標題格式從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服務是也可以看到使用了B3傳播器的HTTP標題。
@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,可以看到Bookinfo應用的頁面。
查看應用列表
應用列表頁面展示了所有被監控應用的健康度得分、本日請求數、本日錯誤數等關鍵計量。您還可以為應用設定自訂標籤,從而通過標籤進行篩選。
-
在左側導覽列,單擊應用列表,然後在頁面上方,選擇目標地區。
查看應用詳情
應用詳情頁面可展示應用在所部屬的每一台機器上的關鍵效能指標、調用拓撲圖和調用鏈路。
-
在左側導覽列,單擊應用列表,然後在頁面上方選擇目標地區,單擊目標應用程式名稱。
-
在左側導覽列,單擊應用詳情,在左側的機器列表中單擊全部或一台以IP地址標識的機器。
您可以在概覽頁簽查看調用拓撲圖和關鍵效能指標;在調用鏈路頁簽查看該應用在所選機器上的調用鏈路列表,按耗時降序排列,最多可列出100個調用鏈路。單擊 調用鏈路 頁簽,查看調用鏈路記錄列表。左側面板提供 回應時間、請求數、錯誤數 排序指標及執行個體篩選,右側列表展示各 Span 的 產生時間、Span名稱、主機/ip、耗時、狀態、traceId 等資訊。可通過 耗時大於 輸入框和 異常 複選框過濾記錄,單擊 查看日誌 可查看對應調用的日誌詳情。
查看調用鏈瀑布圖
調用鏈路的瀑布圖展示了調用鏈路的日誌產生時間、狀態、IP址/機器名稱、服務名、時間軸等資訊。
-
在應用詳情頁面,單擊調用鏈路頁簽,然後單擊目標鏈路的Trace ID。
-
在新彈出的調用鏈路頁面,查看該調用鏈路的瀑布圖。
FAQ
為什麼在ASM中將鏈路追蹤資料擷取到可觀測鏈路OpenTelemetry版,卻仍然看不到調用鏈路?
-
查看鏈路推送日誌。
-
執行以下命令,查看istio-system命名空間下tracing-on-external-zipkin的鏈路推送日誌。
kubectl logs "$(kubectl get pods -n istio-system -l app=tracing -o jsonpath='{.items[0].metadata.name}')" -n istio-system -c nginx可以看到鏈路推送日誌的狀態代碼為406。執行上述命令,若輸出的Nginx日誌中
status值為406,說明對/api/v2/spans的POST請求返回了HTTP 406狀態代碼。remote_addr:192.168.26.98 time_local:17/Aug/2021:08:15:17 +0000 method:POST uri:/api/v2/spans host:zipkin status:406 bytes_sent:1146 referer:- useragent:- forwardedfor:192.168.26.98 request_time:0.012 upstream_response_time:0.011 remote_addr:192.168.26.98 time_local:17/Aug/2021:08:15:17 +0000 method:POST uri:/api/v2/spans host:zipkin status:406 bytes_sent:1146 referer:- useragent:- forwardedfor:192.168.26.98 request_time:0.012 upstream_response_time:0.013
-
查看額度請求數量和昨日請求數量。
-
在左側導覽列,單擊叢集配置,查看額度請求數量和昨日請求數量。
在額度配置面板中,配置額度欄位以萬個請求為單位顯示當前額度值,面板標題括弧內顯示昨日實際請求數。若昨日請求數超過配置額度,需調大額度。
根據以上結果,可以看到服務的請求數量大於鏈路追蹤的額度請求數量。
-
修改額度請求數量。
如果服務的請求數量大於鏈路追蹤的額度請求數量,上報的資料將會被丟棄,您將看不到服務的調用鏈路。您需要修改額度配置,使得額度請求數量大於服務要求數量。
-
在可觀測鏈路OpenTelemetry版控制台左側導覽列,單擊叢集配置。
-
在叢集配置頁簽的額度配置地區修改配置額度,使得額度請求數量大於服務要求數量,然後單擊儲存。
-
在提示對話方塊,單擊確認。
-
為什麼traceid經過ASM網關或Sidecar後發生了改變?
該問題可能是由於發起端應用在發起請求時攜帶的特定傳播標題不全,Envoy認為追蹤資訊不完整,導致重建了傳播標題。若您希望自行產生traceid,對於B3傳播器來說,請求中至少需要攜帶x-b3-trace-id和x-b3-spanid兩個標題;對於W3C Trace Context傳播器來說,請求中至少需要攜帶traceparent標題。