Code view:

A painting is a person's account of this edit as text, recorded independently of the node mapping - a rendering often has several equally defensible answers where the mapping has one. Deletions and insertions carry no position on the opposite side in a painting, so that panel draws no caret for them.

Before

…lines 1–11 unchanged (11 lines)
12 "testing"
13 "time"
14
15 "github.com/cockroachdb/cockroach/pkg/roachpb"
16 "github.com/cockroachdb/cockroach/pkg/settings/cluster"
17 "github.com/cockroachdb/cockroach/pkg/testutils"
18 "github.com/cockroachdb/cockroach/pkg/util/stop"
19 "github.com/cockroachdb/errors"
20 "github.com/stretchr/testify/require"
21)
22
23// newTestSampler creates a Sampler suitable for unit tests.
24func newTestSampler() (*Sampler, *stop.Stopper) {
25 stopper := stop.NewStopper()
…lines 26–560 unchanged (535 lines)
561 appNames[sample.AppName] = struct{}{}
562 }
563 require.Contains(t, appNames, "app-a")
564 require.Contains(t, appNames, "app-b")
565 })
566}
567

After

…lines 1–11 unchanged (11 lines)
12 "testing"
13 "time"
14
15 "github.com/cockroachdb/cockroach/pkg/roachpb"
16 "github.com/cockroachdb/cockroach/pkg/settings/cluster"
17 "github.com/cockroachdb/cockroach/pkg/testutils"
18 "github.com/cockroachdb/cockroach/pkg/util/log"
19 "github.com/cockroachdb/cockroach/pkg/util/log/logpb"
20 "github.com/cockroachdb/cockroach/pkg/util/log/logtestutils"
21 "github.com/cockroachdb/cockroach/pkg/util/stop"
22 "github.com/cockroachdb/cockroach/pkg/util/timeutil"
23 "github.com/cockroachdb/errors"
24 "github.com/stretchr/testify/require"
25)
26
27// newTestSampler creates a Sampler suitable for unit tests.
28func newTestSampler() (*Sampler, *stop.Stopper) {
…lines 29–565 unchanged (537 lines)
566 }
567 require.Contains(t, appNames, "app-a")
568 require.Contains(t, appNames, "app-b")
569 })
570}
571
572func TestSamplerLogSummary(t *testing.T) {
573 defer log.ScopeWithoutShowLogs(t).Close(t)
574
575 // newSummaryTestSampler returns a sampler with lastLogTime far
576 // enough in the past that the summary fires on the next call,
577 // and the log interval set short.
578 newSummaryTestSampler := func() (*Sampler, *stop.Stopper) {
579 s, stopper := newTestSampler()
580 LogInterval.Override(
581 context.Background(), &s.st.SV, time.Second,
582 )
583 s.lastLogTime = timeutil.Now().Add(-time.Hour)
584 return s, stopper
585 }
586
587 t.Run("emits summary for buffered samples", func(t *testing.T) {
588 s, stopper := newSummaryTestSampler()
589 defer stopper.Stop(context.Background())
590
591 enabled.Store(true)
592 defer enabled.Store(false)
593
594 ctx := context.Background()
595 spy := logtestutils.NewLogSpy(
596 t,
597 logtestutils.MatchesF("ash_workload_summary"),
598 )
599 defer log.InterceptWith(ctx, spy)()
600
601 // Register a work state and take several samples.
602 tenantID := roachpb.MustMakeTenantID(1)
603 cleanup := SetWorkState(tenantID, WorkloadInfo{WorkloadID: 42}, WorkCPU, "Optimize")
604 defer cleanup()
605
606 for range 5 {
607 s.takeSample(ctx)
608 }
609
610 // Push lastLogTime back so the next maybeLogSummary fires.
611 s.lastLogTime = timeutil.Now().Add(-time.Hour)
612 s.maybeLogSummary(ctx)
613
614 // Verify structured events were emitted.
615 entries := spy.ReadAll()
616 require.NotEmpty(t, entries,
617 "expected at least one ASHWorkloadSummary event")
618 lastMsg := entries[len(entries)-1].Message
619 require.Contains(t, lastMsg, "CPU")
620 require.Contains(t, lastMsg, "Optimize")
621 })
622
623 t.Run("top-N ordering", func(t *testing.T) {
624 s, stopper := newSummaryTestSampler()
625 defer stopper.Stop(context.Background())
626
627 ctx := context.Background()
628 spy := logtestutils.NewStructuredLogSpy(
629 t,
630 []logpb.Channel{logpb.Channel_OPS},
631 []string{"ash_workload_summary"},
632 logtestutils.AsLogEntry,
633 )
634 defer log.InterceptWith(ctx, spy)()
635
636 // Add samples directly to the buffer with different counts
637 // to test ordering. IO gets 200, CPU gets 100, LOCK gets 50.
638 now := timeutil.Now()
639 for range 200 {
640 s.buffer.Add(ASHSample{
641 SampleTime: now,
642 WorkEventType: WorkIO,
643 WorkEvent: "BatchEval",
644 WorkloadID: "ccc",
645 })
646 }
647 for range 100 {
648 s.buffer.Add(ASHSample{
649 SampleTime: now,
650 WorkEventType: WorkCPU,
651 WorkEvent: "Optimize",
652 WorkloadID: "aaa",
653 })
654 }
655 for range 50 {
656 s.buffer.Add(ASHSample{
657 SampleTime: now,
658 WorkEventType: WorkLock,
659 WorkEvent: "LockWait",
660 WorkloadID: "bbb",
661 })
662 }
663
664 s.maybeLogSummary(ctx)
665
666 entries := spy.GetLogs(logpb.Channel_OPS)
667 require.Len(t, entries, 3)
668
669 // Events are emitted in descending order: IO, CPU, LOCK.
670 require.Contains(t, entries[0].Message, "IO")
671 require.Contains(t, entries[1].Message, "CPU")
672 require.Contains(t, entries[2].Message, "LOCK")
673 })
674
675 t.Run("skips empty window", func(t *testing.T) {
676 s, stopper := newSummaryTestSampler()
677 defer stopper.Stop(context.Background())
678
679 ctx := context.Background()
680 spy := logtestutils.NewLogSpy(
681 t,
682 logtestutils.MatchesF("ash_workload_summary"),
683 )
684 defer log.InterceptWith(ctx, spy)()
685
686 s.maybeLogSummary(ctx)
687
688 require.Empty(t, spy.ReadAll(),
689 "no summary should be logged when there are zero samples")
690 // lastLogTime should still be updated so we don't accumulate.
691 require.True(t, timeutil.Since(s.lastLogTime) < time.Second)
692 })
693}
694

Before

source_file
comment "// Copyright 2026 The Cockroach Authors."
comment "//"
comment "// Use of this software is governed by the CockroachDB Softw"...
comment "// included in the /LICENSE file."
package_clause
package "package"
package_identifier "ash"
import_declaration
import "import"
import_spec_list
( "("
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "context"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "sync"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "sync/atomic"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "testing"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "time"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/cockroach/pkg/roachpb"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/cockroach/pkg/settings/cluster"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/cockroach/pkg/testutils"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/cockroach/pkg/util/stop"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/errors"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/stretchr/testify/require"
" "\""
) ")"
comment "// newTestSampler creates a Sampler suitable for unit tests."
function_declaration (+72 nodes collapsed)
function_declaration (+309 nodes collapsed)
function_declaration (+315 nodes collapsed)
function_declaration (+456 nodes collapsed)
function_declaration (+368 nodes collapsed)
function_declaration (+127 nodes collapsed)
function_declaration (+727 nodes collapsed)
function_declaration (+669 nodes collapsed)
function_declaration (+493 nodes collapsed)
function_declaration (+2016 nodes collapsed)

After

source_file
comment "// Copyright 2026 The Cockroach Authors."
comment "//"
comment "// Use of this software is governed by the CockroachDB Softw"...
comment "// included in the /LICENSE file."
package_clause
package "package"
package_identifier "ash"
import_declaration
import "import"
import_spec_list
( "("
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "context"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "sync"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "sync/atomic"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "testing"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "time"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/cockroach/pkg/roachpb"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/cockroach/pkg/settings/cluster"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/cockroach/pkg/testutils"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/cockroach/pkg/util/log"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/cockroach/pkg/util/log/logpb"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/cockroach/pkg/util/log/logtestutils"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/cockroach/pkg/util/stop"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/cockroach/pkg/util/timeutil"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/cockroachdb/errors"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "github.com/stretchr/testify/require"
" "\""
) ")"
comment "// newTestSampler creates a Sampler suitable for unit tests."
function_declaration (+72 nodes collapsed)
function_declaration (+309 nodes collapsed)
function_declaration (+315 nodes collapsed)
function_declaration (+456 nodes collapsed)
function_declaration (+368 nodes collapsed)
function_declaration (+127 nodes collapsed)
function_declaration (+727 nodes collapsed)
function_declaration (+669 nodes collapsed)
function_declaration (+493 nodes collapsed)
function_declaration (+2016 nodes collapsed)
function_declaration
func "func"
identifier "TestSamplerLogSummary"
parameter_list
( "("
parameter_declaration
identifier "t"
pointer_type
* "*"
qualified_type
package_identifier "testing"
. "."
type_identifier "T"
) ")"
block
{ "{"
statement_list
defer_statement
defer "defer"
call_expression
selector_expression
call_expression
selector_expression
identifier "log"
. "."
field_identifier "ScopeWithoutShowLogs"
argument_list
( "("
identifier "t"
) ")"
. "."
field_identifier "Close"
argument_list
( "("
identifier "t"
) ")"
comment "// newSummaryTestSampler returns a sampler with lastLogTime "...
comment "// enough in the past that the summary fires on the next cal"...
comment "// and the log interval set short."
short_var_declaration
expression_list
identifier "newSummaryTestSampler"
:= ":="
expression_list
func_literal
func "func"
parameter_list
( "("
) ")"
parameter_list
( "("
parameter_declaration
pointer_type
* "*"
type_identifier "Sampler"
, ","
parameter_declaration
pointer_type
* "*"
qualified_type
package_identifier "stop"
. "."
type_identifier "Stopper"
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "s"
, ","
identifier "stopper"
:= ":="
expression_list
call_expression
identifier "newTestSampler"
argument_list
( "("
) ")"
expression_statement
call_expression
selector_expression
identifier "LogInterval"
. "."
field_identifier "Override"
argument_list
( "("
call_expression
selector_expression
identifier "context"
. "."
field_identifier "Background"
argument_list
( "("
) ")"
, ","
unary_expression
& "&"
selector_expression
selector_expression
identifier "s"
. "."
field_identifier "st"
. "."
field_identifier "SV"
, ","
selector_expression
identifier "time"
. "."
field_identifier "Second"
, ","
) ")"
assignment_statement
expression_list
selector_expression
identifier "s"
. "."
field_identifier "lastLogTime"
= "="
expression_list
call_expression
selector_expression
call_expression
selector_expression
identifier "timeutil"
. "."
field_identifier "Now"
argument_list
( "("
) ")"
. "."
field_identifier "Add"
argument_list
( "("
unary_expression
- "-"
selector_expression
identifier "time"
. "."
field_identifier "Hour"
) ")"
return_statement
return "return"
expression_list
identifier "s"
, ","
identifier "stopper"
} "}"
expression_statement
call_expression
selector_expression
identifier "t"
. "."
field_identifier "Run"
argument_list
( "("
interpreted_string_literal
" "\""
interpreted_string_literal_content "emits summary for buffered samples"
" "\""
, ","
func_literal
func "func"
parameter_list
( "("
parameter_declaration
identifier "t"
pointer_type
* "*"
qualified_type
package_identifier "testing"
. "."
type_identifier "T"
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "s"
, ","
identifier "stopper"
:= ":="
expression_list
call_expression
identifier "newSummaryTestSampler"
argument_list
( "("
) ")"
defer_statement
defer "defer"
call_expression
selector_expression
identifier "stopper"
. "."
field_identifier "Stop"
argument_list
( "("
call_expression
selector_expression
identifier "context"
. "."
field_identifier "Background"
argument_list
( "("
) ")"
) ")"
expression_statement
call_expression
selector_expression
identifier "enabled"
. "."
field_identifier "Store"
argument_list
( "("
true "true"
) ")"
defer_statement
defer "defer"
call_expression
selector_expression
identifier "enabled"
. "."
field_identifier "Store"
argument_list
( "("
false "false"
) ")"
short_var_declaration
expression_list
identifier "ctx"
:= ":="
expression_list
call_expression
selector_expression
identifier "context"
. "."
field_identifier "Background"
argument_list
( "("
) ")"
short_var_declaration
expression_list
identifier "spy"
:= ":="
expression_list
call_expression
selector_expression
identifier "logtestutils"
. "."
field_identifier "NewLogSpy"
argument_list
( "("
identifier "t"
, ","
call_expression
selector_expression
identifier "logtestutils"
. "."
field_identifier "MatchesF"
argument_list
( "("
interpreted_string_literal
" "\""
interpreted_string_literal_content "ash_workload_summary"
" "\""
) ")"
, ","
) ")"
defer_statement
defer "defer"
call_expression
call_expression
selector_expression
identifier "log"
. "."
field_identifier "InterceptWith"
argument_list
( "("
identifier "ctx"
, ","
identifier "spy"
) ")"
argument_list
( "("
) ")"
comment "// Register a work state and take several samples."
short_var_declaration
expression_list
identifier "tenantID"
:= ":="
expression_list
call_expression
selector_expression
identifier "roachpb"
. "."
field_identifier "MustMakeTenantID"
argument_list
( "("
int_literal "1"
) ")"
short_var_declaration
expression_list
identifier "cleanup"
:= ":="
expression_list
call_expression
identifier "SetWorkState"
argument_list
( "("
identifier "tenantID"
, ","
composite_literal
type_identifier "WorkloadInfo"
literal_value
{ "{"
keyed_element
literal_element
identifier "WorkloadID"
: ":"
literal_element
int_literal "42"
} "}"
, ","
identifier "WorkCPU"
, ","
interpreted_string_literal
" "\""
interpreted_string_literal_content "Optimize"
" "\""
) ")"
defer_statement
defer "defer"
call_expression
identifier "cleanup"
argument_list
( "("
) ")"
for_statement
for "for"
range_clause
range "range"
int_literal "5"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
identifier "s"
. "."
field_identifier "takeSample"
argument_list
( "("
identifier "ctx"
) ")"
} "}"
comment "// Push lastLogTime back so the next maybeLogSummary fires."
assignment_statement
expression_list
selector_expression
identifier "s"
. "."
field_identifier "lastLogTime"
= "="
expression_list
call_expression
selector_expression
call_expression
selector_expression
identifier "timeutil"
. "."
field_identifier "Now"
argument_list
( "("
) ")"
. "."
field_identifier "Add"
argument_list
( "("
unary_expression
- "-"
selector_expression
identifier "time"
. "."
field_identifier "Hour"
) ")"
expression_statement
call_expression
selector_expression
identifier "s"
. "."
field_identifier "maybeLogSummary"
argument_list
( "("
identifier "ctx"
) ")"
comment "// Verify structured events were emitted."
short_var_declaration
expression_list
identifier "entries"
:= ":="
expression_list
call_expression
selector_expression
identifier "spy"
. "."
field_identifier "ReadAll"
argument_list
( "("
) ")"
expression_statement
call_expression
selector_expression
identifier "require"
. "."
field_identifier "NotEmpty"
argument_list
( "("
identifier "t"
, ","
identifier "entries"
, ","
interpreted_string_literal
" "\""
interpreted_string_literal_content "expected at least one ASHWorkloadSummary event"
" "\""
) ")"
short_var_declaration
expression_list
identifier "lastMsg"
:= ":="
expression_list
selector_expression
index_expression
identifier "entries"
[ "["
binary_expression
call_expression
identifier "len"
argument_list
( "("
identifier "entries"
) ")"
- "-"
int_literal "1"
] "]"
. "."
field_identifier "Message"
expression_statement
call_expression
selector_expression
identifier "require"
. "."
field_identifier "Contains"
argument_list
( "("
identifier "t"
, ","
identifier "lastMsg"
, ","
interpreted_string_literal
" "\""
interpreted_string_literal_content "CPU"
" "\""
) ")"
expression_statement
call_expression
selector_expression
identifier "require"
. "."
field_identifier "Contains"
argument_list
( "("
identifier "t"
, ","
identifier "lastMsg"
, ","
interpreted_string_literal
" "\""
interpreted_string_literal_content "Optimize"
" "\""
) ")"
} "}"
) ")"
expression_statement
call_expression
selector_expression
identifier "t"
. "."
field_identifier "Run"
argument_list
( "("
interpreted_string_literal
" "\""
interpreted_string_literal_content "top-N ordering"
" "\""
, ","
func_literal
func "func"
parameter_list
( "("
parameter_declaration
identifier "t"
pointer_type
* "*"
qualified_type
package_identifier "testing"
. "."
type_identifier "T"
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "s"
, ","
identifier "stopper"
:= ":="
expression_list
call_expression
identifier "newSummaryTestSampler"
argument_list
( "("
) ")"
defer_statement
defer "defer"
call_expression
selector_expression
identifier "stopper"
. "."
field_identifier "Stop"
argument_list
( "("
call_expression
selector_expression
identifier "context"
. "."
field_identifier "Background"
argument_list
( "("
) ")"
) ")"
short_var_declaration
expression_list
identifier "ctx"
:= ":="
expression_list
call_expression
selector_expression
identifier "context"
. "."
field_identifier "Background"
argument_list
( "("
) ")"
short_var_declaration
expression_list
identifier "spy"
:= ":="
expression_list
call_expression
selector_expression
identifier "logtestutils"
. "."
field_identifier "NewStructuredLogSpy"
argument_list
( "("
identifier "t"
, ","
composite_literal
slice_type
[ "["
] "]"
qualified_type
package_identifier "logpb"
. "."
type_identifier "Channel"
literal_value
{ "{"
literal_element
selector_expression
identifier "logpb"
. "."
field_identifier "Channel_OPS"
} "}"
, ","
composite_literal
slice_type
[ "["
] "]"
type_identifier "string"
literal_value
{ "{"
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content "ash_workload_summary"
" "\""
} "}"
, ","
selector_expression
identifier "logtestutils"
. "."
field_identifier "AsLogEntry"
, ","
) ")"
defer_statement
defer "defer"
call_expression
call_expression
selector_expression
identifier "log"
. "."
field_identifier "InterceptWith"
argument_list
( "("
identifier "ctx"
, ","
identifier "spy"
) ")"
argument_list
( "("
) ")"
comment "// Add samples directly to the buffer with different counts"
comment "// to test ordering. IO gets 200, CPU gets 100, LOCK gets 50"...
short_var_declaration
expression_list
identifier "now"
:= ":="
expression_list
call_expression
selector_expression
identifier "timeutil"
. "."
field_identifier "Now"
argument_list
( "("
) ")"
for_statement
for "for"
range_clause
range "range"
int_literal "200"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
selector_expression
identifier "s"
. "."
field_identifier "buffer"
. "."
field_identifier "Add"
argument_list
( "("
composite_literal
type_identifier "ASHSample"
literal_value
{ "{"
keyed_element
literal_element
identifier "SampleTime"
: ":"
literal_element
identifier "now"
, ","
keyed_element
literal_element
identifier "WorkEventType"
: ":"
literal_element
identifier "WorkIO"
, ","
keyed_element
literal_element
identifier "WorkEvent"
: ":"
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content "BatchEval"
" "\""
, ","
keyed_element
literal_element
identifier "WorkloadID"
: ":"
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content "ccc"
" "\""
, ","
} "}"
) ")"
} "}"
for_statement
for "for"
range_clause
range "range"
int_literal "100"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
selector_expression
identifier "s"
. "."
field_identifier "buffer"
. "."
field_identifier "Add"
argument_list
( "("
composite_literal
type_identifier "ASHSample"
literal_value
{ "{"
keyed_element
literal_element
identifier "SampleTime"
: ":"
literal_element
identifier "now"
, ","
keyed_element
literal_element
identifier "WorkEventType"
: ":"
literal_element
identifier "WorkCPU"
, ","
keyed_element
literal_element
identifier "WorkEvent"
: ":"
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content "Optimize"
" "\""
, ","
keyed_element
literal_element
identifier "WorkloadID"
: ":"
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content "aaa"
" "\""
, ","
} "}"
) ")"
} "}"
for_statement
for "for"
range_clause
range "range"
int_literal "50"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
selector_expression
identifier "s"
. "."
field_identifier "buffer"
. "."
field_identifier "Add"
argument_list
( "("
composite_literal
type_identifier "ASHSample"
literal_value
{ "{"
keyed_element
literal_element
identifier "SampleTime"
: ":"
literal_element
identifier "now"
, ","
keyed_element
literal_element
identifier "WorkEventType"
: ":"
literal_element
identifier "WorkLock"
, ","
keyed_element
literal_element
identifier "WorkEvent"
: ":"
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content "LockWait"
" "\""
, ","
keyed_element
literal_element
identifier "WorkloadID"
: ":"
literal_element
interpreted_string_literal
" "\""
interpreted_string_literal_content "bbb"
" "\""
, ","
} "}"
) ")"
} "}"
expression_statement
call_expression
selector_expression
identifier "s"
. "."
field_identifier "maybeLogSummary"
argument_list
( "("
identifier "ctx"
) ")"
short_var_declaration
expression_list
identifier "entries"
:= ":="
expression_list
call_expression
selector_expression
identifier "spy"
. "."
field_identifier "GetLogs"
argument_list
( "("
selector_expression
identifier "logpb"
. "."
field_identifier "Channel_OPS"
) ")"
expression_statement
call_expression
selector_expression
identifier "require"
. "."
field_identifier "Len"
argument_list
( "("
identifier "t"
, ","
identifier "entries"
, ","
int_literal "3"
) ")"
comment "// Events are emitted in descending order: IO, CPU, LOCK."
expression_statement
call_expression
selector_expression
identifier "require"
. "."
field_identifier "Contains"
argument_list
( "("
identifier "t"
, ","
selector_expression
index_expression
identifier "entries"
[ "["
int_literal "0"
] "]"
. "."
field_identifier "Message"
, ","
interpreted_string_literal
" "\""
interpreted_string_literal_content "IO"
" "\""
) ")"
expression_statement
call_expression
selector_expression
identifier "require"
. "."
field_identifier "Contains"
argument_list
( "("
identifier "t"
, ","
selector_expression
index_expression
identifier "entries"
[ "["
int_literal "1"
] "]"
. "."
field_identifier "Message"
, ","
interpreted_string_literal
" "\""
interpreted_string_literal_content "CPU"
" "\""
) ")"
expression_statement
call_expression
selector_expression
identifier "require"
. "."
field_identifier "Contains"
argument_list
( "("
identifier "t"
, ","
selector_expression
index_expression
identifier "entries"
[ "["
int_literal "2"
] "]"
. "."
field_identifier "Message"
, ","
interpreted_string_literal
" "\""
interpreted_string_literal_content "LOCK"
" "\""
) ")"
} "}"
) ")"
expression_statement
call_expression
selector_expression
identifier "t"
. "."
field_identifier "Run"
argument_list
( "("
interpreted_string_literal
" "\""
interpreted_string_literal_content "skips empty window"
" "\""
, ","
func_literal
func "func"
parameter_list
( "("
parameter_declaration
identifier "t"
pointer_type
* "*"
qualified_type
package_identifier "testing"
. "."
type_identifier "T"
) ")"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "s"
, ","
identifier "stopper"
:= ":="
expression_list
call_expression
identifier "newSummaryTestSampler"
argument_list
( "("
) ")"
defer_statement
defer "defer"
call_expression
selector_expression
identifier "stopper"
. "."
field_identifier "Stop"
argument_list
( "("
call_expression
selector_expression
identifier "context"
. "."
field_identifier "Background"
argument_list
( "("
) ")"
) ")"
short_var_declaration
expression_list
identifier "ctx"
:= ":="
expression_list
call_expression
selector_expression
identifier "context"
. "."
field_identifier "Background"
argument_list
( "("
) ")"
short_var_declaration
expression_list
identifier "spy"
:= ":="
expression_list
call_expression
selector_expression
identifier "logtestutils"
. "."
field_identifier "NewLogSpy"
argument_list
( "("
identifier "t"
, ","
call_expression
selector_expression
identifier "logtestutils"
. "."
field_identifier "MatchesF"
argument_list
( "("
interpreted_string_literal
" "\""
interpreted_string_literal_content "ash_workload_summary"
" "\""
) ")"
, ","
) ")"
defer_statement
defer "defer"
call_expression
call_expression
selector_expression
identifier "log"
. "."
field_identifier "InterceptWith"
argument_list
( "("
identifier "ctx"
, ","
identifier "spy"
) ")"
argument_list
( "("
) ")"
expression_statement
call_expression
selector_expression
identifier "s"
. "."
field_identifier "maybeLogSummary"
argument_list
( "("
identifier "ctx"
) ")"
expression_statement
call_expression
selector_expression
identifier "require"
. "."
field_identifier "Empty"
argument_list
( "("
identifier "t"
, ","
call_expression
selector_expression
identifier "spy"
. "."
field_identifier "ReadAll"
argument_list
( "("
) ")"
, ","
interpreted_string_literal
" "\""
interpreted_string_literal_content "no summary should be logged when there are zero samples"
" "\""
) ")"
comment "// lastLogTime should still be updated so we don't accumulat"...
expression_statement
call_expression
selector_expression
identifier "require"
. "."
field_identifier "True"
argument_list
( "("
identifier "t"
, ","
binary_expression
call_expression
selector_expression
identifier "timeutil"
. "."
field_identifier "Since"
argument_list
( "("
selector_expression
identifier "s"
. "."
field_identifier "lastLogTime"
) ")"
< "<"
selector_expression
identifier "time"
. "."
field_identifier "Second"
) ")"
} "}"
) ")"
} "}"