diff --git a/deploy/process/config.sh b/deploy/process/config.sh
index 84e6e057069cd28f468d7fc81eb8631e9fe16dfb..c900f09d4e337926c3b9dbdbfb9e6cac56feace4 100644
--- a/deploy/process/config.sh
+++ b/deploy/process/config.sh
@@ -29,7 +29,7 @@ declare -A port_policy_table
LONG_OPS_INFO="master,ip_address:,cpu_num:,memory_num:,shared_memory_num:,deploy_path:,master_info_output:,master_info:,\
services_path:,master_ip:,driver_gateway_enable:,only_check_param,\
cpu_reserved:,state_storage_type:,system_timeout:,runtime_conn_timeout_s:,\
-status_collect_enable:,status_collect_interval:,enable_trace:,enable_metrics:,metrics_config:,metrics_config_file:,runtime_init_call_timeout_seconds:,custom_resources:,\
+status_collect_enable:,status_collect_interval:,enable_trace:,trace_config:,runtime_trace_config:,enable_metrics:,metrics_config:,metrics_config_file:,runtime_init_call_timeout_seconds:,custom_resources:,\
labels:,control_plane_port_min:,control_plane_port_max:,data_plane_port_min:,data_plane_port_max:,block:,\
ds_worker_unique_enable,log_level:,\
enable_distributed_master,\
@@ -122,6 +122,8 @@ ONLY_CHECK_PARAM="false"
STATUS_COLLECT_ENABLE="false"
STATUS_COLLECT_INTERVAL=300
ENABLE_TRACE=false
+TRACE_CONFIG=""
+RUNTIME_TRACE_CONFIG=""
ENABLE_METRICS=true
METRICS_CONFIG=""
METRICS_CONFIG_FILE=$(readlink -m '${BASE_DIR}/../../../functionsystem/config/metrics/metrics_config.json')
@@ -350,6 +352,8 @@ function usage() {
echo -e " --status_collect_enable enable process status collect, options:true/false(default false)"
echo -e " --status_collect_interval interval of process status collect, unit second(default 300)"
echo -e " --enable_trace enable trace, options:true/false(default false)"
+ echo -e " --trace_config function system trace config, should be json string"
+ echo -e " --runtime_trace_config runtime trace config, should be json string"
echo -e " --enable_metrics enable metrics, options:true/false(default true)"
echo -e " --metrics_config metrics config, should be json string"
echo -e " --metrics_config_file metrics config file path, should be absolute path"
@@ -550,6 +554,8 @@ function parse_opt() {
--pull_resource_interval) PULL_RESOURCE_INTERVAL=$2 && shift 2 ;;
--only_check_param) ONLY_CHECK_PARAM="true" && shift ;;
--enable_trace) ENABLE_TRACE=$2 && shift 2 ;;
+ --trace_config) TRACE_CONFIG=$2 && shift 2 ;;
+ --runtime_trace_config) RUNTIME_TRACE_CONFIG=$2 && shift 2 ;;
--enable_metrics) ENABLE_METRICS=$2 && shift 2 ;;
--metrics_config) METRICS_CONFIG=$2 && shift 2 ;;
--metrics_config_file) METRICS_CONFIG_FILE=$2 && shift 2 ;;
@@ -1399,7 +1405,7 @@ function export_config() {
# etcd
export ETCD_IP ETCD_PORT ETCD_PEER_PORT ETCD_PROXY_NUMS ETCD_PROXY_NUMS ETCD_PROXY_PORT ETCD_NO_FSYNC
# trace and metrics
- export ENABLE_TRACE ENABLE_METRICS METRICS_CONFIG METRICS_CONFIG_FILE STATUS_COLLECT_ENABLE STATUS_COLLECT_INTERVAL
+ export ENABLE_TRACE TRACE_CONFIG RUNTIME_TRACE_CONFIG ENABLE_METRICS METRICS_CONFIG METRICS_CONFIG_FILE STATUS_COLLECT_ENABLE STATUS_COLLECT_INTERVAL
export FUNCTION_AGENT_LITEBUS_THREAD FUNCTION_PROXY_LITEBUS_THREAD FUNCTION_MASTER_LITEBUS_THREAD
export SYSTEM_TIMEOUT FUNCTION_PROXY_UNIQUE_ENABLE
export ENABLE_META_STORE ENABLE_PERSISTENCE META_STORE_MODE META_STORE_EXCLUDED_KEYS
diff --git a/docs/deploy/deploy_processes/parameters.md b/docs/deploy/deploy_processes/parameters.md
index bb330c3c400ea8d9826c4e1b0bfd5f470a36ecf7..11ac0471334047b94bc2e0f2f57154321fffc257 100644
--- a/docs/deploy/deploy_processes/parameters.md
+++ b/docs/deploy/deploy_processes/parameters.md
@@ -22,6 +22,7 @@
| `--status_collect_enable` | 是否开启进程状态收集,记录日志。 | ``false`` | 选填,取值:``true``,``false``。开启后,将定期收集进程状态信息,并记录到日志文件。 |
| `--status_collect_interval` | 进程状态收集间隔(s)。 | ``300`` | 选填。status_collect_enable 为 ``true`` 生效。 |
| `--enable_trace` | 是否开启 trace。 | ``false`` | 选填,取值:``true``,``false``。 |
+| `--runtime_trace_config` | runtime 调用链配置,预期是 json 字符串。 | `""` | 选填。 |
| `--enable_metrics` | 是否开启 metrics。 | ``true`` | 选填,取值:``true``,``false``。 |
| `--metrics_config` | metrics 配置,预期是 json 字符串。 | `""` | 选填,格式参照 metrics_config_file。 |
| `--metrics_config_file` | metrics 配置文件,预期是绝对路径。 | ``""`` | 选填。 |
diff --git a/docs/observability/index.md b/docs/observability/index.md
index 65918a142912a7bb9a48026d0e9c34dec0801fe3..3ba93bf55105f893a06de9361b4a7a817ef47297 100644
--- a/docs/observability/index.md
+++ b/docs/observability/index.md
@@ -9,6 +9,7 @@
dashboard
logs
metrics/index
+ traces
```
可观察性是指用户通过各种外部输出(例如日志、指标、事件等)观察和推断 openYuanrong 应用程序和 openYuanrong 集群的内部状态的能力。openYuanrong 通过提供可观测性能力帮助用户轻松监控和调试 openYuanrong 应用程序和集群。
@@ -24,3 +25,7 @@
- [Dashboard](./dashboard.md)
- [日志](./logs.md)
- [指标](./metrics/index.md)
+
+通过记录和关联分布式系统中各个服务的调用过程,调用链提供端到端的请求追踪能力
+
+- [链路追踪](./traces.md)
diff --git a/docs/observability/traces.md b/docs/observability/traces.md
new file mode 100644
index 0000000000000000000000000000000000000000..a055a8f6c36db7d697280993a473410d53150973
--- /dev/null
+++ b/docs/observability/traces.md
@@ -0,0 +1,152 @@
+# 链路追踪
+
+## Traces 相关基本概念
+
+### Traces
+
+- 元戎的 Traces(链路追踪) 功能基于 Opentelemetry[介绍](https://opentelemetry.io){target="_blank"}。
+- Traces 提供了向应用程序发出请求时发生的情况的全景图。
+- 一条链路可以被认为是一个由多个跨度组成的有向无环图(DAG 图), Span 与 Span 的关系被命名为 References。
+
+### Span
+
+- Span(跨度),您可以理解为一次方法调用,一个程序块的调用,或者一次 RPC/数据库访问。只要是一个具有完整时间周期的程序访问,都可以被认为是一个 span。
+- Span Tag,一组键值对构成的 Span 标签集合。键值对中,键必须为字符串,值可以是字符串,布尔,或者数字类型。
+- Span Log,一组 span 的日志集合。 每次 log 操作包含一个键值对,以及一个时间戳。 键值对中,键必须为 string,值可以是任意类型。 但是需要注意,不是所有的支持 OpenTracing 的 Tracer 都需要支持所有的值类型。
+- SpanContext,Span 上下文对象。
+ - 任何一个 OpenTracing 的实现,都需要将当前调用链的状态(例如:trace 和 span 的 id),依赖一个独特的 Span 去跨进程边界传输。
+ - Baggage Items,Trace 的随行数据,是一个键值对集合,它存在于 trace 中,也需要跨进程边界传输。
+- References(Span 间关系),相关的零个或者多个 Span(Span 间通过 SpanContext 建立这种关系)。
+
+### Traces 与 Span 的时间轴关系
+
+```text
+
+––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–> time
+
+ [Span A···················································]
+ [Span B··············································]
+ [Span D··········································]
+ [Span C········································]
+ [Span E·······]
+
+ [Span F··]
+
+ [Span G··]
+
+ [Span H··]
+
+```
+
+## Trace 功能的启用
+
+通过配置部署参数启用指定导出器,目前 Trace 功能提供 OtlpGrpcExporter 和 LogfileExporter 两种导出器。
+
+- OtlpGrpcExporter 通过 gRPC 协议,使用 protobuf 序列化格式,按照 OTLP 规范导出数据。若使用 OtlpGrpcExporter 导出数据则建议提前部署好数据接收及处理后端( otel-collector\jaeger\grafana 等)。
+- LogfileExporter 则将数据导出到 log 文件中。
+
+### 后端部署
+
+grafana 后端部署可参考 opentelemetry[官方样例](https://opentelemetry.io/zh/docs/demo/architecture/){target="_blank"}。
+
+### 导出器
+
+导出器配置参数说明:
+
+- `enable`: 导出器是否开启,总开关。
+- `runtimeTraceConfig`: runtime 模块导出器配置。
+
+OtlpGrpcExporter 初始化参数:
+
+| 初始化参数 | 说明 | 约束 |
+| ---------- |---------------------------| ------------------ |
+| enable | 是否启用 OtlpGrpcExporter 导出器 | 必填 |
+| endpoint | 接收后端地址,格式为 ip:port | 必填 |
+
+LogfileExporter 初始化参数:
+
+| 初始化参数 | 说明 | 约束 |
+| ---------- |--------------------------| ------------------- |
+| enable | 是否启用 LogfileExporter 导出器 | 必填 |
+
+### 配置样例
+
+配置前提: 已获取元戎包并解压到本地,解压后目录名为 yuanrong。
+
+#### 功能启用
+
+##### yr 命令行方式启用
+
+```text
+
+yr start --master --enable_trace true --runtime_trace_config "{\"otlpGrpcExporter\":{\"enable\":true,\"endpoint\":\"192.168.1.2:4317\"},\"logFileExporter\":{\"enable\":true}}"
+
+```
+
+说明:启用 OtlpGrpcExporter 导出器和 LogFileExporter 导出器。Trace 数据将导出到地址为 192.168.1.2:4317 的后端服务和日志文件中。
+
+##### 进程部署方式启用
+
+```text
+
+CUR_DIR=$(dirname $(readlink -f "$0"))
+
+bash ${CUR_DIR}/yuanrong/deploy/process/yr_master.sh -c 5000 -m 6000 -s 2048 -d ${CUR_DIR}/log -l DEBUG \
+--enable_trace=true --runtime_trace_config="{\"otlpGrpcExporter\":{\"enable\":true,\"endpoint\":\"192.168.1.2:4317\"},\"logFileExporter\":{\"enable\":false}}"
+
+```
+
+说明:启用 OtlpGrpcExporter 导出器但不启用 LogFileExporter 导出器。Trace 数据将只导出到地址为 192.168.1.2:4317 的后端服务。
+
+#### 查看导出的 Trace 数据
+
+##### 启用 OtlpGrpcExporter 导出器
+
+以 Trace 数据导出到 grafana 后端为例
+
+1. 登录 grafana 后端。地址为: 机器 IP:3000 。
+2. 点击左侧边栏的 Explore 页签。
+3. 在 Service Name 下拉框中选择目标函数实例,点击右上角的 Run query 按钮即可查询函数实例相关 Trace 数据。
+
+##### 启用 LogFileExporter 导出器
+
+| 部署方式 | 日志路径 |
+|------| ------------------------- |
+| yr start 命令行 | 1. job-xxx-driver.log
2. /tmp/yr_sessions/latest |
+| 进程部署 | 1. job-xxx-driver.log
2. 部署参数 -d 指定的目录 |
+| k8s 部署 | 1. job-xxx-driver.log
2. faasfrontend pod 、 faasscheduler pod 和调度函数实例的 agent pod 里 /home/snuser/log 目录下的 runtime 日志 |
+
+:::{Note}
+
+日志文件里搜索关键字 “trace info” 即可查找导出的 trace 数据。提前设置如下环境变量后 job-xxx-driver.log 中才能有导出的 trace 数据
+
+:::
+
+```text
+
+export ENABLE_TRACE=true
+export RUNTIME_TRACE_CONFIG="{\"otlpGrpcExporter\":{\"enable\":true,\"endpoint\":\"192.168.1.2:4317\"},\"logFileExporter\":{\"enable\":true}}"
+
+```
+
+#### 使用样例
+
+无需额外增加代码,元戎将导出关键流程调用链,执行如下无状态函数,根据导出器配置获取调用链信息:
+
+```python
+
+import yr
+yr.init()
+
+
+@yr.invoke
+def add(n):
+ return n+1
+
+
+results = [add.invoke(i) for i in range(3)]
+print([yr.get(i) for i in results])
+
+yr.finalize()
+
+```