Apache Flagon 配置参数详解

Apache Flagon 配置参数详解:UserALE.js 的 data-* 属性与 userale.options()、Example Collector 环境变量与端点、Distill 分析函数参数与 systemd 托管配置,全部实测验证。

Apache FlagonApache FlagonPythonUbuntuUbuntu 22.042026/10/16

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-userale 2.4.0(monorepo master 源码)
  • Example Collector:/root/flagon/products/userale/example/server/server.js(master 61677c7)
  • Distill:flagon-distill 0.1.0(monorepo products/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日志上报端点 URLhttp://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-keyx-api-key 请求头null
data-auth-headerAuthorization 头或 () => string 回调null
data-headers额外自定义请求头(JSON 字符串)null
data-exporter导出器配置默认导出器
data-exporter-typehttp-json / otlp / proto-json / websockethttp-json
data-exporter-format导出载荷格式bundle(raw 页面事件默认)
data-otlp-endpointOTLP/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):

  1. data-url 与 data-threshold/data-interval 决定了采集节奏:示例页 data-threshold="1"、data-interval="1000"(每 1 秒、每 1 条即发送),生产建议放宽到默认的 5 条/5 秒以减少请求数;
  2. data-log-details 与 data-userale-redact 是隐私合规的核心开关:默认 false 时不采集按键与输入值;开启 details 后可用 redact 标记对敏感节点脱敏;
  3. data-exporter-type 切换协议族时,data-otlp-endpoint 仅在 otlp 模式下生效(默认 4318 端口对应 OTLP/HTTP);示例页实测未设置时走 http-json;
  4. 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 字段类型默认值说明
urlstringhttp://localhost:8000/上报端点
autostartbooleantrue自动开始采集
transmitIntervalnumber5000发送间隔 ms
logCountThresholdnumber5发送阈值条数
httpSessionIdbooleanfalse上报后刷新会话 ID 模式
browserSessionIdbooleanfalse页面生命周期会话 ID 模式
userIdstringnull用户标识
sessionIdstringnull会话标识(默认 UUID 自动生成)
versionstringnull客户端版本
logDetailsbooleanfalse细节日志(隐私敏感)
resolutionnumber500防抖节流 ms
userFromParamsbooleanfalse从 URL 参数取用户 ID
toolNamestringnull工具名
custIndexfunctionnull自定义事件索引函数(返回字符串)
authHeaderstring/functionnullAuthorization 头或回调
apiKeystringnullx-api-key 头
headersobjectnull自定义头
exporterTypestringhttp-json导出器类型
exporterFormatstringbundle导出载荷格式
otlpEndpointstringhttp://localhost:4318/OTLP 端点
exporterobjectnull自定义导出器实例
traceContextbooleanfalseW3C TraceContext
observeMutationsbooleanfalseDOM 变更捕获

实测核实: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() 生成)
请求体上限源码常量100mburlencoded/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=80008000覆盖默认端口(源码 36 行 process.env.PORT)
Environment=NODE_ENV=productionproduction语义标记
Restart=on-failure异常拉起正常 stop 不会重启
RestartSec=33 秒崩溃后等待间隔
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。

统一注意事项:

  1. 所有 data-* 属性在页面中以 HTML 形式审计,userale.options() 在运行时以 JS 审计,两者同名参数后者优先级更高;
  2. 收集端 100MB 请求体上限与全开 CORS 是参考实现默认值,接入公网前必须按源收紧;
  3. 日志文件按进程启动时间滚动,重启服务即产生新文件,消费侧(如 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 示例栈(写入下游数据库而非本地文件)。

十、参考链接