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

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

0408_1.jpg

SendReport的實現在client_context_base.cc中,跳轉到client_impl中。

0408_2.jpg

client_impl.cc跳轉到report_batch中。

0408_3.jpg

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

0408_4.jpg

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

0408_5.jpg

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

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:

0408_7.jpg

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

0408_8.jpg

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

現在我們會回到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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章