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() + +```