Istio-proxy的report主要是将envoy采集到的链接attributes的信息上报给控制面的mixer,它的入口在request_handler_impl.cc文件中,这里须要打开enable_mixer_report开关,提取出report_data中的attribute信息,调用SendReport发送出去。html
SendReport的实如今client_context_base.cc中,跳转到client_impl中。函数
client_impl.cc跳转到report_batch中。3d
report_batch.cc中会在batch_compresser中添加attributes做为向mixer发起的请求report,这里的Add是一个bool,判断是否全部的上次请求所用的attributes都在本次的report的请求中。 htm
attribute_compressor.cc中定义了Add的方法,利用CompressByDict更新压缩过的attributes &pb,若是在这一步压缩的变量所有都在,那么compressbydict的返回值是true,会更新pb。若是有的attributes的变量不存在,那么返回值为false,不更新pb,回到上一张图。blog
Compress是否成功在下图的函数中判断,这里用到的是delta_update,在delta_update.cc中,也就是增量更新:it
具体是最早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
对于index的对应的value有更新,或者新的index的状况,Check返回false,会根据对应的值的属性添加到对应的map中,更新pb的值。for循环
当全部的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中发送出去。
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