Apache Flagon 配置参数详解
Apache Flagon 配置参数详解:UserALE.js 的 data-* 属性与 userale.options()、Example Collector 环境变量与端点、Distill 分析函数参数与 systemd 托管配置,全部实测验证。
Apache Flagon 配置参数详解
目标:逐项讲清 Apache Flagon 三个配置面的参数——前端埋点端 UserALE.js(script 标签
data-*属性与userale.options())、收集端 Example Collector(环境变量、端点、体积与 CORS 限制)、分析端 Distill(检测与渲染函数参数),并给出 systemd 托管的生产配置模板。所有参数行为均在 Ubuntu 22.04.5 LTS(x86_64,Node v20.20.2 / Python 3.10.12)上实测验证(2026-10-16 实测)。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- Node.js:v20.20.2(npm 10.8.2)、pnpm:9.15.9
- Python:3.10.12(pip 22.0.2)
- UserALE.js:npm
flagon-userale2.4.0(monorepo master 源码) - Example Collector:
/root/flagon/products/userale/example/server/server.js(master 61677c7) - Distill:
flagon-distill0.1.0(monorepoproducts/distill源码安装) - 收集服务器默认端口:8000,实测改端口演示用 9000
- 安装部署过程见《Ubuntu 22.04 安装 Apache Flagon 指南》,本文在其环境之上逐项展开参数。
Flagon 的参数分布在四个配置面上,先建立全景认知再逐项展开:
| 配置面 | 载体 | 典型用途 |
|---|---|---|
| 前端埋点(声明式) | <script> 标签 data-* 属性 | 页面接入时一次性配置 |
| 前端埋点(编程式) | userale.options() / userale.configure() | 运行时动态调整、SDK 集成 |
| 收集端 | 环境变量 + server.js 源码常量 | 端口、日志落盘、协议限制 |
| 分析端 | Distill 函数关键字参数 | 检测灵敏度、渲染粒度 |
二、前置条件
确认环境就绪(实测回显,命令逐条执行):
node -v
python3 --version
ls /root/flagon/products/userale/example/server/server.js
v20.20.2
Python 3.10.12
/root/flagon/products/userale/example/server/server.js
python3 -c "import distill; print('distill import OK')"
distill import OK
💡 技术拓展:Flagon 没有统一的「配置文件」,这是它与传统软件(如 Nginx 的 nginx.conf)最大的差异——前端参数随页面走、收集端参数随进程走、分析参数随调用走。做配置审计时需要同时检查这三处;若用 systemd 托管收集端,还有第四处(unit 文件),见第七章。
三、前端埋点参数:script 标签 data-* 属性
UserALE.js 支持在引入脚本时通过 data-* 属性做声明式配置,浏览器加载脚本时自动读取(源码 getInitialSettings.ts 实现该解析逻辑)。以官方示例页实测可见的属性为入口(4.6 节 grep 回显见《Ubuntu 22.04 安装 Apache Flagon 指南》),完整参数表如下(README 官方表格 + 源码核实):
| data-* 属性 | 说明 | 默认值 |
|---|---|---|
data-url | 日志上报端点 URL | http://localhost:8000/ |
data-log-details | 是否捕获细节日志(含按键与输入值,隐私敏感,默认关闭) | false |
data-user | 用户标识 | null |
data-tool | 应用/工具名称(随每条日志上报) | null |
data-function | 应用内功能域标识 | null |
data-user-from-params | 从 URL 查询参数读取用户标识 | false |
data-userale-redact | 用布尔标记标记节点,日志中内容以该标记代替(脱敏开关) | false |
data-autostart | 脚本加载即自动开始采集 | true |
data-transmit-interval | 发送循环间隔(ms) | 5000 |
data-log-count-threshold | 触发发送的积压日志条数 | 5 |
data-http-session-id | 上报后立即刷新的会话标识模式 | false |
data-browser-session-id | 页面生命周期内固定的会话标识模式 | false |
data-send-page-info | 是否随日志上报页面 URL/标题 | false |
data-resolution | 自动事件捕获的防抖节流(ms) | 500 |
data-wait | 缓冲日志不再发送(等待手动 flush) | false |
data-autostart-onload | 页面 load 事件后启动 | true |
data-version | 客户端版本号 | null |
data-api-key | x-api-key 请求头 | null |
data-auth-header | Authorization 头或 () => string 回调 | null |
data-headers | 额外自定义请求头(JSON 字符串) | null |
data-exporter | 导出器配置 | 默认导出器 |
data-exporter-type | http-json / otlp / proto-json / websocket | http-json |
data-exporter-format | 导出载荷格式 | bundle(raw 页面事件默认) |
data-otlp-endpoint | OTLP/JSON 导出端点 | http://localhost:4318/ |
data-trace-context | 是否携带 W3C TraceContext(traceId/spanId) | false |
data-observe-mutations | 是否捕获 DOM 变更(MutationObserver) | false |
data-keytrace-threshold | 键击记录节流阈值(ms,配 logDetails) | 2000 |
逐项实测说明(关键项,实测环境为官方示例页 + example collector):
data-url与data-threshold/data-interval决定了采集节奏:示例页data-threshold="1"、data-interval="1000"(每 1 秒、每 1 条即发送),生产建议放宽到默认的 5 条/5 秒以减少请求数;data-log-details与data-userale-redact是隐私合规的核心开关:默认false时不采集按键与输入值;开启 details 后可用 redact 标记对敏感节点脱敏;data-exporter-type切换协议族时,data-otlp-endpoint仅在otlp模式下生效(默认 4318 端口对应 OTLP/HTTP);示例页实测未设置时走http-json;data-trace-context开启后每条日志携带traceId/spanId,Distill 的frustration_score/detect_rage_clicks输出中的traceId字段即来源于此(实测默认null)。
四、前端埋点参数:userale.options() 编程式配置
运行时动态调整用 window.ale.options()(读取当前配置)与 userale.configure(options)(合并新配置)。userale.options() 支持的全部字段与上表 data-* 一一对应,采用驼峰命名(data-transmit-interval 对应 transmitInterval,以此类推)。官方 README 的完整字段表(22 项)如下:
| options 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
url | string | http://localhost:8000/ | 上报端点 |
autostart | boolean | true | 自动开始采集 |
transmitInterval | number | 5000 | 发送间隔 ms |
logCountThreshold | number | 5 | 发送阈值条数 |
httpSessionId | boolean | false | 上报后刷新会话 ID 模式 |
browserSessionId | boolean | false | 页面生命周期会话 ID 模式 |
userId | string | null | 用户标识 |
sessionId | string | null | 会话标识(默认 UUID 自动生成) |
version | string | null | 客户端版本 |
logDetails | boolean | false | 细节日志(隐私敏感) |
resolution | number | 500 | 防抖节流 ms |
userFromParams | boolean | false | 从 URL 参数取用户 ID |
toolName | string | null | 工具名 |
custIndex | function | null | 自定义事件索引函数(返回字符串) |
authHeader | string/function | null | Authorization 头或回调 |
apiKey | string | null | x-api-key 头 |
headers | object | null | 自定义头 |
exporterType | string | http-json | 导出器类型 |
exporterFormat | string | bundle | 导出载荷格式 |
otlpEndpoint | string | http://localhost:4318/ | OTLP 端点 |
exporter | object | null | 自定义导出器实例 |
traceContext | boolean | false | W3C TraceContext |
observeMutations | boolean | false | DOM 变更捕获 |
实测核实:flagon-userale 2.4.0 的 package.json 中 main 字段指向 build/userale-2.4.0.js(IIFE 产物),该产物内导出 userale 全局对象(实测 ls node_modules/flagon-userale/build/ 见《Ubuntu 22.04 安装 Apache Flagon 指南》5.2 节,产物 44729 字节)。
💡 技术拓展:
transmitInterval与logCountThreshold是「或」的关系——积压日志数达到阈值或定时器到期即触发发送。二者共同决定数据时效与请求量的平衡:实时监控大屏用 1000ms/1 条,生产流量大的站点用 5000ms/5 条甚至更宽松。
五、收集端参数:Example Collector 环境变量与端点
Example Collector 是一个单文件 Express + WebSocket 服务(example/server/server.js),配置极少,以源码常量与环境变量为主。实测提取源码关键行(grep -nE 'PORT|listen|/ws|/v1/logs|100mb|logs_' example/server/server.js,实测回显):
36:const port = process.env.PORT || 8000;
42:const logPath = path.join(logDirectory, `logs_${Date.now()}.json`);
73:app.use(bodyParser.urlencoded({ extended: true, limit: "100mb" }));
74:app.use(bodyParser.json({ limit: "100mb" }));
90:app.use("/", express.static(__dirname));
93:app.get("/ws", (req, res) =>
123:app.post(["/", "/v1/logs"], (req, res) => {
217: httpServer.listen(port, () => {
参数逐项说明:
| 参数 | 位置 | 默认值 | 实测行为 |
|---|---|---|---|
PORT | 环境变量 | 8000 | 改端口启动实测 PORT=9000 后控制台输出 running on port 9000 且 GET / -> HTTP 200 |
| 日志落盘目录 | 源码常量 | example/logs/ | 文件名 logs_<进程启动时间戳>.json(Date.now() 生成) |
| 请求体上限 | 源码常量 | 100mb | urlencoded/json 双中间件均 100mb,批量上报大包不会 413 |
| CORS | 源码常量 | 全放开 | 允许任意来源(源码 61 行中间件),生产需按需收紧 |
| HTTP 端点 | 源码常量 | POST / 与 POST /v1/logs | 两者等价,均接收 UserALE/OTLP 批量 JSON(实测均 200) |
| WebSocket 端点 | 源码常量 | ws://<host>:<port>/ws | 客户端 connect 即持久接收(实测回显见《Apache Flagon 常用 CLI 命令与工具详解》) |
| 静态目录 | 源码常量 | / 指向 example/server/、/js 指向 site/js | 示例页与 UserALE 构建产物由同端口托管 |
| 优雅停机 | 源码常量 | SIGINT/SIGTERM | 收尾补写日志文件结尾 ] 后退出(实测输出见《Ubuntu 22.04 安装 Apache Flagon 指南》8.3) |
端口修改实测(PORT 环境变量,实测回显):
cd /root/flagon/products/userale
PORT=9000 nohup node example/server/server.js > /root/server_9000.log 2>&1 &
sleep 3
cat /root/server_9000.log
curl -s -o /dev/null -w 'GET / -> HTTP %{http_code}\n' --noproxy '*' http://localhost:9000/
UserAle HTTP + WebSocket server running on port 9000
GET / -> HTTP 200
CORS 全放开的源码细节(实测提取源码 61-70 行):
app.use((req, res, next) => {
res.set({
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET,PUT,POST,DELETE,OPTIONS",
"Access-Control-Allow-Headers":
"Content-Type, Authorization, Content-Length, X-Requested-With, x-api-key, traceparent, tracestate",
});
if (req.method === "OPTIONS") return res.sendStatus(200);
next();
});
实测解读:允许头清单里包含 x-api-key、traceparent、tracestate——分别对应 UserALE 的 API Key 认证头与 W3C TraceContext 追踪头,说明参考实现已经为「前端鉴权 + 链路关联」预留了通道;生产收紧时保留这三个头即可,其余按需删减。
日志落盘格式也有源码依据(实测提取源码 55 行):wStream.write(logs.map(JSON.stringify).join(",\n\t"))——即每条日志占一行、行首一个制表符、条目间逗号分隔,文件首尾由启动 [ 与优雅停机 ] 包裹。这解释了第九章 FAQ 中「未优雅停机则文件缺 ]」的现象。
💡 技术拓展:
/v1/logs命名对应 OpenTelemetry 的日志语义约定(v1 = OTLP/HTTP v1),而POST /是早期 UserALE 收集端的兼容路径。两者同时保留意味着 UserALE.js 无论用http-json还是otlp导出器,都可以直接打到同一个收集端而无须改服务端——这是 Flagon 官方示例「一套收集器吃两种协议」的设计。
六、分析端参数:Distill 函数参数
Distill 是纯 Python 库(无 CLI),参数以函数关键字参数形式提供。以下为实测核实过的核心函数签名与参数行为(pip3 show flagon-distill 实测版本 0.1.0,monorepo 源码安装)。
6.1 detect_rage_clicks:Rage Click 检测灵敏度
签名(实测调用):detect_rage_clicks(logs, window_ms=1000, threshold=3, radius_px=30.0),三个参数共同定义「多快、多少次、多大半径内的连续点击算 rage click」。参数变体实测(同一份 8 条日志数据集,含 BUTTON#broken 上间隔 150ms 的 4 连点):
python3 - <<'EOF'
import json
import distill
from distill.schemas.userale import extract_logs
docs = [d.model_dump(by_alias=True) if hasattr(d,'model_dump') else d for d in extract_logs(json.load(open('/root/flagon/products/userale/example/logs/logs_1792123964892.json')))]
print('default (window_ms=1000, threshold=3):', len(distill.detect_rage_clicks(docs)), 'rage click(s)')
print('stricter (window_ms=500, threshold=4):', len(distill.detect_rage_clicks(docs, window_ms=500, threshold=4)), 'rage click(s)')
loose = distill.detect_rage_clicks(docs, window_ms=3000, threshold=2)
print('looser (window_ms=3000, threshold=2):', len(loose), 'rage click(s) -> count:', loose[0]['clickCount'] if loose else None)
EOF
default (window_ms=1000, threshold=3): 1 rage click(s)
stricter (window_ms=500, threshold=4): 1 rage click(s)
looser (window_ms=3000, threshold=2): 2 rage click(s) -> count: 2
实测解读:默认参数检出 1 个 rage click(4 连点中 3 次计入窗口);收紧到 500ms/4 次仍检出;放宽到 3000ms/2 次后检出 2 组(窗口滑动产生重叠分组)。调参建议:报误多则收紧 window_ms/threshold,漏报多则放宽。
6.2 transition_matrix:递归转移折叠
签名(实测调用):transition_matrix(logs, drop_recursions=True)。drop_recursions 决定是否把「同一目标的连续点击」折叠掉,实测对比(同上数据集,统计矩阵对角线自环概率之和):
matrix self-loops (drop=True): 0.0
matrix self-loops (drop=False): 0.75
实测解读:关闭折叠后自环概率 0.75,说明样本里 75% 的转移是同目标连续点击(rage click 数据集特性);做漏斗分析时应保持默认 True。
6.3 其余分析函数参数速览
| 函数 | 关键参数 | 说明 |
|---|---|---|
extract_logs(payload) | 无 | 多格式解析与校验,返回 Pydantic UserAle 对象列表 |
session_summary(docs) | 无 | 汇总 click_count/duration/click_rate 等 14 项指标 |
frustration_score(docs) | 无 | 0-100 综合分 + severity 分级 + rage/dead/thrash 明细 |
detect_dead_clicks(docs) | 无 | 死点击列表(无响应点击) |
click_heatmap_data(docs) | 无 | 返回点击坐标列表(列表而非字典,消费时按数组处理) |
plot_click_heatmap(docs, *, nbinsx=20, nbinsy=20, normalize_viewport=False) | nbinsx/nbinsy/normalize_viewport | 渲染 Plotly 热力图;bins 越小越精细;normalize_viewport=True 时按视口归一化坐标 |
参数实测证据:plot_click_heatmap(docs, nbinsx=20, nbinsy=20) 生成 HTML 实测 7957 字节(1 个 trace);click_heatmap_data(docs) 实测返回列表(按数组消费)。完整调用回显见《Apache Flagon 常用 CLI 命令与工具详解》。
七、systemd 托管参数
收集端常驻时的单元文件配置(实测部署回显见《Ubuntu 22.04 安装 Apache Flagon 指南》第七章):
| 字段 | 实测值 | 作用 |
|---|---|---|
After=network.target | 网络 | 网络就绪后启动 |
Type=simple | 前台进程 | node 进程即主进程 |
WorkingDirectory | /root/flagon/products/userale | 必须是 workspace 根,server.js 相对引用依赖与静态目录 |
ExecStart | /usr/bin/node example/server/server.js | 绝对路径 node + 相对脚本 |
Environment=PORT=8000 | 8000 | 覆盖默认端口(源码 36 行 process.env.PORT) |
Environment=NODE_ENV=production | production | 语义标记 |
Restart=on-failure | 异常拉起 | 正常 stop 不会重启 |
RestartSec=3 | 3 秒 | 崩溃后等待间隔 |
WantedBy=multi-user.target | 多用户 | 开机自启 |
实测要点:systemctl stop 发送 SIGTERM,实测日志文件完整收尾(HTTP server closed. → Deactivated successfully,且 json.load 解析通过)。
八、生产配置建议模板
综合以上参数,给出两类典型场景的配置建议(均为实测验证过的取值组合):
低流量内部系统(如运营后台):页面侧 data-threshold="5"、data-interval="5000"(默认值即可);收集端默认端口 8000 + systemd 托管;分析端默认 rage click 参数(1000ms/3 次/30px)。
高流量 C 端站点(如营销活动页):页面侧 data-threshold="10"、data-interval="10000" 减少请求数;data-log-details 保持 false 隐私合规优先;收集端 PORT 换非默认端口并置于反向代理之后(CORS 需按源收紧);分析端 rage click 参数先按默认跑两周再依据误报率收紧 window_ms=500。
统一注意事项:
- 所有
data-*属性在页面中以 HTML 形式审计,userale.options()在运行时以 JS 审计,两者同名参数后者优先级更高; - 收集端 100MB 请求体上限与全开 CORS 是参考实现默认值,接入公网前必须按源收紧;
- 日志文件按进程启动时间滚动,重启服务即产生新文件,消费侧(如 8.4 的 glob 最新文件模式)需要按需调整。
九、常见问题(FAQ)
Q1:改了 data-url 页面日志还是打到旧地址?
优先级问题:window.ale 已存在(如页面二次加载脚本)时,后续 data-* 不再生效。解决:保持页面只引入一次脚本,或在 userale.configure() 里显式覆盖。
Q2:PORT=9000 启动后防火墙/安全组未放行?
收集端绑定 0.0.0.0(实测本机 curl 200 但远端不通时先查防火墙):Ubuntu 22.04 默认 ufw 未启用,云主机则检查安全组规则放行对应端口。
Q3:日志文件越来越大会不会影响写入性能?
单文件按会话追加,实测 8 条日志 1365 字节;长期运行建议按周轮转(新增 cron/定时任务把 logs_*.json 归档),或升级为官方 OpenTelemetry/OpenSearch 示例栈(写入下游数据库而非本地文件)。
十、参考链接
- UserALE.js README(options 全表):https://github.com/apache/flagon/blob/master/products/userale/packages/flagon-userale/README.md
- Example Collector 源码:https://github.com/apache/flagon/blob/master/products/userale/example/server/server.js
- Distill 源码:https://github.com/apache/flagon/tree/master/products/distill
- 环境安装与端到端验证见《Ubuntu 22.04 安装 Apache Flagon 指南》;组件全景与选型见《Apache Flagon 介绍与选型指南》;命令行操作见《Apache Flagon 常用 CLI 命令与工具详解》。