Skip to content

Commit 8509bcd

Browse files
authored
resolved: review comments (#44)
* resolved: review comments
1 parent 948764b commit 8509bcd

20 files changed

+364
-318
lines changed

src/main.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
//go:generate goversioninfo
12
package main
23

34
import (
@@ -91,7 +92,7 @@ func main() {
9192
log.Error(err.Error())
9293
}
9394

94-
if args.EnableQueryMonitoring {
95+
if args.EnableQueryMonitoring && args.HasMetrics() {
9596
queryperformancemonitoring.QueryPerformanceMain(args, pgIntegration, collectionList)
9697
}
9798

src/query-performance-monitoring/common-utils/common-helpers.go src/query-performance-monitoring/common-utils/common_helpers.go

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/newrelic/nri-postgresql/src/collection"
1212
)
1313

14+
// re is a regular expression that matches single-quoted strings, numbers, or double-quoted strings
1415
var re = regexp.MustCompile(`'[^']*'|\d+|".*?"`)
1516

1617
func GetQuotedStringFromArray(array []string) string {

src/query-performance-monitoring/common-utils/commmon-helpers_test.go src/query-performance-monitoring/common-utils/common_helpers_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ func TestGetQuotedStringFromArray(t *testing.T) {
1818
}
1919

2020
func TestGetDatabaseListInString(t *testing.T) {
21-
dbListKeys := []string{"db1", "db2"}
21+
dbListKeys := []string{"db1"}
2222
sort.Strings(dbListKeys) // Sort the keys to ensure consistent order
2323
dbList := collection.DatabaseList{}
2424
for _, key := range dbListKeys {
2525
dbList[key] = collection.SchemaList{}
2626
}
27-
expected := "'db1','db2'"
27+
expected := "'db1'"
2828
result := commonutils.GetDatabaseListInString(dbList)
2929
assert.Equal(t, expected, result)
3030

src/query-performance-monitoring/common-utils/ingestion-helpers.go

+11-9
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ import (
44
"fmt"
55
"reflect"
66

7+
globalvariables "github.com/newrelic/nri-postgresql/src/query-performance-monitoring/global-variables"
8+
79
"github.com/newrelic/infra-integrations-sdk/v3/data/metric"
810
"github.com/newrelic/infra-integrations-sdk/v3/integration"
911
"github.com/newrelic/infra-integrations-sdk/v3/log"
10-
"github.com/newrelic/nri-postgresql/src/args"
1112
)
1213

1314
func SetMetric(metricSet *metric.Set, name string, value interface{}, sourceType string) {
@@ -33,8 +34,9 @@ func SetMetric(metricSet *metric.Set, name string, value interface{}, sourceType
3334
}
3435
}
3536

36-
func IngestMetric(metricList []interface{}, eventName string, pgIntegration *integration.Integration, args args.ArgumentList) {
37-
instanceEntity, err := CreateEntity(pgIntegration, args)
37+
// IngestMetric is a util by which we publish data in batches .Reason for this is to avoid publishing large data in one go and its a limitation for NewRelic.
38+
func IngestMetric(metricList []interface{}, eventName string, pgIntegration *integration.Integration, gv *globalvariables.GlobalVariables) {
39+
instanceEntity, err := CreateEntity(pgIntegration, gv)
3840
if err != nil {
3941
log.Error("Error creating entity: %v", err)
4042
return
@@ -58,22 +60,22 @@ func IngestMetric(metricList []interface{}, eventName string, pgIntegration *int
5860

5961
if metricCount == PublishThreshold || metricCount == lenOfMetricList {
6062
metricCount = 0
61-
if err := PublishMetrics(pgIntegration, &instanceEntity, args); err != nil {
63+
if err := PublishMetrics(pgIntegration, &instanceEntity, gv); err != nil {
6264
log.Error("Error publishing metrics: %v", err)
6365
return
6466
}
6567
}
6668
}
6769
if metricCount > 0 {
68-
if err := PublishMetrics(pgIntegration, &instanceEntity, args); err != nil {
70+
if err := PublishMetrics(pgIntegration, &instanceEntity, gv); err != nil {
6971
log.Error("Error publishing metrics: %v", err)
7072
return
7173
}
7274
}
7375
}
7476

75-
func CreateEntity(pgIntegration *integration.Integration, args args.ArgumentList) (*integration.Entity, error) {
76-
return pgIntegration.Entity(fmt.Sprintf("%s:%s", args.Hostname, args.Port), "pg-instance")
77+
func CreateEntity(pgIntegration *integration.Integration, gv *globalvariables.GlobalVariables) (*integration.Entity, error) {
78+
return pgIntegration.Entity(fmt.Sprintf("%s:%s", gv.Hostname, gv.Port), "pg-instance")
7779
}
7880

7981
func ProcessModel(model interface{}, metricSet *metric.Set) error {
@@ -108,11 +110,11 @@ func ProcessModel(model interface{}, metricSet *metric.Set) error {
108110
return nil
109111
}
110112

111-
func PublishMetrics(pgIntegration *integration.Integration, instanceEntity **integration.Entity, args args.ArgumentList) error {
113+
func PublishMetrics(pgIntegration *integration.Integration, instanceEntity **integration.Entity, gv *globalvariables.GlobalVariables) error {
112114
if err := pgIntegration.Publish(); err != nil {
113115
return err
114116
}
115117
var err error
116-
*instanceEntity, err = pgIntegration.Entity(fmt.Sprintf("%s:%s", args.Hostname, args.Port), "pg-instance")
118+
*instanceEntity, err = CreateEntity(pgIntegration, gv)
117119
return err
118120
}

src/query-performance-monitoring/common-utils/ingestion-helper_test.go src/query-performance-monitoring/common-utils/ingestion_helper_test.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package commonutils_test
33
import (
44
"testing"
55

6+
global_variables "github.com/newrelic/nri-postgresql/src/query-performance-monitoring/global-variables"
7+
68
"github.com/newrelic/infra-integrations-sdk/v3/integration"
79
"github.com/newrelic/nri-postgresql/src/args"
810
commonutils "github.com/newrelic/nri-postgresql/src/query-performance-monitoring/common-utils"
@@ -12,15 +14,11 @@ import (
1214
func TestSetMetric(t *testing.T) {
1315
pgIntegration, _ := integration.New("test", "1.0.0")
1416
entity, _ := pgIntegration.Entity("test-entity", "test-type")
15-
1617
metricSet := entity.NewMetricSet("test-event")
17-
1818
commonutils.SetMetric(metricSet, "testGauge", 123.0, "gauge")
1919
assert.Equal(t, 123.0, metricSet.Metrics["testGauge"])
20-
2120
commonutils.SetMetric(metricSet, "testAttribute", "value", "attribute")
2221
assert.Equal(t, "value", metricSet.Metrics["testAttribute"])
23-
2422
commonutils.SetMetric(metricSet, "testDefault", 456.0, "unknown")
2523
assert.Equal(t, 456.0, metricSet.Metrics["testDefault"])
2624
}
@@ -31,13 +29,13 @@ func TestIngestMetric(t *testing.T) {
3129
Hostname: "localhost",
3230
Port: "5432",
3331
}
32+
gv := global_variables.SetGlobalVariables(args, uint64(14), "testdb")
3433
metricList := []interface{}{
3534
struct {
3635
TestField int `metric_name:"testField" source_type:"gauge"`
3736
}{TestField: 123},
3837
}
39-
40-
commonutils.IngestMetric(metricList, "testEvent", pgIntegration, args)
38+
commonutils.IngestMetric(metricList, "testEvent", pgIntegration, gv)
4139
assert.NotEmpty(t, pgIntegration.Entities)
4240
}
4341

@@ -47,8 +45,9 @@ func TestCreateEntity(t *testing.T) {
4745
Hostname: "localhost",
4846
Port: "5432",
4947
}
48+
gv := global_variables.SetGlobalVariables(args, uint64(14), "testdb")
5049

51-
entity, err := commonutils.CreateEntity(pgIntegration, args)
50+
entity, err := commonutils.CreateEntity(pgIntegration, gv)
5251
assert.NoError(t, err)
5352
assert.NotNil(t, entity)
5453
assert.Equal(t, "localhost:5432", entity.Metadata.Name)
@@ -75,9 +74,10 @@ func TestPublishMetrics(t *testing.T) {
7574
Hostname: "localhost",
7675
Port: "5432",
7776
}
78-
entity, _ := commonutils.CreateEntity(pgIntegration, args)
77+
gv := global_variables.SetGlobalVariables(args, uint64(14), "testdb")
78+
entity, _ := commonutils.CreateEntity(pgIntegration, gv)
7979

80-
err := commonutils.PublishMetrics(pgIntegration, &entity, args)
80+
err := commonutils.PublishMetrics(pgIntegration, &entity, gv)
8181
assert.NoError(t, err)
8282
assert.NotNil(t, entity)
8383
}

src/query-performance-monitoring/common-utils/query-fetch-helpers.go src/query-performance-monitoring/common-utils/query_fetch_helpers.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func FetchVersionSpecificIndividualQueries(version uint64) (string, error) {
3030
switch {
3131
case version == PostgresVersion12:
3232
return queries.IndividualQuerySearchV12, nil
33-
case version >= PostgresVersion12:
33+
case version > PostgresVersion12:
3434
return queries.IndividualQuerySearchV13AndAbove, nil
3535
default:
3636
return "", ErrUnsupportedVersion
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package globalvariables
2+
3+
import (
4+
"github.com/newrelic/nri-postgresql/src/args"
5+
)
6+
7+
type GlobalVariables struct {
8+
QueryResponseTimeThreshold int
9+
QueryCountThreshold int
10+
Version uint64
11+
DatabaseString string
12+
Hostname string
13+
Port string
14+
Arguments args.ArgumentList
15+
}
16+
17+
func SetGlobalVariables(args args.ArgumentList, version uint64, databaseString string) *GlobalVariables {
18+
return &GlobalVariables{
19+
QueryResponseTimeThreshold: args.QueryResponseTimeThreshold,
20+
QueryCountThreshold: args.QueryCountThreshold,
21+
Version: version,
22+
DatabaseString: databaseString,
23+
Hostname: args.Hostname,
24+
Port: args.Port,
25+
Arguments: args,
26+
}
27+
}

src/query-performance-monitoring/performance-metrics/blocking_sessions.go

+10-9
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,19 @@ package performancemetrics
33
import (
44
"fmt"
55

6+
globalvariables "github.com/newrelic/nri-postgresql/src/query-performance-monitoring/global-variables"
7+
68
"github.com/newrelic/infra-integrations-sdk/v3/integration"
79
commonutils "github.com/newrelic/nri-postgresql/src/query-performance-monitoring/common-utils"
810
"github.com/newrelic/nri-postgresql/src/query-performance-monitoring/validations"
911

1012
"github.com/newrelic/infra-integrations-sdk/v3/log"
11-
"github.com/newrelic/nri-postgresql/src/args"
1213
performancedbconnection "github.com/newrelic/nri-postgresql/src/connection"
1314
"github.com/newrelic/nri-postgresql/src/query-performance-monitoring/datamodels"
1415
)
1516

16-
func PopulateBlockingMetrics(conn *performancedbconnection.PGSQLConnection, pgIntegration *integration.Integration, args args.ArgumentList, databaseName string, version uint64) error {
17-
isEligible, enableCheckError := validations.CheckBlockingSessionMetricsFetchEligibility(conn, version)
17+
func PopulateBlockingMetrics(conn *performancedbconnection.PGSQLConnection, pgIntegration *integration.Integration, gv *globalvariables.GlobalVariables) error {
18+
isEligible, enableCheckError := validations.CheckBlockingSessionMetricsFetchEligibility(conn, gv.Version)
1819
if enableCheckError != nil {
1920
log.Debug("Error executing query: %v in PopulateBlockingMetrics", enableCheckError)
2021
return commonutils.ErrUnExpectedError
@@ -23,7 +24,7 @@ func PopulateBlockingMetrics(conn *performancedbconnection.PGSQLConnection, pgIn
2324
log.Debug("Extension 'pg_stat_statements' is not enabled or unsupported version.")
2425
return commonutils.ErrNotEligible
2526
}
26-
blockingQueriesMetricsList, blockQueryFetchErr := GetBlockingMetrics(conn, args, databaseName, version)
27+
blockingQueriesMetricsList, blockQueryFetchErr := GetBlockingMetrics(conn, gv)
2728
if blockQueryFetchErr != nil {
2829
log.Error("Error fetching Blocking queries: %v", blockQueryFetchErr)
2930
return commonutils.ErrUnExpectedError
@@ -32,18 +33,18 @@ func PopulateBlockingMetrics(conn *performancedbconnection.PGSQLConnection, pgIn
3233
log.Debug("No Blocking queries found.")
3334
return nil
3435
}
35-
commonutils.IngestMetric(blockingQueriesMetricsList, "PostgresBlockingSessions", pgIntegration, args)
36+
commonutils.IngestMetric(blockingQueriesMetricsList, "PostgresBlockingSessions", pgIntegration, gv)
3637
return nil
3738
}
3839

39-
func GetBlockingMetrics(conn *performancedbconnection.PGSQLConnection, args args.ArgumentList, databaseName string, version uint64) ([]interface{}, error) {
40+
func GetBlockingMetrics(conn *performancedbconnection.PGSQLConnection, gv *globalvariables.GlobalVariables) ([]interface{}, error) {
4041
var blockingQueriesMetricsList []interface{}
41-
versionSpecificBlockingQuery, err := commonutils.FetchVersionSpecificBlockingQueries(version)
42+
versionSpecificBlockingQuery, err := commonutils.FetchVersionSpecificBlockingQueries(gv.Version)
4243
if err != nil {
4344
log.Error("Unsupported postgres version: %v", err)
4445
return nil, err
4546
}
46-
var query = fmt.Sprintf(versionSpecificBlockingQuery, databaseName, min(args.QueryCountThreshold, commonutils.MaxQueryThreshold))
47+
var query = fmt.Sprintf(versionSpecificBlockingQuery, gv.DatabaseString, min(gv.QueryCountThreshold, commonutils.MaxQueryThreshold))
4748
rows, err := conn.Queryx(query)
4849
if err != nil {
4950
log.Error("Failed to execute query: %v", err)
@@ -54,7 +55,7 @@ func GetBlockingMetrics(conn *performancedbconnection.PGSQLConnection, args args
5455
if scanError := rows.StructScan(&blockingQueryMetric); scanError != nil {
5556
return nil, scanError
5657
}
57-
if version == commonutils.PostgresVersion13 || version == commonutils.PostgresVersion12 {
58+
if gv.Version == commonutils.PostgresVersion13 || gv.Version == commonutils.PostgresVersion12 {
5859
*blockingQueryMetric.BlockedQuery = commonutils.AnonymizeQueryText(*blockingQueryMetric.BlockedQuery)
5960
*blockingQueryMetric.BlockingQuery = commonutils.AnonymizeQueryText(*blockingQueryMetric.BlockingQuery)
6061
}

src/query-performance-monitoring/performance-metrics/blocking_sessions_test.go

+15-10
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ import (
55
"regexp"
66
"testing"
77

8-
commonutils "github.com/newrelic/nri-postgresql/src/query-performance-monitoring/common-utils"
9-
"github.com/newrelic/nri-postgresql/src/query-performance-monitoring/queries"
10-
"gopkg.in/DATA-DOG/go-sqlmock.v1"
11-
128
"github.com/newrelic/infra-integrations-sdk/v3/integration"
139
"github.com/newrelic/nri-postgresql/src/args"
1410
"github.com/newrelic/nri-postgresql/src/connection"
11+
commonutils "github.com/newrelic/nri-postgresql/src/query-performance-monitoring/common-utils"
12+
global_variables "github.com/newrelic/nri-postgresql/src/query-performance-monitoring/global-variables"
1513
performancemetrics "github.com/newrelic/nri-postgresql/src/query-performance-monitoring/performance-metrics"
14+
"github.com/newrelic/nri-postgresql/src/query-performance-monitoring/queries"
1615
"github.com/stretchr/testify/assert"
16+
"gopkg.in/DATA-DOG/go-sqlmock.v1"
1717
)
1818

1919
func TestPopulateBlockingMetrics(t *testing.T) {
@@ -22,6 +22,7 @@ func TestPopulateBlockingMetrics(t *testing.T) {
2222
args := args.ArgumentList{QueryCountThreshold: 10}
2323
databaseName := "testdb"
2424
version := uint64(14)
25+
gv := global_variables.SetGlobalVariables(args, version, databaseName)
2526
validationQueryStatStatements := fmt.Sprintf("SELECT count(*) FROM pg_extension WHERE extname = '%s'", "pg_stat_statements")
2627
mock.ExpectQuery(regexp.QuoteMeta(validationQueryStatStatements)).WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(1))
2728
expectedQuery := queries.BlockingQueriesForV14AndAbove
@@ -34,7 +35,7 @@ func TestPopulateBlockingMetrics(t *testing.T) {
3435
456, "SELECT 2", 4566, "2023-01-01 00:00:00",
3536
))
3637

37-
err := performancemetrics.PopulateBlockingMetrics(conn, pgIntegration, args, databaseName, version)
38+
err := performancemetrics.PopulateBlockingMetrics(conn, pgIntegration, gv)
3839
assert.NoError(t, err)
3940
assert.NoError(t, mock.ExpectationsWereMet())
4041
}
@@ -45,6 +46,7 @@ func TestPopulateBlockingMetricsSupportedVersionExtensionNotRequired(t *testing.
4546
args := args.ArgumentList{QueryCountThreshold: 10}
4647
databaseName := "testdb"
4748
version := uint64(12)
49+
gv := global_variables.SetGlobalVariables(args, version, databaseName)
4850
expectedQuery := queries.BlockingQueriesForV12AndV13
4951
query := fmt.Sprintf(expectedQuery, databaseName, min(args.QueryCountThreshold, commonutils.MaxQueryThreshold))
5052
mock.ExpectQuery(regexp.QuoteMeta(query)).WillReturnRows(sqlmock.NewRows([]string{
@@ -54,7 +56,7 @@ func TestPopulateBlockingMetricsSupportedVersionExtensionNotRequired(t *testing.
5456
"newrelic_value", 123, "SELECT 1", 1233444, "2023-01-01 00:00:00", "testdb",
5557
456, "SELECT 2", 4566, "2023-01-01 00:00:00",
5658
))
57-
err := performancemetrics.PopulateBlockingMetrics(conn, pgIntegration, args, databaseName, version)
59+
err := performancemetrics.PopulateBlockingMetrics(conn, pgIntegration, gv)
5860
assert.NoError(t, err)
5961
assert.NoError(t, mock.ExpectationsWereMet())
6062
}
@@ -65,7 +67,8 @@ func TestPopulateBlockingMetricsUnSupportedVersion(t *testing.T) {
6567
args := args.ArgumentList{QueryCountThreshold: 10}
6668
databaseName := "testdb"
6769
version := uint64(11)
68-
err := performancemetrics.PopulateBlockingMetrics(conn, pgIntegration, args, databaseName, version)
70+
gv := global_variables.SetGlobalVariables(args, version, databaseName)
71+
err := performancemetrics.PopulateBlockingMetrics(conn, pgIntegration, gv)
6972
assert.EqualError(t, err, commonutils.ErrNotEligible.Error())
7073
assert.NoError(t, mock.ExpectationsWereMet())
7174
}
@@ -76,9 +79,10 @@ func TestPopulateBlockingMetricsExtensionsNotEnabled(t *testing.T) {
7679
args := args.ArgumentList{QueryCountThreshold: 10}
7780
databaseName := "testdb"
7881
version := uint64(14)
82+
gv := global_variables.SetGlobalVariables(args, version, databaseName)
7983
validationQueryStatStatements := fmt.Sprintf("SELECT count(*) FROM pg_extension WHERE extname = '%s'", "pg_stat_statements")
8084
mock.ExpectQuery(regexp.QuoteMeta(validationQueryStatStatements)).WillReturnRows(sqlmock.NewRows([]string{"count"}).AddRow(0))
81-
err := performancemetrics.PopulateBlockingMetrics(conn, pgIntegration, args, databaseName, version)
85+
err := performancemetrics.PopulateBlockingMetrics(conn, pgIntegration, gv)
8286
assert.EqualError(t, err, commonutils.ErrNotEligible.Error())
8387
assert.NoError(t, mock.ExpectationsWereMet())
8488
}
@@ -88,6 +92,8 @@ func TestGetBlockingMetrics(t *testing.T) {
8892
args := args.ArgumentList{QueryCountThreshold: 10}
8993
databaseName := "testdb"
9094
version := uint64(13)
95+
gv := global_variables.SetGlobalVariables(args, version, databaseName)
96+
9197
expectedQuery := queries.BlockingQueriesForV12AndV13
9298
query := fmt.Sprintf(expectedQuery, databaseName, min(args.QueryCountThreshold, commonutils.MaxQueryThreshold))
9399
mock.ExpectQuery(regexp.QuoteMeta(query)).WillReturnRows(sqlmock.NewRows([]string{
@@ -97,8 +103,7 @@ func TestGetBlockingMetrics(t *testing.T) {
97103
"newrelic_value", 123, "SELECT 1", 1233444, "2023-01-01 00:00:00", "testdb",
98104
456, "SELECT 2", 4566, "2023-01-01 00:00:00",
99105
))
100-
blockingQueriesMetricsList, err := performancemetrics.GetBlockingMetrics(conn, args, databaseName, version)
101-
106+
blockingQueriesMetricsList, err := performancemetrics.GetBlockingMetrics(conn, gv)
102107
assert.NoError(t, err)
103108
assert.Len(t, blockingQueriesMetricsList, 1)
104109
assert.NoError(t, mock.ExpectationsWereMet())

src/query-performance-monitoring/performance-metrics/execution_plan_metrics.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,26 @@ import (
66
"github.com/go-viper/mapstructure/v2"
77
"github.com/newrelic/infra-integrations-sdk/v3/integration"
88
"github.com/newrelic/infra-integrations-sdk/v3/log"
9-
"github.com/newrelic/nri-postgresql/src/args"
109
performancedbconnection "github.com/newrelic/nri-postgresql/src/connection"
1110
commonutils "github.com/newrelic/nri-postgresql/src/query-performance-monitoring/common-utils"
1211
"github.com/newrelic/nri-postgresql/src/query-performance-monitoring/datamodels"
12+
globalvariables "github.com/newrelic/nri-postgresql/src/query-performance-monitoring/global-variables"
1313
)
1414

15-
func PopulateExecutionPlanMetrics(results []datamodels.IndividualQueryMetrics, pgIntegration *integration.Integration, args args.ArgumentList) {
15+
func PopulateExecutionPlanMetrics(results []datamodels.IndividualQueryMetrics, pgIntegration *integration.Integration, gv *globalvariables.GlobalVariables) {
1616
if len(results) == 0 {
1717
log.Debug("No individual queries found.")
1818
return
1919
}
20-
executionDetailsList := GetExecutionPlanMetrics(results, args)
21-
commonutils.IngestMetric(executionDetailsList, "PostgresExecutionPlanMetrics", pgIntegration, args)
20+
executionDetailsList := GetExecutionPlanMetrics(results, gv)
21+
commonutils.IngestMetric(executionDetailsList, "PostgresExecutionPlanMetrics", pgIntegration, gv)
2222
}
2323

24-
func GetExecutionPlanMetrics(results []datamodels.IndividualQueryMetrics, args args.ArgumentList) []interface{} {
24+
func GetExecutionPlanMetrics(results []datamodels.IndividualQueryMetrics, gv *globalvariables.GlobalVariables) []interface{} {
2525
var executionPlanMetricsList []interface{}
2626
var groupIndividualQueriesByDatabase = GroupQueriesByDatabase(results)
2727
for dbName, individualQueriesList := range groupIndividualQueriesByDatabase {
28-
connectionInfo := performancedbconnection.DefaultConnectionInfo(&args)
28+
connectionInfo := performancedbconnection.DefaultConnectionInfo(&gv.Arguments)
2929
dbConn, err := connectionInfo.NewConnection(dbName)
3030
if err != nil {
3131
log.Error("Error opening database connection: %v", err)

0 commit comments

Comments
 (0)