@@ -12,6 +12,7 @@ import (
1212 "path/filepath"
1313 "strings"
1414 "testing"
15+ "time"
1516
1617 lru "github.com/hashicorp/golang-lru/v2"
1718 "github.com/stretchr/testify/assert"
@@ -291,6 +292,7 @@ func TestScraper_ScrapeTopNLogs(t *testing.T) {
291292 }()
292293 require .NoError (t , err )
293294 expectedQueryPlanFile := filepath .Join ("testdata" , "expectedQueryTextAndPlanQuery.yaml" )
295+ collectionTriggerTime := time .Now ()
294296
295297 logs , err := scrpr .scrapeLogs (t .Context ())
296298
@@ -304,6 +306,8 @@ func TestScraper_ScrapeTopNLogs(t *testing.T) {
304306 assert .NoError (t , errs )
305307 assert .Equal (t , "db.server.top_query" , logs .ResourceLogs ().At (0 ).ScopeLogs ().At (0 ).LogRecords ().At (0 ).EventName ())
306308 assert .NoError (t , errs )
309+
310+ assert .True (t , scrpr .lastExecutionTimestamp .After (collectionTriggerTime ), "lastExecutionTimestamp hasn't set after a successful collection" )
307311 }
308312 })
309313 }
@@ -426,8 +430,100 @@ func TestGetInstanceId(t *testing.T) {
426430 assert .Equal (t , "unknown:1521" , localInstanceID )
427431}
428432
429- func testCalculateLookbackSeconds (t * testing.T ) {
430- //TODO
433+ func TestScrapesTopNLogsOnlyWhenIntervalHasElapsed (t * testing.T ) {
434+ var metricRowData []metricRow
435+ var logRowData []metricRow
436+ tests := []struct {
437+ name string
438+ dbclientFn func (db * sql.DB , s string , logger * zap.Logger ) dbClient
439+ errWanted string
440+ }{
441+ {
442+ name : "valid collection" ,
443+ dbclientFn : func (_ * sql.DB , s string , _ * zap.Logger ) dbClient {
444+ if strings .Contains (s , "V$SQL_PLAN" ) {
445+ metricRowFile := readFile ("oracleQueryPlanData.txt" )
446+ unmarshalErr := json .Unmarshal (metricRowFile , & logRowData )
447+ if unmarshalErr == nil {
448+ return & fakeDbClient {
449+ Responses : [][]metricRow {
450+ logRowData ,
451+ },
452+ }
453+ }
454+ } else {
455+ metricRowFile := readFile ("oracleQueryMetricsData.txt" )
456+ unmarshalErr := json .Unmarshal (metricRowFile , & metricRowData )
457+ if unmarshalErr == nil {
458+ return & fakeDbClient {
459+ Responses : [][]metricRow {
460+ metricRowData ,
461+ },
462+ }
463+ }
464+ }
465+ return nil
466+ },
467+ },
468+ }
469+
470+ for _ , test := range tests {
471+ t .Run (test .name , func (t * testing.T ) {
472+ logsCfg := metadata .DefaultLogsBuilderConfig ()
473+ logsCfg .Events .DbServerTopQuery .Enabled = true
474+ metricsCfg := metadata .DefaultMetricsBuilderConfig ()
475+ lruCache , _ := lru.New [string , map [string ]int64 ](500 )
476+ lruCache .Add ("fxk8aq3nds8aw:0" , cacheValue )
477+
478+ scrpr := oracleScraper {
479+ logger : zap .NewNop (),
480+ mb : metadata .NewMetricsBuilder (metricsCfg , receivertest .NewNopSettings (metadata .Type )),
481+ lb : metadata .NewLogsBuilder (logsCfg , receivertest .NewNopSettings (metadata .Type )),
482+ dbProviderFunc : func () (* sql.DB , error ) {
483+ return nil , nil
484+ },
485+ clientProviderFunc : test .dbclientFn ,
486+ metricsBuilderConfig : metadata .DefaultMetricsBuilderConfig (),
487+ logsBuilderConfig : metadata .DefaultLogsBuilderConfig (),
488+ metricCache : lruCache ,
489+ topQueryCollectCfg : TopQueryCollection {MaxQuerySampleCount : 5000 , TopQueryCount : 200 },
490+ obfuscator : newObfuscator (),
491+ }
492+
493+ scrpr .logsBuilderConfig .Events .DbServerTopQuery .Enabled = true
494+ scrpr .topQueryCollectCfg .CollectionInterval = 1 * time .Minute
495+
496+ err := scrpr .start (t .Context (), componenttest .NewNopHost ())
497+ defer func () {
498+ assert .NoError (t , scrpr .shutdown (t .Context ()))
499+ }()
500+ require .NoError (t , err )
501+
502+ assert .True (t , scrpr .lastExecutionTimestamp .IsZero (), "No value should be set for lastExecutionTimestamp before a successful collection" )
503+ logsCol1 , _ := scrpr .scrapeLogs (t .Context ())
504+ assert .Equal (t , 1 , logsCol1 .ResourceLogs ().At (0 ).ScopeLogs ().Len (), "Collection should run when lastExecutionTimestamp is not available" )
505+ assert .False (t , scrpr .lastExecutionTimestamp .IsZero (), "A value should be set for lastExecutionTimestamp after a successful collection" )
506+
507+ scrpr .lastExecutionTimestamp .Add (- 10 * time .Second )
508+ logsCol2 , err := scrpr .scrapeLogs (t .Context ())
509+ assert .Equal (t , 0 , logsCol2 .ResourceLogs ().Len (), "top_query should not be collected until %s elapsed." , scrpr .topQueryCollectCfg .CollectionInterval .String ())
510+ require .NoError (t , err , "coll" )
511+ })
512+ }
513+ }
514+
515+ func TestCalculateLookbackSeconds (t * testing.T ) {
516+ collectionInterval := 20 * time .Second
517+ vsqlRefreshLagSec := 10 * time .Second
518+ expectedMinimumLookbackTime := int ((collectionInterval + vsqlRefreshLagSec ).Seconds ())
519+ currentCollectionTime := time .Now ()
520+
521+ scrpr := oracleScraper {
522+ lastExecutionTimestamp : currentCollectionTime .Add (- collectionInterval ),
523+ }
524+ lookbackTime := scrpr .calculateLookbackSeconds ()
525+
526+ assert .LessOrEqual (t , expectedMinimumLookbackTime , lookbackTime , "`lookbackTime` should be minimum %d" , expectedMinimumLookbackTime )
431527}
432528
433529func readFile (fname string ) []byte {
0 commit comments