十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Vector Socket Sink 深入解析:通过 TCP、UDP 与 Unix 域套接字交付日志与指标

Vector Socket Sink 深入解析:通过 TCP、UDP 与 Unix 域套接字交付日志与指标 Vector Socket Sink 深入解析通过 TCP、UDP 与 Unix 域套接字交付日志与指标【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vectorVector 的socketsink 是一个稳定版stable组件负责把日志、指标乃至 traces 输入下的原始数据编码后交付到远端 TCP 端点、UDP 端口或本机 Unix 域套接字。本文以官方组件文档为骨架结合 src/sinks/socket.rs 与 src/sinks/util 下的底层实现完整讲解其mode四种取值、全部配置字段含 TLS、keepalive、发送缓冲区、framing 等、四种模式的真实配置示例以及连接建立、断线检测、指数退避重连的源码级工作机制帮助你把 socket sink 真正用于日志转发如转发到 syslog 风格接收端、GELF 网关与指标导出场景。一、组件定位能力矩阵速览socketsink 的能力矩阵定义在 socket.cue 中页面元数据则来自 socket.md标题 Socket描述为 Deliver logs to a remote socket endpoint并带有旧版/docs/reference/sinks/tcp的别名。关键字段如下维度取值含义交付方式 (delivery)best_effort尽力交付无服务端确认协议断连期间数据可能丢失组件状态 (development)stable稳定版组件出口方式 (egress_method)stream以流式方式推送事件健康检查 (healthcheck)支持启动时验证目标可连通端到端确认 (acknowledgements)支持仅适用于可确认的上游如 socket source详见下文压缩 (compression)不支持原生无压缩选项编码 (encoding)支持可选json/text/gelf三种 codec并支持 framing输入类型logs、metricscounter/distribution/gauge/histogram/set/summary、traces具体可接受的输入由所选 encoding 决定状态 (stateful)false无本地持久状态从源码结构看socketsink 本质是一个模式聚合器SocketSinkConfig通过#[serde(flatten)]把mode判别字段展开实际配置被分派到TcpMode/UdpMode/UnixMode三种子结构分别复用src/sinks/util中独立的 TCP、UDP、Unix 实现见 socket.rs 的 Mode 枚举。二、配置字段完整参考以下字段参考来自自动生成的字段元数据 generated/socket.cue并结合源码标注了行为细节字段类型必填适用模式说明modestring 枚举是全部套接字类型tcp、udp、unix_stream、unix_datagramaddressstring是tcp、udp目标地址IP 或主机名均可必须包含端口如92.12.333.224:5000pathstring是unix_stream、unix_datagramUnix 套接字路径应为绝对路径如/path/to/socketencodingobject是全部编码配置codec 可选json/text/gelf所选 encoding 同时决定支持的输入类型framingobject否tcp、unix_stream、unix_datagram分帧配置用于在字节流中标记事件边界UDP 模式不适用keepaliveobject否仅tcpTCP keepalive 参数对应TcpKeepaliveConfigsend_buffer_bytesuint (bytes)否tcp、udp套接字发送缓冲区大小通过SO_SNDBUF选项下发示例值65536tlsobject否仅tcpTLS 配置支持证书与主机名校验默认不启用acknowledgementsobject否全部端到端确认配置见 e2e acks 相关机制mode字段的四个枚举值及其官方描述见 generated/socket.cuetcp— Send over TCP.udp— Send over UDP.unix_stream— Send over a Unix domain socket (UDS), in stream mode.源码中带#[serde(alias unix)]见 socket.rs因此写mode: unix也合法。unix_datagram— Send over a Unix domain socket (UDS), in datagram mode.macOS 上不可用由于 macOSsend(2)的疑似非阻塞行为会返回 ENOBUFS 错误当前实现未处理socket.rs 注释。mode的平台限制在validate()中被硬性拦截非 Unix 平台如 Windows配置任何 Unix 模式会直接报错 Unix modes are supported only on Unix platformsmacOS 上配置unix_datagram同样报错见 socket.rs validate 实现。三、四种模式的配置示例1. TCP 模式支持 TLS、framing、keepaliveGenerateConfig中给出的官方最小示例socket.rssinks: my_tcp_sink: type: socket mode: tcp address: 92.12.333.224:5000 encoding: codec: json完整参数版本含 TLS 与 framing字段均可选sinks: my_tcp_sink: type: socket mode: tcp address: logs.example.com:5000 # 必须带端口 tls: enabled: true verify_certificate: true verify_hostname: true ca_file: /etc/ssl/certs/ca-bundle.crt keepalive: enabled: true send_buffer_bytes: 65536 framing: delimiter: \n encoding: codec: gelf几点行为说明均可在源码中验证地址解析address通过http::Uri解析tcp.rs parse_address因此host:port之外也接受https://somehost:5000这类带 scheme 的写法缺失 host 或端口会在配置校验阶段被拒绝而不是等到运行时对应测试validate_rejects_tcp_address_without_portsocket.rs。DNS 解析在连接阶段进行TcpConnector::connect先通过dns::Resolver解析主机名再发起 TCP 连接tcp.rs。keepalive / 发送缓冲区连接建立后依次应用set_keepalive与SO_SNDBUF两者设置失败只告警不中断warn!(Failed configuring ...)。2. UDP 模式数据报无 framingsinks: my_udp_sink: type: socket mode: udp address: metrics.example.com:514 send_buffer_bytes: 65536 encoding: codec: jsonUDP 模式的三个关键差异没有framing字段它不是流而是逐包发送当编码器支持 chunker 时事件会被切分为符合数据报大小限制的块udp.rs run 实现 调用send_datagrams。本地绑定地址自动推导find_bind_address按对端 IPv4/IPv6 选择0.0.0.0:0/[::]:0进行 bindudp.rs保证本地地址族与远端一致。无 TLS、无 keepalive这两个字段在 CUE 元数据中均标注仅tcp模式相关。3. Unix stream 模式sinks: my_unix_sink: type: socket mode: unix_stream # 也可写 mode: unixserde alias path: /var/run/vector/log.sock framing: delimiter: \n encoding: codec: json4. Unix datagram 模式macOS 不可用sinks: my_unix_dgram_sink: type: socket mode: unix_datagram path: /var/run/vector/dgram.sock framing: delimiter: \n encoding: codec: textUnix 两种模式在build时分别映射到UnixMode::Stream/UnixMode::Datagram由UnixConnector用UnixStream::connect或UnixDatagram::unbound() connect建立连接unix.rs。四、交付语义best-effort、acknowledgements 与健康检查尽力交付。从源码结构看TCP 与 Unix stream 模式共用BytesSink一旦写入失败只会发出SocketSendError内部事件并丢弃当前批次不保证送达tcp.rs run 实现 中的注释明确写着 best-effort delivery。socket.cue中delivery: best_effort即对应这一语义。端到端确认。acknowledgements字段继承自AcknowledgementsConfig控制事件确认如何在该 sink 上处理。由于 socket 协议本身无服务端 ACK实际确认效果取决于上游事件携带的 finalizersTCP 流式发送成功后EncodedEvent中携带的 finalizers 会被调用以完成确认链。健康检查。所有三种底层连接器都实现了healthcheck()其实现就是尝试建立一次连接tcp.rs、udp.rs、unix.rs因此vector validate之外的运行期健康探测本质是目标端口/路径当前是否可达。五、源码级工作机制5.1 配置到运行时的调用链SocketSinkConfig实现了SinkConfigValidatedSink两个 traitsocket.rsinput()根据mode返回编码器声明的输入类型——这正是所选 encoding 决定支持的输入类型的由来例如jsoncodec 可接收 logs/metricsgelf面向日志validate()做纯解析校验TCP/UDP 只解析 host/port 不做 DNS 与 TLSUnix 模式检查平台可用性产出ValidatedSocket枚举含 Tcp/Udp/UnixStream/UnixDatagram见 socket.rsbuild()按模式构建 encoderTCP 与 Unix 走SinkType::StreamBased构建 framer serializerUDP 仅构建 serializer 并取 chunker再调用对应*SinkConfig::build产出VectorSink与 healthcheck future。5.2 连接建立与指数退避重连三种模式的连接器TcpConnector/UdpConnector/UnixConnector共享同一套重连范式connect_backoff连接失败则发出*SocketOutgoingConnectionError内部事件按ExponentialBackoff::default()睡眠后重试成功则发出*SocketConnectionEstablished以 tcp.rs connect_backoff 为例UDP/Unix 结构相同。代码中留有// TODO: make configurable说明退避参数当前不可配置——这是使用时需要了解的适用前提。5.3 远端断开检测TCPTCP 模式在每次写之前执行shutdown_check以 1 字节 buffer 对连接做poll_read——返回错误或Ok(0)读端已关闭即判定连接失效并触发重连返回Pending则认为连接仍有效tcp.rs shutdown_check。集成测试tcp_stream_detects_disconnect专门验证该路径发送 10 个事件后由服务端 shutdown再发 10 个事件最终断言服务端收到 20 个事件且共建立 2 次连接socket.rs 测试reconnect测试则覆盖硬断连后的恢复5 秒内必须重新建立连接。5.4 单元测试对配置的守护socket.rs 测试模块 直接锁定了配置边界validate_produces_usable_state、validate_rejects_invalid_tcp_address、validate_rejects_tcp_address_without_port、validate_rejects_invalid_udp_address、validate_rejects_udp_address_without_port以及udp_ipv4/udp_ipv6/unix_datagram/tcp_stream/metrics_socket验证 Unix stream 上可输出 metrics等端到端用例。修改 socket sink 相关代码时这些用例是验证回归的第一道门。六、实践要点与限制小结选型建议远端接收且需保证连接语义 →tcp可加 TLS高吞吐、可容忍丢包、对接 UDP 接收端如传统 syslog/指标口→udp同机跨进程交付sidecar 容器共享 socket→unix_stream/unix_datagram。平台限制unix_datagram在 macOS 上被validate()拒绝Windows 上所有 Unix 模式不可用。地址必须带端口TCP/UDP 的address缺端口会在配置校验阶段失败属设计内行为而非 bug。数据可靠性该组件为 best-effort 交付无内置持久缓冲依赖之外的保证断连期间事件按内部事件机制记录丢弃SocketSendError排障时可关注vector_component_errors_total、vector_component_event_discards_total等内部遥测。编码决定输入encoding.codec不仅影响输出字节格式还通过input()决定 sink 能接受 logs 还是 metrics——把 metrics 送入text/gelfcodec 时会在配置期暴露类型不匹配。参考路径组件文档元数据website/content/en/docs/reference/configuration/sinks/socket.md能力矩阵website/cue/reference/components/sinks/socket.cue字段级配置参考website/cue/reference/components/sinks/generated/socket.cuesink 主体实现src/sinks/socket.rsTCP/UDP/Unix 底层实现src/sinks/util/tcp.rs、src/sinks/util/udp.rs、src/sinks/util/unix.rs【免费下载链接】vectorA high-performance observability data pipeline.项目地址: https://gitcode.com/GitHub_Trending/vect/vector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表