@@ -11,11 +11,14 @@ import (
1111 "strconv"
1212 "time"
1313
14+ lru "github.com/hashicorp/golang-lru/v2"
1415 go_ora "github.com/sijms/go-ora/v2"
1516 "go.opentelemetry.io/collector/component"
1617 "go.opentelemetry.io/collector/consumer"
1718 "go.opentelemetry.io/collector/receiver"
19+ "go.opentelemetry.io/collector/scraper"
1820 "go.opentelemetry.io/collector/scraper/scraperhelper"
21+ "go.uber.org/zap"
1922
2023 "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/oracledbreceiver/internal/metadata"
2124)
@@ -27,7 +30,10 @@ func NewFactory() receiver.Factory {
2730 createDefaultConfig ,
2831 receiver .WithMetrics (createReceiverFunc (func (dataSourceName string ) (* sql.DB , error ) {
2932 return sql .Open ("oracle" , dataSourceName )
30- }, newDbClient ), metadata .MetricsStability ))
33+ }, newDbClient ), metadata .MetricsStability ),
34+ receiver .WithLogs (createLogsReceiverFunc (func (dataSourceName string ) (* sql.DB , error ) {
35+ return sql .Open ("oracle" , dataSourceName )
36+ }, newDbClient ), metadata .LogsStability ))
3137}
3238
3339func createDefaultConfig () component.Config {
@@ -37,6 +43,15 @@ func createDefaultConfig() component.Config {
3743 return & Config {
3844 ControllerConfig : cfg ,
3945 MetricsBuilderConfig : metadata .DefaultMetricsBuilderConfig (),
46+ LogsBuilderConfig : metadata .DefaultLogsBuilderConfig (),
47+ QuerySample : QuerySample {
48+ MaxRowsPerQuery : 100 ,
49+ },
50+ TopQueryCollection : TopQueryCollection {
51+ MaxQuerySampleCount : 1000 ,
52+ TopQueryCount : 200 ,
53+ QueryCacheSize : 5000 ,
54+ },
4055 }
4156}
4257
@@ -56,10 +71,14 @@ func createReceiverFunc(sqlOpenerFunc sqlOpenerFunc, clientProviderFunc clientPr
5671 if err != nil {
5772 return nil , err
5873 }
74+ hostName , hostNameErr := getHostName (getDataSource (* sqlCfg ))
75+ if hostNameErr != nil {
76+ return nil , hostNameErr
77+ }
5978
6079 mp , err := newScraper (metricsBuilder , sqlCfg .MetricsBuilderConfig , sqlCfg .ControllerConfig , settings .Logger , func () (* sql.DB , error ) {
6180 return sqlOpenerFunc (getDataSource (* sqlCfg ))
62- }, clientProviderFunc , instanceName )
81+ }, clientProviderFunc , instanceName , hostName )
6382 if err != nil {
6483 return nil , err
6584 }
@@ -74,6 +93,56 @@ func createReceiverFunc(sqlOpenerFunc sqlOpenerFunc, clientProviderFunc clientPr
7493 }
7594}
7695
96+ func createLogsReceiverFunc (sqlOpenerFunc sqlOpenerFunc , clientProviderFunc clientProviderFunc ) receiver.CreateLogsFunc {
97+ return func (
98+ _ context.Context ,
99+ settings receiver.Settings ,
100+ cfg component.Config ,
101+ logsConsumer consumer.Logs ,
102+ ) (receiver.Logs , error ) {
103+ sqlCfg := cfg .(* Config )
104+
105+ logsBuilder := metadata .NewLogsBuilder (sqlCfg .LogsBuilderConfig , settings )
106+
107+ instanceName , err := getInstanceName (getDataSource (* sqlCfg ))
108+ if err != nil {
109+ return nil , err
110+ }
111+
112+ hostName , hostNameErr := getHostName (getDataSource (* sqlCfg ))
113+ if hostNameErr != nil {
114+ return nil , hostNameErr
115+ }
116+
117+ cacheSize := sqlCfg .QueryCacheSize
118+ metricCache , err := lru.New [string , map [string ]int64 ](cacheSize )
119+ if err != nil {
120+ settings .Logger .Error ("Failed to create LRU cache, skipping the current scraper" , zap .Error (err ))
121+ return nil , err
122+ }
123+
124+ mp , err := newLogsScraper (logsBuilder , sqlCfg .LogsBuilderConfig , sqlCfg .ControllerConfig , settings .Logger , func () (* sql.DB , error ) {
125+ return sqlOpenerFunc (getDataSource (* sqlCfg ))
126+ }, clientProviderFunc , instanceName , metricCache , sqlCfg .TopQueryCollection , sqlCfg .QuerySample , hostName )
127+ if err != nil {
128+ return nil , err
129+ }
130+
131+ f := scraper .NewFactory (metadata .Type , nil ,
132+ scraper .WithLogs (func (context.Context , scraper.Settings , component.Config ) (scraper.Logs , error ) {
133+ return mp , nil
134+ }, component .StabilityLevelAlpha ))
135+ opt := scraperhelper .AddFactoryWithConfig (f , nil )
136+
137+ return scraperhelper .NewLogsController (
138+ & sqlCfg .ControllerConfig ,
139+ settings ,
140+ logsConsumer ,
141+ opt ,
142+ )
143+ }
144+ }
145+
77146func getDataSource (cfg Config ) string {
78147 if cfg .DataSource != "" {
79148 return cfg .DataSource
@@ -95,3 +164,11 @@ func getInstanceName(datasource string) (string, error) {
95164 instanceName := datasourceURL .Host + datasourceURL .Path
96165 return instanceName , nil
97166}
167+
168+ func getHostName (datasource string ) (string , error ) {
169+ datasourceURL , err := url .Parse (datasource )
170+ if err != nil {
171+ return "" , err
172+ }
173+ return datasourceURL .Host , nil
174+ }
0 commit comments