服務網格ASM集成了阿里云可觀測鏈路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實例已啟用鏈路追蹤。具體操作,請參見將鏈路追蹤數據采集到阿里云可觀測鏈路OpenTelemetry版。
示例解析
在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個調用鏈路。
查看調用鏈瀑布圖
調用鏈路的瀑布圖展示了調用鏈路的日志產生時間、狀態、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。
查看額度請求數量和昨日請求數量。
在左側導航欄,單擊集群配置,查看額度請求數量和昨日請求數量。
根據以上結果,可以看到服務的請求數量大于鏈路追蹤的額度請求數量。
修改額度請求數量。
如果服務的請求數量大于鏈路追蹤的額度請求數量,上報的數據將會被丟棄,您將看不到服務的調用鏈路。您需要修改額度配置,使得額度請求數量大于服務請求數量。
在可觀測鏈路OpenTelemetry版控制臺左側導航欄,單擊集群配置。
在集群配置頁簽的額度配置區域修改配置額度,使得額度請求數量大于服務請求數量,然后單擊保存。
在提示對話框,單擊確認。
為什么traceid經過ASM網關或Sidecar后發生了改變?
該問題可能是由于發起端應用在發起請求時攜帶的特定傳播標頭不全,Envoy認為追蹤信息不完整,導致重新生成了傳播標頭。若您希望自行生成traceid
,對于B3傳播器來說,請求中至少需要攜帶x-b3-trace-id和x-b3-spanid兩個標頭;對于W3C Trace Context傳播器來說,請求中至少需要攜帶traceparent標頭。