From e49b05efb3c206963e8056d4737d48d491479404 Mon Sep 17 00:00:00 2001 From: Daniel Jaglowski Date: Wed, 23 Oct 2024 19:52:24 -0400 Subject: [PATCH] [connector/routing] Fix issue where conditions were not deduplicated properly (#35962) --- .chloggen/routing-tests-golden.yaml | 27 ++++ connector/routingconnector/config_test.go | 8 +- connector/routingconnector/logs_test.go | 92 ++++++++++++ connector/routingconnector/router.go | 32 ++-- .../{config_logs.yaml => config/logs.yaml} | 0 .../metrics.yaml} | 0 .../traces.yaml} | 0 .../all_match_first_only/config.yaml | 10 ++ .../all_match_first_only/input.yaml | 141 ++++++++++++++++++ .../all_match_first_only/sink_0.yaml | 141 ++++++++++++++++++ .../all_match_last_only/config.yaml | 10 ++ .../all_match_last_only/input.yaml | 141 ++++++++++++++++++ .../all_match_last_only/sink_1.yaml | 141 ++++++++++++++++++ .../all_match_once/config.yaml | 11 ++ .../all_match_once/input.yaml | 141 ++++++++++++++++++ .../all_match_once/sink_0.yaml | 141 ++++++++++++++++++ .../each_matches_one/config.yaml | 10 ++ .../each_matches_one/input.yaml | 141 ++++++++++++++++++ .../each_matches_one/sink_0.yaml | 71 +++++++++ .../each_matches_one/sink_1.yaml | 71 +++++++++ .../match_none_with_default/config.yaml | 10 ++ .../match_none_with_default/input.yaml | 141 ++++++++++++++++++ .../match_none_with_default/sink_default.yaml | 141 ++++++++++++++++++ .../match_none_without_default/config.yaml | 10 ++ .../match_none_without_default/input.yaml | 141 ++++++++++++++++++ 25 files changed, 1749 insertions(+), 23 deletions(-) create mode 100644 .chloggen/routing-tests-golden.yaml rename connector/routingconnector/testdata/{config_logs.yaml => config/logs.yaml} (100%) rename connector/routingconnector/testdata/{config_metrics.yaml => config/metrics.yaml} (100%) rename connector/routingconnector/testdata/{config_traces.yaml => config/traces.yaml} (100%) create mode 100644 connector/routingconnector/testdata/logs/resource_context/all_match_first_only/config.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/all_match_first_only/input.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/all_match_first_only/sink_0.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/all_match_last_only/config.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/all_match_last_only/input.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/all_match_last_only/sink_1.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/all_match_once/config.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/all_match_once/input.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/all_match_once/sink_0.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/each_matches_one/config.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/each_matches_one/input.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/each_matches_one/sink_0.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/each_matches_one/sink_1.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/match_none_with_default/config.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/match_none_with_default/input.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/match_none_with_default/sink_default.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/match_none_without_default/config.yaml create mode 100644 connector/routingconnector/testdata/logs/resource_context/match_none_without_default/input.yaml diff --git a/.chloggen/routing-tests-golden.yaml b/.chloggen/routing-tests-golden.yaml new file mode 100644 index 000000000000..2bfc50b3f64d --- /dev/null +++ b/.chloggen/routing-tests-golden.yaml @@ -0,0 +1,27 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: bug_fix + +# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver) +component: connector/routing + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Fix detection of duplicate conditions in routing table. + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [35962] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: + +# If your change doesn't affect end users or the exported elements of any package, +# you should instead start your pull request title with [chore] or use the "Skip Changelog" label. +# Optional: The change log or logs in which this entry should be included. +# e.g. '[user]' or '[user, api]' +# Include 'user' if the change is relevant to end users. +# Include 'api' if there is a change to a library API. +# Default: '[user]' +change_logs: [] diff --git a/connector/routingconnector/config_test.go b/connector/routingconnector/config_test.go index 1beb6bd44638..5f3514f76e4d 100644 --- a/connector/routingconnector/config_test.go +++ b/connector/routingconnector/config_test.go @@ -24,7 +24,7 @@ func TestLoadConfig(t *testing.T) { expected component.Config }{ { - configPath: "config_traces.yaml", + configPath: filepath.Join("testdata", "config", "traces.yaml"), id: component.NewIDWithName(metadata.Type, ""), expected: &Config{ DefaultPipelines: []pipeline.ID{ @@ -49,7 +49,7 @@ func TestLoadConfig(t *testing.T) { }, }, { - configPath: "config_metrics.yaml", + configPath: filepath.Join("testdata", "config", "metrics.yaml"), id: component.NewIDWithName(metadata.Type, ""), expected: &Config{ DefaultPipelines: []pipeline.ID{ @@ -74,7 +74,7 @@ func TestLoadConfig(t *testing.T) { }, }, { - configPath: "config_logs.yaml", + configPath: filepath.Join("testdata", "config", "logs.yaml"), id: component.NewIDWithName(metadata.Type, ""), expected: &Config{ DefaultPipelines: []pipeline.ID{ @@ -102,7 +102,7 @@ func TestLoadConfig(t *testing.T) { for _, tt := range testcases { t.Run(tt.configPath, func(t *testing.T) { - cm, err := confmaptest.LoadConf(filepath.Join("testdata", tt.configPath)) + cm, err := confmaptest.LoadConf(tt.configPath) require.NoError(t, err) factory := NewFactory() diff --git a/connector/routingconnector/logs_test.go b/connector/routingconnector/logs_test.go index ee450a17e4a9..344aa01e07ba 100644 --- a/connector/routingconnector/logs_test.go +++ b/connector/routingconnector/logs_test.go @@ -5,17 +5,24 @@ package routingconnector // import "github.com/open-telemetry/opentelemetry-coll import ( "context" + "os" + "path/filepath" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/confmap/confmaptest" "go.opentelemetry.io/collector/connector" "go.opentelemetry.io/collector/connector/connectortest" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/consumer/consumertest" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/pipeline" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden" + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/plogtest" ) func TestLogsRegisterConsumersForValidRoute(t *testing.T) { @@ -465,3 +472,88 @@ func TestLogsConnectorCapabilities(t *testing.T) { require.NoError(t, err) assert.False(t, conn.Capabilities().MutatesData) } + +func TestLogsConnectorDetailed(t *testing.T) { + testCases := []string{ + filepath.Join("testdata", "logs", "resource_context", "all_match_first_only"), + filepath.Join("testdata", "logs", "resource_context", "all_match_last_only"), + filepath.Join("testdata", "logs", "resource_context", "all_match_once"), + filepath.Join("testdata", "logs", "resource_context", "each_matches_one"), + filepath.Join("testdata", "logs", "resource_context", "match_none_with_default"), + filepath.Join("testdata", "logs", "resource_context", "match_none_without_default"), + } + + for _, tt := range testCases { + t.Run(tt, func(t *testing.T) { + + cm, err := confmaptest.LoadConf(filepath.Join(tt, "config.yaml")) + require.NoError(t, err) + factory := NewFactory() + cfg := factory.CreateDefaultConfig() + sub, err := cm.Sub("routing") + require.NoError(t, err) + require.NoError(t, sub.Unmarshal(cfg)) + require.NoError(t, component.ValidateConfig(cfg)) + + var sinkDefault, sink0, sink1 consumertest.LogsSink + router := connector.NewLogsRouter(map[pipeline.ID]consumer.Logs{ + pipeline.NewIDWithName(pipeline.SignalLogs, "default"): &sinkDefault, + pipeline.NewIDWithName(pipeline.SignalLogs, "0"): &sink0, + pipeline.NewIDWithName(pipeline.SignalLogs, "1"): &sink1, + }) + + conn, err := factory.CreateLogsToLogs( + context.Background(), + connectortest.NewNopSettings(), + cfg, + router.(consumer.Logs), + ) + require.NoError(t, err) + + var expected0, expected1, expectedDefault *plog.Logs + if expected, readErr := golden.ReadLogs(filepath.Join(tt, "sink_0.yaml")); readErr == nil { + expected0 = &expected + } else if !os.IsNotExist(readErr) { + t.Fatalf("Error reading sink_0.yaml: %v", readErr) + } + + if expected, readErr := golden.ReadLogs(filepath.Join(tt, "sink_1.yaml")); readErr == nil { + expected1 = &expected + } else if !os.IsNotExist(readErr) { + t.Fatalf("Error reading sink_1.yaml: %v", readErr) + } + + if expected, readErr := golden.ReadLogs(filepath.Join(tt, "sink_default.yaml")); readErr == nil { + expectedDefault = &expected + } else if !os.IsNotExist(readErr) { + t.Fatalf("Error reading sink_default.yaml: %v", readErr) + } + + input, readErr := golden.ReadLogs(filepath.Join(tt, "input.yaml")) + require.NoError(t, readErr) + + require.NoError(t, conn.ConsumeLogs(context.Background(), input)) + + if expected0 == nil { + assert.Empty(t, sink0.AllLogs(), "sink0 should be empty") + } else { + require.Len(t, sink0.AllLogs(), 1, "sink0 should have one plog.Logs") + assert.NoError(t, plogtest.CompareLogs(*expected0, sink0.AllLogs()[0]), "sink0 has unexpected result") + } + + if expected1 == nil { + assert.Empty(t, sink1.AllLogs(), "sink1 should be empty") + } else { + require.Len(t, sink1.AllLogs(), 1, "sink1 should have one plog.Logs") + assert.NoError(t, plogtest.CompareLogs(*expected1, sink1.AllLogs()[0]), "sink1 has unexpected result") + } + + if expectedDefault == nil { + assert.Empty(t, sinkDefault.AllLogs(), "sinkDefault should be empty") + } else { + require.Len(t, sinkDefault.AllLogs(), 1, "sinkDefault should have one plog.Logs") + assert.NoError(t, plogtest.CompareLogs(*expectedDefault, sinkDefault.AllLogs()[0]), "sinkDefault has unexpected result") + } + }) + } +} diff --git a/connector/routingconnector/router.go b/connector/routingconnector/router.go index aef71a743e39..d9cc906b3564 100644 --- a/connector/routingconnector/router.go +++ b/connector/routingconnector/router.go @@ -83,6 +83,8 @@ func (r *router[C]) registerConsumers(defaultPipelineIDs []pipeline.ID) error { return err } + r.normalizeConditions() + // register pipelines for each route err = r.registerRouteConsumers() if err != nil { @@ -109,11 +111,21 @@ func (r *router[C]) registerDefaultConsumer(pipelineIDs []pipeline.ID) error { return nil } +// convert conditions to statements +func (r *router[C]) normalizeConditions() { + for i := range r.table { + item := &r.table[i] + if item.Condition != "" { + item.Statement = fmt.Sprintf("route() where %s", item.Condition) + } + } +} + // registerRouteConsumers registers a consumer for the pipelines configured // for each route func (r *router[C]) registerRouteConsumers() error { for _, item := range r.table { - statement, err := r.getStatementFrom(item) + statement, err := r.parser.ParseStatement(item.Statement) if err != nil { return err } @@ -144,24 +156,6 @@ func (r *router[C]) registerRouteConsumers() error { return nil } -// getStatementFrom builds a routing OTTL statement from the provided -// routing table entry configuration. If the routing table entry configuration -// does not contain a valid OTTL statement then nil is returned. -func (r *router[C]) getStatementFrom(item RoutingTableItem) (*ottl.Statement[ottlresource.TransformContext], error) { - var statement *ottl.Statement[ottlresource.TransformContext] - if item.Condition != "" { - item.Statement = fmt.Sprintf("route() where %s", item.Condition) - } - if item.Statement != "" { - var err error - statement, err = r.parser.ParseStatement(item.Statement) - if err != nil { - return statement, err - } - } - return statement, nil -} - func key(entry RoutingTableItem) string { return entry.Statement } diff --git a/connector/routingconnector/testdata/config_logs.yaml b/connector/routingconnector/testdata/config/logs.yaml similarity index 100% rename from connector/routingconnector/testdata/config_logs.yaml rename to connector/routingconnector/testdata/config/logs.yaml diff --git a/connector/routingconnector/testdata/config_metrics.yaml b/connector/routingconnector/testdata/config/metrics.yaml similarity index 100% rename from connector/routingconnector/testdata/config_metrics.yaml rename to connector/routingconnector/testdata/config/metrics.yaml diff --git a/connector/routingconnector/testdata/config_traces.yaml b/connector/routingconnector/testdata/config/traces.yaml similarity index 100% rename from connector/routingconnector/testdata/config_traces.yaml rename to connector/routingconnector/testdata/config/traces.yaml diff --git a/connector/routingconnector/testdata/logs/resource_context/all_match_first_only/config.yaml b/connector/routingconnector/testdata/logs/resource_context/all_match_first_only/config.yaml new file mode 100644 index 000000000000..0c6ae0f17eca --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/all_match_first_only/config.yaml @@ -0,0 +1,10 @@ +routing: + default_pipelines: + - logs/default + table: + - condition: attributes["resourceName"] != nil + pipelines: + - logs/0 + - condition: attributes["resourceName"] == "resourceY" + pipelines: + - logs/1 diff --git a/connector/routingconnector/testdata/logs/resource_context/all_match_first_only/input.yaml b/connector/routingconnector/testdata/logs/resource_context/all_match_first_only/input.yaml new file mode 100644 index 000000000000..63c6eada6cf9 --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/all_match_first_only/input.yaml @@ -0,0 +1,141 @@ +resourceLogs: + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceA + - key: resourceNameAgain + value: + stringValue: resourceA + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceB + - key: resourceNameAgain + value: + stringValue: resourceB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 diff --git a/connector/routingconnector/testdata/logs/resource_context/all_match_first_only/sink_0.yaml b/connector/routingconnector/testdata/logs/resource_context/all_match_first_only/sink_0.yaml new file mode 100644 index 000000000000..63c6eada6cf9 --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/all_match_first_only/sink_0.yaml @@ -0,0 +1,141 @@ +resourceLogs: + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceA + - key: resourceNameAgain + value: + stringValue: resourceA + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceB + - key: resourceNameAgain + value: + stringValue: resourceB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 diff --git a/connector/routingconnector/testdata/logs/resource_context/all_match_last_only/config.yaml b/connector/routingconnector/testdata/logs/resource_context/all_match_last_only/config.yaml new file mode 100644 index 000000000000..107c8c59b83b --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/all_match_last_only/config.yaml @@ -0,0 +1,10 @@ +routing: + default_pipelines: + - logs/default + table: + - condition: attributes["resourceName"] == "resourceX" + pipelines: + - logs/0 + - condition: attributes["resourceName"] != nil + pipelines: + - logs/1 diff --git a/connector/routingconnector/testdata/logs/resource_context/all_match_last_only/input.yaml b/connector/routingconnector/testdata/logs/resource_context/all_match_last_only/input.yaml new file mode 100644 index 000000000000..63c6eada6cf9 --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/all_match_last_only/input.yaml @@ -0,0 +1,141 @@ +resourceLogs: + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceA + - key: resourceNameAgain + value: + stringValue: resourceA + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceB + - key: resourceNameAgain + value: + stringValue: resourceB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 diff --git a/connector/routingconnector/testdata/logs/resource_context/all_match_last_only/sink_1.yaml b/connector/routingconnector/testdata/logs/resource_context/all_match_last_only/sink_1.yaml new file mode 100644 index 000000000000..63c6eada6cf9 --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/all_match_last_only/sink_1.yaml @@ -0,0 +1,141 @@ +resourceLogs: + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceA + - key: resourceNameAgain + value: + stringValue: resourceA + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceB + - key: resourceNameAgain + value: + stringValue: resourceB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 diff --git a/connector/routingconnector/testdata/logs/resource_context/all_match_once/config.yaml b/connector/routingconnector/testdata/logs/resource_context/all_match_once/config.yaml new file mode 100644 index 000000000000..3edeec5ce55f --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/all_match_once/config.yaml @@ -0,0 +1,11 @@ +routing: + match_once: true + default_pipelines: + - logs/default + table: + - condition: attributes["resourceName"] != nil + pipelines: + - logs/0 + - condition: attributes["resourceName"] == "resourceA" or attributes["resourceName"] == "resourceB" + pipelines: + - logs/1 diff --git a/connector/routingconnector/testdata/logs/resource_context/all_match_once/input.yaml b/connector/routingconnector/testdata/logs/resource_context/all_match_once/input.yaml new file mode 100644 index 000000000000..63c6eada6cf9 --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/all_match_once/input.yaml @@ -0,0 +1,141 @@ +resourceLogs: + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceA + - key: resourceNameAgain + value: + stringValue: resourceA + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceB + - key: resourceNameAgain + value: + stringValue: resourceB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 diff --git a/connector/routingconnector/testdata/logs/resource_context/all_match_once/sink_0.yaml b/connector/routingconnector/testdata/logs/resource_context/all_match_once/sink_0.yaml new file mode 100644 index 000000000000..63c6eada6cf9 --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/all_match_once/sink_0.yaml @@ -0,0 +1,141 @@ +resourceLogs: + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceA + - key: resourceNameAgain + value: + stringValue: resourceA + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceB + - key: resourceNameAgain + value: + stringValue: resourceB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 diff --git a/connector/routingconnector/testdata/logs/resource_context/each_matches_one/config.yaml b/connector/routingconnector/testdata/logs/resource_context/each_matches_one/config.yaml new file mode 100644 index 000000000000..98382e3a56a9 --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/each_matches_one/config.yaml @@ -0,0 +1,10 @@ +routing: + default_pipelines: + - logs/default + table: + - condition: attributes["resourceName"] == "resourceB" + pipelines: + - logs/0 + - condition: attributes["resourceName"] == "resourceA" + pipelines: + - logs/1 diff --git a/connector/routingconnector/testdata/logs/resource_context/each_matches_one/input.yaml b/connector/routingconnector/testdata/logs/resource_context/each_matches_one/input.yaml new file mode 100644 index 000000000000..63c6eada6cf9 --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/each_matches_one/input.yaml @@ -0,0 +1,141 @@ +resourceLogs: + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceA + - key: resourceNameAgain + value: + stringValue: resourceA + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceB + - key: resourceNameAgain + value: + stringValue: resourceB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 diff --git a/connector/routingconnector/testdata/logs/resource_context/each_matches_one/sink_0.yaml b/connector/routingconnector/testdata/logs/resource_context/each_matches_one/sink_0.yaml new file mode 100644 index 000000000000..28a5a7c8b0f5 --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/each_matches_one/sink_0.yaml @@ -0,0 +1,71 @@ +resourceLogs: + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceB + - key: resourceNameAgain + value: + stringValue: resourceB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 diff --git a/connector/routingconnector/testdata/logs/resource_context/each_matches_one/sink_1.yaml b/connector/routingconnector/testdata/logs/resource_context/each_matches_one/sink_1.yaml new file mode 100644 index 000000000000..ba494d3e311d --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/each_matches_one/sink_1.yaml @@ -0,0 +1,71 @@ +resourceLogs: + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceA + - key: resourceNameAgain + value: + stringValue: resourceA + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 \ No newline at end of file diff --git a/connector/routingconnector/testdata/logs/resource_context/match_none_with_default/config.yaml b/connector/routingconnector/testdata/logs/resource_context/match_none_with_default/config.yaml new file mode 100644 index 000000000000..5988ac82a9ad --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/match_none_with_default/config.yaml @@ -0,0 +1,10 @@ +routing: + default_pipelines: + - logs/default + table: + - condition: attributes["resourceName"] == "resourceX" + pipelines: + - logs/0 + - condition: attributes["resourceName"] == "resourceY" + pipelines: + - logs/1 diff --git a/connector/routingconnector/testdata/logs/resource_context/match_none_with_default/input.yaml b/connector/routingconnector/testdata/logs/resource_context/match_none_with_default/input.yaml new file mode 100644 index 000000000000..63c6eada6cf9 --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/match_none_with_default/input.yaml @@ -0,0 +1,141 @@ +resourceLogs: + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceA + - key: resourceNameAgain + value: + stringValue: resourceA + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceB + - key: resourceNameAgain + value: + stringValue: resourceB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 diff --git a/connector/routingconnector/testdata/logs/resource_context/match_none_with_default/sink_default.yaml b/connector/routingconnector/testdata/logs/resource_context/match_none_with_default/sink_default.yaml new file mode 100644 index 000000000000..63c6eada6cf9 --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/match_none_with_default/sink_default.yaml @@ -0,0 +1,141 @@ +resourceLogs: + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceA + - key: resourceNameAgain + value: + stringValue: resourceA + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceB + - key: resourceNameAgain + value: + stringValue: resourceB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 diff --git a/connector/routingconnector/testdata/logs/resource_context/match_none_without_default/config.yaml b/connector/routingconnector/testdata/logs/resource_context/match_none_without_default/config.yaml new file mode 100644 index 000000000000..36054006adea --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/match_none_without_default/config.yaml @@ -0,0 +1,10 @@ +routing: + match_once: true + # no default pipelines + table: + - condition: attributes["resourceName"] == "resourceX" + pipelines: + - logs/0 + - condition: attributes["resourceName"] == "resourceY" + pipelines: + - logs/1 diff --git a/connector/routingconnector/testdata/logs/resource_context/match_none_without_default/input.yaml b/connector/routingconnector/testdata/logs/resource_context/match_none_without_default/input.yaml new file mode 100644 index 000000000000..63c6eada6cf9 --- /dev/null +++ b/connector/routingconnector/testdata/logs/resource_context/match_none_without_default/input.yaml @@ -0,0 +1,141 @@ +resourceLogs: + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceA + - key: resourceNameAgain + value: + stringValue: resourceA + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0 + - resource: + attributes: + - key: resourceName + value: + stringValue: resourceB + - key: resourceNameAgain + value: + stringValue: resourceB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scopeLogs: + - attributes: + - key: scopeName + value: + stringValue: scopeA + - key: scopeNameAgain + value: + stringValue: scopeA + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeA + version: v0.1.0 + - attributes: + - key: scopeName + value: + stringValue: scopeB + - key: scopeNameAgain + value: + stringValue: scopeB + logRecords: + - attributes: + - key: logName + value: + stringValue: logA + - key: logNameAgain + value: + stringValue: logA + body: + stringValue: logA + - attributes: + - key: logName + value: + stringValue: logB + - key: logNameAgain + value: + stringValue: logB + body: + stringValue: logB + schemaUrl: https://opentelemetry.io/schemas/1.6.1 + scope: + name: scopeB + version: v0.1.0