数据转发¶
对于需要长期保存但更新频率低的数据(如日志),可通过数据转发功能将其自动保存至对象存储,或实时转发至 Kafka 等外部系统。该功能按规则筛选用户所需数据,实现低成本长期归档,同时支持后续二次加工处理。
规则生效后,在数据转发页面设定查询时段与规则,即可快速检索已存储的数据。
功能原理¶
当数据被转发到对象存储时,其工作流程如下:符合规则的用户上报数据首先会被按行写入服务器本地磁盘的一个临时文件中。当该临时文件大小累积达到预设值(例如 256MB)或持续写入时间超过设定时长(例如 1 小时)时,系统会自动关闭当前文件并创建新的临时文件继续接收数据。
与此同时,一个后台服务会持续扫描这些已关闭的临时文件,将它们使用 gzip 格式压缩以减小体积,然后按照预先定义好的路径规则上传到您指定的对象存储位置。当您需要搜索这些存储的数据时,系统会依据相同的路径规则在对象存储中定位相关文件,将它们下载、解压,并逐行匹配您输入的搜索条件。
文件格式说明¶
最终存储在对象存储中的文件格式为:经过 gzip 压缩。解压后,文件内容呈现为多行文本,每一行对应一条原始数据记录,数据以 JSON 格式完整保存。文件中的任何空行会被系统自动忽略。
一个典型的日志类型的数据转发文件类似如下:
其中 date
为必须字段,用于标识该条数据的时间,为毫秒级 unix 时间戳,message
字段是具体的日志内容。
{"__docid":"L_1750649205520_d1cciupkac7k1683bhq0","__namespace":"backup_log","date":1750649205520,"date_ns":168000,"df_metering_size":-9223372036854775808,"filepath":"/var/log/datakit/gin.log","host":"X.local","log_read_lines":2,"message":"[GIN] 2025/06/23 - 11:26:43 | 200 | 1.012923708s | 127.0.0.1 | GET \"/metrics\"","message_length":87,"service":"default","source":"default","status":"unknown"}
{"__docid":"L_1750649205516_d1cciupkac7k1683bhqg","__namespace":"backup_log","date":1750649205516,"date_ns":897000,"df_metering_size":-9223372036854775808,"filepath":"/var/log/datakit/gin.log","host":"X.local","log_read_lines":1,"message":"[GIN] 2025/06/23 - 11:26:38 | 200 | 1.012696542s | 127.0.0.1 | GET \"/metrics\"","message_length":87,"service":"default","source":"default","status":"unknown"}
{"__docid":"L_1750649206520_d1cciupkac7k1683bhr0","__namespace":"backup_log","date":1750649206520,"date_ns":948000,"df_metering_size":-9223372036854775808,"filepath":"/var/log/datakit/log","host":"X.local","log_read_lines":150,"message":"2025-06-23T11:26:46.520+0800\tWARN\thost_processes\tprocess/input.go:332\tprocess: {\"pid\":411}, proc.PageFaults(): not implemented yet","message_length":130,"service":"default","source":"default","status":"unknown"}
{"__docid":"L_1750649205520_d1cciupkac7k1683bhrg","__namespace":"backup_log","date":1750649205520,"date_ns":419000,"df_metering_size":-9223372036854775808,"filepath":"/var/log/datakit/log","host":"X.local","log_read_lines":9,"message":"2025-06-23T11:26:43.876+0800\tWARN\tcontainer\tcontainer/impl.go:254\tendpoint unix:///var/run/crio/crio.sock does not exist, maybe it is not running, skip","message_length":151,"service":"default","source":"default","status":"unknown"}
{"__docid":"L_1750649205517_d1cciupkac7k1683bhs0","__namespace":"backup_log","date":1750649205517,"date_ns":79000,"df_metering_size":-9223372036854775808,"filepath":"/var/log/datakit/log","host":"X.local","log_read_lines":1,"message":"2025-06-23T11:26:38.365+0800\tWARN\thttp\thttpapi/http.go:494\tlistener.Close failed: close tcp [::]:9529: use of closed network connection","message_length":135,"service":"default","source":"default","status":"unknown"}
{"__docid":"L_1750649205517_d1cciupkac7k1683bhsg","__namespace":"backup_log","date":1750649205517,"date_ns":80000,"df_metering_size":-9223372036854775808,"filepath":"/var/log/datakit/log","host":"X.local","log_read_lines":2,"message":"2025-06-23T11:26:38.365+0800\tWARN\thttp\thttpapi/http.go:494\tlistener.Close failed: close tcp [::]:9529: use of closed network connection","message_length":135,"service":"default","source":"default","status":"unknown"}
文件命名及存储路径¶
[{$path_prefix}/]{$workspace_uuid}/[{$data_type}/]
{$rule_name}/{$year}/{$month}/{$day}/{$hour}/{$time}-{$hostname}.gz
用 []
括起来的部分表示“可选项”,具体请参考下方说明:
变量 | 说明 | 示例 | 备注 |
---|---|---|---|
$path_prefix |
路径前缀 | path/to/backup |
可选,对应新建备份规则时的存储路径选项 对象存储不支持以 / 开始的 key,所以不要以 / 开始 |
$workspace_uuid |
工作空间 id | wksp_d9a1851859e040469d290409bc17cceb |
|
$data_type |
备份数据类型,可选值:logging :日志rum :用户访问监测tracing :链路event :事件audit_event :审计事件 |
tracing |
由于日志是默认的数据类型,对于日志类型数据,{$data_type}/ (即 logging/ ) 部分需要省略 |
$rule_name |
规则名称 | backup_logging_for_test |
对应新建规则时的规则名称选项 建议使用英文 |
$year |
日志发生时间所属年,4 位 | 2025 |
UTC 时区 |
$month |
日志发生时间所属月,2 位 | 03 |
UTC 时区 |
$day |
日志发生时间所属日,2 位 | 01 |
UTC 时区 |
$hour |
日志发生时间所属小时,2 位 | 22 |
UTC 时区 |
$time |
文件中最后一条日志的发生时间 格式:时时分分秒秒 + 3 位毫秒 |
220607889 |
UTC 时区 |
$hostname |
主机名经 MD5 计算后取前 16 位 | c6a92aafa992599c |
自行构造文件时可以使用当前文件的 crc64 或随机生成一个 64 位随机数然后转 16 进制 |
路径示例:
wksp_d9a1851859e040469d290409bc17cceb/backup_logging_for_test/2025/05/06/17/175950000-c6a92aafa992599c.gz
path/to/backup/wksp_d9a1851859e040469d290409bc17cceb/tracing/test-minio/2025/05/06/17/175950000-c6a92aafa992599c.gz
文件切分规则
- 时间边界:单个文件仅包含同一小时内的日志,绝不跨小时。
- 大小边界:未压缩原始文件控制在 256 MB~512 MB 之间,gzip 压缩后通常为几十 MB~百 MB,过大或过小都会降低检索效率。
可将外部文件按数据转发规则生成的格式与路径规则上传至对象存储,控制台会以同样方式搜索、展示。