openYuanrong datasystem 日志¶
日志类别¶
openYuanrong datasystem 的日志分为以下类型:
运行日志:记录客户端、服务端运行时的日志信息,包括 INFO、WARNING、ERROR、FATAL;更细粒度调试可通过
VLOG与 gflags(如--v)控制。访问日志:记录每一次访问客户端/服务端的请求,每个请求一条日志,用于定界上游是否访问客户端/服务端(需开启
log_monitor)。请求第三方日志(request_out):记录 Worker 访问第三方组件的请求,每个请求一条日志,可用于定界 openYuanrong datasystem 是否成功访问该外部组件;当前实现中 主要接入 ETCD gRPC(需开启
log_monitor)。资源日志:定时输出 Worker 运行时关键资源信息,包括共享内存、Spill 磁盘、线程池、队列、流缓存相关统计等(需
log_monitor且log_monitor_exporter=harddisk)。流缓存指标日志(sc_metrics):流缓存运行数据(需开启
log_monitor)。容器/进程相关日志:容器运行日志,管理和监控worker进程的生命周期。
操作审计日志(operation):记录进程启动/停止、配置初始化及运行时动态配置变更(
UpdateConfigAPI 或monitor_config_file热更新),便于运维追溯配置操作历史。资源快照日志(kv_resource):
resource.log同源字段的 JSON-Lines 快照,每行一个完整 JSON 对象,顶层含pod_name/cluster_name,metrics为按resource_json_schema配置的 metric 组及子字段(需json_log_monitor且log_monitor_exporter=harddisk;与resource.log复用同一采集线程和周期,写入由json_log_monitor独立控制)。指标摘要日志(kv_metrics):
datasystem_worker.INFO.log中metrics_summary摘要的 JSON-Lines 并行输出,每行一个完整 JSON 对象,顶层含pod_name/cluster_name,body 与 INFO.log 逐字一致(需json_log_monitor;INFO.log 原metrics_summary仍由log_monitor控制)。
日志目录一般为配置项 log_dir(如部署下的 yr_datasystem/logs);下文 /path/yr_datasystem/logs 表示该目录。
不同模块日志文件¶
序号 |
模块 |
日志路径及文件名 |
含义、用途 |
|---|---|---|---|
1 |
datasystem_worker |
|
Worker 运行日志; |
2 |
datasystem_worker |
|
访问 Worker POSIX 等接口的日志 |
3 |
datasystem_worker |
|
Worker 资源使用日志;默认关闭,由 |
4 |
datasystem_worker |
|
访问第三方(当前主要为 ETCD)接口日志 |
5 |
datasystem_worker |
|
流缓存运行数据;由 |
6 |
datasystem_worker |
|
容器运行日志,管理和监控worker进程的生命周期 |
7 |
datasystem_worker |
|
操作审计日志;记录 Init/Shutdown、配置初始化快照及运行时 flag 变更( |
8 |
datasystem_worker |
|
资源快照 JSON-Lines; |
9 |
datasystem_worker |
|
指标摘要 JSON-Lines;INFO.log 中 |
10 |
Client |
|
SDK 运行日志;基名可由启动参数与环境变量 |
11 |
Client |
|
Client 操作审计日志;记录 Init/Shutdown 及 |
12 |
Client |
|
SDK 接口访问日志;基名可由 |
日志格式¶
格式总览¶
序号 |
日志 |
日志格式 |
|---|---|---|
1 |
运行日志 |
Time | level | filename | pod_name | pid:tid | trace_id | cluster_name | message |
2 |
访问日志 |
Time | level | filename | pod_name | pid:tid | trace_id | cluster_name | status_code | action | cost | data size | request param| response param |
3 |
访问第三方日志 |
Time | level | filename | pod_name | pid:tid | trace_id | cluster_name | status_code | action | cost | data size | request param| response param |
4 |
资源日志 |
Time | level | filename | pod_name | pid:tid | trace_id | cluster_name | shm info | spill disk info | client nums | object nums | object total datasize | WorkerOcService threadpool | WorkerWorkerOcService threadpool | MasterWorkerOcService threadpool | MasterOcService threadpool | write ETCD queue | ETCDrequest success rate | OBSrequest success rate | Master AsyncTask threadpool | stream nums | ClientWorkerSCService threadpool | WorkerWorkerSCService threadpool | MasterWorkerSCService threadpool | MasterSCService threadpool | remote stream push success rate | shared disk info | scLocalCache info | Cache Hit Info |
5 |
流缓存数据日志 |
Time | level | filename | pod_name | pid:tid | trace_id | cluster_name | sc_metric |
6 |
容器运行日志 |
Time | level | filename | pod_name | pid:tid | trace_id | cluster_name | message |
7 |
操作审计日志 |
Time | level | filename | pod_name | pid:tid | trace_id | cluster_name | operation message |
8 |
资源快照日志(kv_resource) |
纯 JSON 单行: |
9 |
指标摘要日志(kv_metrics) |
纯 JSON 单行: |
日志字段¶
字段 |
长度 Byte |
描述 |
|---|---|---|
time |
26 |
ISO8601格式的时间戳,示例: 2023-06-02T14:58:32.081156 |
level |
1 |
日志级别 (debug, info, warn等) |
filename |
128 |
输出该条日志的函数所在文件及行号,最大长度128Byte,超出则截断。示例:oc_metadata_manager.cpp:733 |
pod_name |
128 |
输出当前worker所属的POD名称,超出长度则截断。示例:ds-worker-hs5qm |
pid:tid |
11 |
该日志所属的进程ID和线程ID。进程号最大值为32757,该字段最大长度11.示例:9:177 |
trace_id |
36 |
请求的trace_id |
cluster_name |
128 |
输出日志的组件名,最大长度为128,超出长度则截断。示例:ds-worker |
Message |
1024 |
自定义消息内容 |
status_code |
5 |
该请求的状态,不同消息类型状态值不一样。SDK/datasystem_worker 访问日志,0表示成功,其他表示失败 |
action |
64 |
表示该请求所访问的接口名称。约定前缀:SDK接口:DS_KV_CLIENT、DS_OBJECT_CLIENT,Worker接口:DS_OBJECT_POSIX,ETCD:DS_ETCD,HTTP请求:POST {url path} |
cost |
16 |
记录该请求所花费的时间。单位:us |
datasize |
16 |
记录Publish请求接收到的Payload大小 |
request param |
2560 |
记录该请求的关键请求参数,最大长度2048。请参考“关键请求参数”表格 |
response param |
1024 |
记录该请求的响应信息。最大长度为1024 Byte,超出则截断 |
shm info |
47 |
记录共享内存使用信息,单位为Byte,按照1T限制大小,每个长度 13 Byte,格式为:memoryUsage/physicalMemoryUsage/totalLimit/rate/scMemoryUsage/scMemoryLimit |
spill disk info |
47 |
记录Spill磁盘使用信息。单位为Byte,按照1T限制大小,每个长度 13 Byte,格式为:spaceUsage/physicalSpaceUsage/totalLimit/rate |
client nums |
5 |
记录已和worker成功建立连接的Client数。最大值为10000 |
object nums |
9 |
记录worker已缓存对象数。按照1亿对象限制数量 |
object total datasize |
13 |
记录worker已缓存对象的大小。按照1T限制大小,长度 13 Byte |
WorkerOcService threadpool |
21 |
WorkerOcService threadpool使用信息,线程数限制最大128;格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate |
WorkerWorkerOcService threadpool |
21 |
threadpool使用信息 |
MasterWorkerOcService threadpool |
21 |
threadpool使用信息 |
MasterOcService threadpool |
21 |
threadpool使用信息 |
write ETCD queue |
15 |
队列使用信息 |
ETCDrequest success rate |
6 |
请求成功率,单位 %,保留3位有效数字 |
OBSrequest success rate |
6 |
请求成功率,单位 %,保留3位有效数字 |
Master AsyncTask threadpool |
21 |
threadpool使用信息,格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate |
stream nums |
9 |
记录本节点流的个数。本节点上的流:在本节点存在producer或者consumer |
ClientWorkerSCService threadpool |
21 |
线程池使用信息,格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate |
WorkerWorkerSCService threadpool |
21 |
线程池使用信息,格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate |
MasterWorkerSCService threadpool |
21 |
线程池使用信息,格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate |
MasterSCService threadpool |
21 |
线程池使用信息,格式为:idleNum/currentTotalNum/MaxThreadNum/waitingTaskNum/rate |
remote stream push success rate |
6 |
请求成功率,单位 %,保留3位有效数字 |
shared disk info |
47 |
记录共享磁盘使用信息,单位为Byte,按照1T限制大小,每个长度 13 Byte,格式为:usage/physicaleUsage/totalLimit/rate |
scLocalCache info |
47 |
记录scLocalCache使用信息,单位为Byte,按照1T限制大小,每个长度 13 Byte,格式为:usedSize/reservedSize/totalLimit/usedRate |
Cache Hit Info |
9 |
缓存命中统计,格式为:memHitNum/diskHitNum/l2HitNum/remoteHitNum/missNum, |
sc_metric |
1024 |
流缓存运行数据(sc_stream_metric)。worker上一个stream的的流缓存数据,格式:streamName [“exit”]/numLocalProd/numRemoteProd/numLocalCon/numRemoteCon/sharedMemUsed/localMemUsed/numEleSent/numEleRecv/numEleAck/numSendReq/numRecvReq/numPagesCreated/numPagesReleased/numPagesInUse/numPagesCached/numBigPagesCreated/numBigPagesReleased/numLocalProdBlocked/numRemoteProdBlocked/numRemoteConBlocking/retainData/streamState/numProdMaster/numConMaster |
SDK 与 Worker 访问日志关键请求参数¶
关键请求参数 |
长度 Byte |
描述 |
|---|---|---|
Object_key |
255 |
对象的ID。长度:255Byte; |
object_keys |
1024 |
多个对象 KEY。单个 Item 最长 255 Byte,展示总长上限约 1KB;超出时仅显示总数等缩写。示例 JSON: |
Nested_keys |
1024 |
嵌套引用的对象KEY。单个Item长度:255Byte,全部长度:1KB; |
keep |
1 |
是否手动管理对象生命周期。取值:true/false, 长度:5Byte |
Write_mode |
1 |
写数据的模式,影响数据可靠性。取值:int32 |
consistency_type |
1 |
数据一致性模式。取值:uint32 |
is_seal |
1 |
数据是否不可修改。取值:0/1, 0表示false |
is_retry |
1 |
是否为重试场景。取值:0/1 |
ttl_second |
32 |
TTL时间配置。取值:uint32 |
existence |
1 |
配置Key存在时是否允许继续操作,默认允许。取值:int |
sub_timeout |
32 |
Get请求订阅时间。取值:int64 |
timeout |
32 |
接口超时时间。取值:int32 |
访问第三方日志关键请求参数¶
外部组件 |
请求类型 |
关键请求参数 |
描述 |
|---|---|---|---|
ETCD |
GRPC |
key |
将Key字段获取并打印。 |
操作审计日志消息类型¶
操作审计日志与运行日志共用 spdlog 文本前缀(见「格式总览」第 7 行),operation message 为审计正文。Worker 与 Client 在 Init 成功时自动创建 {log_filename}_operation.log / ds_client_operation.log,无需额外开关。
消息前缀 |
触发时机 |
正文格式与说明 |
|---|---|---|
|
进程 |
|
|
进程 |
|
|
配置初始化完成 |
|
|
配置初始化失败 |
|
|
|
|
|
动态配置变更失败 |
|
敏感 flag(审计日志中值一律脱敏为 xxx):system_access_key、system_secret_key、system_data_key、sc_encrypt_secret_key、tenant_access_key、tenant_secret_key、obs_access_key、obs_secret_key、etcd_password、etcd_key、yuanrong_iam_passphrase、yuanrong_iam_key。
资源快照日志(kv_resource.log)字段¶
每行一个完整 JSON 对象,不含 time / level / file / pid:tid / trace_id 等文本前缀;采集周期与 resource.log 相同(log_monitor_interval_ms,默认 10s)。与 resource.log 共用同一次 handler 调用,避免区间计数器被重复清零。
行结构(顶层字段)
字段 |
类型 |
描述 |
|---|---|---|
|
string |
当前 Worker Pod 标识( |
|
string |
集群名( |
|
string |
固定为 |
|
string |
schema 版本,当前为 |
|
object |
资源 metric 组,键为 snake_case 组名,值为对象或标量 |
metrics 内已输出的 metric 组(与 resource.log 管道字段同源;未列出的组仅出现在文本 resource.log 中,JSON 行内省略整组):
JSON 组名 |
子字段(snake_case) |
对应 resource.log 语义 |
|---|---|---|
|
|
共享内存使用(Byte / %);不含 |
|
|
Spill 磁盘使用 |
|
(标量) |
已连接 Client 数 |
|
(标量) |
缓存对象数 |
|
(标量) |
缓存对象总大小(Byte) |
|
|
线程池状态;语义与「日志字段」表中 threadpool 五元组一致 |
|
|
ETCD 写队列 |
|
(标量) |
ETCD 请求成功率(%) |
|
同线程池五元组 |
Master 异步任务线程池 |
|
|
缓存命中统计 |
运维约定
handler 返回空串、未注册或 token 数与 schema 不符时,该组输出全 0 结构(单字段组为
0),保证每行 group key 稳定;成功率类字段为 0 常表示「本周期无样本」而非必然失败。字段映射真源:
resource_json_schema(与res_metrics.def对齐)。
行样例
{
"pod_name": "ds-worker-hs5qm",
"cluster_name": "recs",
"event": "resource_snapshot",
"version": "v0",
"metrics": {
"shared_memory": {
"memory_usage": 73814,
"physical_memory_usage": 80000,
"total_limit": 1073741824,
"worker_share_memory_usage": 0.069
},
"active_client_count": 3,
"worker_oc_service_thread_pool": {
"idle_num": 3,
"current_total_num": 4,
"max_thread_num": 8,
"waiting_task_num": 0,
"thread_pool_usage": 0.030
}
}
}
指标摘要日志(kv_metrics.log)字段¶
每行一个完整 JSON 对象,body 与 datasystem_worker.INFO.log 中同周期 metrics_summary 逐字一致,仅在行首额外插入 JSON 转义后的 pod_name、cluster_name。摘要由 metrics::Tick 按 log_monitor_interval_ms 周期输出,关停时另有一次 PrintSummary。
行结构(顶层字段)
字段 |
类型 |
描述 |
|---|---|---|
|
string |
当前 Worker Pod 标识 |
|
string |
集群名 |
|
string |
固定为 |
|
string |
当前为 |
|
uint64 |
摘要周期序号,单调递增 |
|
int |
本摘要覆盖的采集间隔(毫秒),与 |
|
int |
分片序号(从 1 起) |
|
int |
本分周期总分片数 |
|
array |
本行包含的 metric 条目列表 |
metrics[] 元素结构(按 metric 类型区分):
类型 |
字段 |
描述 |
|---|---|---|
COUNTER / GAUGE |
|
|
HISTOGRAM |
|
二者均为对象: |
本周期无样本的 metric 不出现在 metrics 数组中。单行 JSON 超过 MAX_METRICS_LOG_BYTES 时按数组拆分为多行,各行 part_index / part_count 不同,cycle 相同。
metric 名称示例(完整列表见 kv_metrics.cpp 中 KV_METRIC_DESCS):
类别 |
|
|---|---|
Client 请求 |
|
Client RPC 时延 |
|
Worker 处理 / RPC |
|
ZMQ / URMA |
|
资源 Gauge |
|
行样例
{
"pod_name": "ds-worker-hs5qm",
"cluster_name": "recs",
"event": "metrics_summary",
"version": "v0",
"cycle": 1,
"interval_ms": 10000,
"part_index": 1,
"part_count": 1,
"metrics": [{
"name": "worker_rpc_create_meta_latency",
"total": {
"count": 3,
"avg_us": 171,
"max_us": 249,
"p50": 249,
"p90": 249,
"p99": 249
},
"delta": {
"count": 3,
"avg_us": 171,
"max_us": 249,
"p50": 249,
"p90": 249,
"p99": 249
}
}]
}
观测日志开关¶
log_monitor 与 json_log_monitor 独立控制文本观测日志与 JSON Lines 观测日志,可任意组合:
|
|
输出效果 |
|---|---|---|
on |
on |
|
on |
off |
仅 |
off |
on |
仅 |
off |
off |
上述观测日志均不写入(采集循环不运行) |
相关配置项:log_monitor、json_log_monitor、log_monitor_exporter(须为 harddisk)、log_monitor_interval_ms;详见 dscli 配置说明。
日志采样¶
LogSampler 提供统一随机哈希阈值采样,替代旧的 log_rate_limit first-N 限速机制。
工作原理¶
三类独立采样率:
request_sample_rate、access_sample_rate、diagnostic_sample_rate(各 0.0–1.0,默认 1.0=全量保留)采样粒度是”请求(traceId)“,不是”单条日志”
请求采样决策随 RPC 元数据传播(LogSampleState),跨 client/worker 保持同一 trace 的一致结果
request sampled-in 时,该请求的 INFO/VLOG/ERROR/WARNING/PLOG 都直接输出(请求日志完整性优先)
request reject 只直接阻断 INFO/VLOG;diagnostic/access 不把 reject 当作直接丢弃条件,继续各自补采样
仅 SDK 请求 trace 参与采样;后台线程日志不受本方案控制
配置权威源:worker;client 通过 register/heartbeat 接收 worker 下发的
LogSampleConfigPb
派生规则(request-only derivation)¶
当仅显式配置 request_sample_rate,而未显式设置 access_sample_rate 或 diagnostic_sample_rate 时,两者自动按以下公式派生:
access_sample_rate = min(1.0, request_sample_rate × 3)(简称 3r 规则)diagnostic_sample_rate = min(1.0, request_sample_rate × 4)(简称 4r 规则)
示例: 仅设置 request_sample_rate=0.2 → effective access=0.6, diagnostic=0.8
显式 1.0 阻止派生¶
即使 access_sample_rate=1.0 与默认值相同,显式设置也意味着”用户明确要求全量保留 access 日志”,阻止自动派生。这与”未设置时默认 1.0”有本质区别:
配置 |
access effective 值 |
派生行为 |
|---|---|---|
仅 |
0.6 (派生) |
派生生效 |
|
1.0 (显式) |
派生被阻止 |
|
0.3 (显式) |
派生被阻止 |
Sticky Explicit 行为¶
一旦某个采样率被显式设置(如 access_sample_rate=0.3),后续仅修改 request_sample_rate 的动态更新不会覆盖已显式设置的值。这防止了配置漂移导致的意外日志量变化。
示例:
首次配置
request=0.2→ access 派生 0.6动态更新显式
access=0.3→ access 固定 0.3,标记为 ever-explicit再次更新
request=0.1→ access 仍为 0.3(不会被派生覆盖为 0.3×3=0.3,而是保持显式值)
配置方式¶
场景 |
配置方式 |
示例 |
|---|---|---|
Worker 命令行 |
|
|
Worker 命令行(阻止派生) |
|
access=1.0(显式),阻止 3r 派生 |
K8s Helm |
|
自动派生 |
K8s Helm(阻止派生) |
|
access=1.0(显式) |
dscli |
|
自动派生 |
Embedded Worker |
|
|
Embedded Worker(阻止派生) |
|
access=1.0(显式) |
运行时动态修改 |
修改 |
— |
默认值均为 1.0(全量保留),完全向后兼容。
慢日志与 latencySummary¶
当请求的处理或 RPC 阶段时延超过配置阈值时,access log 中会额外输出 latencySummary 字段,包含各阶段耗时明细,便于快速定位慢请求瓶颈。
配置参数¶
参数 |
类型 |
默认值 |
格式与示例 |
描述 |
|---|---|---|---|---|
|
uint64 |
|
正整数,单位微秒;例如 |
处理阶段时延阈值(微秒)。默认2000μs(2ms);设为0可禁用;启用后,当处理阶段的耗时(不含跨进程 RPC)超过此阈值时输出 latencySummary。 |
|
uint64 |
|
正整数,单位微秒;例如 |
跨进程 RPC 阶段时延阈值(微秒)。默认5000μs(5ms);设为0可禁用;启用后,当 RPC 子阶段耗时超过此阈值时输出 latencySummary。支持热更新。 |
|
uint64 |
|
正整数,单位微秒 |
Client 侧处理阶段慢日志门限(微秒)。默认2000μs(2ms);设为0禁用。通过 |
|
uint64 |
|
正整数,单位微秒 |
Client 侧 RPC 阶段慢日志门限(微秒)。默认5000μs(5ms);设为0禁用。通过 |
“process”含义说明:
process阶段 = 总耗时 - 子 RPC 耗时,代表处理与等待时间,而非端到端整链路耗时。例如client.process.get= 客户端从发起 Get 到收到响应的总耗时 -client.rpc.get(客户端→worker RPC耗时),即客户端排队、序列化、反序列化等处理耗时。
latencySummary 格式¶
latencySummary 字段以预计算字符串形式写入 access log 的 request param 区域,格式示例:
latencySummary:{client.process.get:200,client.rpc.get:896,worker.process.get:768,worker.rpc.query_meta:512}
各阶段耗时以 {phase:duration} 形式输出,多个阶段用 , 分隔,phase 与 duration 之间用 : 分隔,整体用 {} 包裹,单位为微秒。如有 tick 因 buffer 溢出被丢弃,尾部附加 tick_dropped:N;如有 phase 因数组溢出被丢弃,尾部附加 phase_dropped:N。
可选 phase 名称如下:
命名规则:
process= 处理耗时(扣除子 RPC/跨进程调用),非 IP 地址;rpc= 跨进程 RPC 耗时;urma/ub= 用户态 RDMA(Urma-based)相关传输耗时。
phase 名称 |
含义 |
|---|---|
|
客户端 Get 处理耗时(总耗时扣除 RPC) |
|
客户端→worker Get RPC 耗时 |
|
客户端 Set/Put 处理耗时(总耗时扣除子 RPC) |
|
客户端→worker Create RPC 耗时(Set/Put 的 Create 子阶段) |
|
客户端 Set/Put 数据拷贝到共享内存耗时 |
|
客户端→worker Publish RPC 耗时 |
|
客户端 UB(Urma-based 用户态 RDMA)数据传输耗时 |
|
客户端 Create 处理耗时(总耗时扣除 RPC) |
|
客户端 Exist 处理耗时(总耗时扣除 RPC) |
|
客户端→worker Exist RPC 耗时 |
|
worker Get 处理耗时(总耗时扣除子 RPC,与 worker IP 无关) |
|
worker→master QueryMeta RPC 耗时 |
|
worker→远端 worker RemoteGet RPC 耗时 |
|
worker URMA 协议栈总耗时(含 RDMA 数据搬运、远端响应等) |
|
worker L2 缓存读取耗时 |
|
worker Create 处理耗时 |
|
worker Publish 处理耗时(总耗时扣除子 RPC) |
|
worker→master CreateMeta RPC 耗时 |
|
worker→master UpdateMeta RPC 耗时 |
|
worker Exist 处理耗时(总耗时扣除 QueryMeta RPC) |
|
master QueryMeta 处理耗时 |
|
master CreateMeta 处理耗时 |
|
master UpdateMeta 处理耗时 |
|
远端数据 worker RemoteGet 处理耗时 |
配置方式¶
场景 |
配置方式 |
示例 |
|---|---|---|
Worker 命令行 |
|
处理>1ms或RPC>2ms时输出 |
K8s Helm |
|
同上 |
dscli |
|
同上 |
Embedded Worker |
|
同上 |
Client 配置文件 |
|
Client 侧处理>1ms时输出 |
Client API |
|
运行时动态修改 Client 侧门限 |
运行时动态修改 |
修改 |
— |
默认值为 2000/5000(进程内2ms/RPC 5ms),完全向后兼容,零开销。