@flisk/ 分析跟踪
通过分析跟踪代码和从Side、Amplition、Mixpanel等工具生成数据计划,自动记录您的分析设置
为什么使用 @flisk/分析跟踪?
📊 理解你的跟踪 - 毫无顾忌地分析你的密码库 track 电话可以让你看到所有的分析事件、属性和触发点。 别再猜测什么被跟踪了!
🔍 自动文档事件 – 生成一个完整的YAML schema,它能捕捉所有的事件和属性,包括在您代码库中执行的地方.
🕵️♂️ 音轨随时间变化 – 容易发现出乎意料的变化,或确保您的分析设置在更新过程中保持一致.
📚 填充数据目录 – 自动生成结构化文档, 帮助输入您的数据目录, 让每个人都更容易理解您的事件 .
快速启动
不安装就跑! 只要使用:
npx @flisk/analyze-tracking /path/to/project [options]
密钥选项
-g, --generateDescription: 生成字段描述( 默认 :false(中文(简体) )-p, --provider <provider>: 指定提供者(选项:openai, (中文(简体) ),gemini(中文(简体) )-m, --model <model>: 指定一个模型(前:gpt-4.1-nano, (中文(简体) ),gpt-4o-mini, (中文(简体) ),gemini-2.0-flash-lite-001(中文(简体) )-o, --output <output_file>: 输出文件名称( 默认 ):tracking-schema.yaml(中文(简体) )-c, --customFunction <function_signature>: 指定自定义跟踪功能的签名(参见 这里的指令(中文(简体) )--format <format>: 输出格式, 或yaml(违约)或json。如果提供了无效的值,则CLI会以出错退出.--stdout:将输出打印到终端而不是写入文件(与YAML和JSON同时工作)
🔑 重要内容: 使用时 generateDescription,您必须设置您作为环境变量使用的 LLM 提供者的适当证书。 OpenAI 用途 OPENAI_API_KEY 和 Google Vertex AI 应用 GOOGLE_APPLICATION_CREDENTIALS。 。 。 .
自定义函数
如果您拥有自己的内部跟踪器或可调用其他跟踪库的包装器功能,您可以使用 -c 或者说 --customFunction 选项.
标准自定义函数格式
您的函数签名应当采用以下格式:
yourCustomTrackFunctionName(EVENT_NAME, PROPERTIES, customFieldOne, customFieldTwo)
EVENT_NAME是您正在跟踪的事件的名称 。 应该是一串或指向一串. 这是必要的.PROPERTIES是该事件属性的对象。 应当为对象/字典. 这是可选的.- 任何额外的参数都是您正在跟踪的其他字段 。 他们可以是任何类型的。 您为这些参数提供的名称将作为输出中的属性名称.
例如,如果您的函数在开头有一个用户ID参数,然后是事件名称和属性,那么您会通过以下参数:
yourCustomTrackFunctionName(userId, EVENT_NAME, PROPERTIES)
如果您的函数遵循标准格式 yourCustomTrackFunctionName(EVENT_NAME, PROPERTIES),你可以简单通过 yourCustomTrackFunctionName 改为 --customFunction 作为简写.
方法- Name- as- Event 格式
对于方法名称本身是事件名称的跟踪模式(例如, yourClass.yourEventName({...})),使用特别 EVENT_NAME 方法位置的占位符 :
yourClass.EVENT_NAME(PROPERTIES)
这个模式告诉分析者:
yourClass是匹配的对象名称- 点后的方法名( 例如 ),
viewItemList, (中文(简体) ),addToCart是事件名称 PROPERTIES是属性对象( 如果未指定第一个参数默认)
示例
// Code in your project:
yourClass.viewItemList({ items: [...] });
yourClass.addToCart({ item: {...}, value: 100 });
yourClass.purchase({ userId: '123', value: 100 });
// Command:
npx @flisk/analyze-tracking /path/to/project --customFunction "yourClass.EVENT_NAME(PROPERTIES)"
这将检测:
- 事件 :
viewItemList带有第一个参数属性 - 事件 :
addToCart带有第一个参数属性 - 事件 :
purchase带有第一个参数属性
说明: 此模式目前仅为JavaScript和TypeScript代码所支持.
多自定义函数
您也可以在多个自定义函数签名中通过 --customFunction 选项多次或以空格分隔的函数签名列表通过.
npx @flisk/analyze-tracking /path/to/project --customFunction "yourFunc1" --customFunction "yourFunc2(userId, EVENT_NAME, PROPERTIES)"
npx @flisk/analyze-tracking /path/to/project -c "yourFunc1" "yourFunc2(userId, EVENT_NAME, PROPERTIES)"
npx @flisk/analyze-tracking /path/to/project -c "yourClass.EVENT_NAME(PROPERTIES)" "customTrack(EVENT_NAME, PROPERTIES)"
什么是创造?
一个清晰的YAML计划,它显示你的事件被跟踪的地点,其属性,以及更多. 举个例子:
version: 1
source:
repository: <repository_url>
commit: <commit_sha>
timestamp: <commit_timestamp>
events:
<event_name>:
description: <ai_generated_description>
implementations:
- description: <ai_generated_description>
path: <path_to_file>
line: <line_number>
function: <function_name>
destination: <platform_name>
properties:
<property_name>:
description: <ai_generated_description>
type: <property_type>
用这个来了解你的事件在代码中的位置 以及他们是如何被跟踪的.
您选择的 LLM 用于生成事件、 属性和执行的描述 .
见 计划.json 用于输出的JSON Schema.
支持跟踪库和语言
| 图书馆 | Java 脚本/ Type 脚本 | 蟒 | 鲁比 | 走开 | 挥发 |
|---|---|---|---|---|---|
| 谷歌分析 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 谷歌标签管理器 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 部分 | ✅ | ✅ | ✅ | ✅ | ✅ |
| 混音板 | ✅ | ✅ | ✅ | ✅ | ✅ |
| 广度 | ✅ | ✅ | ❌ | ✅ | ✅ |
| 鲁德斯塔克 | ✅ | ✅ | ✳️ | ✳️ | ✅ |
| mp粒子 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 邮箱 | ✅ | ✅ | ✅ | ✅ | ✅ |
| 任天堂 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 高点 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 雪地风 | ✅ | ✅ | ✅ | ✅ | ❌ |
| 数据犬 RUM | ✅ | ❌ | ❌ | ❌ | ❌ |
| 自定义函数 | ✅ | ✅ | ✅ | ✅ | ✅ |
QQ Ruderstack的SDK经常使用和Sependy相同的格式,因此Ruderstack事件可能被检测为Sependy事件.
支持库的 SDKs
谷歌分析
Java 脚本/ Type 脚本
gtag('event', '<event_name>', {
'<property_name>': '<property_value>'
});
挥发
Analytics.logEvent("<event_name>", parameters: [
"<property_name>": "<property_value>"
])
谷歌标签管理器
Java 脚本/ Type 脚本
dataLayer.push({
event: '<event_name>',
'<property_name>': '<property_value>'
});
// Or via window
window.dataLayer.push({
event: '<event_name>',
'<property_name>': '<property_value>'
});
挥发
dataLayer.push(["event": "<event_name>", "<property_name>": "<property_value>"])
部分
Java 脚本/ Type 脚本
analytics.track('<event_name>', {
'<property_name>': '<property_value>'
});
蟒
analytics.track('<event_name>', {
'<property_name>': '<property_value>'
})
鲁比
Analytics.track(
event: '<event_name>',
properties: {
'<property_name>': '<property_value>'
}
)
走开
client.Enqueue(analytics.Track{
UserId: "user-id",
Event: "<event_name>",
Properties: analytics.NewProperties().
Set("<property_name>", "<property_value>"),
})
挥发
analytics.track(name: "<event_name>", properties: TrackProperties("<property_name>": "<property_value>"))
混音板
Java 脚本/ Type 脚本
mixpanel.track('<event_name>', {
'<property_name>': '<property_value>'
});
蟒
mixpanel.track('<event_name>', {
'<property_name>': '<property_value>'
})
鲁比
tracker.track('<distinct_id>', '<event_name>', {
'<property_name>': '<property_value>'
})
走开
ctx := context.Background()
mp := mixpanel.NewApiClient("YOUR_PROJECT_TOKEN")
mp.Track(ctx, []*mixpanel.Event{
mp.NewEvent("<event_name>", "", map[string]any{}{
"<property_name>": "<property_value>",
}),
})
挥发
Mixpanel.mainInstance().track(event: "<event_name>", properties: [
"<property_name>": "<property_value>"
])
广度
Java 脚本/ Type 脚本
amplitude.track('<event_name>', {
<event_parameters>
});
蟒
client.track(
BaseEvent(
event_type="<event_name>",
user_id="<user_id>",
event_properties={
"<property_name>": "<property_value>",
},
)
)
走开
client.Track(amplitude.Event{
UserID: "<user_id>",
EventType: "<event_name>",
EventProperties: map[string]any{}{
"<property_name>": "<property_value>",
},
})
挥发
amplitude.track(
eventType: "<event_name>",
eventProperties: ["<property_name>": "<property_value>"]
)
鲁德斯塔克
Java 脚本/ Type 脚本
rudderanalytics.track('<event_name>', {
<event_parameters>
});
蟒
rudder_analytics.track('<event_name>', {
'<property_name>': '<property_value>'
})
鲁比
analytics.track(
user_id: '<user_id>',
event: '<event_name>',
properties: {
'<property_name>': '<property_value>'
}
)
走开
client.Enqueue(analytics.Track{
UserId: "<user_id>",
Event: "<event_name>",
Properties: analytics.NewProperties().
Set("<property_name>", "<property_value>"),
})
挥发
RSClient.sharedInstance()?.track("<event_name>", properties: [
"<property_name>": "<property_value>"
])
mp粒子
Java 脚本/ Type 脚本
mParticle.logEvent('<event_name>', mParticle.EventType.<event_type>, {
'<property_name>': '<property_value>'
});
挥发
let event = MPEvent(name: "<event_name>", type: .other)
event.customAttributes = [
"<property_name>": "<property_value>"
]
MParticle.sharedInstance().logEvent(event)
邮箱
Java 脚本/ Type 脚本
posthog.capture('<event_name>', {
'<property_name>': '<property_value>'
});
蟒
posthog.capture('distinct_id', '<event_name>', {
'<property_name>': '<property_value>'
})
# Or
posthog.capture(
'distinct_id',
event='<event_name>',
properties={
'<property_name>': '<property_value>'
}
)
鲁比
posthog.capture({
distinct_id: '<distinct_id>',
event: '<event_name>',
properties: {
'<property_name>': '<property_value>'
}
})
走开
client.Enqueue(posthog.Capture{
DistinctId: "<distinct_id>",
Event: "<event_name>",
Properties: posthog.NewProperties().
Set("<property_name>", "<property_value>"),
})
挥发
PostHogSDK.shared.capture("<event_name>", properties: [
"<property_name>": "<property_value>"
])
任天堂
Java 脚本/ Type 脚本
pendo.track('<event_name>', {
<event_parameters>
});
蟒
pendo.track('<event_name>', {
'<property_name>': '<property_value>'
})
挥发
PendoManager.shared().track("<event_name>", properties: [
"<property_name>": "<property_value>"
])
高点
Java 脚本/ Type 脚本
heap.track('<event_name>', {
<event_parameters>
});
蟒
heap.track('<event_name>', {
'<property_name>': '<property_value>'
})
挥发
Heap.shared.track("<event_name>", properties: [
"<property_name>": "<property_value>"
])
数据犬 RUM
Java 脚本/ Type 脚本
datadogRum.addAction('<event_name>', {
'<property_name>': '<property_value>'
});
// Or via window
window.DD_RUM.addAction('<event_name>', {
'<property_name>': '<property_value>'
});
// Or via global DD_RUM
DD_RUM.addAction('<event_name>', {
'<property_name>': '<property_value>'
});
雪花( 有缝隙的事件)
Java 脚本/ Type 脚本
tracker.track(buildStructEvent({
action: '<event_name>',
category: '<category>',
label: '<label>',
property: '<property>',
value: <value>
}));
蟒
tracker.track(StructuredEvent(
action="<event_name>",
category="<category>",
label="<label>",
property_="<property>",
value=<value>,
))
鲁比
tracker.track_struct_event(
action: '<event_name>',
category: '<category>',
label: '<label>',
property: '<property>',
value: <value>
)
走开
tracker.TrackStructEvent(sp.StructuredEvent{
Action: sp.NewString("<event_name>"),
Category: sp.NewString("<category>"),
Label: sp.NewString("<label>"),
Property: sp.NewString("<property>"),
Value: sp.NewFloat64(<value>),
})
贡献
我们正在积极改进这项一揽子计划。 找到窃听器了吗? 有特别请求吗? 打开一个问题或提交拉力请求!