docker_logs: 一种临时流错误,从 Vector 进程启动以来重放每一条记录
问题
当“ docker logs” 日志串流以 * 短暂 * 错误结束时, 源不恢复 从上次交付的记录开始——它从维克特进程开始时间恢复并重载 自从矢量发射以来 集装箱的每行都记录下来了
结果是,一个可回收的溪流再发送一个容器的整个历史, 重新交付的数量随着收集器的起动时间而增加。 在我们的环境下,一个代理在前面 Docker 套接字在固定的10分钟宽度上切入了闲置的日志后流;每个切出一个完整的 重弹. 测量的再交付因子,按准确的“时间UnixNano”对收到的记录进行分组:
容器 窗口 记录 不同因素 |-|-|-|-. 低容量缓存服务 95分 128分 13分 **9.8x ** |
- 闲置的建材基箱 * * * ~ 3天 *
没有丢失记录,接收器从未施放回压——每份副本都被接受. 这起9.8x案是每10分钟切出一次所有13个记录的回放.
代码路径
在“src/sources/docker logs/mod.rs”(v0.56.0)中,一个容器的恢复位置位于 `ContanerLogInfo',属于运行中的溪流任务。
一个干净 流端返回它, 所以州生存:
让结果=匹配(结果,错误){
(Ok( ()), 无) QQ Ok( info), // 信息保存
(ERR( (())), -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --(Info.id,错误存在:永久), -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
( , some( 意外) ) * @ Err( (info.id, 发生)), /// info DROPPED
* ;
主循环恢复“重起”的干净外壳,该外壳重新使用现有的“信息”:
有些( Ok( info)) {{
让状态 =自. containers.get mut(和info.id).expect(.);
如果状态。 返回 info( info) { self.esb.restart(状态);}
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
但 " 集装箱 " 的 " 瞬变器 " 案件只是 " 起动 " :
错误持续时间: 如果状态. is running () {
让后退=一些(自.后退 期限);
自动. containers. 插入( id. clone (), self. esb. start (id, backoff) ) );
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
和“开始” 建立一个** brand新** “集装箱LogInfo” 以源头的'now timestamp'为种子:
让信息=集装箱LogInfo: new(id, m元数据, this.core.now timestamp);
现在 时间戳'在源创建时被捕获一次,所以是矢量过程开始 时间。 last log'现在是none',因此log since ()'返回进程开始,而不是
上次发送的记录 :
fn 日志自( &self) - > i64 {
last log.as ref ().map (|(d, )| d.timestamp ()).
. unwrap or else ( 自创建. timestamp ()) - 1
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
该值直接传递到 Docker API :
. suse(info.log suse () as i32) (中文(简体) ).
新 事件'中的重复警卫无济于事,因为用最后 log:无'就不用了。
第一分支,它承认“创建”后的一切:
无 {{{
如果自己. 创建 < timetamp. with timezone( & Utc) {
//Noop - 第一个处理日志 。
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
所以每个 . . . . . . .
内容来源: vectordotdev/vector