@@ -193,8 +193,8 @@ type BrowsersCreateInput struct {
193193 StartURL string
194194 Extensions []string
195195 Viewport string
196- TelemetryEnabled bool
197- Output string
196+ Telemetry string
197+ Output string
198198}
199199
200200type BrowsersDeleteInput struct {
@@ -459,8 +459,14 @@ func (b BrowsersCmd) Create(ctx context.Context, in BrowsersCreateInput) error {
459459 }
460460 }
461461
462- if in .TelemetryEnabled {
462+ if in .Telemetry == "all" {
463463 params .Telemetry = kernel.BrowserTelemetryRequestConfigParam {Enabled : kernel .Opt (true )}
464+ } else if in .Telemetry != "" {
465+ p , err := parseTelemetryCategories (in .Telemetry )
466+ if err != nil {
467+ return err
468+ }
469+ params .Telemetry = kernel.BrowserTelemetryRequestConfigParam {Browser : p }
464470 }
465471
466472 browser , err := b .browsers .New (ctx , params )
@@ -726,15 +732,14 @@ func (b BrowsersCmd) TelemetryStop(ctx context.Context, in BrowsersTelemetryStop
726732 return nil
727733}
728734
729- func (b BrowsersCmd ) TelemetrySet (ctx context.Context , in BrowsersTelemetrySetInput ) error {
730- if in .Output != "" && in .Output != "json" {
731- return fmt .Errorf ("unsupported --output value: use 'json'" )
732- }
735+ // parseTelemetryCategories parses a comma-separated "name=on|off" string into
736+ // a BrowserTelemetryCategoriesConfigParam. Unmentioned categories are omitted.
737+ func parseTelemetryCategories (s string ) (kernel.BrowserTelemetryCategoriesConfigParam , error ) {
733738 p := kernel.BrowserTelemetryCategoriesConfigParam {}
734- for _ , part := range strings .Split (in . Categories , "," ) {
739+ for _ , part := range strings .Split (s , "," ) {
735740 kv := strings .SplitN (strings .TrimSpace (part ), "=" , 2 )
736741 if len (kv ) != 2 {
737- return fmt .Errorf ("invalid category assignment %q: expected name=on or name=off" , part )
742+ return p , fmt .Errorf ("invalid category assignment %q: expected name=on or name=off" , part )
738743 }
739744 name , val := strings .TrimSpace (kv [0 ]), strings .TrimSpace (kv [1 ])
740745 var enabled bool
@@ -744,7 +749,7 @@ func (b BrowsersCmd) TelemetrySet(ctx context.Context, in BrowsersTelemetrySetIn
744749 case "off" :
745750 enabled = false
746751 default :
747- return fmt .Errorf ("invalid value %q for category %q: must be 'on' or 'off'" , val , name )
752+ return p , fmt .Errorf ("invalid value %q for category %q: must be 'on' or 'off'" , val , name )
748753 }
749754 switch name {
750755 case "console" :
@@ -756,9 +761,20 @@ func (b BrowsersCmd) TelemetrySet(ctx context.Context, in BrowsersTelemetrySetIn
756761 case "page" :
757762 p .Page = kernel.BrowserTelemetryCategoryConfigParam {Enabled : kernel .Opt (enabled )}
758763 default :
759- return fmt .Errorf ("unknown category %q: must be one of console, interaction, network, page" , name )
764+ return p , fmt .Errorf ("unknown category %q: must be one of console, interaction, network, page" , name )
760765 }
761766 }
767+ return p , nil
768+ }
769+
770+ func (b BrowsersCmd ) TelemetrySet (ctx context.Context , in BrowsersTelemetrySetInput ) error {
771+ if in .Output != "" && in .Output != "json" {
772+ return fmt .Errorf ("unsupported --output value: use 'json'" )
773+ }
774+ p , err := parseTelemetryCategories (in .Categories )
775+ if err != nil {
776+ return err
777+ }
762778 res , err := b .browsers .Update (ctx , in .Identifier , kernel.BrowserUpdateParams {
763779 Telemetry : kernel.BrowserTelemetryRequestConfigParam {Browser : p },
764780 })
@@ -818,10 +834,32 @@ func shouldEmit(eventType string, categories, types []string) bool {
818834 return true
819835}
820836
837+ var knownTelemetryCategories = []string {"console" , "network" , "page" , "interaction" , "monitor" }
838+
839+ var knownTelemetryTypes = []string {
840+ "console_log" , "console_error" ,
841+ "network_request" , "network_response" , "network_loading_failed" , "network_idle" ,
842+ "page_navigation" , "page_dom_content_loaded" , "page_load" , "page_tab_opened" ,
843+ "page_layout_shift" , "page_lcp" , "page_layout_settled" , "page_navigation_settled" ,
844+ "interaction_click" , "interaction_key" , "interaction_scroll_settled" ,
845+ "monitor_screenshot" , "monitor_disconnected" , "monitor_reconnected" ,
846+ "monitor_reconnect_failed" , "monitor_init_failed" ,
847+ }
848+
821849func (b BrowsersCmd ) TelemetryStream (ctx context.Context , in BrowsersTelemetryStreamInput ) error {
822850 if in .Output != "" && in .Output != "json" {
823851 return fmt .Errorf ("unsupported --output value: use 'json'" )
824852 }
853+ for _ , c := range in .Categories {
854+ if ! slices .Contains (knownTelemetryCategories , c ) {
855+ return fmt .Errorf ("unknown category %q: must be one of %s" , c , strings .Join (knownTelemetryCategories , ", " ))
856+ }
857+ }
858+ for _ , t := range in .Types {
859+ if ! slices .Contains (knownTelemetryTypes , t ) {
860+ pterm .Warning .Printf ("unrecognized event type %q — no events will match\n " , t )
861+ }
862+ }
825863 br , err := b .browsers .Get (ctx , in .Identifier , kernel.BrowserGetParams {})
826864 if err != nil {
827865 return util.CleanedUpSdkError {Err : err }
@@ -2479,17 +2517,15 @@ func init() {
24792517 // telemetry
24802518 telemetryRoot := & cobra.Command {Use : "telemetry" , Short : "Browser telemetry operations" }
24812519 telemetryStream := & cobra.Command {Use : "stream <id>" , Short : "Stream live telemetry events" , Args : cobra .ExactArgs (1 ), RunE : runBrowsersTelemetryStream }
2482- telemetryStream .Flags ().StringSlice ("categories" , []string {}, "Filter by category (console,network,page,interaction,monitor)" )
2520+ telemetryStream .Flags ().StringSlice ("categories" , []string {}, "Filter by category (console,network,page,interaction,monitor); monitor is always-on and filter-only — it cannot be toggled via telemetry set " )
24832521 telemetryStream .Flags ().StringSlice ("types" , []string {}, "Filter by event type (e.g. network_response,console_error)" )
24842522 telemetryStream .Flags ().Int64 ("seq" , 0 , "Resume stream from sequence number (Last-Event-ID)" )
24852523 telemetryStream .Flags ().StringP ("output" , "o" , "" , "Output format: json for newline-delimited JSON envelopes" )
24862524 telemetryStart := & cobra.Command {Use : "start <id>" , Short : "Start telemetry capture (enabled: true)" , Args : cobra .ExactArgs (1 ), RunE : runBrowsersTelemetryStart }
24872525 telemetryStart .Flags ().StringP ("output" , "o" , "" , "Output format: json for raw API response" )
24882526 telemetryStop := & cobra.Command {Use : "stop <id>" , Short : "Stop telemetry capture (enabled: false)" , Args : cobra .ExactArgs (1 ), RunE : runBrowsersTelemetryStop }
24892527 telemetryStop .Flags ().StringP ("output" , "o" , "" , "Output format: json for raw API response" )
2490- telemetrySet := & cobra.Command {Use : "set <id>" , Short : "Set per-category telemetry config" , Args : cobra .ExactArgs (1 ), RunE : runBrowsersTelemetrySet }
2491- telemetrySet .Flags ().String ("categories" , "" , "Per-category assignments, e.g. network=on,page=off (console, interaction, network, page)" )
2492- _ = telemetrySet .MarkFlagRequired ("categories" )
2528+ telemetrySet := & cobra.Command {Use : "set <id> <name=on|off>..." , Short : "Set per-category telemetry config" , Args : cobra .MinimumNArgs (2 ), RunE : runBrowsersTelemetrySet }
24932529 telemetrySet .Flags ().StringP ("output" , "o" , "" , "Output format: json for raw API response" )
24942530 telemetryStatus := & cobra.Command {Use : "status <id>" , Short : "Show current telemetry configuration" , Args : cobra .ExactArgs (1 ), RunE : runBrowsersTelemetryStatus }
24952531 telemetryStatus .Flags ().StringP ("output" , "o" , "" , "Output format: json for raw API response" )
@@ -2725,7 +2761,8 @@ func init() {
27252761 browsersCreateCmd .Flags ().Bool ("viewport-interactive" , false , "Interactively select viewport size from list" )
27262762 browsersCreateCmd .Flags ().String ("pool-id" , "" , "Browser pool ID to acquire from (mutually exclusive with --pool-name)" )
27272763 browsersCreateCmd .Flags ().String ("pool-name" , "" , "Browser pool name to acquire from (mutually exclusive with --pool-id)" )
2728- browsersCreateCmd .Flags ().Bool ("telemetry" , false , "Enable telemetry capture on the new session (enabled: true)" )
2764+ browsersCreateCmd .Flags ().String ("telemetry" , "" , "Enable telemetry: --telemetry for all, --telemetry=network=on,page=off for per-category" )
2765+ browsersCreateCmd .Flag ("telemetry" ).NoOptDefVal = "all"
27292766
27302767 // curl
27312768 curlCmd := & cobra.Command {
@@ -2795,7 +2832,7 @@ func runBrowsersCreate(cmd *cobra.Command, args []string) error {
27952832 viewportInteractive , _ := cmd .Flags ().GetBool ("viewport-interactive" )
27962833 poolID , _ := cmd .Flags ().GetString ("pool-id" )
27972834 poolName , _ := cmd .Flags ().GetString ("pool-name" )
2798- telemetry , _ := cmd .Flags ().GetBool ("telemetry" )
2835+ telemetry , _ := cmd .Flags ().GetString ("telemetry" )
27992836 output , _ := cmd .Flags ().GetString ("output" )
28002837
28012838 if poolID != "" && poolName != "" {
@@ -2905,8 +2942,8 @@ func runBrowsersCreate(cmd *cobra.Command, args []string) error {
29052942 StartURL : startURL ,
29062943 Extensions : extensions ,
29072944 Viewport : viewport ,
2908- TelemetryEnabled : telemetry ,
2909- Output : output ,
2945+ Telemetry : telemetry ,
2946+ Output : output ,
29102947 }
29112948
29122949 svc := client .Browsers
@@ -3050,9 +3087,8 @@ func runBrowsersTelemetrySet(cmd *cobra.Command, args []string) error {
30503087 client := getKernelClient (cmd )
30513088 svc := client .Browsers
30523089 out , _ := cmd .Flags ().GetString ("output" )
3053- categories , _ := cmd .Flags ().GetString ("categories" )
30543090 b := BrowsersCmd {browsers : & svc }
3055- return b .TelemetrySet (cmd .Context (), BrowsersTelemetrySetInput {Identifier : args [0 ], Categories : categories , Output : out })
3091+ return b .TelemetrySet (cmd .Context (), BrowsersTelemetrySetInput {Identifier : args [0 ], Categories : strings . Join ( args [ 1 :], "," ) , Output : out })
30563092}
30573093
30583094func runBrowsersTelemetryStatus (cmd * cobra.Command , args []string ) error {
0 commit comments