@@ -5789,6 +5789,93 @@ func TestLogCompression(t *testing.T) {
57895789 })
57905790}
57915791
5792+ func TestLogCursor (t * testing.T ) {
5793+ t .Parallel ()
5794+ RunForEachImageAndFeatureFlag (t , []string {OtelLoggingFeatureFlag }, func (t * testing.T , imageSpec string , feature string ) {
5795+ t .Parallel ()
5796+
5797+ ctx , logger , vm := setupMainLogAndVM (t , imageSpec )
5798+
5799+ logPath := logPathForImage (vm .ImageSpec )
5800+ config := fmt .Sprintf (`logging:
5801+ receivers:
5802+ files_1:
5803+ type: files
5804+ include_paths: [%s]
5805+ service:
5806+ pipelines:
5807+ p1:
5808+ receivers: [files_1]
5809+ ` , logPath )
5810+
5811+ firstLinesToWrite := []string {
5812+ `line #1` ,
5813+ `line #2` ,
5814+ }
5815+ if err := writeLinesToRemoteFile (ctx , logger , vm , imageSpec , logPath , firstLinesToWrite ... ); err != nil {
5816+ t .Fatalf ("Error writing dummy log lines: %v" , err )
5817+ }
5818+
5819+ if err := SetupOpsAgentWithFeatureFlag (ctx , logger , vm , config , feature ); err != nil {
5820+ t .Fatal (err )
5821+ }
5822+
5823+ var waitGroup sync.WaitGroup
5824+ addQueryFuncToWaitGroup := func (queryFunc func () error ) {
5825+ waitGroup .Add (1 )
5826+ go func () {
5827+ defer waitGroup .Done ()
5828+ if err := queryFunc (); err != nil {
5829+ t .Error (err )
5830+ }
5831+ }()
5832+ }
5833+
5834+ addQueryFuncToWaitGroup (func () error {
5835+ return gce .WaitForLog (ctx , logger , vm , "files_1" , time .Hour , `jsonPayload.message="line #1"` )
5836+ })
5837+ addQueryFuncToWaitGroup (func () error {
5838+ return gce .WaitForLog (ctx , logger , vm , "files_1" , time .Hour , `jsonPayload.message="line #2"` )
5839+ })
5840+ waitGroup .Wait ()
5841+
5842+ if _ , err := gce .RunRemotely (ctx , logger , vm , agents .StopCommandForImage (vm .ImageSpec )); err != nil {
5843+ t .Fatal (err )
5844+ }
5845+
5846+ secondLinesToWrite := []string {
5847+ `line #3` ,
5848+ `line #4` ,
5849+ }
5850+
5851+ if err := writeLinesToRemoteFile (ctx , logger , vm , imageSpec , logPath , secondLinesToWrite ... ); err != nil {
5852+ t .Fatalf ("Error writing dummy log lines: %v" , err )
5853+ }
5854+
5855+ time .Sleep (1 * time .Minute )
5856+
5857+ if _ , err := gce .RunRemotely (ctx , logger , vm , agents .StartCommandForImage (vm .ImageSpec )); err != nil {
5858+ t .Fatal (err )
5859+ }
5860+
5861+ time .Sleep (1 * time .Minute )
5862+
5863+ addQueryFuncToWaitGroup (func () error {
5864+ return gce .AssertLogMissing (ctx , logger , vm , "files_1" , 2 * time .Minute , `jsonPayload.message="line #1"` )
5865+ })
5866+ addQueryFuncToWaitGroup (func () error {
5867+ return gce .AssertLogMissing (ctx , logger , vm , "files_1" , 2 * time .Minute , `jsonPayload.message="line #2"` )
5868+ })
5869+ addQueryFuncToWaitGroup (func () error {
5870+ return gce .WaitForLog (ctx , logger , vm , "files_1" , 2 * time .Minute , `jsonPayload.message="line #3"` )
5871+ })
5872+ addQueryFuncToWaitGroup (func () error {
5873+ return gce .WaitForLog (ctx , logger , vm , "files_1" , 2 * time .Minute , `jsonPayload.message="line #4"` )
5874+ })
5875+ waitGroup .Wait ()
5876+ })
5877+ }
5878+
57925879// listAndDeleteResources lists all gcloud resources of a given resourceType that match the gcloudFilter.
57935880// All the found listed resources are then deleted sequentially.
57945881// extraArguments can be used for different type of gcloud command requirements.
0 commit comments