diff --git a/.chloggen/service_instance_id_for_oracledbreceiver.yaml b/.chloggen/service_instance_id_for_oracledbreceiver.yaml new file mode 100644 index 0000000000000..c760329dd34aa --- /dev/null +++ b/.chloggen/service_instance_id_for_oracledbreceiver.yaml @@ -0,0 +1,29 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement + +# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver) +component: oracledbreceiver + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Add `service.instance.id` resource attribute + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [42402] + +# (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: | + The `service.instance.id` resource attribute is added in the format `:/` to uniquely identify + Oracle DB hosts. This resource attribute is enabled by default for metrics and logs. + +# 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: [user] diff --git a/receiver/oracledbreceiver/documentation.md b/receiver/oracledbreceiver/documentation.md index 8e30df3c11e21..c4a1b08a9ef56 100644 --- a/receiver/oracledbreceiver/documentation.md +++ b/receiver/oracledbreceiver/documentation.md @@ -470,3 +470,4 @@ Collection of event metrics for top N queries, filtered based on the highest CPU | ---- | ----------- | ------ | ------- | | host.name | The host name of Oracle Server | Any Str | true | | oracledb.instance.name | The name of the instance that data is coming from. | Any Str | true | +| service.instance.id | A unique identifier of the Oracle DB instance in the format host:port/serviceName. (defaults to 'unknown:1521', in case of error in generating this value) | Any Str | true | diff --git a/receiver/oracledbreceiver/internal/metadata/generated_config.go b/receiver/oracledbreceiver/internal/metadata/generated_config.go index 61b93fbd50df8..1d8d20609ae80 100644 --- a/receiver/oracledbreceiver/internal/metadata/generated_config.go +++ b/receiver/oracledbreceiver/internal/metadata/generated_config.go @@ -276,6 +276,7 @@ func (rac *ResourceAttributeConfig) Unmarshal(parser *confmap.Conf) error { type ResourceAttributesConfig struct { HostName ResourceAttributeConfig `mapstructure:"host.name"` OracledbInstanceName ResourceAttributeConfig `mapstructure:"oracledb.instance.name"` + ServiceInstanceID ResourceAttributeConfig `mapstructure:"service.instance.id"` } func DefaultResourceAttributesConfig() ResourceAttributesConfig { @@ -286,6 +287,9 @@ func DefaultResourceAttributesConfig() ResourceAttributesConfig { OracledbInstanceName: ResourceAttributeConfig{ Enabled: true, }, + ServiceInstanceID: ResourceAttributeConfig{ + Enabled: true, + }, } } diff --git a/receiver/oracledbreceiver/internal/metadata/generated_config_test.go b/receiver/oracledbreceiver/internal/metadata/generated_config_test.go index 84a4824de125d..83a0df54c694d 100644 --- a/receiver/oracledbreceiver/internal/metadata/generated_config_test.go +++ b/receiver/oracledbreceiver/internal/metadata/generated_config_test.go @@ -73,6 +73,7 @@ func TestMetricsBuilderConfig(t *testing.T) { ResourceAttributes: ResourceAttributesConfig{ HostName: ResourceAttributeConfig{Enabled: true}, OracledbInstanceName: ResourceAttributeConfig{Enabled: true}, + ServiceInstanceID: ResourceAttributeConfig{Enabled: true}, }, }, }, @@ -126,6 +127,7 @@ func TestMetricsBuilderConfig(t *testing.T) { ResourceAttributes: ResourceAttributesConfig{ HostName: ResourceAttributeConfig{Enabled: false}, OracledbInstanceName: ResourceAttributeConfig{Enabled: false}, + ServiceInstanceID: ResourceAttributeConfig{Enabled: false}, }, }, }, @@ -173,6 +175,7 @@ func TestResourceAttributesConfig(t *testing.T) { want: ResourceAttributesConfig{ HostName: ResourceAttributeConfig{Enabled: true}, OracledbInstanceName: ResourceAttributeConfig{Enabled: true}, + ServiceInstanceID: ResourceAttributeConfig{Enabled: true}, }, }, { @@ -180,6 +183,7 @@ func TestResourceAttributesConfig(t *testing.T) { want: ResourceAttributesConfig{ HostName: ResourceAttributeConfig{Enabled: false}, OracledbInstanceName: ResourceAttributeConfig{Enabled: false}, + ServiceInstanceID: ResourceAttributeConfig{Enabled: false}, }, }, } diff --git a/receiver/oracledbreceiver/internal/metadata/generated_logs.go b/receiver/oracledbreceiver/internal/metadata/generated_logs.go index 0f6fc7e3d10d7..a9683732cc3d6 100644 --- a/receiver/oracledbreceiver/internal/metadata/generated_logs.go +++ b/receiver/oracledbreceiver/internal/metadata/generated_logs.go @@ -173,6 +173,12 @@ func NewLogsBuilder(lbc LogsBuilderConfig, settings receiver.Settings) *LogsBuil if lbc.ResourceAttributes.OracledbInstanceName.EventsExclude != nil { lb.resourceAttributeExcludeFilter["oracledb.instance.name"] = filter.CreateFilter(lbc.ResourceAttributes.OracledbInstanceName.EventsExclude) } + if lbc.ResourceAttributes.ServiceInstanceID.EventsInclude != nil { + lb.resourceAttributeIncludeFilter["service.instance.id"] = filter.CreateFilter(lbc.ResourceAttributes.ServiceInstanceID.EventsInclude) + } + if lbc.ResourceAttributes.ServiceInstanceID.EventsExclude != nil { + lb.resourceAttributeExcludeFilter["service.instance.id"] = filter.CreateFilter(lbc.ResourceAttributes.ServiceInstanceID.EventsExclude) + } return lb } diff --git a/receiver/oracledbreceiver/internal/metadata/generated_logs_test.go b/receiver/oracledbreceiver/internal/metadata/generated_logs_test.go index 50d8d146f74c1..7e08396da8dae 100644 --- a/receiver/oracledbreceiver/internal/metadata/generated_logs_test.go +++ b/receiver/oracledbreceiver/internal/metadata/generated_logs_test.go @@ -33,6 +33,7 @@ func TestLogsBuilderAppendLogRecord(t *testing.T) { rb := lb.NewResourceBuilder() rb.SetHostName("host.name-val") rb.SetOracledbInstanceName("oracledb.instance.name-val") + rb.SetServiceInstanceID("service.instance.id-val") res := rb.Emit() // append the first log record @@ -138,6 +139,7 @@ func TestLogsBuilder(t *testing.T) { rb := lb.NewResourceBuilder() rb.SetHostName("host.name-val") rb.SetOracledbInstanceName("oracledb.instance.name-val") + rb.SetServiceInstanceID("service.instance.id-val") res := rb.Emit() logs := lb.Emit(WithLogsResource(res)) diff --git a/receiver/oracledbreceiver/internal/metadata/generated_metrics.go b/receiver/oracledbreceiver/internal/metadata/generated_metrics.go index b3e487958562f..a8f0a1f12d959 100644 --- a/receiver/oracledbreceiver/internal/metadata/generated_metrics.go +++ b/receiver/oracledbreceiver/internal/metadata/generated_metrics.go @@ -2447,6 +2447,12 @@ func NewMetricsBuilder(mbc MetricsBuilderConfig, settings receiver.Settings, opt if mbc.ResourceAttributes.OracledbInstanceName.MetricsExclude != nil { mb.resourceAttributeExcludeFilter["oracledb.instance.name"] = filter.CreateFilter(mbc.ResourceAttributes.OracledbInstanceName.MetricsExclude) } + if mbc.ResourceAttributes.ServiceInstanceID.MetricsInclude != nil { + mb.resourceAttributeIncludeFilter["service.instance.id"] = filter.CreateFilter(mbc.ResourceAttributes.ServiceInstanceID.MetricsInclude) + } + if mbc.ResourceAttributes.ServiceInstanceID.MetricsExclude != nil { + mb.resourceAttributeExcludeFilter["service.instance.id"] = filter.CreateFilter(mbc.ResourceAttributes.ServiceInstanceID.MetricsExclude) + } for _, op := range options { op.apply(mb) diff --git a/receiver/oracledbreceiver/internal/metadata/generated_metrics_test.go b/receiver/oracledbreceiver/internal/metadata/generated_metrics_test.go index 498b63974869d..78778724407cc 100644 --- a/receiver/oracledbreceiver/internal/metadata/generated_metrics_test.go +++ b/receiver/oracledbreceiver/internal/metadata/generated_metrics_test.go @@ -222,6 +222,7 @@ func TestMetricsBuilder(t *testing.T) { rb := mb.NewResourceBuilder() rb.SetHostName("host.name-val") rb.SetOracledbInstanceName("oracledb.instance.name-val") + rb.SetServiceInstanceID("service.instance.id-val") res := rb.Emit() metrics := mb.Emit(WithResource(res)) diff --git a/receiver/oracledbreceiver/internal/metadata/generated_resource.go b/receiver/oracledbreceiver/internal/metadata/generated_resource.go index 805f84f280c0c..0825fb20f8c10 100644 --- a/receiver/oracledbreceiver/internal/metadata/generated_resource.go +++ b/receiver/oracledbreceiver/internal/metadata/generated_resource.go @@ -35,6 +35,13 @@ func (rb *ResourceBuilder) SetOracledbInstanceName(val string) { } } +// SetServiceInstanceID sets provided value as "service.instance.id" attribute. +func (rb *ResourceBuilder) SetServiceInstanceID(val string) { + if rb.config.ServiceInstanceID.Enabled { + rb.res.Attributes().PutStr("service.instance.id", val) + } +} + // Emit returns the built resource and resets the internal builder state. func (rb *ResourceBuilder) Emit() pcommon.Resource { r := rb.res diff --git a/receiver/oracledbreceiver/internal/metadata/generated_resource_test.go b/receiver/oracledbreceiver/internal/metadata/generated_resource_test.go index 7995f73df8462..748a7c59f7777 100644 --- a/receiver/oracledbreceiver/internal/metadata/generated_resource_test.go +++ b/receiver/oracledbreceiver/internal/metadata/generated_resource_test.go @@ -15,15 +15,16 @@ func TestResourceBuilder(t *testing.T) { rb := NewResourceBuilder(cfg) rb.SetHostName("host.name-val") rb.SetOracledbInstanceName("oracledb.instance.name-val") + rb.SetServiceInstanceID("service.instance.id-val") res := rb.Emit() assert.Equal(t, 0, rb.Emit().Attributes().Len()) // Second call should return empty Resource switch tt { case "default": - assert.Equal(t, 2, res.Attributes().Len()) + assert.Equal(t, 3, res.Attributes().Len()) case "all_set": - assert.Equal(t, 2, res.Attributes().Len()) + assert.Equal(t, 3, res.Attributes().Len()) case "none_set": assert.Equal(t, 0, res.Attributes().Len()) return @@ -41,6 +42,11 @@ func TestResourceBuilder(t *testing.T) { if ok { assert.Equal(t, "oracledb.instance.name-val", val.Str()) } + val, ok = res.Attributes().Get("service.instance.id") + assert.True(t, ok) + if ok { + assert.Equal(t, "service.instance.id-val", val.Str()) + } }) } } diff --git a/receiver/oracledbreceiver/internal/metadata/testdata/config.yaml b/receiver/oracledbreceiver/internal/metadata/testdata/config.yaml index c0cd319251fd0..6158dbbeea194 100644 --- a/receiver/oracledbreceiver/internal/metadata/testdata/config.yaml +++ b/receiver/oracledbreceiver/internal/metadata/testdata/config.yaml @@ -95,6 +95,8 @@ all_set: enabled: true oracledb.instance.name: enabled: true + service.instance.id: + enabled: true none_set: metrics: oracledb.consistent_gets: @@ -191,6 +193,8 @@ none_set: enabled: false oracledb.instance.name: enabled: false + service.instance.id: + enabled: false filter_set_include: resource_attributes: host.name: @@ -205,6 +209,12 @@ filter_set_include: - regexp: ".*" events_include: - regexp: ".*" + service.instance.id: + enabled: true + metrics_include: + - regexp: ".*" + events_include: + - regexp: ".*" filter_set_exclude: resource_attributes: host.name: @@ -219,3 +229,9 @@ filter_set_exclude: - strict: "oracledb.instance.name-val" events_exclude: - strict: "oracledb.instance.name-val" + service.instance.id: + enabled: true + metrics_exclude: + - strict: "service.instance.id-val" + events_exclude: + - strict: "service.instance.id-val" diff --git a/receiver/oracledbreceiver/metadata.yaml b/receiver/oracledbreceiver/metadata.yaml index dd29bb0386479..34bc4fa346919 100644 --- a/receiver/oracledbreceiver/metadata.yaml +++ b/receiver/oracledbreceiver/metadata.yaml @@ -18,6 +18,10 @@ resource_attributes: description: The host name of Oracle Server enabled: true type: string + service.instance.id: + description: A unique identifier of the Oracle DB instance in the format host:port/serviceName. (defaults to 'unknown:1521', in case of error in generating this value) + enabled: true + type: string attributes: session_status: diff --git a/receiver/oracledbreceiver/scraper.go b/receiver/oracledbreceiver/scraper.go index 5982168132851..6ef450cbb7376 100644 --- a/receiver/oracledbreceiver/scraper.go +++ b/receiver/oracledbreceiver/scraper.go @@ -11,6 +11,8 @@ import ( "encoding/json" "errors" "fmt" + "net" + "os" "sort" "strconv" "strings" @@ -131,6 +133,7 @@ type oracleScraper struct { topQueryCollectCfg TopQueryCollection obfuscator *obfuscator querySampleCfg QuerySample + serviceInstanceID string } func newScraper(metricsBuilder *metadata.MetricsBuilder, metricsBuilderConfig metadata.MetricsBuilderConfig, scrapeCfg scraperhelper.ControllerConfig, logger *zap.Logger, providerFunc dbProviderFunc, clientProviderFunc clientProviderFunc, instanceName, hostName string) (scraper.Metrics, error) { @@ -143,6 +146,7 @@ func newScraper(metricsBuilder *metadata.MetricsBuilder, metricsBuilderConfig me clientProviderFunc: clientProviderFunc, instanceName: instanceName, hostName: hostName, + serviceInstanceID: getInstanceID(instanceName, logger), } return scraper.NewMetrics(s.scrape, scraper.WithShutdown(s.shutdown), scraper.WithStart(s.start)) } @@ -164,6 +168,7 @@ func newLogsScraper(logsBuilder *metadata.LogsBuilder, logsBuilderConfig metadat querySampleCfg: querySampleCfg, hostName: hostName, obfuscator: newObfuscator(), + serviceInstanceID: getInstanceID(instanceName, logger), } return scraper.NewLogs(s.scrapeLogs, scraper.WithShutdown(s.shutdown), scraper.WithStart(s.start)) } @@ -502,9 +507,8 @@ func (s *oracleScraper) scrape(ctx context.Context) (pmetric.Metrics, error) { } } - rb := s.mb.NewResourceBuilder() - rb.SetOracledbInstanceName(s.instanceName) - rb.SetHostName(s.hostName) + rb := s.setupResourceBuilder(s.mb.NewResourceBuilder()) + out := s.mb.Emit(metadata.WithResource(rb.Emit())) s.logger.Debug("Done scraping") if len(scrapeErrors) > 0 { @@ -634,9 +638,7 @@ func (s *oracleScraper) collectTopNMetricData(ctx context.Context, logs plog.Log hits = s.obfuscateCacheHits(hits) childAddressToPlanMap := s.getChildAddressToPlanMap(ctx, hits) - rb := s.lb.NewResourceBuilder() - rb.SetOracledbInstanceName(s.instanceName) - rb.SetHostName(s.hostName) + rb := s.setupResourceBuilder(s.lb.NewResourceBuilder()) for _, hit := range hits { planBytes, err := json.Marshal(childAddressToPlanMap[hit.childAddress]) @@ -717,9 +719,7 @@ func (s *oracleScraper) collectQuerySamples(ctx context.Context, logs plog.Logs) scrapeErrors = append(scrapeErrors, fmt.Errorf("error executing %s: %w", samplesQuery, err)) } - rb := s.lb.NewResourceBuilder() - rb.SetOracledbInstanceName(s.instanceName) - rb.SetHostName(s.hostName) + rb := s.setupResourceBuilder(s.lb.NewResourceBuilder()) for _, row := range rows { if row[sqlText] == "" { @@ -828,3 +828,49 @@ func (s *oracleScraper) shutdown(_ context.Context) error { } return s.db.Close() } + +func (s *oracleScraper) setupResourceBuilder(rb *metadata.ResourceBuilder) *metadata.ResourceBuilder { + rb.SetOracledbInstanceName(s.instanceName) + rb.SetHostName(s.hostName) + rb.SetServiceInstanceID(s.serviceInstanceID) + return rb +} + +func getInstanceID(instanceString string, logger *zap.Logger) string { + hostAndPort, service, found := strings.Cut(instanceString, "/") + if !found { + logger.Info("No service name found in the connection string", zap.String("instanceString", instanceString)) + } + + host, port, err := net.SplitHostPort(hostAndPort) + if err != nil { + logger.Warn("Computing service.instance.id failed. Couldn't extract host and port from the connection data.", zap.Error(err)) + return constructInstanceID("unknown", "1521", service) + } + + // Replace the host value with machine name if connecting to localhost target + if strings.EqualFold(host, "localhost") || net.ParseIP(host).IsLoopback() { + localhost, err := os.Hostname() + if err != nil { + logger.Warn("Failed getting localhost machine name for the service.instance.id.") + } else { + host = localhost + } + } + + return constructInstanceID(host, port, service) +} + +func constructInstanceID(host, port, service string) string { + if strings.TrimSpace(host) == "" { + host = "unknown" + } + if strings.TrimSpace(port) == "" { + port = "1521" + } + + if service != "" { + return fmt.Sprintf("%s:%s/%s", host, port, service) + } + return fmt.Sprintf("%s:%s", host, port) +} diff --git a/receiver/oracledbreceiver/scraper_test.go b/receiver/oracledbreceiver/scraper_test.go index 9ccf1da1d9e2f..4300a1fc512f0 100644 --- a/receiver/oracledbreceiver/scraper_test.go +++ b/receiver/oracledbreceiver/scraper_test.go @@ -277,9 +277,10 @@ func TestScraper_ScrapeTopNLogs(t *testing.T) { logsBuilderConfig: metadata.DefaultLogsBuilderConfig(), metricCache: lruCache, topQueryCollectCfg: TopQueryCollection{MaxQuerySampleCount: 5000, TopQueryCount: 200}, - instanceName: "oracle-instance-sample-1", - hostName: "oracle-host-sample-1", + instanceName: "oraclehost:1521/ORCL", + hostName: "oraclehost:1521", obfuscator: newObfuscator(), + serviceInstanceID: getInstanceID("oraclehost:1521/ORCL", zap.NewNop()), } scrpr.logsBuilderConfig.Events.DbServerTopQuery.Enabled = true @@ -364,6 +365,8 @@ func TestSamplesQuery(t *testing.T) { lb: metadata.NewLogsBuilder(logsCfg, receivertest.NewNopSettings(metadata.Type)), logsBuilderConfig: metadata.DefaultLogsBuilderConfig(), obfuscator: newObfuscator(), + instanceName: "oraclehost:1521/ORCL", + serviceInstanceID: getInstanceID("oraclehost:1521/ORCL", zap.NewNop()), } scrpr.logsBuilderConfig.Events.DbServerTopQuery.Enabled = false scrpr.logsBuilderConfig.Events.DbServerQuerySample.Enabled = true @@ -390,6 +393,39 @@ func TestSamplesQuery(t *testing.T) { } } +func TestGetInstanceId(t *testing.T) { + localhostName, _ := os.Hostname() + + instanceString := "example.com:1521/XE" + instanceID := getInstanceID(instanceString, zap.NewNop()) + assert.Equal(t, "example.com:1521/XE", instanceID) + + localHostStringUppercase := "Localhost:1521/XE" + localInstanceID := getInstanceID(localHostStringUppercase, zap.NewNop()) + assert.NotNil(t, localInstanceID) + assert.Equal(t, localhostName+":1521/XE", localInstanceID) + + localHostString := "127.0.0.1:1521/XE" + localInstanceID = getInstanceID(localHostString, zap.NewNop()) + assert.NotNil(t, localInstanceID) + assert.Equal(t, localhostName+":1521/XE", localInstanceID) + + localHostStringIPV6 := "[::1]:1521/XE" + localInstanceID = getInstanceID(localHostStringIPV6, zap.NewNop()) + assert.NotNil(t, localInstanceID) + assert.Equal(t, localhostName+":1521/XE", localInstanceID) + + hostWithoutService := "127.0.0.1:1521" + localInstanceID = getInstanceID(hostWithoutService, zap.NewNop()) + assert.NotNil(t, localInstanceID) + assert.Equal(t, localhostName+":1521", localInstanceID) + + hostNameErrorSample := "" + localInstanceID = getInstanceID(hostNameErrorSample, zap.NewNop()) + assert.NotNil(t, localInstanceID) + assert.Equal(t, "unknown:1521", localInstanceID) +} + func readFile(fname string) []byte { file, err := os.ReadFile(filepath.Join("testdata", fname)) if err != nil { diff --git a/receiver/oracledbreceiver/testdata/expectedQueryTextAndPlanQuery.yaml b/receiver/oracledbreceiver/testdata/expectedQueryTextAndPlanQuery.yaml index bb36e8c1e56f7..b98e017159b59 100644 --- a/receiver/oracledbreceiver/testdata/expectedQueryTextAndPlanQuery.yaml +++ b/receiver/oracledbreceiver/testdata/expectedQueryTextAndPlanQuery.yaml @@ -3,10 +3,13 @@ resourceLogs: attributes: - key: oracledb.instance.name value: - stringValue: oracle-instance-sample-1 + stringValue: oraclehost:1521/ORCL - key: host.name value: - stringValue: oracle-host-sample-1 + stringValue: oraclehost:1521 + - key: service.instance.id + value: + stringValue: oraclehost:1521/ORCL scopeLogs: - logRecords: - attributes: @@ -15,7 +18,7 @@ resourceLogs: stringValue: oracle - key: db.server.name value: - stringValue: oracle-host-sample-1 + stringValue: oraclehost:1521 - key: db.query.text value: stringValue: SELECT COUNT ( * ) FROM ADMIN. Employee e JOIN ADMIN. Person p ON e. BusinessEntityID = ? JOIN ADMIN. EmployeePayHistory eph ON e. BusinessEntityID = eph. BusinessEntityID WHERE eph. Rate > ( SELECT AVG ( Rate ) FROM ADMIN. EmployeePayHistory ) @@ -81,9 +84,7 @@ resourceLogs: doubleValue: 2e-05 body: {} eventName: db.server.top_query - spanId: "" - timeUnixNano: "1752581882636677000" - traceId: "" + timeUnixNano: "1759142512777891000" scope: name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver version: latest diff --git a/receiver/oracledbreceiver/testdata/expectedSamplesFile.yaml b/receiver/oracledbreceiver/testdata/expectedSamplesFile.yaml index 097b8c6a7609e..350327bfcb62a 100644 --- a/receiver/oracledbreceiver/testdata/expectedSamplesFile.yaml +++ b/receiver/oracledbreceiver/testdata/expectedSamplesFile.yaml @@ -3,10 +3,13 @@ resourceLogs: attributes: - key: oracledb.instance.name value: - stringValue: "" + stringValue: oraclehost:1521/ORCL - key: host.name value: stringValue: "" + - key: service.instance.id + value: + stringValue: oraclehost:1521/ORCL scopeLogs: - logRecords: - attributes: @@ -45,7 +48,7 @@ resourceLogs: stringValue: "0" - key: oracledb.child_address value: - stringValue: "SDF3SDF1234D" + stringValue: SDF3SDF1234D - key: oracledb.sid value: stringValue: "675" @@ -91,7 +94,7 @@ resourceLogs: body: {} eventName: db.server.query_sample spanId: a7ad6b7169203331 - timeUnixNano: "1754828794690056000" + timeUnixNano: "1759142300369458000" traceId: 0af7651916cd43dd8448eb211c80319c scope: name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver