2017-06-22 48 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 
}