Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[iceworks] data statistics #2318

Merged
merged 11 commits into from Jul 5, 2019
Merged

Conversation

@chenbin92
Copy link
Collaborator

chenbin92 commented Jul 2, 2019

数据统计

#2026

方法封装

function goldlog(action, extraData = {}) {
  const realData = {
    action: iceworks-v3-<action>
    data: {
       ...extraData,
       browser: {
          name: 'node',
          version: '9.9.0',
          versionNumber: 9.9,
          mobile: false,
         os: 'win32'
       }
     }
   };
});

action 对应的 data 需要指定 type 进一步细分

{
   type: project || engineering  || material || home,
}

调用

goldlog('download-block', {
    type: 'material',
    blockName: '',
    url: '',
})

or

goldlog('dev-task', {
    type: 'engineering',
    projectName: '',
})
@chenbin92 chenbin92 self-assigned this Jul 2, 2019
chenbin92 added 2 commits Jul 2, 2019
@chenbin92 chenbin92 changed the title [WIP][iceworks] data statistics [iceworks] data statistics Jul 3, 2019
@chenbin92 chenbin92 requested review from imsobear and alvinhui Jul 3, 2019
chenbin92 added 2 commits Jul 3, 2019
@@ -40,6 +41,10 @@ const GitPanel = ({ intl, title, description }) => {
async function onInit(setRemoteUrl) {
await gitStore.init(setRemoteUrl);
await gitStore.refresh();
goldlog('git-init', {
type: 'project',
url: setRemoteUrl,

This comment has been minimized.

Copy link
@imsobear

imsobear Jul 4, 2019

Collaborator

setRemoteUrl 看逻辑是个变量,单个命名是个方法

@alvinhui

This comment has been minimized.

Copy link
Collaborator

alvinhui commented Jul 4, 2019

我的理解,数据打点的目标是为了统计和分析 Iceworks 的功能使用情况,这里面的核心问题是:

  • 统计哪些数据;
  • 怎么统计;
  • 未来怎么分析。

第一个问题这里有整理。

从目前打点来看,数据结构上只划分到了顶层的:工程、项目、物料、设置。其他地方是比较零散的。

我在想我们能不能把这个数据结构理得更清晰一些,比如:

  • domain: 在哪个域下

    project|setting|engineering...

  • module: 在哪个模块下

    git|menu|page...

  • action: 执行什么动作

    create|delete|update...

这样的话我们便可以比较完整地统计到所有的功能使用情况且利于未来进行分析。

  • 黄金令箭上,建议是新建一个令箭,把新老数据区分开来;

  • 统计参数上,可以是:

    {
      "domain": "",
      "module": "",
      "action": "",
    
      // 其他附加的信息
      "data": {
    
      }
    }
  • 统计执行上,能不能在 socket 层去做这个事情?毕竟我们现在每个动作都会触发请求。

@chenbin92

This comment has been minimized.

Copy link
Collaborator Author

chenbin92 commented Jul 4, 2019

统计参数上,可以是:

{
  "domain": "",
  "module": "",
  "action": "",

  // 其他附加的信息
  "data": {

  }
}
  1. domain 就是现在的 type
  2. module 这个可以加上
  3. action 已经有了
  4. 统计参数应该都是在 data 上的,上面的数据结果需要验证是否可行?

统计执行上,能不能在 socket 层去做这个事情?毕竟我们现在每个动作都会触发请求。

之前讨论是在 socket 层去处理,但是 socket 层处理可能收集的数据都是请求的,是否都有必要收集上来?

@alvinhui

This comment has been minimized.

Copy link
Collaborator

alvinhui commented Jul 4, 2019

统计参数上,可以是:

{
  "domain": "",
  "module": "",
  "action": "",

  // 其他附加的信息
  "data": {

  }
}
  1. domain 就是现在的 type
  2. module 这个可以加上
  3. action 已经有了
  4. 统计参数应该都是在 data 上的,上面的数据结果需要验证是否可行?

统计执行上,能不能在 socket 层去做这个事情?毕竟我们现在每个动作都会触发请求。

之前讨论是在 socket 层去处理,但是 socket 层处理可能收集的数据都是请求的,是否都有必要收集上来?

第四点,我们可以新建一个令箭,自己自定义参数?

@alvinhui

This comment has been minimized.

Copy link
Collaborator

alvinhui commented Jul 4, 2019

socket 那个想法我不确定,就是一个提议哈。
我是觉得:如果数据存储的容量不是一个问题,那么收集多一些也可以。

@chenbin92

This comment has been minimized.

Copy link
Collaborator Author

chenbin92 commented Jul 4, 2019

统计参数上,可以是:

{
  "domain": "",
  "module": "",
  "action": "",

  // 其他附加的信息
  "data": {

  }
}
  1. domain 就是现在的 type
  2. module 这个可以加上
  3. action 已经有了
  4. 统计参数应该都是在 data 上的,上面的数据结果需要验证是否可行?

统计执行上,能不能在 socket 层去做这个事情?毕竟我们现在每个动作都会触发请求。

之前讨论是在 socket 层去处理,但是 socket 层处理可能收集的数据都是请求的,是否都有必要收集上来?

第四点,我们可以新建一个令箭,自己自定义参数?

这样就可以了

{
  "action": "",

  // 其他附加的信息
  "data": {
         "type": "Project",
         "module": "Git",
  }
}
@chenbin92

This comment has been minimized.

Copy link
Collaborator Author

chenbin92 commented Jul 4, 2019

socket 那个想法我不确定,就是一个提议哈。
我是觉得:如果数据存储的容量不是一个问题,那么收集多一些也可以。

我觉得不是多收集的概念,应该收集有意义的数据。问题在于怎么定义什么是有意义的数据。这是我目前选择没在 socket 层数据,而是选择在需要的数据打点的原因

@alvinhui

This comment has been minimized.

Copy link
Collaborator

alvinhui commented Jul 4, 2019

socket 那个想法我不确定,就是一个提议哈。
我是觉得:如果数据存储的容量不是一个问题,那么收集多一些也可以。

我觉得不是多收集的概念,应该收集有意义的数据。问题在于怎么定义什么是有意义的数据。这是我目前选择没在 socket 层数据,而是选择在需要的数据打点的原因

  • 为了不与旧数据混淆,我们可以新建一个黄金令箭。参数可以重新拟定,不一定是要遵循老的规则的;

  • 在数据收集上,我的看法是:如果数据存储的容量不是瓶颈,没有安全相关的顾虑,则按照设定的数据结构,尽可能地收集更多的数据。观点基于下面的思考:

    • 脏数据是可以在分析阶段通过一定的手段进行有效过滤的,甚至在数据存储层进行清查的;
    • 相反,如果数据量少了,一是想再要回这些数据是不可能了,二是不足量的数据不利于进行后期的数据分析。

所以我的方案是:

  1. 新建新的黄金令箭串,名称是:/iceteam.iceworks.log

  2. 参数:

    {
      "domain": "",
      "module": "",
      "action": "",
      "data": {}
    }

    data 中视乎可以不需要 browser?因为 glodlog 默认会上传 UA。

@alvinhui alvinhui mentioned this pull request Jul 4, 2019
41 of 47 tasks complete
@chenbin92

This comment has been minimized.

Copy link
Collaborator Author

chenbin92 commented Jul 5, 2019

问题

目前在前端实现数据统计会有跨域问题

原因 iceworks cli 提供的本地 localhost 服务,没有域名无法配置对应的名单,发送请求到 https://xxx.iceteam.iceworks.log3 会存在跨域

image

解决

  • 将 goldlog 移到 Node 层做一层中转,在前端调 Node 接口经由 Node 服务在发送
@alvinhui

This comment has been minimized.

Copy link
Collaborator

alvinhui commented Jul 5, 2019

问题

目前在前端实现数据统计会有跨域问题

原因目前 iceworks cli 提供的本地 localhost 服务,没有域名无法配置对应的名单,发送请求到 https://xxx.iceteam.iceworks.log3 会存在跨域

image

解决

  • 将 goldlog 移到 Node 层,做一层中转,在前端掉 Node 接口,经由 Node 服务在发送

有没有什么解决办法啊?
我的理解,无论是前端还是后端,数据打点都是一个 HTTP 请求。跨域的限制是 gm.mmstat.com 域名检查了 Referer?
以前我们在网页端,是通过调 aplus 提供的脚本库来发黄金令箭的。aplus.js 是通过发送一个 .gif 请求来打点的。
我们能不能调这个 aplus 库?不自己引入 axios。

@chenbin92

This comment has been minimized.

Copy link
Collaborator Author

chenbin92 commented Jul 5, 2019

问题

目前在前端实现数据统计会有跨域问题
原因目前 iceworks cli 提供的本地 localhost 服务,没有域名无法配置对应的名单,发送请求到 https://xxx.iceteam.iceworks.log3 会存在跨域
image

解决

  • 将 goldlog 移到 Node 层,做一层中转,在前端掉 Node 接口,经由 Node 服务在发送

有没有什么解决办法啊?
我的理解,无论是前端还是后端,数据打点都是一个 HTTP 请求。跨域的限制是 gm.mmstat.com 域名检查了 Referer?
以前我们在网页端,是通过调 aplus 提供的脚本库来发黄金令箭的。aplus.js 是通过发送一个 .gif 请求来打点的。
我们能不能调这个 aplus 库?不自己引入 axios。

目前 iceworks cli 提供的本地 localhost 服务,没有域名无法配置对应的名单,也就是没办法生成对应的 aplus 的脚本

@chenbin92

This comment has been minimized.

Copy link
Collaborator Author

chenbin92 commented Jul 5, 2019

结论

打点数据主要基于 iceworks-server/src/app/router.ts (查询接口服务),数据结构如下:

{
  "namespace": "",  // 对应 eventName 的 namespace 
  "module": "", // 对应 eventName 的 module
  "action": "", // 对应 eventName 的 action
  "data": {}  // 对应 eventName 的 handle 参数
}
module,
action,
data: {
...data,

This comment has been minimized.

Copy link
@alvinhui

alvinhui Jul 5, 2019

Collaborator
  • 这个 data 不一定有,可以看到下面有个 !args[1] 的判断;
  • data 似乎没有必要传递?因为请求的参数有可能非常多,且这个数据对于我们来说没有意义?
  • 如果要传递,这里可以直接赋值:{a: 1, data,}

This comment has been minimized.

Copy link
@chenbin92

chenbin92 Jul 5, 2019

Author Collaborator

这个 data 不一定有,可以看到下面有个 !args[1] 的判断;

+1 这个写代码的时候还记得说要判断下的,给忘记了

data 似乎没有必要传递?因为请求的参数有可能非常多,且这个数据对于我们来说没有意义?

这里是考虑到比如区块,模板下载之类的数据需要进一步细分,比如说那个模板下载最多之类的

如果要传递,这里可以直接赋值:{a: 1, data,}

{a: 1} 是干嘛的

This comment has been minimized.

Copy link
@alvinhui

alvinhui Jul 5, 2019

Collaborator

{a: 1} 是个示例,我的意思是这里可以写成:

goldlog({
        namespace,
        module,
        action,
        data,
});

This comment has been minimized.

Copy link
@chenbin92

chenbin92 Jul 5, 2019

Author Collaborator

done

return axios({
method: 'post',
url: `${appConfig.apiUrl}goldlog/record`,
data: { ...data },

This comment has been minimized.

Copy link
@alvinhui

alvinhui Jul 5, 2019

Collaborator

data 可以直接赋值,不需要析构?

This comment has been minimized.

Copy link
@chenbin92

chenbin92 Jul 5, 2019

Author Collaborator

done

@alvinhui

This comment has been minimized.

Copy link
Collaborator

alvinhui commented Jul 5, 2019

应除掉 PR 中的 console.log?


function goldlog(data = {}) {
data.data.visit_time = dateTime();
data.data.browser_info = browserInfo;

This comment has been minimized.

Copy link
@alvinhui

alvinhui Jul 5, 2019

Collaborator

visit_time 是个参数,应该跟其他参数同级:

data.visit_time = dateTime();

同时默认参数里有个 UA,是不是可以利用这个参数,然后就不需要 browser_info 了呢?

data.UA = '....';

data.data 可能会为 undefined(无法要求手动打点的位置必须有 data ),这里需要判断一下。

This comment has been minimized.

Copy link
@chenbin92

chenbin92 Jul 5, 2019

Author Collaborator

done

@chenbin92

This comment has been minimized.

Copy link
Collaborator Author

chenbin92 commented Jul 5, 2019

应除掉 PR 中的 console.log?

@alvinhui done

@alvinhui alvinhui merged commit 6e15e0d into iceworks/release-3.x Jul 5, 2019
4 checks passed
4 checks passed
WIP Ready for review
Details
continuous-integration/travis-ci/pr The Travis CI build passed
Details
continuous-integration/travis-ci/push The Travis CI build passed
Details
license/cla Contributor License Agreement is signed.
Details
@delete-merged-branch delete-merged-branch bot deleted the iceworks/data-statistics branch Jul 5, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
3 participants
You can’t perform that action at this time.