2017-06-22 28 views
0

我有一个长时间运行的应用程序,我想实时监控。 HAR文件允许我在事后做到这一点,但由于它们是“存档”,因此它们不允许我实时执行此操作。流HAR事件

他们无论如何都要流式处理HAR文件的“events”数组,以便在生成它们时处理它们?

这可以是Firefox或Chrome。

回答

0

所以从https://github.com/mafredri/cdp/tree/master/example/screencast一些帮助,我想通了如何使用Chrome的调试API

这段代码没有做的是要求身体绑到响应(如果是不可用)为此在去,但正如我所示RequestID将是一致的,所以如果一个序列化事件处理(比如通过锁定),可以保存主体并在发现响应事件时使用它。

package main 

import (
    "context" 
    "log" 

    "github.com/mafredri/cdp" 
    "github.com/mafredri/cdp/cdpcmd" 
    "github.com/mafredri/cdp/devtool" 
    "github.com/mafredri/cdp/rpcc" 
) 

func main() { 
    if err := run(); err != nil { 
     panic(err) 
    } 
} 

func run() error { 
    ctx, cancel := context.WithCancel(context.TODO()) 
    defer cancel() 

    devt := devtool.New("http://localhost:9222") 

    page, err := devt.Get(ctx, devtool.Page) 
    if err != nil { 
     return err 
    } 

    conn, err := rpcc.DialContext(ctx, page.WebSocketDebuggerURL) 
    if err != nil { 
     return err 
    } 
    defer conn.Close() 

    c := cdp.NewClient(conn) 

    err = c.Page.Enable(ctx) 
    if err != nil { 
     return err 
    } 

    loadEventFired, err := c.Page.LoadEventFired(ctx) 
    if err != nil { 
     return err 
    } 

    _, err = c.Page.Navigate(ctx, cdpcmd.NewPageNavigateArgs("https://github.com/")) 
    if err != nil { 
     return err 
    } 

    _, err = loadEventFired.Recv() 
    if err != nil { 
     return err 
    } 
    loadEventFired.Close() 

    a := &cdpcmd.NetworkEnableArgs{} 
    a.SetMaxResourceBufferSize(32000) 
    a.SetMaxTotalBufferSize(96000) 

    err = c.Network.Enable(ctx, a) 

    responseEvents, err := c.Network.ResponseReceived(ctx) 
    requestEvents, err := c.Network.RequestWillBeSent(ctx) 

    go func() { 
     defer responseEvents.Close() 

     for { 
      ev, err := responseEvents.Recv() 
      if err != nil { 
       log.Printf("Failed to receive network event: %v", err) 
       return 
      } 
      log.Printf("requestid = %v, url = %v", ev.RequestID, ev.Response.URL) 
     } 
    }() 

    go func() { 
     defer requestEvents.Close() 

     for { 
      ev, err := requestEvents.Recv() 
      if err != nil { 
       log.Printf("Failed to receive network event: %v", err) 
       return 
      } 
      log.Printf("requestid = %v, url = %v", ev.RequestID, ev.Request.URL) 
     } 
    }() 

    select {} 

    return nil 
}