From b161cb59c3bdf58e100767f5aefb8e484464f415 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 9 Sep 2025 12:41:25 +0200 Subject: [PATCH 01/15] Update index template name --- internal/testrunner/runners/system/tester.go | 34 ++++++++++++-------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/internal/testrunner/runners/system/tester.go b/internal/testrunner/runners/system/tester.go index cc79e81c8..b7648b8de 100644 --- a/internal/testrunner/runners/system/tester.go +++ b/internal/testrunner/runners/system/tester.go @@ -1150,19 +1150,7 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC // Delete old data logger.Debug("deleting old data in data stream...") - // Input packages can set `data_stream.dataset` by convention to customize the dataset. - dataStreamDataset := ds.Inputs[0].Streams[0].DataStream.Dataset - if r.pkgManifest.Type == "input" { - v, _ := config.Vars.GetValue("data_stream.dataset") - if dataset, ok := v.(string); ok && dataset != "" { - dataStreamDataset = dataset - } - } - scenario.indexTemplateName = fmt.Sprintf( - "%s-%s", - ds.Inputs[0].Streams[0].DataStream.Type, - dataStreamDataset, - ) + scenario.indexTemplateName = r.buildIndexTemplateName(ds, policyTemplate, config) scenario.dataStream = fmt.Sprintf( "%s-%s", scenario.indexTemplateName, @@ -1334,6 +1322,26 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC return &scenario, nil } +func (r *tester) buildIndexTemplateName(ds kibana.PackageDataStream, policyTemplate packages.PolicyTemplate, config *testConfig) string { + // Input packages can set `data_stream.dataset` by convention to customize the dataset. + dataStreamDataset := ds.Inputs[0].Streams[0].DataStream.Dataset + if r.pkgManifest.Type == "input" { + v, _ := config.Vars.GetValue("data_stream.dataset") + if dataset, ok := v.(string); ok && dataset != "" { + dataStreamDataset = dataset + } + if policyTemplate.Input == "otelcol" { + dataStreamDataset = fmt.Sprintf("%s.otel", dataStreamDataset) + } + } + indexTemplateName := fmt.Sprintf( + "%s-%s", + ds.Inputs[0].Streams[0].DataStream.Type, + dataStreamDataset, + ) + return indexTemplateName +} + func (r *tester) setupService(ctx context.Context, config *testConfig, serviceOptions servicedeployer.FactoryOptions, svcInfo servicedeployer.ServiceInfo, agentInfo agentdeployer.AgentInfo, agentDeployed agentdeployer.DeployedAgent, policy *kibana.Policy, state ServiceState) (servicedeployer.DeployedService, servicedeployer.ServiceInfo, error) { logger.Info("Setting up service...") if r.runTearDown || r.runTestsOnly { From 6469ae48449dac4f87d837d0a77e717420afd631 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 9 Sep 2025 12:41:51 +0200 Subject: [PATCH 02/15] Remove outdated log message --- internal/testrunner/runners/system/tester.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/internal/testrunner/runners/system/tester.go b/internal/testrunner/runners/system/tester.go index b7648b8de..1215ed0d2 100644 --- a/internal/testrunner/runners/system/tester.go +++ b/internal/testrunner/runners/system/tester.go @@ -1147,9 +1147,6 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC } scenario.kibanaDataStream = ds - // Delete old data - logger.Debug("deleting old data in data stream...") - scenario.indexTemplateName = r.buildIndexTemplateName(ds, policyTemplate, config) scenario.dataStream = fmt.Sprintf( "%s-%s", From fdb23e90510a9bcd2a5874e9968f324250423dd6 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 9 Sep 2025 12:53:54 +0200 Subject: [PATCH 03/15] Extract function to create kibana policies --- internal/testrunner/runners/system/tester.go | 171 ++++++++++--------- 1 file changed, 91 insertions(+), 80 deletions(-) diff --git a/internal/testrunner/runners/system/tester.go b/internal/testrunner/runners/system/tester.go index 1215ed0d2..2d42d1cb3 100644 --- a/internal/testrunner/runners/system/tester.go +++ b/internal/testrunner/runners/system/tester.go @@ -1007,86 +1007,9 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC return nil, fmt.Errorf("failed to find the selected policy_template: %w", err) } - // Configure package (single data stream) via Fleet APIs. - testTime := time.Now().Format("20060102T15:04:05Z") - var policyToTest, policyCurrent, policyToEnroll *kibana.Policy - if r.runTearDown || r.runTestsOnly { - policyCurrent = &serviceStateData.CurrentPolicy - policyToEnroll = &serviceStateData.EnrollPolicy - logger.Debugf("Got current policy from file: %q - %q", policyCurrent.Name, policyCurrent.ID) - } else { - // Created a specific Agent Policy to enrolling purposes - // There are some issues when the stack is running for some time, - // agents cannot enroll with the default policy - // This enroll policy must be created even if independent Elastic Agents are not used. Agents created - // in Kubernetes or Custom Agents require this enroll policy too (service deployer). - logger.Debug("creating enroll policy...") - policyEnroll := kibana.Policy{ - Name: fmt.Sprintf("ep-test-system-enroll-%s-%s-%s-%s-%s", r.testFolder.Package, r.testFolder.DataStream, r.serviceVariant, r.configFileName, testTime), - Description: fmt.Sprintf("test policy created by elastic-package to enroll agent for data stream %s/%s", r.testFolder.Package, r.testFolder.DataStream), - Namespace: common.CreateTestRunID(), - } - - policyToEnroll, err = r.kibanaClient.CreatePolicy(ctx, policyEnroll) - if err != nil { - return nil, fmt.Errorf("could not create test policy: %w", err) - } - } - - r.deleteTestPolicyHandler = func(ctx context.Context) error { - // ensure that policyToEnroll policy gets deleted if the execution receives a signal - // before creating the test policy - // This handler is going to be redefined after creating the test policy - if r.runTestsOnly { - return nil - } - if err := r.kibanaClient.DeletePolicy(ctx, policyToEnroll.ID); err != nil { - return fmt.Errorf("error cleaning up test policy: %w", err) - } - return nil - } - - if r.runTearDown { - // required to assign the policy stored in the service state file - // so data stream related to this Agent Policy can be obtained (and deleted) - // in the cleanTestScenarioHandler handler - policyToTest = policyCurrent - } else { - // Create a specific Agent Policy just for testing this test. - // This allows us to ensure that the Agent Policy used for testing is - // assigned to the agent with all the required changes (e.g. Package DataStream) - logger.Debug("creating test policy...") - policy := kibana.Policy{ - Name: fmt.Sprintf("ep-test-system-%s-%s-%s-%s-%s", r.testFolder.Package, r.testFolder.DataStream, r.serviceVariant, r.configFileName, testTime), - Description: fmt.Sprintf("test policy created by elastic-package test system for data stream %s/%s", r.testFolder.Package, r.testFolder.DataStream), - Namespace: common.CreateTestRunID(), - } - // Assign the data_output_id to the agent policy to configure the output to logstash. The value is inferred from stack/_static/kibana.yml.tmpl - // TODO: Migrate from stack.logstash_enabled to the stack config. - if r.profile.Config("stack.logstash_enabled", "false") == "true" { - policy.DataOutputID = "fleet-logstash-output" - } - if stackConfig.OutputID != "" { - policy.DataOutputID = stackConfig.OutputID - } - policyToTest, err = r.kibanaClient.CreatePolicy(ctx, policy) - if err != nil { - return nil, fmt.Errorf("could not create test policy: %w", err) - } - } - - r.deleteTestPolicyHandler = func(ctx context.Context) error { - logger.Debug("deleting test policies...") - if err := r.kibanaClient.DeletePolicy(ctx, policyToTest.ID); err != nil { - return fmt.Errorf("error cleaning up test policy: %w", err) - } - if r.runTestsOnly { - return nil - } - if err := r.kibanaClient.DeletePolicy(ctx, policyToEnroll.ID); err != nil { - return fmt.Errorf("error cleaning up test policy: %w", err) - } - return nil + policyCurrent, policyToEnroll, policyToTest, err := r.createKibanaPolicies(ctx, serviceStateData, stackConfig) + if err != nil { + return nil, fmt.Errorf("failed to create kibana policies: %w", err) } // policyToEnroll is used in both independent agents and agents created by servicedeployer (custom or kubernetes agents) @@ -1319,6 +1242,94 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC return &scenario, nil } +func (r *tester) createKibanaPolicies(ctx context.Context, serviceStateData ServiceState, stackConfig stack.Config) (*kibana.Policy, *kibana.Policy, *kibana.Policy, error) { + // Configure package (single data stream) via Fleet APIs. + testTime := time.Now().Format("20060102T15:04:05Z") + var policyToTest, policyCurrent, policyToEnroll *kibana.Policy + var err error + + if r.runTearDown || r.runTestsOnly { + policyCurrent = &serviceStateData.CurrentPolicy + policyToEnroll = &serviceStateData.EnrollPolicy + logger.Debugf("Got current policy from file: %q - %q", policyCurrent.Name, policyCurrent.ID) + } else { + // Created a specific Agent Policy to enrolling purposes + // There are some issues when the stack is running for some time, + // agents cannot enroll with the default policy + // This enroll policy must be created even if independent Elastic Agents are not used. Agents created + // in Kubernetes or Custom Agents require this enroll policy too (service deployer). + logger.Debug("creating enroll policy...") + policyEnroll := kibana.Policy{ + Name: fmt.Sprintf("ep-test-system-enroll-%s-%s-%s-%s-%s", r.testFolder.Package, r.testFolder.DataStream, r.serviceVariant, r.configFileName, testTime), + Description: fmt.Sprintf("test policy created by elastic-package to enroll agent for data stream %s/%s", r.testFolder.Package, r.testFolder.DataStream), + Namespace: common.CreateTestRunID(), + } + + policyToEnroll, err = r.kibanaClient.CreatePolicy(ctx, policyEnroll) + if err != nil { + return nil, nil, nil, fmt.Errorf("could not create test policy: %w", err) + } + } + + r.deleteTestPolicyHandler = func(ctx context.Context) error { + // ensure that policyToEnroll policy gets deleted if the execution receives a signal + // before creating the test policy + // This handler is going to be redefined after creating the test policy + if r.runTestsOnly { + return nil + } + if err := r.kibanaClient.DeletePolicy(ctx, policyToEnroll.ID); err != nil { + return fmt.Errorf("error cleaning up test policy: %w", err) + } + return nil + } + + if r.runTearDown { + // required to assign the policy stored in the service state file + // so data stream related to this Agent Policy can be obtained (and deleted) + // in the cleanTestScenarioHandler handler + policyToTest = policyCurrent + } else { + // Create a specific Agent Policy just for testing this test. + // This allows us to ensure that the Agent Policy used for testing is + // assigned to the agent with all the required changes (e.g. Package DataStream) + logger.Debug("creating test policy...") + policy := kibana.Policy{ + Name: fmt.Sprintf("ep-test-system-%s-%s-%s-%s-%s", r.testFolder.Package, r.testFolder.DataStream, r.serviceVariant, r.configFileName, testTime), + Description: fmt.Sprintf("test policy created by elastic-package test system for data stream %s/%s", r.testFolder.Package, r.testFolder.DataStream), + Namespace: common.CreateTestRunID(), + } + // Assign the data_output_id to the agent policy to configure the output to logstash. The value is inferred from stack/_static/kibana.yml.tmpl + // TODO: Migrate from stack.logstash_enabled to the stack config. + if r.profile.Config("stack.logstash_enabled", "false") == "true" { + policy.DataOutputID = "fleet-logstash-output" + } + if stackConfig.OutputID != "" { + policy.DataOutputID = stackConfig.OutputID + } + policyToTest, err = r.kibanaClient.CreatePolicy(ctx, policy) + if err != nil { + return nil, nil, nil, fmt.Errorf("could not create test policy: %w", err) + } + } + + r.deleteTestPolicyHandler = func(ctx context.Context) error { + logger.Debug("deleting test policies...") + if err := r.kibanaClient.DeletePolicy(ctx, policyToTest.ID); err != nil { + return fmt.Errorf("error cleaning up test policy: %w", err) + } + if r.runTestsOnly { + return nil + } + if err := r.kibanaClient.DeletePolicy(ctx, policyToEnroll.ID); err != nil { + return fmt.Errorf("error cleaning up test policy: %w", err) + } + return nil + } + + return policyCurrent, policyToEnroll, policyToTest, nil +} + func (r *tester) buildIndexTemplateName(ds kibana.PackageDataStream, policyTemplate packages.PolicyTemplate, config *testConfig) string { // Input packages can set `data_stream.dataset` by convention to customize the dataset. dataStreamDataset := ds.Inputs[0].Streams[0].DataStream.Dataset From 2147b14a38eb4f73b4247e2f5673de02f46b84a0 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 9 Sep 2025 14:45:47 +0200 Subject: [PATCH 04/15] Revert "Extract function to create kibana policies" This reverts commit 77de02ed6bc3c765f8e88954fa3bee5e780ad37a. --- internal/testrunner/runners/system/tester.go | 171 +++++++++---------- 1 file changed, 80 insertions(+), 91 deletions(-) diff --git a/internal/testrunner/runners/system/tester.go b/internal/testrunner/runners/system/tester.go index 2d42d1cb3..1215ed0d2 100644 --- a/internal/testrunner/runners/system/tester.go +++ b/internal/testrunner/runners/system/tester.go @@ -1007,9 +1007,86 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC return nil, fmt.Errorf("failed to find the selected policy_template: %w", err) } - policyCurrent, policyToEnroll, policyToTest, err := r.createKibanaPolicies(ctx, serviceStateData, stackConfig) - if err != nil { - return nil, fmt.Errorf("failed to create kibana policies: %w", err) + // Configure package (single data stream) via Fleet APIs. + testTime := time.Now().Format("20060102T15:04:05Z") + var policyToTest, policyCurrent, policyToEnroll *kibana.Policy + if r.runTearDown || r.runTestsOnly { + policyCurrent = &serviceStateData.CurrentPolicy + policyToEnroll = &serviceStateData.EnrollPolicy + logger.Debugf("Got current policy from file: %q - %q", policyCurrent.Name, policyCurrent.ID) + } else { + // Created a specific Agent Policy to enrolling purposes + // There are some issues when the stack is running for some time, + // agents cannot enroll with the default policy + // This enroll policy must be created even if independent Elastic Agents are not used. Agents created + // in Kubernetes or Custom Agents require this enroll policy too (service deployer). + logger.Debug("creating enroll policy...") + policyEnroll := kibana.Policy{ + Name: fmt.Sprintf("ep-test-system-enroll-%s-%s-%s-%s-%s", r.testFolder.Package, r.testFolder.DataStream, r.serviceVariant, r.configFileName, testTime), + Description: fmt.Sprintf("test policy created by elastic-package to enroll agent for data stream %s/%s", r.testFolder.Package, r.testFolder.DataStream), + Namespace: common.CreateTestRunID(), + } + + policyToEnroll, err = r.kibanaClient.CreatePolicy(ctx, policyEnroll) + if err != nil { + return nil, fmt.Errorf("could not create test policy: %w", err) + } + } + + r.deleteTestPolicyHandler = func(ctx context.Context) error { + // ensure that policyToEnroll policy gets deleted if the execution receives a signal + // before creating the test policy + // This handler is going to be redefined after creating the test policy + if r.runTestsOnly { + return nil + } + if err := r.kibanaClient.DeletePolicy(ctx, policyToEnroll.ID); err != nil { + return fmt.Errorf("error cleaning up test policy: %w", err) + } + return nil + } + + if r.runTearDown { + // required to assign the policy stored in the service state file + // so data stream related to this Agent Policy can be obtained (and deleted) + // in the cleanTestScenarioHandler handler + policyToTest = policyCurrent + } else { + // Create a specific Agent Policy just for testing this test. + // This allows us to ensure that the Agent Policy used for testing is + // assigned to the agent with all the required changes (e.g. Package DataStream) + logger.Debug("creating test policy...") + policy := kibana.Policy{ + Name: fmt.Sprintf("ep-test-system-%s-%s-%s-%s-%s", r.testFolder.Package, r.testFolder.DataStream, r.serviceVariant, r.configFileName, testTime), + Description: fmt.Sprintf("test policy created by elastic-package test system for data stream %s/%s", r.testFolder.Package, r.testFolder.DataStream), + Namespace: common.CreateTestRunID(), + } + // Assign the data_output_id to the agent policy to configure the output to logstash. The value is inferred from stack/_static/kibana.yml.tmpl + // TODO: Migrate from stack.logstash_enabled to the stack config. + if r.profile.Config("stack.logstash_enabled", "false") == "true" { + policy.DataOutputID = "fleet-logstash-output" + } + if stackConfig.OutputID != "" { + policy.DataOutputID = stackConfig.OutputID + } + policyToTest, err = r.kibanaClient.CreatePolicy(ctx, policy) + if err != nil { + return nil, fmt.Errorf("could not create test policy: %w", err) + } + } + + r.deleteTestPolicyHandler = func(ctx context.Context) error { + logger.Debug("deleting test policies...") + if err := r.kibanaClient.DeletePolicy(ctx, policyToTest.ID); err != nil { + return fmt.Errorf("error cleaning up test policy: %w", err) + } + if r.runTestsOnly { + return nil + } + if err := r.kibanaClient.DeletePolicy(ctx, policyToEnroll.ID); err != nil { + return fmt.Errorf("error cleaning up test policy: %w", err) + } + return nil } // policyToEnroll is used in both independent agents and agents created by servicedeployer (custom or kubernetes agents) @@ -1242,94 +1319,6 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC return &scenario, nil } -func (r *tester) createKibanaPolicies(ctx context.Context, serviceStateData ServiceState, stackConfig stack.Config) (*kibana.Policy, *kibana.Policy, *kibana.Policy, error) { - // Configure package (single data stream) via Fleet APIs. - testTime := time.Now().Format("20060102T15:04:05Z") - var policyToTest, policyCurrent, policyToEnroll *kibana.Policy - var err error - - if r.runTearDown || r.runTestsOnly { - policyCurrent = &serviceStateData.CurrentPolicy - policyToEnroll = &serviceStateData.EnrollPolicy - logger.Debugf("Got current policy from file: %q - %q", policyCurrent.Name, policyCurrent.ID) - } else { - // Created a specific Agent Policy to enrolling purposes - // There are some issues when the stack is running for some time, - // agents cannot enroll with the default policy - // This enroll policy must be created even if independent Elastic Agents are not used. Agents created - // in Kubernetes or Custom Agents require this enroll policy too (service deployer). - logger.Debug("creating enroll policy...") - policyEnroll := kibana.Policy{ - Name: fmt.Sprintf("ep-test-system-enroll-%s-%s-%s-%s-%s", r.testFolder.Package, r.testFolder.DataStream, r.serviceVariant, r.configFileName, testTime), - Description: fmt.Sprintf("test policy created by elastic-package to enroll agent for data stream %s/%s", r.testFolder.Package, r.testFolder.DataStream), - Namespace: common.CreateTestRunID(), - } - - policyToEnroll, err = r.kibanaClient.CreatePolicy(ctx, policyEnroll) - if err != nil { - return nil, nil, nil, fmt.Errorf("could not create test policy: %w", err) - } - } - - r.deleteTestPolicyHandler = func(ctx context.Context) error { - // ensure that policyToEnroll policy gets deleted if the execution receives a signal - // before creating the test policy - // This handler is going to be redefined after creating the test policy - if r.runTestsOnly { - return nil - } - if err := r.kibanaClient.DeletePolicy(ctx, policyToEnroll.ID); err != nil { - return fmt.Errorf("error cleaning up test policy: %w", err) - } - return nil - } - - if r.runTearDown { - // required to assign the policy stored in the service state file - // so data stream related to this Agent Policy can be obtained (and deleted) - // in the cleanTestScenarioHandler handler - policyToTest = policyCurrent - } else { - // Create a specific Agent Policy just for testing this test. - // This allows us to ensure that the Agent Policy used for testing is - // assigned to the agent with all the required changes (e.g. Package DataStream) - logger.Debug("creating test policy...") - policy := kibana.Policy{ - Name: fmt.Sprintf("ep-test-system-%s-%s-%s-%s-%s", r.testFolder.Package, r.testFolder.DataStream, r.serviceVariant, r.configFileName, testTime), - Description: fmt.Sprintf("test policy created by elastic-package test system for data stream %s/%s", r.testFolder.Package, r.testFolder.DataStream), - Namespace: common.CreateTestRunID(), - } - // Assign the data_output_id to the agent policy to configure the output to logstash. The value is inferred from stack/_static/kibana.yml.tmpl - // TODO: Migrate from stack.logstash_enabled to the stack config. - if r.profile.Config("stack.logstash_enabled", "false") == "true" { - policy.DataOutputID = "fleet-logstash-output" - } - if stackConfig.OutputID != "" { - policy.DataOutputID = stackConfig.OutputID - } - policyToTest, err = r.kibanaClient.CreatePolicy(ctx, policy) - if err != nil { - return nil, nil, nil, fmt.Errorf("could not create test policy: %w", err) - } - } - - r.deleteTestPolicyHandler = func(ctx context.Context) error { - logger.Debug("deleting test policies...") - if err := r.kibanaClient.DeletePolicy(ctx, policyToTest.ID); err != nil { - return fmt.Errorf("error cleaning up test policy: %w", err) - } - if r.runTestsOnly { - return nil - } - if err := r.kibanaClient.DeletePolicy(ctx, policyToEnroll.ID); err != nil { - return fmt.Errorf("error cleaning up test policy: %w", err) - } - return nil - } - - return policyCurrent, policyToEnroll, policyToTest, nil -} - func (r *tester) buildIndexTemplateName(ds kibana.PackageDataStream, policyTemplate packages.PolicyTemplate, config *testConfig) string { // Input packages can set `data_stream.dataset` by convention to customize the dataset. dataStreamDataset := ds.Inputs[0].Streams[0].DataStream.Dataset From 8ae00435ed203021cf9b912688b1fabd4720a761 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 9 Sep 2025 14:46:15 +0200 Subject: [PATCH 05/15] Update package datastream - integration policy --- internal/testrunner/runners/system/tester.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/internal/testrunner/runners/system/tester.go b/internal/testrunner/runners/system/tester.go index 1215ed0d2..8cdeb9f01 100644 --- a/internal/testrunner/runners/system/tester.go +++ b/internal/testrunner/runners/system/tester.go @@ -1887,8 +1887,13 @@ func createInputPackageDatastream( config testConfig, suffix string, ) kibana.PackageDataStream { + dataset := fmt.Sprintf("%s-%s", pkg.Name, policyTemplate.Name) + if policyTemplate.Input == "otelcol" { + dataset = fmt.Sprintf("%s.otel", dataset) + } + r := kibana.PackageDataStream{ - Name: fmt.Sprintf("%s-%s-%s", pkg.Name, policyTemplate.Name, suffix), + Name: fmt.Sprintf("%s-%s", dataset, suffix), Namespace: kibanaPolicy.Namespace, PolicyID: kibanaPolicy.ID, Enabled: true, @@ -1901,16 +1906,13 @@ func createInputPackageDatastream( PolicyTemplate: policyTemplate.Name, Enabled: true, Vars: kibana.Vars{}, + Type: policyTemplate.Input, }, } - streamInput := policyTemplate.Input - r.Inputs[0].Type = streamInput - - dataset := fmt.Sprintf("%s.%s", pkg.Name, policyTemplate.Name) streams := []kibana.Stream{ { - ID: fmt.Sprintf("%s-%s.%s", streamInput, pkg.Name, policyTemplate.Name), + ID: fmt.Sprintf("%s-%s.%s", policyTemplate.Input, pkg.Name, policyTemplate.Name), Enabled: true, DataStream: kibana.DataStream{ Type: policyTemplate.Type, From eb1450bee413e0f5e94f115e68c470f70209c27b Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Tue, 9 Sep 2025 18:20:12 +0200 Subject: [PATCH 06/15] Add otel as suffic for dataset --- internal/testrunner/runners/system/tester.go | 27 +++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/internal/testrunner/runners/system/tester.go b/internal/testrunner/runners/system/tester.go index 8cdeb9f01..c75a07fc4 100644 --- a/internal/testrunner/runners/system/tester.go +++ b/internal/testrunner/runners/system/tester.go @@ -88,6 +88,9 @@ const ( ServiceLogsAgentDir = "/tmp/service_logs" waitForDataDefaultTimeout = 10 * time.Minute + + otelCollectorInputName = "otelcol" + otelSuffixDataset = "otel" ) type logsRegexp struct { @@ -943,6 +946,7 @@ type scenarioTest struct { dataStream string indexTemplateName string policyTemplateName string + policyTemplateInput string kibanaDataStream kibana.PackageDataStream syntheticEnabled bool docs []common.MapStr @@ -1007,6 +1011,8 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC return nil, fmt.Errorf("failed to find the selected policy_template: %w", err) } + scenario.policyTemplateInput = policyTemplate.Input + // Configure package (single data stream) via Fleet APIs. testTime := time.Now().Format("20060102T15:04:05Z") var policyToTest, policyCurrent, policyToEnroll *kibana.Policy @@ -1327,8 +1333,8 @@ func (r *tester) buildIndexTemplateName(ds kibana.PackageDataStream, policyTempl if dataset, ok := v.(string); ok && dataset != "" { dataStreamDataset = dataset } - if policyTemplate.Input == "otelcol" { - dataStreamDataset = fmt.Sprintf("%s.otel", dataStreamDataset) + if policyTemplate.Input == otelCollectorInputName { + dataStreamDataset = fmt.Sprintf("%s.%s", dataStreamDataset, otelSuffixDataset) } } indexTemplateName := fmt.Sprintf( @@ -1586,7 +1592,13 @@ func (r *tester) validateTestScenario(ctx context.Context, result *testrunner.Re if ds := r.testFolder.DataStream; ds != "" { expectedDataset = getDataStreamDataset(*r.pkgManifest, *r.dataStreamManifest) } else { + // Input packages without data stream use the policy template name as dataset expectedDataset = r.pkgManifest.Name + "." + scenario.policyTemplateName + // Special case for opentelemetry package + if scenario.policyTemplateInput == otelCollectorInputName { + expectedDataset += "." + otelSuffixDataset + } + logger.Infof("No data stream defined, using policy template name as dataset: %s", expectedDataset) } expectedDatasets = []string{expectedDataset} } @@ -1887,13 +1899,16 @@ func createInputPackageDatastream( config testConfig, suffix string, ) kibana.PackageDataStream { - dataset := fmt.Sprintf("%s-%s", pkg.Name, policyTemplate.Name) - if policyTemplate.Input == "otelcol" { - dataset = fmt.Sprintf("%s.otel", dataset) + policyName := fmt.Sprintf("%s-%s", pkg.Name, policyTemplate.Name) + dataset := fmt.Sprintf("%s.%s", pkg.Name, policyTemplate.Name) + + if policyTemplate.Input == otelCollectorInputName { + dataset = fmt.Sprintf("%s.%s", dataset, otelSuffixDataset) + policyName = fmt.Sprintf("%s.%s", policyName, otelSuffixDataset) } r := kibana.PackageDataStream{ - Name: fmt.Sprintf("%s-%s", dataset, suffix), + Name: fmt.Sprintf("%s-%s", policyName, suffix), Namespace: kibanaPolicy.Namespace, PolicyID: kibanaPolicy.ID, Enabled: true, From 6fe40ebb4ffc02b760a0255df501a101f2040158 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Wed, 10 Sep 2025 11:39:33 +0200 Subject: [PATCH 07/15] Keep package datastream / integration policy with the previous values --- internal/testrunner/runners/system/tester.go | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/internal/testrunner/runners/system/tester.go b/internal/testrunner/runners/system/tester.go index c75a07fc4..2d98a9ea3 100644 --- a/internal/testrunner/runners/system/tester.go +++ b/internal/testrunner/runners/system/tester.go @@ -1899,16 +1899,8 @@ func createInputPackageDatastream( config testConfig, suffix string, ) kibana.PackageDataStream { - policyName := fmt.Sprintf("%s-%s", pkg.Name, policyTemplate.Name) - dataset := fmt.Sprintf("%s.%s", pkg.Name, policyTemplate.Name) - - if policyTemplate.Input == otelCollectorInputName { - dataset = fmt.Sprintf("%s.%s", dataset, otelSuffixDataset) - policyName = fmt.Sprintf("%s.%s", policyName, otelSuffixDataset) - } - r := kibana.PackageDataStream{ - Name: fmt.Sprintf("%s-%s", policyName, suffix), + Name: fmt.Sprintf("%s-%s-%s", pkg.Name, policyTemplate.Name, suffix), Namespace: kibanaPolicy.Namespace, PolicyID: kibanaPolicy.ID, Enabled: true, @@ -1925,6 +1917,7 @@ func createInputPackageDatastream( }, } + dataset := fmt.Sprintf("%s.%s", pkg.Name, policyTemplate.Name) streams := []kibana.Stream{ { ID: fmt.Sprintf("%s-%s.%s", policyTemplate.Input, pkg.Name, policyTemplate.Name), From 2bfebb86078cfe84ebdbbc877f307f1663af4bf2 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Wed, 10 Sep 2025 13:05:04 +0200 Subject: [PATCH 08/15] Enable system test for httpcheck package --- .../httpcheck/_dev/test/system/test-local-config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/packages/parallel/httpcheck/_dev/test/system/test-local-config.yml b/test/packages/parallel/httpcheck/_dev/test/system/test-local-config.yml index 918e1b323..6afd21786 100644 --- a/test/packages/parallel/httpcheck/_dev/test/system/test-local-config.yml +++ b/test/packages/parallel/httpcheck/_dev/test/system/test-local-config.yml @@ -1,6 +1,6 @@ -skip: - reason: Not supported system tests with input type otelcol. - link: https://github.com/elastic/elastic-package/issues/2835 +# skip: +# reason: Not supported system tests with input type otelcol. +# link: https://github.com/elastic/elastic-package/issues/2835 service: web vars: period: 1s From 82f082fbcd52a2ea1c8980b0e66369380e0c1d32 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Wed, 10 Sep 2025 17:41:32 +0200 Subject: [PATCH 09/15] httpcheck - Added field definitions --- .../parallel/httpcheck/fields/fields.yml | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 test/packages/parallel/httpcheck/fields/fields.yml diff --git a/test/packages/parallel/httpcheck/fields/fields.yml b/test/packages/parallel/httpcheck/fields/fields.yml new file mode 100644 index 000000000..7b27cbfbb --- /dev/null +++ b/test/packages/parallel/httpcheck/fields/fields.yml @@ -0,0 +1,49 @@ +- name: "_metric_names_hash" + type: string +- name: "attributes.http" + type: group + fields: + - name: method + type: keyword + - name: status_class + type: keyword + - name: status_code + type: long + - name: url + type: string +- name: "http" + type: group + fields: + - name: method + type: keyword + - name: status_class + type: keyword + - name: status_code + type: long + - name: url + type: string +- name: httpcheck + type: group + fields: + - name: duration + type: long + - name: status + type: long +- name: metrics.httpcheck + type: group + fields: + - name: duration + type: long + - name: status + type: long +- name: scope + type: group + fields: + - name: name + type: string + - name: version + type: string +- name: start_timestamp + type: date +- name: unit + type: string From 0a5db1baee60db9be1eb3dd5fc66bd6347999109 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Wed, 10 Sep 2025 18:22:34 +0200 Subject: [PATCH 10/15] httpcheck - replace string by keyword type --- test/packages/parallel/httpcheck/fields/fields.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/packages/parallel/httpcheck/fields/fields.yml b/test/packages/parallel/httpcheck/fields/fields.yml index 7b27cbfbb..8cd5061b8 100644 --- a/test/packages/parallel/httpcheck/fields/fields.yml +++ b/test/packages/parallel/httpcheck/fields/fields.yml @@ -1,5 +1,5 @@ - name: "_metric_names_hash" - type: string + type: keyword - name: "attributes.http" type: group fields: @@ -10,7 +10,7 @@ - name: status_code type: long - name: url - type: string + type: keyword - name: "http" type: group fields: @@ -21,7 +21,7 @@ - name: status_code type: long - name: url - type: string + type: keyword - name: httpcheck type: group fields: @@ -40,10 +40,10 @@ type: group fields: - name: name - type: string + type: keyword - name: version - type: string + type: keyword - name: start_timestamp type: date - name: unit - type: string + type: keyword From 68d15da4f0dbf753d4d370631b931c9414403881 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Fri, 12 Sep 2025 16:32:09 +0200 Subject: [PATCH 11/15] Update comments --- internal/testrunner/runners/system/tester.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/internal/testrunner/runners/system/tester.go b/internal/testrunner/runners/system/tester.go index ab61de048..121e42544 100644 --- a/internal/testrunner/runners/system/tester.go +++ b/internal/testrunner/runners/system/tester.go @@ -1607,13 +1607,14 @@ func (r *tester) validateTestScenario(ctx context.Context, result *testrunner.Re if ds := r.testFolder.DataStream; ds != "" { expectedDataset = getDataStreamDataset(*r.pkgManifest, *r.dataStreamManifest) } else { - // Input packages without data stream use the policy template name as dataset + // If there is no data stream, then these packages are input packages and + // it is used the policy template name as part of the dataset expectedDataset = r.pkgManifest.Name + "." + scenario.policyTemplateName - // Special case for opentelemetry package if scenario.policyTemplateInput == otelCollectorInputName { + // Input packages whose input is `otelcol` must add the `.otel` suffix + // Example: httpcheck.metrics.otel expectedDataset += "." + otelSuffixDataset } - logger.Infof("No data stream defined, using policy template name as dataset: %s", expectedDataset) } expectedDatasets = []string{expectedDataset} } From fcc9f7185a26ae709045143dd9f67c41e1d8e9b5 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Thu, 18 Sep 2025 15:51:09 +0200 Subject: [PATCH 12/15] Skip some OTEL fields - to be validated --- internal/fields/validate.go | 55 ++++++++++++++++ internal/testrunner/runners/system/tester.go | 1 + .../parallel/httpcheck/fields/fields.yml | 62 +++++++++---------- 3 files changed, 87 insertions(+), 31 deletions(-) diff --git a/internal/fields/validate.go b/internal/fields/validate.go index fd4ca46f3..4835eb0e1 100644 --- a/internal/fields/validate.go +++ b/internal/fields/validate.go @@ -154,6 +154,8 @@ type Validator struct { disabledNormalization bool + enabledOTELValidation bool + injectFieldsOptions InjectFieldsOptions } @@ -246,6 +248,13 @@ func WithInjectFieldsOptions(options InjectFieldsOptions) ValidatorOption { } } +func WithOTELValidation(enabled bool) ValidatorOption { + return func(v *Validator) error { + v.enabledOTELValidation = enabled + return nil + } +} + type packageRootFinder interface { FindPackageRoot() (string, bool, error) } @@ -690,6 +699,8 @@ func (v *Validator) validateScalarElement(key string, val any, doc common.MapStr switch { case skipValidationForField(key): return nil // generic field, let's skip validation for now + case v.enabledOTELValidation && skipValidationForOTELField(key): + return nil // generic OTEL field, let's skip validation for now case isFlattenedSubfield(key, v.Schema): return nil // flattened subfield, it will be stored as member of the flattened ancestor. case isArrayOfObjects(val): @@ -831,6 +842,50 @@ func skipValidationForField(key string) bool { isFieldFamilyMatching("event.module", key) // field is deprecated } +func skipValidationForOTELField(key string) bool { + // TODO: This list of fields to be skipped should be validated + return isFieldFamilyMatching("scope.name", key) || + isFieldFamilyMatching("scope.version", key) || + isFieldFamilyMatching("scope.schema_url", key) || + isFieldFamilyMatching("scope.dropped_attributes_count", key) || + isFieldFamilyMatching("scope.attributes", key) || + isFieldFamilyMatching("dropped_attributes_count", key) || + isFieldFamilyMatching("resource.schema_url", key) || + isFieldFamilyMatching("resource.dropped_attributes_count", key) || + isFieldFamilyMatching("resource.attributes", key) || + isFieldFamilyMatching("attributes", key) || + // common metrics + isFieldFamilyMatching("start_timestamp", key) || + isFieldFamilyMatching("unit", key) || + isFieldFamilyMatching("_metric_names_hash", key) || + isFieldFamilyMatching("metrics", key) || + // common logs + isFieldFamilyMatching("observed_timestamp", key) || + isFieldFamilyMatching("trace_id", key) || + isFieldFamilyMatching("trace.id", key) || + isFieldFamilyMatching("span_id", key) || + isFieldFamilyMatching("span.id", key) || + isFieldFamilyMatching("severity_number", key) || + isFieldFamilyMatching("severity_text", key) || + isFieldFamilyMatching("log.level", key) || + isFieldFamilyMatching("body", key) || + isFieldFamilyMatching("event_name", key) || + isFieldFamilyMatching("error", key) || + // common traces + isFieldFamilyMatching("dropped_events_count", key) || + isFieldFamilyMatching("parent_span_id", key) || + isFieldFamilyMatching("span.name", key) || + isFieldFamilyMatching("trace_state", key) || + isFieldFamilyMatching("kind", key) || + isFieldFamilyMatching("dropped_links_count", key) || + isFieldFamilyMatching("duration", key) || + isFieldFamilyMatching("name", key) || + isFieldFamilyMatching("parent.id", key) || + isFieldFamilyMatching("links", key) || + isFieldFamilyMatching("status.code", key) || + isFieldFamilyMatching("status.message", key) +} + // skipLeafOfObject checks if the element is a child of an object that was skipped in some previous // version of the spec. This is relevant in documents that store fields without subobjects. func skipLeafOfObject(root, name string, specVersion semver.Version, schema []FieldDefinition) bool { diff --git a/internal/testrunner/runners/system/tester.go b/internal/testrunner/runners/system/tester.go index 121e42544..49b85bacf 100644 --- a/internal/testrunner/runners/system/tester.go +++ b/internal/testrunner/runners/system/tester.go @@ -1632,6 +1632,7 @@ func (r *tester) validateTestScenario(ctx context.Context, result *testrunner.Re fields.WithExpectedDatasets(expectedDatasets), fields.WithEnabledImportAllECSSChema(true), fields.WithDisableNormalization(scenario.syntheticEnabled), + fields.WithOTELValidation(r.pkgManifest.Type == "input" && scenario.policyTemplateInput == otelCollectorInputName), ) if err != nil { return result.WithErrorf("creating fields validator for data stream failed (path: %s): %w", r.dataStreamPath, err) diff --git a/test/packages/parallel/httpcheck/fields/fields.yml b/test/packages/parallel/httpcheck/fields/fields.yml index 8cd5061b8..a3b22f433 100644 --- a/test/packages/parallel/httpcheck/fields/fields.yml +++ b/test/packages/parallel/httpcheck/fields/fields.yml @@ -1,16 +1,16 @@ -- name: "_metric_names_hash" - type: keyword -- name: "attributes.http" - type: group - fields: - - name: method - type: keyword - - name: status_class - type: keyword - - name: status_code - type: long - - name: url - type: keyword +# - name: "_metric_names_hash" +# type: keyword +# - name: "attributes.http" +# type: group +# fields: +# - name: method +# type: keyword +# - name: status_class +# type: keyword +# - name: status_code +# type: long +# - name: url +# type: keyword - name: "http" type: group fields: @@ -29,21 +29,21 @@ type: long - name: status type: long -- name: metrics.httpcheck - type: group - fields: - - name: duration - type: long - - name: status - type: long -- name: scope - type: group - fields: - - name: name - type: keyword - - name: version - type: keyword -- name: start_timestamp - type: date -- name: unit - type: keyword +# - name: metrics.httpcheck +# type: group +# fields: +# - name: duration +# type: long +# - name: status +# type: long +# - name: scope +# type: group +# fields: +# - name: name +# type: keyword +# - name: version +# type: keyword +# - name: start_timestamp +# type: date +# - name: unit +# type: keyword From c70169d92040814fe097783ea2d4af3ec0d51018 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Thu, 18 Sep 2025 16:33:14 +0200 Subject: [PATCH 13/15] Update index template and data stream names for system tests --- internal/testrunner/runners/system/tester.go | 26 ++++++++++++-------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/internal/testrunner/runners/system/tester.go b/internal/testrunner/runners/system/tester.go index 49b85bacf..ae395645e 100644 --- a/internal/testrunner/runners/system/tester.go +++ b/internal/testrunner/runners/system/tester.go @@ -1068,12 +1068,8 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC } scenario.kibanaDataStream = ds - scenario.indexTemplateName = r.buildIndexTemplateName(ds, policyTemplate, config) - scenario.dataStream = fmt.Sprintf( - "%s-%s", - scenario.indexTemplateName, - ds.Namespace, - ) + scenario.indexTemplateName = r.buildIndexTemplateName(ds, config) + scenario.dataStream = r.buildDataStreamName(scenario.indexTemplateName, ds.Namespace, policyTemplate) r.cleanTestScenarioHandler = func(ctx context.Context) error { logger.Debugf("Deleting data stream for testing %s", scenario.dataStream) @@ -1240,7 +1236,7 @@ func (r *tester) prepareScenario(ctx context.Context, config *testConfig, stackC return &scenario, nil } -func (r *tester) buildIndexTemplateName(ds kibana.PackageDataStream, policyTemplate packages.PolicyTemplate, config *testConfig) string { +func (r *tester) buildIndexTemplateName(ds kibana.PackageDataStream, config *testConfig) string { // Input packages can set `data_stream.dataset` by convention to customize the dataset. dataStreamDataset := ds.Inputs[0].Streams[0].DataStream.Dataset if r.pkgManifest.Type == "input" { @@ -1248,9 +1244,6 @@ func (r *tester) buildIndexTemplateName(ds kibana.PackageDataStream, policyTempl if dataset, ok := v.(string); ok && dataset != "" { dataStreamDataset = dataset } - if policyTemplate.Input == otelCollectorInputName { - dataStreamDataset = fmt.Sprintf("%s.%s", dataStreamDataset, otelSuffixDataset) - } } indexTemplateName := fmt.Sprintf( "%s-%s", @@ -1260,6 +1253,19 @@ func (r *tester) buildIndexTemplateName(ds kibana.PackageDataStream, policyTempl return indexTemplateName } +func (r *tester) buildDataStreamName(indexTemplateName, namespace string, policyTemplate packages.PolicyTemplate) string { + if r.pkgManifest.Type == "input" && policyTemplate.Input == otelCollectorInputName { + indexTemplateName = fmt.Sprintf("%s.%s", indexTemplateName, otelSuffixDataset) + } + + dataStreamName := fmt.Sprintf( + "%s-%s", + indexTemplateName, + namespace, + ) + return dataStreamName +} + // createOrGetKibanaPolicies creates the Kibana policies required for testing. // It creates two policies, one for enrolling the agent (policyToEnroll) and another one // for testing purposes (policyToTest) where the package data stream is added. From 947cb6ac21efcf161c435823f969e7c2bf1deb25 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Mon, 22 Sep 2025 12:54:59 +0200 Subject: [PATCH 14/15] Skip validation per fields in OTEL collector input --- internal/testrunner/runners/system/tester.go | 30 ++++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/internal/testrunner/runners/system/tester.go b/internal/testrunner/runners/system/tester.go index ae395645e..198a93fd0 100644 --- a/internal/testrunner/runners/system/tester.go +++ b/internal/testrunner/runners/system/tester.go @@ -145,6 +145,7 @@ var ( type fieldValidationMethod int const ( + // Required to allow setting `fields` as an option via environment variable fieldsMethod fieldValidationMethod = iota mappingsMethod ) @@ -1644,14 +1645,18 @@ func (r *tester) validateTestScenario(ctx context.Context, result *testrunner.Re return result.WithErrorf("creating fields validator for data stream failed (path: %s): %w", r.dataStreamPath, err) } - if errs := validateFields(scenario.docs, fieldsValidator); len(errs) > 0 { - return result.WithError(testrunner.ErrTestCaseFailed{ - Reason: fmt.Sprintf("one or more errors found in documents stored in %s data stream", scenario.dataStream), - Details: errs.Error(), - }) + if r.isTestUsingOTELCollectorInput(scenario) { + logger.Debug("Skip field validation for OTEL Collector input") + } else { + if errs := validateFields(scenario.docs, fieldsValidator); len(errs) > 0 { + return result.WithError(testrunner.ErrTestCaseFailed{ + Reason: fmt.Sprintf("one or more errors found in documents stored in %s data stream", scenario.dataStream), + Details: errs.Error(), + }) + } } - if r.fieldValidationMethod == mappingsMethod { + if r.isTestUsingOTELCollectorInput(scenario) || r.fieldValidationMethod == mappingsMethod { logger.Debug("Performing validation based on mappings") exceptionFields := listExceptionFields(scenario.docs, fieldsValidator) @@ -1777,6 +1782,19 @@ func (r *tester) runTest(ctx context.Context, config *testConfig, stackConfig st return r.validateTestScenario(ctx, result, scenario, config) } +func (r *tester) isTestUsingOTELCollectorInput(scenario *scenarioTest) bool { + // Just supported for input packages currently + if r.pkgManifest.Type != "input" { + return false + } + + if scenario.policyTemplateInput != otelCollectorInputName { + return false + } + + return true +} + func dumpScenarioDocs(docs any) error { timestamp := time.Now().Format("20060102150405") path := filepath.Join(os.TempDir(), fmt.Sprintf("elastic-package-test-docs-dump-%s.json", timestamp)) From cc93829c8122c1d174a6b29081e3cf8b7cfa8457 Mon Sep 17 00:00:00 2001 From: Mario Rodriguez Molins Date: Mon, 22 Sep 2025 12:56:14 +0200 Subject: [PATCH 15/15] Remove skip fields for OTEL Packages using OTEL collector input will perform the validation based on the mappings found before and after ingesting documents. --- internal/fields/validate.go | 55 -------------------- internal/testrunner/runners/system/tester.go | 1 - 2 files changed, 56 deletions(-) diff --git a/internal/fields/validate.go b/internal/fields/validate.go index 4835eb0e1..fd4ca46f3 100644 --- a/internal/fields/validate.go +++ b/internal/fields/validate.go @@ -154,8 +154,6 @@ type Validator struct { disabledNormalization bool - enabledOTELValidation bool - injectFieldsOptions InjectFieldsOptions } @@ -248,13 +246,6 @@ func WithInjectFieldsOptions(options InjectFieldsOptions) ValidatorOption { } } -func WithOTELValidation(enabled bool) ValidatorOption { - return func(v *Validator) error { - v.enabledOTELValidation = enabled - return nil - } -} - type packageRootFinder interface { FindPackageRoot() (string, bool, error) } @@ -699,8 +690,6 @@ func (v *Validator) validateScalarElement(key string, val any, doc common.MapStr switch { case skipValidationForField(key): return nil // generic field, let's skip validation for now - case v.enabledOTELValidation && skipValidationForOTELField(key): - return nil // generic OTEL field, let's skip validation for now case isFlattenedSubfield(key, v.Schema): return nil // flattened subfield, it will be stored as member of the flattened ancestor. case isArrayOfObjects(val): @@ -842,50 +831,6 @@ func skipValidationForField(key string) bool { isFieldFamilyMatching("event.module", key) // field is deprecated } -func skipValidationForOTELField(key string) bool { - // TODO: This list of fields to be skipped should be validated - return isFieldFamilyMatching("scope.name", key) || - isFieldFamilyMatching("scope.version", key) || - isFieldFamilyMatching("scope.schema_url", key) || - isFieldFamilyMatching("scope.dropped_attributes_count", key) || - isFieldFamilyMatching("scope.attributes", key) || - isFieldFamilyMatching("dropped_attributes_count", key) || - isFieldFamilyMatching("resource.schema_url", key) || - isFieldFamilyMatching("resource.dropped_attributes_count", key) || - isFieldFamilyMatching("resource.attributes", key) || - isFieldFamilyMatching("attributes", key) || - // common metrics - isFieldFamilyMatching("start_timestamp", key) || - isFieldFamilyMatching("unit", key) || - isFieldFamilyMatching("_metric_names_hash", key) || - isFieldFamilyMatching("metrics", key) || - // common logs - isFieldFamilyMatching("observed_timestamp", key) || - isFieldFamilyMatching("trace_id", key) || - isFieldFamilyMatching("trace.id", key) || - isFieldFamilyMatching("span_id", key) || - isFieldFamilyMatching("span.id", key) || - isFieldFamilyMatching("severity_number", key) || - isFieldFamilyMatching("severity_text", key) || - isFieldFamilyMatching("log.level", key) || - isFieldFamilyMatching("body", key) || - isFieldFamilyMatching("event_name", key) || - isFieldFamilyMatching("error", key) || - // common traces - isFieldFamilyMatching("dropped_events_count", key) || - isFieldFamilyMatching("parent_span_id", key) || - isFieldFamilyMatching("span.name", key) || - isFieldFamilyMatching("trace_state", key) || - isFieldFamilyMatching("kind", key) || - isFieldFamilyMatching("dropped_links_count", key) || - isFieldFamilyMatching("duration", key) || - isFieldFamilyMatching("name", key) || - isFieldFamilyMatching("parent.id", key) || - isFieldFamilyMatching("links", key) || - isFieldFamilyMatching("status.code", key) || - isFieldFamilyMatching("status.message", key) -} - // skipLeafOfObject checks if the element is a child of an object that was skipped in some previous // version of the spec. This is relevant in documents that store fields without subobjects. func skipLeafOfObject(root, name string, specVersion semver.Version, schema []FieldDefinition) bool { diff --git a/internal/testrunner/runners/system/tester.go b/internal/testrunner/runners/system/tester.go index 198a93fd0..5937c11e2 100644 --- a/internal/testrunner/runners/system/tester.go +++ b/internal/testrunner/runners/system/tester.go @@ -1639,7 +1639,6 @@ func (r *tester) validateTestScenario(ctx context.Context, result *testrunner.Re fields.WithExpectedDatasets(expectedDatasets), fields.WithEnabledImportAllECSSChema(true), fields.WithDisableNormalization(scenario.syntheticEnabled), - fields.WithOTELValidation(r.pkgManifest.Type == "input" && scenario.policyTemplateInput == otelCollectorInputName), ) if err != nil { return result.WithErrorf("creating fields validator for data stream failed (path: %s): %w", r.dataStreamPath, err)