idou老師教你學istio 31:Istio-proxy的report流程

Istio-proxy的report主要是將envoy採集到的鏈接attributes的信息上報給控制面的mixer,它的入口在request_handler_impl.cc文件中,這裏須要打開enable_mixer_report開關,提取出report_data中的attribute信息,調用SendReport發送出去。html

0408_1.jpg

SendReport的實如今client_context_base.cc中,跳轉到client_impl中。函數

0408_2.jpg

client_impl.cc跳轉到report_batch中。3d

0408_3.jpg

report_batch.cc中會在batch_compresser中添加attributes做爲向mixer發起的請求report,這裏的Add是一個bool,判斷是否全部的上次請求所用的attributes都在本次的report的請求中。 htm

0408_4.jpg

attribute_compressor.cc中定義了Add的方法,利用CompressByDict更新壓縮過的attributes &pb,若是在這一步壓縮的變量所有都在,那麼compressbydict的返回值是true,會更新pb。若是有的attributes的變量不存在,那麼返回值爲false,不更新pb,回到上一張圖。blog

0408_5.jpg

Compress是否成功在下圖的函數中判斷,這裏用到的是delta_update,在delta_update.cc中,也就是增量更新:it

0408_6.jpg

具體是最早Start(),這裏會設置set變量prev_set_,將以前一次report的map中的index存入,而後調用Check,利用MessageDifferencer::Equals比較同一個index的值是否更新,若是更新就會刷新prev_map_中index對應的value。若是是新的index,那麼會做爲一個新的元素插入prev_map_,每次執行一次index的比較,就會刪去prev_set_中當前的index值,直到執行完成全部的當前上報的attributes的index:io

0408_7.jpg

對於index的對應的value有更新,或者新的index的狀況,Check返回false,會根據對應的值的屬性添加到對應的map中,更新pb的值。for循環

0408_8.jpg

當全部的attributes都for循環完成以後,這個函數會返回delta_update.Finish(),也就是prev_set_中的index是否所有存在。若是所有存在都會被erase掉,此時set爲空,返回true,證實CompressByDict完成。若是有值沒有上報,那麼返回值爲false。class

如今咱們會回到report_batch.cc中,如今request已經壓縮完成若是Add值爲true,這時會判斷compressor的尺寸是否大於等於預設的batch的大小,或是否超過了上報的max_batch_time,若是二者其中一個知足條件,就會調用FlushWithLock()像mixer發送report。變量

若是add的值爲false,那麼會將這條request以前的已經壓縮好的信息調用FlushWithLock()先發送出去,而後再執行一遍Add操做,本次的request會在下一次report中發送出去。

0408_9.jpg

max_batch_entries和max_batch_time_ms的默認值在options.h中,分別爲1000條和1000ms。

0408_10.jpg

在FlushWithLock中:

0408_11.jpg

attribute_compressor.cc中用Finish()把dictionary中的message_words_添加上。

0408_12.jpg0408_13.jpg

須要report的信息完整以後,reset_compressor,調用transport_把report的request發送給mixer,而且刪除response。

若是發送的信息狀態!ok,返回ERROR提示"Mixer Report failed with: ",而且將GlobalDictionary()重置大小。

相關服務請訪問:https://support.huaweicloud.com/cce/index.html?utm_content=cce_helpcenter_2019

相關文章
相關標籤/搜索