面向网络的ELU分析
捕获产品事件,将活动与用户和组织联系起来,进行评估 功能标志,并根据您的ELU隐私设置记录会话。
每个页面使用一种安装方法:ELU脚本或NPM客户端。都使用 你ELU 网站的关键. 将帐户凭证和服务器机密保存在浏览器之外 代码。
安装脚本
将Web代码片段从您的ELU集成设置复制到您的站点中
<head>. 保留提供的URL和站点密钥:
<script async src="https://elu.dev/v1/YOUR_SITE_KEY.js"></script>
该脚本为该站点初始化ELU。不要打电话 init(). 装载机后
运行过,使用过 window.elu:
window.elu?.capture('checkout_started', { source: 'pricing_page' })
window.elu?.identify('user_123', { plan: 'pro' })
脚本是异步加载的。可选链接可以防止出现错误
没有装载,但是 不排队呼叫. 把重要的早起电话接到
脚本的 load 事件,或者使用下面的NPM客户端。一旦加载器
创建 window.elu,状态改变调用可以等待SDK启动;getter可能
还回来 undefined.
NPM安装
安装软件包并使用ELU项目的Web设置中的站点密钥。
npm install @elu-labs/analytics-browser@latest
页面本身必须使用HTTPS,包括在本地开发期间。服务你的 使用受浏览器信任的证书的本地应用程序,或使用受信任的HTTPS 预览。初始化停留在HTTP localhost暂停;HTTPS集合 只有端点是不够的。
在您的同意管理器允许分析后,在浏览器代码中初始化一次; 并重用返回的客户端:
import { createEluClient } from '@elu-labs/analytics-browser'
const elu = createEluClient('YOUR_SITE_KEY')
elu.capture('checkout_started', { source: 'pricing_page' })
对于您自己域上的ELU集合实例,设置其HTTPS URL:
const elu = createEluClient('YOUR_SITE_KEY', {
api_host: 'https://analytics.example.com',
})
实例必须提供站点配置和事件、标志和重播
配置授权的端点。它的记录器资产使用相同的基础
URL,除非你提供 assets_host. 云默认值不需要主机选项。两个
选项接受带有可选路径前缀的绝对HTTPS URL,例如
https://analytics.example.com/elu. 端点位于该前缀下;
凭据、查询、片段和不规则路径被拒绝。所选
在页面上第一次成功初始化客户端后,url不能更改。
被服务的配置不能将请求重定向到另一个源或外部
所选路径前缀。
自托管实例
有一个习惯 api_host,客户端不向任何ELU云原点发出请求;
| 请求 | ELU云 | 自定义 api_host |
|---|---|---|
网站配置 /sdk/v2/<key>/config | https://elu.dev | api_host |
| 事件、标志和重播 | https://ingest.elu.dev | api_host |
录音机 /sdk/recorder/<sha256>.js | https://assets.elu.dev | assets_host 或者 api_host |
| 脚本存储模块 | https://elu.dev | assets_host 或者 api_host |
如果记录器主机没有交付记录器,例如因为a
网络过滤器或内容安全策略仅阻止该主机,即客户端
从事件主机获取相同的文件一次
/static/elu-owned/sdk/recorder/<sha256>.js 下 https://ingest.elu.dev 或者
你的 api_host. 它的字节必须与固定的摘要匹配。
客户端使用elu拥有的存储来标识和同意。现有的ELU状态为
保留;没有它的访问者会在网站下获得一个新的身份
opt_out_capturing_by_default 和 respect_dnt 设置。早期SDK存储
和回滚同步不再受支持。
页面可以直接加载实例的脚本:
<script src="https://analytics.example.com/static/elu.js"></script>
<script>_eluSdk.init('YOUR_PROJECT_TOKEN', { api_host: 'https://analytics.example.com' })</script>
init 启动与代码片段相同的客户端并发布 window.elu 当
佩奇没有。它需要一个明确的 api_host 和一个HTTPS页面。这个
安装指南描述了页面选项、共享身份和同意。
当画布捕获打开时(页面的 session_recording.captureCanvas ?? 你的
实例的设置)并且该实例不隐藏图像和媒体,
记录器还发送画布像素作为回放帧。它启动了一个Web Worker
从一个 blob: URL,因此内容安全策略必须允许 worker-src blob:
(或 script-src blob:)以及 connect-src 以你为例。没有它,
画布被忽略,重播的其余部分继续。创建了一个WebGL画布
录音开始前需要 preserveDrawingBuffer: createEluClient
为调用它之后创建的上下文提供它(除非翻页)
Canvas(关闭),正如实例的安装代码段所做的那样,因此创建客户端
在你的地图或图表之前。
画布框架是图片,所以文本遮罩,输入遮罩和遮罩选择器 不适用于它们:绘制到画布中的文本被记录为像素,即使当 所有文本都被屏蔽。块规则,或隐藏图像和媒体,保留一个画布 不再重播。
当重放网络捕获打开时(该页的 capture_performance 和
session_recording.recordHeaders/recordBody ?? 实例的设置),记录器将添加
页面的资源和导航计时,以及选中的方法,
的状态、标题和正文 fetch 和 XMLHttpRequest 请求。凭证
头文件总是记录为 redacted;大,二进制和敏感的外观
主体被音符代替;对实例的请求永远不会被记录。
重播屏蔽不适用于这些行,并且 capture_network_requests
不能控制他们。
当控制台录音是在(页的) enable_recording_console_log ?? 你的
实例的设置),记录器也记录页面的设置
console.* 在重播中调用和未捕获的错误,如前面的脚本所做的:
每个条目最多保留其级别、堆栈跟踪和序列化的参数
十个2000个字符的字符串。控制台只在重播时打补丁
会话正在录制,并在会话停止时进行恢复。屏蔽设置不适用
控制台条目:无论文本规则是什么,都记录一个页面记录的内容
是为了之前的剧本。记录到控制台的DOM节点被记录为其
选择器路径,而不是它的标记,以及记录的输入、组合或键盘
事件不携带键入的文本,因此阻塞或屏蔽文本和输入值不携带
就这样留下这一页。页面的 enable_recording_console_log 决定:
true 记录控制台,即使实例没有要求它, false
从不;省略,由实例的设置决定。相同的优先级,页
选择? ?项目拨款,适用于每个自动收集器,和一个
启用页面的一个运行时具有与授予的一个相同的屏蔽和边界。
重播从页面的完整快照开始,并在
每一次之后的第一次改变 session_recording.full_snapshot_interval_millis 的
活动,五分钟,除非书上另有说明。每个检查点开始一个
新的重播块,所以寻找土地在一个和一个玩家不能使用
渐进式的变化在下一个阶段又会变得完整。一大块不超过
5000个事件,不管它的字节大小。
包导出 createEluClient 和TypeScript类型 EluClient. ESM
和CommonJS的根导入。导入包则不会
初始化分析。只在浏览器中调用工厂,不要在呈现时调用
在服务器上。在组件框架中,为页面保留一个客户端
而不是在每次渲染或mount上创建一个。NPM客户端不创建
window.elu;保留返回的对象。
初始化选项
| 选项 | 默认的 | 行为 |
|---|---|---|
api_host | ELU云 | 您的实例的HTTPS URL,可选地带有路径前缀(https://example.com/elu),用于其事件、标志和重播。站点权威必须在其下发布端点。 |
assets_host | 实例起源,或用于云摄取起源的ELU云资产 | 可选的单独HTTPS URL,可选的带有路径前缀,用于记录器资产。 |
capture_pageview | 'history_change' | 初始页面浏览量加上历史API和哈希路由的变化。 true 只捕获初始页面浏览量; false 禁用自动页面浏览量。 |
capture_pageleave | 'if_capture_pageview' | $pageleave 在 pagehide,与左页的 $prev_pageview_* 持续时间和滚动值,由访问者在网站上加载的下一个页面提供。 'if_capture_pageview' 无论何时发送 capture_pageview 是在; true 总是; false 从来没有。 |
autocapture | true | 根据站点策略和同意,启用自动交互捕获。对象也启用它,缩小到1.409.5 url_allowlist, url_ignorelist, dom_event_allowlist, element_allowlist, css_selector_allowlist 和 css_selector_ignorelist 列表; element_attribute_ignorelist 命名永远不会作为元素内容发送的属性。 |
capture_exceptions | 项目设置为ELU | 未处理的错误和承诺拒绝,与堆栈框架(脚本URL没有查询,函数,行,列)。 true 打开这一页, false 要走;省略,项目的 captureExceptions 决定谁的压制规则在授予时适用。每种异常类型都有速率限制,就像1.409.5包中一样(每10秒重新填充10个令牌;突发最多发送9个)。手册 captureException() 仍然可用,不受限制。 |
capture_copied_text | 你的实例 captureCopiedText | 集 true 用于 $copy_autocapture 当访问者复制或剪切时,您的实例是否授予复制的文本:所选文本(最多255个字符,卡片和社会安全号码删除)和 $copy_type. 集 false 无论你的情况如何,永远不要送出去;Unset,你的实例 captureCopiedText 决定。无论哪种方式,选择都是在实例的屏蔽和页面自己的重放屏蔽(session_recording的掩码和块选择器和类,以及 elu-mask 班):什么都不送 mask_all_text,对于选择退出的访问者,当从祖先元素或选择的任何部分复制的元素达到无捕获标记时,实例掩码或阻塞的元素,图像元素(img, picture, video),而您的实例阻塞图像,这是rrweb的默认值 rr-block 或者 rr-mask 类,或密码,隐藏或敏感命名字段,从任何表单字段(甚至在重播记录其值的地方),或从封闭的阴影树,嵌套在打开的或不,在每个浏览器中。只有页面显示的文本可以解释选择:一个携带表单字段的默认文本,一个关闭树的文本或隐藏文本不发送任何内容。如果选择太大而无法在20毫秒内判断,或者超过50,000个节点,则不发送任何内容,而是延迟复制。 |
capture_network_requests | true | 集 false 停止报告获取/XHR请求。每个报告只携带方法、状态、时间和一个擦除路径——从不查询字符串、标题或正文。每页最多200页。 |
capture_performance | Web vital和重放网络定时:项目在ELU中的设置采样关闭,除非在ELU中启用 | true 打开Web vital、重播网络定时、内存和长任务示例; false 把它们都关掉;省略,由项目决定。一个对象集合 web_vitals 和 network_timing (每人决定页码), web_vitals_allowed_metrics, memory 和 long_tasks 单独的;见下文。 |
capture_heatmaps | 项目在ELU中的热图设置 | true 或者 { flush_interval_milliseconds } (默认为5000)发送点击,愤怒点击,死点击和鼠标移动位置为 $$heatmap 在这一页; false 发送没有;省略,项目的 captureHeatmaps 决定。坐标。 |
enable_recording_console_log | 项目设置为ELU | 控制台录音回放。 true 记录该页上该页的控制台调用, false 从不;省略,项目的 captureConsole 决定。 |
disable_session_recording | false | true 即使您的实例授予重播,也会在此页面上保持关闭重播。事件不受影响。没有办法把它重新打开。 |
session_recording | { full_snapshot_interval_millis: 300000 } | full_snapshot_interval_millis:重放页面的完整快照之间的活动毫秒,保持在10秒到30分钟之间。 recordHeaders 和 recordBody 决定页面的重放网络标头和正文(true , false 要走;省略,项目的 captureNetwork); captureCanvas: { recordCanvas, canvasFps, canvasQuality } 在实例的遮罩内,以相同的方式决定画布像素,有界(每秒1到12帧,质量从0到1)。在实例掩码之上的页面掩码,只会更严格: maskAllInputs: true, maskInputOptions, maskTextSelector, maskTextClass, blockSelector, blockClass, ignoreClass, ignoreSelector. RegExp类是以精确的类形状读取的 /^(a|b)$/ 只有。其他成员被忽略。 |
mask_all_text | 你的实例 captureElementContent | true 屏蔽重播中的每个文本节点,并将元素文本排除在交互事件之外,无论您的实例授予什么。 false 在您的实例的屏蔽范围内,无论您的实例是否授予它,都在该页的交互事件上发送元素文本(如果没有,则屏蔽所有文本);它永远不会揭开重播的面纱。省略,由你的实例决定。 |
mask_all_element_attributes | 你的实例 captureElementContent | true 将元素属性排除在交互事件之外,无论您的实例授予什么。 false 为此页发送它们,无论您的实例是否授予它们 autocapture element_attribute_ignorelist. 省略,由你的实例决定。 |
loaded(client) | 无 | 在本地启动之后和初始自动页面浏览之前运行。这并不意味着配置、标志或交付已经完成。没有等待异步回调。 |
before_send | 无 | 一个函数,或一个按顺序调用的函数数组,在每个事件被排队之前运行: capture, captureException 自动事件也一样。它接收 { event, properties, $set?, $set_once?, timestamp },将已注册的超级属性合并到事件自己的超级属性下,并返回它,在适当位置编辑或替换,或 null 放弃事件;被移除的超级属性保持被移除状态。身份更改作为先前脚本为其发送的事件($identify 与 $set/$set_once, $set 与 properties.$set/$set_once, $create_alias, $groupidentify 与 properties.$group_set); null 丢掉零钱。抛出的钩子会丢弃带有一个控制台错误的事件。重放数据不通过它。 |
property_denylist | [] | 从每个事件的属性(包括已注册的超级属性)中删除的属性名 sanitize_properties 和 before_send. 早先的脚本是 property_blacklist 仍然在它前面读取和合并。 |
sanitize_properties | 无 | 弃用;使用 before_send. (properties, eventName) 返回要发送的属性;在否定者之后和之前运行 before_send. |
脚本加载器选择它的启动选项;改变NPM选项则不然
配置脚本安装。重播和隐私设置来自ELU;一个
页面只能添加到它们。元素 elu-mask 类有
他们的文字被掩盖了, elu-no-capture 记录为
占位符和输入 elu-ignore-input 有
无论该实例的规则如何规定,他们的改变都被忽略了。一个 session_recording
成员,记录器不能支持精确类形状之外的RegExp类
/^(a|b)$/,一个选择器,它不进行解析或被未关闭的选项打开
注释、字符串、括号或括号或尾随的反斜杠)保持回放
在该页上关闭,而不是记录要求隐藏的内容,以及运行时
在控制台中为选项命名一次; maskTextFn 和 maskInputFn 不
运行时,他们将重写的内容被屏蔽如下。没有
set_config() 或在此客户机上覆盖每个请求端点:较早的
对于所针对的页面,返回对象接受脚本的名称
它, set_config() 被控制台警告忽略,并且
startSessionRecording() / stopSessionRecording() 切换这一页的记录器
在实例允许的范围内。看到
早期的脚本方法.
Web vital和可选的性能示例
当网页生命体征在(页面的) capture_performance ?? 你的ELU项目
captureWebVitals),每个页面都会报告其核心Web vital
(LCP, FCP, CLS和INP,或项目列出的指标)作为一个或多个
$web_vitals 事件携带值,它们的评级和页面位置
只有。较早完成的指标会在短暂延迟后一起发送;CLS和
INP也会在页面可见时发送,每次它们发生变化,因为
一旦页面被隐藏,捕获就会停止。一页在隐藏时开始绘画
报告没有油漆时间。页面的选项决定两个方向:
capture_performance: true 或者 { web_vitals: true } 即使在哪里也能打开它们
该项目并没有授予他们(每一个指标,缩小到
web_vitals_allowed_metrics), { web_vitals: false } 或者 capture_performance: false 关掉它们;省略,项目决定,和
web_vitals_allowed_metrics 缩小了它的度量。
当您的ELU站点配置和本地配置都不启用时,性能采样将关闭 初始化选项启用它。对于NPM客户端,你可以显式地选择:
const elu = createEluClient('YOUR_SITE_KEY', {
capture_performance: {
memory: true,
long_tasks: true,
sample_interval_ms: 30_000,
},
})
TypeScript的选项类型是 PerformanceCaptureConfig. 每个本地设置
覆盖其远程对应; true 同时启用度量和 false
禁用两者,以及Web vital。一个 capture_performance 这就是价值
布尔值和对象都不能关闭样本。间隔默认为
30秒,最少5秒。
如果更新的站点配置省略了性能设置,则先前的远程
有选择地加入结束;显式本地覆盖仍然需要有效的捕获权限。
样本使用常态 $performance_sample 事件队列。记忆的测量
仅在浏览器公开堆统计信息时可用;长期任务
测量要求 PerformanceObserver 支持。不支持的测量
省略了。当页面被隐藏时,Collection会暂停并丢弃旧的
当身份、同意或捕获配置更改时测量窗口。
选择退出,阻止捕获和过期配置阻止采样。
关于隐藏或导航的最后一个示例是尽力而为的。浏览器生命周期和 同意检查仍然适用;关闭选项卡或进程可以阻止排队或 交付。此功能不保证卸载样例或进程死亡 复苏。
识别用户和组织
使用应用程序稳定的内部ID,而不是电子邮件地址、姓名或电话 号码。在登录后和相关自定义事件之前进行识别:
elu.identify('user_123', { plan: 'pro' }, { signup_source: 'website' })
elu.group('organization', 'org_456', { plan: 'pro' })
elu.capture('project_created', { template: 'blank' })
// On sign-out:
elu.reset()
第三个论点 identify 仅在不存在时设置person属性。使用
setPersonProperties 用于以后的更改。 group 关联后续活动
对于这种群体类型; resetGroups 清除组关联。
reset() 开始一个新的匿名身份,并清除超级属性,组
标志上下文。它保留了设备ID ($device_id),除非被称为
reset(true),并保留访客选择退出的权利。身份重置是
不同意恢复捕获;使用您的同意管理器来做出决定。
同意及私隐
如果在任何SDK活动之前都需要征得同意,请等待加载脚本或调用
createEluClient 直到获得同意。初始化可以打开浏览器
存储和请求配置;之后选择退出不能撤销这些
最初的行动。
对于初始化的客户端:
elu.opt_out_capturing()
// Only when the visitor explicitly opts back in:
elu.opt_in_capturing({ captureEventName: false })
调用 opt_in_capturing() 没有选项也请求一个 $opt_in 事件。
选择退出抑制捕获,标志评估和重放。它不删除数据
已经交付给欧盟。
保存密码、付款详情、令牌及敏感个人资料 事件属性、id和异常消息。重播屏蔽无法进行消毒 任意自定义事件属性。
会话回放是为每个项目单独激活的。请联系ELU技术支持 它不可用;安装包不启用录音。重播 还需要同意,一个站点配置允许它,并符合条件 浏览器和会话。查看网站的输入、文本、图像和块化元素 设置在ELU;不要假设默认情况下所有可见的文本和图像都是屏蔽的。
在回放中掩蔽总是意味着保持长度 *. 遮罩文本节点保持
它是空格,并且所有其他字符都由 *,以及一个屏蔽输入
价值合二为一 * 每个字符,所以 Team settings 记录为
**** ******** 和7个字符的密码为 *******. 遮罩内容为
从来没有空白或掉落:重放保持页面的布局,没有任何
原始页除了它的长度。HTML注释总是隐藏在
同样的方式。阻塞是移除内容的单独规则:被阻塞的元素
被记录为相同大小的空占位符,并且被阻止的图像保持没有
src.
功能标志
标志异步加载。 undefined 指没有可用价值;
将其与显式函数分开处理 false:
const unsubscribe = elu.onFeatureFlags((_keys, _variants, context) => {
if (context?.errorsLoading) return
const enabled = elu.isFeatureEnabled('new_checkout', { defaultValue: false })
// Render the new checkout only when enabled === true.
})
// When the component is disposed:
unsubscribe()
使用 getFeatureFlag 对于布尔或字符串变体, getFeatureFlagPayload 用于
它的JSON有效负载,或者 getFeatureFlagResult 用于 { key, enabled, variant, payload }. Flag读数可以报告暴露;通过 { send_event: false } 到一个
当您不想要曝光事件时,读取标志/特性。使用
reloadFeatureFlags() 请求新的值。特性标志不是
服务器端授权边界。
一旦一个求值被加载,每个事件都会携带它: $feature/<key> 与
每个被求值的标志的值和 $active_feature_flags 带着谁的钥匙
价值就是真理。它们是从加载的求值中派生出来的,从不存储为
超级属性 reset() 还有身份变更清除他们,直到
下一次评估落地;超级属性的改变(register, register_once,
unregister)保存加载的求值,直到它自己的过期或
下一次求值无需新的请求,因此一次读取或一次事件在同一回合进行
仍然看到它;事件本身同名的属性获胜,而戳记获胜
符合捕获属性预算。 $feature_flag_called 也
命名它所报告的评价: $feature_flag_request_id,
$feature_flag_evaluated_at (Unix纪元以来的毫秒数)和
$used_bootstrap_value,当值来自缓存的求值时,为true
而不是本页收到的回复。每个值报告一次
跨页面加载(分类帐为)的匿名访问者的标志键和值
保存在 localStorage 每个站点密钥,1.409.5包保留
$flag_call_reported): identify() 把它保存起来 reset() 开始新的生活。
每次更新配置时(最多5分钟)都会重新评估标志
分开)。
其他常用操作
elu.register({ app_area: 'dashboard' }) // Properties on later events
elu.register_once({ first_campaign: 'docs' })
elu.unregister('app_area')
elu.setPersonProperties({ plan: 'business' })
elu.captureException(new Error('Upload failed'), { operation: 'upload' })
capture() 不返回送货收据或承诺。确认与a的集成
ELU非敏感试验事件;只需下载脚本或返回方法即可
不能证明是摄入。
许可证
ELU的捐款可在 MIT许可证,包括 商业用途、修改和再分发。
第三方部分保留其原始的Apache-2.0、MIT或ISC术语
归因 THIRD_PARTY_NOTICES.txt. ELU的
麻省理工术语不能取代上游术语。包括
LICENSE, NOTICE-ELU, THIRD_PARTY_NOTICES.txt 在重新分配
SDK。发布的npm版本保留了包含在其存档中的术语。