Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .chloggen/42355-fix-hostname.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
change_type: bug_fix
component: receiver/sqlserver
note: Add missing `host.name` for logs when using `datasource` configuration
issues: [46740]
change_logs: [user]
27 changes: 8 additions & 19 deletions receiver/sqlserverreceiver/scraper.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,8 @@ func (s *sqlServerScraperHelper) Shutdown(context.Context) error {
return nil
}

// setupResourceBuilder configures common resource attributes for metrics
func (s *sqlServerScraperHelper) setupResourceBuilder(row sqlquery.StringMap) *metadata.ResourceBuilder {
rb := s.mb.NewResourceBuilder()
// setupResourceBuilder configures common resource attributes for metrics and logs.
func (s *sqlServerScraperHelper) setupResourceBuilder(rb *metadata.ResourceBuilder, row sqlquery.StringMap) *metadata.ResourceBuilder {
rb.SetSqlserverComputerName(row[computerNameKey])
rb.SetSqlserverInstanceName(row[instanceNameKey])

Expand Down Expand Up @@ -224,7 +223,7 @@ func (s *sqlServerScraperHelper) recordDatabaseIOMetrics(ctx context.Context) er
now := pcommon.NewTimestampFromTime(time.Now())
var val any
for i, row := range rows {
rb := s.setupResourceBuilder(row)
rb := s.setupResourceBuilder(s.mb.NewResourceBuilder(), row)
rb.SetSqlserverDatabaseName(row[databaseNameKey])

val, err = retrieveFloat(row, readLatencyMsKey)
Expand Down Expand Up @@ -308,7 +307,7 @@ func (s *sqlServerScraperHelper) recordDatabasePerfCounterMetrics(ctx context.Co
now := pcommon.NewTimestampFromTime(time.Now())

for i, row := range rows {
rb := s.setupResourceBuilder(row)
rb := s.setupResourceBuilder(s.mb.NewResourceBuilder(), row)

switch row[counterKey] {
case activeTempTables:
Expand Down Expand Up @@ -579,7 +578,7 @@ func (s *sqlServerScraperHelper) recordDatabaseStatusMetrics(ctx context.Context
var errs []error
now := pcommon.NewTimestampFromTime(time.Now())
for _, row := range rows {
rb := s.setupResourceBuilder(row)
rb := s.setupResourceBuilder(s.mb.NewResourceBuilder(), row)

errs = append(errs,
s.mb.RecordSqlserverDatabaseCountDataPoint(now, row[dbOnline], metadata.AttributeDatabaseStatusOnline),
Expand Down Expand Up @@ -618,7 +617,7 @@ func (s *sqlServerScraperHelper) recordDatabaseWaitMetrics(ctx context.Context)
now := pcommon.NewTimestampFromTime(time.Now())
var val any
for i, row := range rows {
rb := s.setupResourceBuilder(row)
rb := s.setupResourceBuilder(s.mb.NewResourceBuilder(), row)
rb.SetSqlserverDatabaseName(row[databaseNameKey])

val, err = retrieveFloat(row, waitTimeMs)
Expand Down Expand Up @@ -779,12 +778,7 @@ func (s *sqlServerScraperHelper) recordDatabaseQueryTextAndPlan(ctx context.Cont
s.logger.Debug(fmt.Sprintf("QueryHash: %v, PlanHash: %v, DataRow: %v", queryHashVal, queryPlanHashVal, row))

if !resourcesAdded {
resourceAttributes := resources.Attributes()
resourceAttributes.PutStr("host.name", s.config.Server)
resourceAttributes.PutStr("sqlserver.computer.name", row[computerNameKey])
resourceAttributes.PutStr("sqlserver.instance.name", row[instanceNameKey])
resourceAttributes.PutStr("service.instance.id", s.serviceInstanceID)

resources = s.setupResourceBuilder(s.lb.NewResourceBuilder(), row).Emit()
resourcesAdded = true
}
s.lb.RecordDbServerTopQueryEvent(
Expand Down Expand Up @@ -1073,12 +1067,7 @@ func (s *sqlServerScraperHelper) recordDatabaseSampleQuery(ctx context.Context)
)

if !resourcesAdded {
resourceAttributes := resources.Attributes()
resourceAttributes.PutStr("host.name", s.config.Server)
resourceAttributes.PutStr("sqlserver.computer.name", row[computerNameKey])
resourceAttributes.PutStr("sqlserver.instance.name", row[instanceNameKey])
resourceAttributes.PutStr("service.instance.id", s.serviceInstanceID)

resources = s.setupResourceBuilder(s.lb.NewResourceBuilder(), row).Emit()
resourcesAdded = true
}
}
Expand Down
180 changes: 176 additions & 4 deletions receiver/sqlserverreceiver/scraper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,13 @@ func configureAllScraperMetricsAndEvents(cfg *Config, enabled bool) {
// cfg.QuerySample.Enabled = enabled
}

func enableSQLServerResourceAttributesForTests(resourceAttributes *metadata.ResourceAttributesConfig) {
resourceAttributes.SqlserverComputerName.Enabled = true
resourceAttributes.SqlserverInstanceName.Enabled = true
resourceAttributes.ServerAddress.Enabled = true
resourceAttributes.ServerPort.Enabled = true
}

func TestEmptyScrape(t *testing.T) {
cfg := createDefaultConfig().(*Config)
cfg.Username = "sa"
Expand Down Expand Up @@ -394,7 +401,7 @@ func TestQueryTextAndPlanQueryMetricsShouldBeCachedSinceFirstCollection(t *testi
cfg.Password = "password"
cfg.Port = 1433
cfg.Server = "0.0.0.0"
cfg.MetricsBuilderConfig.ResourceAttributes.SqlserverInstanceName.Enabled = true
enableSQLServerResourceAttributesForTests(&cfg.LogsBuilderConfig.ResourceAttributes)
cfg.Events.DbServerTopQuery.Enabled = true
assert.NoError(t, cfg.Validate())

Expand Down Expand Up @@ -469,7 +476,7 @@ func TestQueryTextAndPlanQuery(t *testing.T) {
cfg.Password = "password"
cfg.Port = 1433
cfg.Server = "0.0.0.0"
cfg.MetricsBuilderConfig.ResourceAttributes.SqlserverInstanceName.Enabled = true
enableSQLServerResourceAttributesForTests(&cfg.LogsBuilderConfig.ResourceAttributes)
cfg.Events.DbServerTopQuery.Enabled = true
assert.NoError(t, cfg.Validate())

Expand Down Expand Up @@ -618,7 +625,7 @@ func TestRecordDatabaseSampleQuery(t *testing.T) {
cfg.Password = "password"
cfg.Port = 1433
cfg.Server = "0.0.0.0"
cfg.MetricsBuilderConfig.ResourceAttributes.SqlserverInstanceName.Enabled = true
enableSQLServerResourceAttributesForTests(&cfg.LogsBuilderConfig.ResourceAttributes)
assert.NoError(t, cfg.Validate())

configureAllScraperMetricsAndEvents(cfg, false)
Expand Down Expand Up @@ -793,7 +800,7 @@ func TestSetupResourceBuilder(t *testing.T) {
instanceNameKey: "test-instance",
}

rb := scraper.setupResourceBuilder(row)
rb := scraper.setupResourceBuilder(scraper.mb.NewResourceBuilder(), row)
resource := rb.Emit()

hostName, exists := resource.Attributes().Get("host.name")
Expand All @@ -802,3 +809,168 @@ func TestSetupResourceBuilder(t *testing.T) {
})
}
}

func TestRecordDatabaseSampleQueryUsesResourceBuilderForLogs(t *testing.T) {
cfg := createDefaultConfig().(*Config)
cfg.DataSource = "sqlserver://testuser:testpass@datasource-host.example.com:1434?database=testdb"
enableSQLServerResourceAttributesForTests(&cfg.LogsBuilderConfig.ResourceAttributes)
cfg.Events.DbServerQuerySample.Enabled = true
assert.NoError(t, cfg.Validate())

configureAllScraperMetricsAndEvents(cfg, false)
cfg.Events.DbServerQuerySample.Enabled = true

scrapers := setupSQLServerLogsScrapers(receivertest.NewNopSettings(metadata.Type), cfg)
assert.Len(t, scrapers, 1)

scraper := scrapers[0]
scraper.client = mockClient{
instanceName: scraper.config.InstanceName,
SQL: scraper.sqlQuery,
maxRowsPerQuery: 100,
}

actualLogs, err := scraper.ScrapeLogs(t.Context())
assert.NoError(t, err)
assert.Equal(t, 1, actualLogs.ResourceLogs().Len())

resourceAttributes := actualLogs.ResourceLogs().At(0).Resource().Attributes()
hostName, exists := resourceAttributes.Get("host.name")
assert.True(t, exists)
assert.Equal(t, "datasource-host.example.com", hostName.AsString())

serviceInstanceID, exists := resourceAttributes.Get("service.instance.id")
assert.True(t, exists)
assert.Equal(t, "datasource-host.example.com:1434", serviceInstanceID.AsString())

computerName, exists := resourceAttributes.Get("sqlserver.computer.name")
assert.True(t, exists)
assert.Equal(t, "DESKTOP-GHAEGRD", computerName.AsString())

instanceName, exists := resourceAttributes.Get("sqlserver.instance.name")
assert.True(t, exists)
assert.Equal(t, "sqlserver", instanceName.AsString())
}

func TestRecordDatabaseQueryTextAndPlanUsesResourceBuilderForLogs(t *testing.T) {
cfg := createDefaultConfig().(*Config)
cfg.DataSource = "sqlserver://testuser:testpass@datasource-host.example.com:1434?database=testdb"
enableSQLServerResourceAttributesForTests(&cfg.LogsBuilderConfig.ResourceAttributes)
cfg.Events.DbServerTopQuery.Enabled = true
assert.NoError(t, cfg.Validate())

configureAllScraperMetricsAndEvents(cfg, false)
cfg.Events.DbServerTopQuery.Enabled = true
cfg.TopQueryCollection.CollectionInterval = cfg.ControllerConfig.CollectionInterval

scrapers := setupSQLServerLogsScrapers(receivertest.NewNopSettings(metadata.Type), cfg)
assert.Len(t, scrapers, 1)

scraper := scrapers[0]
const totalElapsedTime = "total_elapsed_time"
const rowsReturned = "total_rows"
const totalWorkerTime = "total_worker_time"
const logicalReads = "total_logical_reads"
const logicalWrites = "total_logical_writes"
const physicalReads = "total_physical_reads"
const executionCount = "execution_count"
const totalGrant = "total_grant_kb"

queryHash := hex.EncodeToString([]byte("0x37849E874171E3F3"))
queryPlanHash := hex.EncodeToString([]byte("0xD3112909429A1B50"))
procedureID := "0"
scraper.cacheAndDiff(queryHash, queryPlanHash, procedureID, totalElapsedTime, 846)
scraper.cacheAndDiff(queryHash, queryPlanHash, procedureID, rowsReturned, 1)
scraper.cacheAndDiff(queryHash, queryPlanHash, procedureID, logicalReads, 1)
scraper.cacheAndDiff(queryHash, queryPlanHash, procedureID, logicalWrites, 1)
scraper.cacheAndDiff(queryHash, queryPlanHash, procedureID, physicalReads, 1)
scraper.cacheAndDiff(queryHash, queryPlanHash, procedureID, executionCount, 1)
scraper.cacheAndDiff(queryHash, queryPlanHash, procedureID, totalWorkerTime, 845)
scraper.cacheAndDiff(queryHash, queryPlanHash, procedureID, totalGrant, 1)

scraper.client = mockClient{
instanceName: scraper.config.InstanceName,
SQL: scraper.sqlQuery,
maxQuerySampleCount: 1000,
lookbackTime: 20,
topQueryCount: 200,
}

actualLogs, err := scraper.ScrapeLogs(t.Context())
assert.NoError(t, err)
assert.Equal(t, 1, actualLogs.ResourceLogs().Len())

resourceAttributes := actualLogs.ResourceLogs().At(0).Resource().Attributes()
hostName, exists := resourceAttributes.Get("host.name")
assert.True(t, exists)
assert.Equal(t, "datasource-host.example.com", hostName.AsString())

serviceInstanceID, exists := resourceAttributes.Get("service.instance.id")
assert.True(t, exists)
assert.Equal(t, "datasource-host.example.com:1434", serviceInstanceID.AsString())

computerName, exists := resourceAttributes.Get("sqlserver.computer.name")
assert.True(t, exists)
assert.Equal(t, "DESKTOP-GHAEGRD", computerName.AsString())

instanceName, exists := resourceAttributes.Get("sqlserver.instance.name")
assert.True(t, exists)
assert.Equal(t, "sqlserver", instanceName.AsString())

serverAddress, exists := resourceAttributes.Get("server.address")
assert.True(t, exists)
assert.Equal(t, "datasource-host.example.com", serverAddress.AsString())

serverPort, exists := resourceAttributes.Get("server.port")
assert.True(t, exists)
assert.Equal(t, int64(1434), serverPort.Int())
}

func TestRecordDatabaseStatusMetricsUsesResourceBuilderForMetrics(t *testing.T) {
cfg := createDefaultConfig().(*Config)
cfg.DataSource = "sqlserver://testuser:testpass@datasource-host.example.com:1434?database=testdb"
enableSQLServerResourceAttributesForTests(&cfg.MetricsBuilderConfig.ResourceAttributes)
cfg.Metrics.SqlserverCPUCount.Enabled = true
assert.NoError(t, cfg.Validate())

configureAllScraperMetricsAndEvents(cfg, false)
cfg.Metrics.SqlserverCPUCount.Enabled = true

scrapers := setupSQLServerScrapers(receivertest.NewNopSettings(metadata.Type), cfg)
assert.Len(t, scrapers, 1)

scraper := scrapers[0]
scraper.client = mockClient{
instanceName: scraper.config.InstanceName,
SQL: scraper.sqlQuery,
}

actualMetrics, err := scraper.ScrapeMetrics(t.Context())
assert.NoError(t, err)
assert.Equal(t, 1, actualMetrics.ResourceMetrics().Len())

resourceAttributes := actualMetrics.ResourceMetrics().At(0).Resource().Attributes()
hostName, exists := resourceAttributes.Get("host.name")
assert.True(t, exists)
assert.Equal(t, "datasource-host.example.com", hostName.AsString())

serviceInstanceID, exists := resourceAttributes.Get("service.instance.id")
assert.True(t, exists)
assert.Equal(t, "datasource-host.example.com:1434", serviceInstanceID.AsString())

computerName, exists := resourceAttributes.Get("sqlserver.computer.name")
assert.True(t, exists)
assert.Equal(t, "abcde", computerName.AsString())

instanceName, exists := resourceAttributes.Get("sqlserver.instance.name")
assert.True(t, exists)
assert.Equal(t, "ad8fb2b53dce", instanceName.AsString())

serverAddress, exists := resourceAttributes.Get("server.address")
assert.True(t, exists)
assert.Equal(t, "datasource-host.example.com", serverAddress.AsString())

serverPort, exists := resourceAttributes.Get("server.port")
assert.True(t, exists)
assert.Equal(t, int64(1434), serverPort.Int())
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ resourceLogs:
- key: host.name
value:
stringValue: 0.0.0.0
- key: server.address
value:
stringValue: 0.0.0.0
- key: server.port
value:
intValue: "1433"
- key: service.instance.id
value:
stringValue: 0.0.0.0:1433
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ resourceLogs:
- key: host.name
value:
stringValue: 0.0.0.0
- key: server.address
value:
stringValue: 0.0.0.0
- key: server.port
value:
intValue: "1433"
- key: service.instance.id
value:
stringValue: 0.0.0.0:1433
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ resourceLogs:
- key: host.name
value:
stringValue: 0.0.0.0
- key: server.address
value:
stringValue: 0.0.0.0
- key: server.port
value:
intValue: "1433"
- key: service.instance.id
value:
stringValue: 0.0.0.0:1433
Expand Down
Loading