Skip to content

Commit a9b9bcd

Browse files
Create TestLogCursor to verify log cursor is preserved after restart.
1 parent 14d3700 commit a9b9bcd

File tree

2 files changed

+88
-2
lines changed

2 files changed

+88
-2
lines changed

confgenerator/confgenerator.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,12 +168,11 @@ func (uc *UnifiedConfig) GenerateOtelConfig(ctx context.Context, outDir, stateDi
168168
}
169169
agentSelfMetrics.AddSelfMetricsPipelines(receiverPipelines, pipelines)
170170

171-
extensions := uc.getEnabledExtensions(ctx, stateDir)
172171
otelConfig, err := otel.ModularConfig{
173172
LogLevel: uc.getOTelLogLevel(),
174173
ReceiverPipelines: receiverPipelines,
175174
Pipelines: pipelines,
176-
Extensions: extensions,
175+
Extensions: uc.getEnabledExtensions(ctx, stateDir),
177176
Exporters: map[otel.ExporterType]otel.Component{
178177
otel.System: googleCloudExporter(userAgent, false, false),
179178
otel.OTel: googleCloudExporter(userAgent, true, true),

integration_test/ops_agent_test/main_test.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)