Flume-ng生产环境实践(二)flume-ng 测试过程中event丢失部分body数据

经过测试发现,当source端单event的body数据大于16字节后,输出到目标只剩下16字节。进过多源代码的分析,发现,源代码中进行了截取。
在LoggerSink.java中:
if (event != null) {
        if (logger.isInfoEnabled()) {
          logger.info("Event: " + EventHelper.dumpEvent(event));
        }
}

我们去看EventHelper.java的dumpEvent方法:
private static final int DEFAULT_MAX_BYTES = 16;
public static String dumpEvent(Event event) {
    return dumpEvent(event, DEFAULT_MAX_BYTES);
}

public static String dumpEvent(Event event, int maxBytes) {
    StringBuilder buffer = new StringBuilder();
    if (event == null || event.getBody() == null) {
      buffer.append("null");
    } else if (event.getBody().length == 0) {
      // do nothing... in this case, HexDump.dump() will throw an exception
    } else {
      byte[] body = event.getBody();
      byte[] data = Arrays.copyOf(body, Math.min(body.length, maxBytes));
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      try {
        HexDump.dump(data, 0, out, 0);
        String hexDump = new String(out.toByteArray());
        // remove offset since it's not relevant for such a small dataset
        if(hexDump.startsWith(HEXDUMP_OFFSET)) {
          hexDump = hexDump.substring(HEXDUMP_OFFSET.length());
        }
        buffer.append(hexDump);
      } catch (Exception e) {
       if(LOGGER.isInfoEnabled()) {
         LOGGER.info("Exception while dumping event", e);
       }
        buffer.append("...Exception while dumping: ").append(e.getMessage());
      }
      String result = buffer.toString();
      if(result.endsWith(EOL) && buffer.length() > EOL.length()) {
        buffer.delete(buffer.length() - EOL.length(), buffer.length()).toString();
      }
    }
    return "{ headers:" + event.getHeaders() + " body:" + buffer + " }";
  }

不难看出,在event处理过程中,发生了数据截取操作。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值