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

CCE_huawei發表於2019-04-08

Istio-proxy的report主要是將envoy採集到的連線attributes的資訊上報給控制面的mixer,它的入口在request_handler_impl.cc檔案中,這裡需要開啟enable_mixer_report開關,提取出report_data中的attribute資訊,呼叫SendReport傳送出去。

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

client_impl.cc跳轉到report_batch中。

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

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

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

具體是最先Start(),這裡會設定set變數prev_set_,將之前一次report的map中的index存入,然後呼叫Check,利用MessageDifferencer::Equals比較同一個index的值是否更新,如果更新就會重新整理prev_map_中index對應的value。如果是新的index,那麼會作為一個新的元素插入prev_map_,每次執行一次index的比較,就會刪去prev_set_中當前的index值,直到執行完成所有的當前上報的attributes的index:

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

當所有的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中傳送出去。

max_batch_entries和max_batch_time_ms的預設值在options.h中,分別為1000條和1000ms。

在FlushWithLock中:

attribute_compressor.cc中用Finish()把dictionary中的message_words_新增上。

需要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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69908804/viewspace-2640630/,如需轉載,請註明出處,否則將追究法律責任。

相關文章