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

最新文章

  1. Final-阶段站立会议6
  2. 缓存AsimpleCache -- 解决Android中Sharedpreferences无法存储List数据/ASimpleCache
  3. noi1696 逆波兰表达式
  4. erlang局域网内节点通信——艰难四步曲 (转)
  5. 使用jeesite org.springframework.beans.NotReadablePropertyException: Invalid property 'tfxqCmsAccount.id' of bean class
  6. web调试工具
  7. visualvm
  8. Http的Post和Get
  9. HUNNU Contest 区间最值
  10. 已经安装了Myeclipse8.5 的情况下,激活myeclipse10.7要注意
  11. pixi.js
  12. FFmpeg备忘录
  13. HttpClient学习--HttpClient的POST请求过程源码解读
  14. package.json中 npm依赖包版本前的符号的意义
  15. 前端-----css(1)
  16. 001.Oracle安装部署-本地文件系统
  17. [DevExpress使用随笔]之NavBarControl控件(一)【转】
  18. Redis使用sortedset缓存IP段数据
  19. QUIC:基于udp的传输新技术
  20. _map

热门文章

  1. unittest中的TestLoader使用
  2. Pytest单元测试框架-测试用例运行规则
  3. tomcat一闪而过,无法开启
  4. [LeetCode] 165. Compare Version Numbers 比较版本数
  5. [LeetCode] 243. Shortest Word Distance 最短单词距离
  6. Oracle spatial空间查询的选择度分析
  7. dockfile构建自己的tomcat
  8. ByteBuffer常见方法
  9. 《TCP/IP - TCP/UDP》
  10. Django连接多个数据库并实现读写分离