【问题标题】:Track user time in completing a particular action in a website跟踪用户在网站中完成特定操作的时间
【发布时间】:2018-06-05 11:12:46
【问题描述】:

我想跟踪用户在网站中完成特定操作所花费的时间(包括服务器响应时间和渲染时间(DOM 相关更改))。

我已经在 Angular 框架中尝试过了。为此,我正在考虑记录用户开始操作的时间,并且我想记下操作完成的时间。作为开发人员,我会知道用户何时开始活动以及用户何时完成搜索、过滤、编辑、添加、删除等操作。因此,我们可以对它们进行区分。但要注意每一个动作,我们必须在应用程序的每个部分编写代码。我们是否可以创建一个插件,以便我们可以在任何地方使用它,而不是在任何地方编写相同的代码来跟踪用户的时间。有什么方法可以创建它?或者有什么工具可以实现这个功能?

【问题讨论】:

  • 您正在寻找的是网站的用户活动监控
  • @Cocoduf 我正在寻找计算特定操作的时间。例如,如果用户正在加载任何页面,加载需要多少时间,包括服务器响应时间和页面在 dom 中的呈现。我想计算从开始加载到页面加载完成的时间。我想为每一个可能的操作做它,比如搜索、添加、删除、更新等。
  • 你没有提到你使用的是什么服务器端技术。如果是 Java/Spring,就会想到 AOP。 vmware.com/uk/products/pivotal-tcserver.html
  • @JGFMK 我们正在使用 Java/Spring,但是我们使用什么技术很重要,因为我们在前端这样做。我们注意到前端的开始时间和前端的结束时间。为什么后端技术很重要?
  • @HimanshuGarg 引用你的话:“包括服务器响应时间”! - 没有服务器端技术的标签..

标签: javascript angular time-tracking


【解决方案1】:

这样的东西会有帮助吗?

@Injectable({provideIn: 'root'})
export class TrackingService {

  private cache: {[id: number]: {description: string, time: number}} = {};
  private id: number = 0;

  public startTracking(actionDescription: string): number{
    const id = ++this.id;
    this.cache[id] = { description: actionDescription, time: new Date().getTime() };
    return id;
  }

  public stopTracking(actionId: number){
    const data = this.cache[actionId];
    if(data){
      const elapsed = new Date().getTime() - data.time;
      // ...
      // Do something with your 'elapsed' and 'data.description'
      // ...
      delete this.cache[id];
      return {...data, elapsed: elapsed};
    }
    throw `No action with id [${actionId}] running! `;
  }
}

然后在您需要跟踪操作的任何地方投放广告:

private actionId: number;

constructor(private trackingService: TrackingService){}

startAction(){
  this.actionId = this.trackingService.startTracking('Description');
}

stopAction(){
  const trackingResult = this.trackingService.stopTracking(this.actionId);
}

您可以在某些地方自动跟踪,例如路由:

// app.module.ts

private routeChangeSubscription: Subscription;
private configLoadActionId: number;
private navigationActionId: number;

constructor(private router: Router, private trackingService: TrackingService){
  this.routeChangeSubscription = router.events.subscribe((event: Event) => {
    if (event instanceof RouteConfigLoadStart) {
      this.configLoadActionId = this.trackingService.startTracking('configLoad');
    }
    else if (event instanceof RouteConfigLoadEnd) {
      const result = this.trackingService.stopTracking(this.configLoadActionId);
      // ... process the result if you wish
    }
    else if (event instanceof NavigationStart) {
      this.navigationActionId = this.trackingService.startTracking('navigation');
    }
    else if (event instanceof NavigationEnd) {
      const result = this.trackingService.stopTracking(this.navigationActionId);
      // ... process the result if you wish
    }
  });
}

或者对于 HTTP 请求:

// http-tracking.interceptor

export class HttpTrackingInterceptor implements HttpInterceptor {

  constructor(private trackingService: TrackingService) {}

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const actionId = this.trackingService.startTracking('HTTP request');
    return next.handle(req.clone()).pipe(
      tap(r => this.trackingService.stopTracking(actionId))
    );
  }
}

// app.module.ts

@NgModule({
  // ... other module stuff
  providers: [
    // ... other providers
    { 
      provide: HTTP_INTERCEPTORS, 
      useClass: HttpTrackingInterceptor, 
      multi: true, 
      deps: [TrackingService] 
    }
  ]
})
export class AppModule { ... }

您可以轻松扩展 TrackingService 以返回 Promises 或 Observables 或其他任何内容,以防您更喜欢...

希望这会有所帮助:-)

【讨论】:

  • 感谢您的回答。这也是我的方法,因为我能够记录事件的开始和停止时间。正如您建议的路由和 Http 请求的自动化方法,我还想自动化您在跟踪服务中执行的整个过程,而不是每次为每个操作调用服务并记录时间。
  • 好吧,我不知道您要跟踪哪些确切的操作 :-)。恐怕您必须在某处为您要跟踪的所有内容插入一段跟踪代码。在我看来,最好的方法是为每个特定事件找到一个共同点,然后用你的跟踪代码围绕它创建一个抽象......
【解决方案2】:

我将建议您使用自定义 Google Analytics(分析)事件。特别是用户计时。这允许您在网页上记录特定时间,您可以使用自己的标签和类别进行记录。

引用文档:

用户计时允许开发人员使用 analytics.js 库。这对于开发人员特别有用 测量延迟或花费的时间,发出 AJAX 请求和加载 网络资源。

我在下面有一些示例代码,这只是与点击挂钩,并将从属性data-name 获取描述符 - 如果不可用,将仅记录为“匿名点击” - 您可以自定义它以不跟踪未标记的项目。您还可以挂钩 ajax 调用和其他值得注意的事件,而无需了解您的具体要求,很难给出更多示例。

用于锁定点击事件的示例标记助手。

<button data-name="Foo"/>

下面的代码会进行日志记录,注意它使用window.performance.now() 进行记录 - 这将返回页面加载后的时间(以毫秒为单位)。这将允许您生成用户交互的时间线,而不是花在单个任务上的原始时间,而 Google Analytics(分析)报告可以为您计算。

(function($, Analytics) {

  init_hooks();


  function init_hooks() {
    $('body').on('click', track);
  }

  function track(e) {
    // Get a name to record this against
    var name = e.target.data(name) || "Anonymous Click";

    // Time since page loaded
    var time = window.performance.now()

    Analytics('send', {
      hitType: 'timing',
      timingCategory: 'Front End Intereactions',
      timingVar: name,
      timingValue: time
    });

  }
})(jQuery, ga)

了解更多look at the docs

【讨论】:

    【解决方案3】:

    您可以使用 OpenTracing for Js 检测您的代码。

    您需要在事务开始和结束时添加请求。

    也是一个 OpenTracing 服务器,用于接收来自浏览器的请求。

    【讨论】:

      【解决方案4】:

      您必须在客户端代码中编写一个简单的事件跟踪器。由于我不知道您要跟踪哪些事件,因此我将提供一般情况的解决方案。

      此外,您必须手动触发开始和停止跟踪。

      EventTracker = {
        trackedEvents: {},
      
        start: function(key) {
          var startTime = new Date();
          this.trackedEvents[key] = {
            start: startTime
          }
        },
      
        stop: function(key) {
          var endTime = new Date();
          this.trackedEvents[key]['duration'] = (endTime - this.trackedEvents[key]['start']) / 1000 + 's';
          this.trackedEvents[key]['end'] = endTime;
        },
      }
      
      // Use EventTracker everywhere to track performance
      // Example:
      EventTracker.start('search_track'); // User searches, start tracking.
      setTimeout(function() {
        EventTracker.stop('search_track'); // Records fetched after 5 seconds. Stop tracking.
        console.log(EventTracker.trackedEvents);
      }, 5000);

      您可以根据需要跟踪所有事件。对于服务器响应,请在发出请求时使用:EventTracker.start('search_ajax_track'),并在收到响应时停止跟踪。 您可以根据自己的需要修改以上代码来测量其他参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        • 1970-01-01
        • 2022-01-27
        • 1970-01-01
        相关资源
        最近更新 更多