From 1ca7663e0f532972ead7e650014761c3cbdecd1c Mon Sep 17 00:00:00 2001 From: Gustavo Bazan Date: Thu, 9 Apr 2020 13:34:39 +0100 Subject: [PATCH 1/5] Add database measurements Endpoint --- mongodbatlas/mongodbatlas.go | 2 + mongodbatlas/process_database_measurements.go | 68 ++++++++++++ .../process_database_measurements_test.go | 102 ++++++++++++++++++ mongodbatlas/process_disk_measurements.go | 6 +- .../process_disk_measurements_test.go | 4 +- 5 files changed, 177 insertions(+), 5 deletions(-) create mode 100644 mongodbatlas/process_database_measurements.go create mode 100644 mongodbatlas/process_database_measurements_test.go diff --git a/mongodbatlas/mongodbatlas.go b/mongodbatlas/mongodbatlas.go index c67a130d8..ae3a1c41b 100644 --- a/mongodbatlas/mongodbatlas.go +++ b/mongodbatlas/mongodbatlas.go @@ -85,6 +85,7 @@ type Client struct { ProcessDisks ProcessDisksService ProcessDiskMeasurements ProcessDiskMeasurementsService ProcessDatabases ProcessDatabasesService + ProcessDatabaseMeasurements ProcessDatabaseMeasurementsService Indexes IndexesService Logs LogsService @@ -210,6 +211,7 @@ func NewClient(httpClient *http.Client) *Client { c.ProcessDisks = &ProcessDisksServiceOp{Client: c} c.ProcessDiskMeasurements = &ProcessDiskMeasurementsServiceOp{Client: c} c.ProcessDatabases = &ProcessDatabasesServiceOp{Client: c} + c.ProcessDatabaseMeasurements = &ProcessDatabaseMeasurementsServiceOp{Client: c} c.Indexes = &IndexesServiceOp{Client: c} c.Logs = &LogsServiceOp{Client: c} diff --git a/mongodbatlas/process_database_measurements.go b/mongodbatlas/process_database_measurements.go new file mode 100644 index 000000000..727e56cfd --- /dev/null +++ b/mongodbatlas/process_database_measurements.go @@ -0,0 +1,68 @@ +package mongodbatlas + +import ( + "context" + "fmt" + "net/http" +) + +const processDatabaseMeasurementsPath = processesDatabasesPath + "/%s/measurements" + +// ProcessDatabaseMeasurementsService is an interface for interfacing with the Process Disk Measurements +// endpoints of the MongoDB Atlas API. +// See more: https://docs.atlas.mongodb.com/reference/api/process-databases-measurements/ +type ProcessDatabaseMeasurementsService interface { + List(context.Context, string, string, int, string, *ProcessMeasurementListOptions) (*ProcessDatabaseMeasurements, *Response, error) +} + +// ProcessDatabaseMeasurementsServiceOp handles communication with the process database measurements related methods of the +// MongoDB Atlas API +type ProcessDatabaseMeasurementsServiceOp struct { + Client RequestDoer +} + +// ProcessDiskMeasurements represents a MongoDB Process Disk Measurements. +type ProcessDatabaseMeasurements struct { + *ProcessMeasurements + DatabaseName string `json:"databaseName"` +} + +var _ ProcessDatabaseMeasurementsService = &ProcessDatabaseMeasurementsServiceOp{} + +// List list measurements for a specific Atlas MongoDB database. +// See more: https://docs.atlas.mongodb.com/reference/api/process-databases-measurements/ +func (s *ProcessDatabaseMeasurementsServiceOp) List(ctx context.Context, groupID, hostName string, port int, databaseName string, opts *ProcessMeasurementListOptions) (*ProcessDatabaseMeasurements, *Response, error) { + + if groupID == "" { + return nil, nil, NewArgError("groupID", "must be set") + } + + if hostName == "" { + return nil, nil, NewArgError("hostName", "must be set") + } + + if databaseName == "" { + return nil, nil, NewArgError("databaseName", "must be set") + } + + basePath := fmt.Sprintf(processDatabaseMeasurementsPath, groupID, hostName, port, databaseName) + + //Add query params from listOptions + path, err := setListOptions(basePath, opts) + if err != nil { + return nil, nil, err + } + + req, err := s.Client.NewRequest(ctx, http.MethodGet, path, nil) + if err != nil { + return nil, nil, err + } + + root := new(ProcessDatabaseMeasurements) + resp, err := s.Client.Do(ctx, req, root) + if err != nil { + return nil, resp, err + } + + return root, resp, err +} diff --git a/mongodbatlas/process_database_measurements_test.go b/mongodbatlas/process_database_measurements_test.go new file mode 100644 index 000000000..46bbede4b --- /dev/null +++ b/mongodbatlas/process_database_measurements_test.go @@ -0,0 +1,102 @@ +package mongodbatlas + +import ( + "fmt" + "net/http" + "testing" + + "github.com/go-test/deep" +) + +func TestProcessDatabaseMeasurements_List(t *testing.T) { + setup() + defer teardown() + + groups := "12345678" + host := "shard-00-00.mongodb.net" + port := 27017 + database := "database" + + mux.HandleFunc(fmt.Sprintf("/groups/%s/processes/%s:%d/databases/%s/measurements", groups, host, port, database), func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, http.MethodGet) + fmt.Fprint(w, `{ + "end" : "2017-08-22T20:31:14Z", + "granularity" : "PT1M", + "groupId" : "12345678", + "hostId" : "shard-00-00.mongodb.net:27017", + "links" : [ { + "href" : "https://cloud.mongodb.com/api/atlas/v1.0/groups/12345678/processes/shard-00-00.mongodb.net:27017/dataabses/database/measurements?granularity=PT1M&period=PT1M", + "rel" : "self" + }, { + "href" : "https://cloud.mongodb.com/api/atlas/v1.0/groups/12345678/processes/shard-00-00.mongodb.net:27017", + "rel" : "http://mms.mongodb.com/host" + } ], + "measurements" : [ { + "dataPoints" : [ { + "timestamp" : "2017-08-22T20:31:12Z", + "value" : null + }, { + "timestamp" : "2017-08-22T20:31:14Z", + "value" : null + } ], + "name" : "DISK_PARTITION_IOPS_READ", + "units" : "SCALAR_PER_SECOND" + }], + "databaseName":"database", + "processId" : "shard-00-00.mongodb.net:27017", + "start" : "2017-08-22T20:30:45Z" + }`) + }) + + opts := &ProcessMeasurementListOptions{ + Granularity: "PT1M", + Period: "PT1M", + } + + measurements, _, err := client.ProcessDatabaseMeasurements.List(ctx, groups, host, port, database, opts) + if err != nil { + t.Fatalf("ProcessDatabaseMeasurements.List returned error: %v", err) + } + + expected := &ProcessDatabaseMeasurements{ + ProcessMeasurements: &ProcessMeasurements{ + End: "2017-08-22T20:31:14Z", + Granularity: "PT1M", + GroupID: "12345678", + HostID: "shard-00-00.mongodb.net:27017", + Links: []*Link{ + { + Rel: "self", + Href: "https://cloud.mongodb.com/api/atlas/v1.0/groups/12345678/processes/shard-00-00.mongodb.net:27017/dataabses/database/measurements?granularity=PT1M&period=PT1M", + }, + { + Href: "https://cloud.mongodb.com/api/atlas/v1.0/groups/12345678/processes/shard-00-00.mongodb.net:27017", + Rel: "http://mms.mongodb.com/host", + }, + }, + Measurements: []*Measurements{ + { + DataPoints: []*DataPoints{ + { + Timestamp: "2017-08-22T20:31:12Z", + Value: nil, + }, + { + Timestamp: "2017-08-22T20:31:14Z", + Value: nil, + }, + }, + Name: "DISK_PARTITION_IOPS_READ", + Units: "SCALAR_PER_SECOND", + }, + }, + ProcessID: "shard-00-00.mongodb.net:27017", + Start: "2017-08-22T20:30:45Z", + }, + DatabaseName: "database", + } + + if diff := deep.Equal(measurements, expected); diff != nil { + t.Error(diff) + } +} diff --git a/mongodbatlas/process_disk_measurements.go b/mongodbatlas/process_disk_measurements.go index 8d02f664e..2cff87669 100644 --- a/mongodbatlas/process_disk_measurements.go +++ b/mongodbatlas/process_disk_measurements.go @@ -6,7 +6,7 @@ import ( "net/http" ) -const ProcessDiskMeasurementsPath = processesDisksPath + "/%s/measurements" +const processDiskMeasurementsPath = processesDisksPath + "/%s/measurements" // ProcessDiskMeasurementsService is an interface for interfacing with the Process Disk Measurements // endpoints of the MongoDB Atlas API. @@ -29,7 +29,7 @@ type ProcessDiskMeasurements struct { var _ ProcessDiskMeasurementsService = &ProcessDiskMeasurementsServiceOp{} -// Get gets measurements for a specific Atlas MongoDB disk. +// List list measurements for a specific Atlas MongoDB disk. // See more: https://docs.atlas.mongodb.com/reference/api/process-disks-measurements/#get-measurements-of-a-disk-for-a-mongodb-process func (s *ProcessDiskMeasurementsServiceOp) List(ctx context.Context, groupID, hostName string, port int, diskName string, opts *ProcessMeasurementListOptions) (*ProcessDiskMeasurements, *Response, error) { @@ -45,7 +45,7 @@ func (s *ProcessDiskMeasurementsServiceOp) List(ctx context.Context, groupID, ho return nil, nil, NewArgError("diskName", "must be set") } - basePath := fmt.Sprintf(ProcessDiskMeasurementsPath, groupID, hostName, port, diskName) + basePath := fmt.Sprintf(processDiskMeasurementsPath, groupID, hostName, port, diskName) //Add query params from listOptions path, err := setListOptions(basePath, opts) diff --git a/mongodbatlas/process_disk_measurements_test.go b/mongodbatlas/process_disk_measurements_test.go index 498b68572..1cdb4890c 100644 --- a/mongodbatlas/process_disk_measurements_test.go +++ b/mongodbatlas/process_disk_measurements_test.go @@ -8,7 +8,7 @@ import ( "github.com/go-test/deep" ) -func TestDiskMeasurements_List(t *testing.T) { +func TestProcessDiskMeasurements_List(t *testing.T) { setup() defer teardown() @@ -55,7 +55,7 @@ func TestDiskMeasurements_List(t *testing.T) { measurements, _, err := client.ProcessDiskMeasurements.List(ctx, groups, host, port, disk, opts) if err != nil { - t.Fatalf("Teams.Get returned error: %v", err) + t.Fatalf("ProcessDiskMeasurements.List returned error: %v", err) } expected := &ProcessDiskMeasurements{ From 48b9ddc0775022fa902c594ab450b04dd5da51f7 Mon Sep 17 00:00:00 2001 From: Gustavo Bazan Date: Thu, 9 Apr 2020 13:36:15 +0100 Subject: [PATCH 2/5] Update process_database_measurements.go --- mongodbatlas/process_database_measurements.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mongodbatlas/process_database_measurements.go b/mongodbatlas/process_database_measurements.go index 727e56cfd..61e2f9a1e 100644 --- a/mongodbatlas/process_database_measurements.go +++ b/mongodbatlas/process_database_measurements.go @@ -8,7 +8,7 @@ import ( const processDatabaseMeasurementsPath = processesDatabasesPath + "/%s/measurements" -// ProcessDatabaseMeasurementsService is an interface for interfacing with the Process Disk Measurements +// ProcessDatabaseMeasurementsService is an interface for interfacing with the process database measurements // endpoints of the MongoDB Atlas API. // See more: https://docs.atlas.mongodb.com/reference/api/process-databases-measurements/ type ProcessDatabaseMeasurementsService interface { @@ -21,7 +21,7 @@ type ProcessDatabaseMeasurementsServiceOp struct { Client RequestDoer } -// ProcessDiskMeasurements represents a MongoDB Process Disk Measurements. +// ProcessDiskMeasurements represents a MongoDB process database measurements. type ProcessDatabaseMeasurements struct { *ProcessMeasurements DatabaseName string `json:"databaseName"` From ef73690f73edaced361b6585a7987330a54331a9 Mon Sep 17 00:00:00 2001 From: Gustavo Bazan Date: Thu, 9 Apr 2020 13:59:10 +0100 Subject: [PATCH 3/5] Update mongodbatlas/process_database_measurements.go Co-Authored-By: Andrea Angiolillo --- mongodbatlas/process_database_measurements.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mongodbatlas/process_database_measurements.go b/mongodbatlas/process_database_measurements.go index 61e2f9a1e..b82ef6ac5 100644 --- a/mongodbatlas/process_database_measurements.go +++ b/mongodbatlas/process_database_measurements.go @@ -21,7 +21,7 @@ type ProcessDatabaseMeasurementsServiceOp struct { Client RequestDoer } -// ProcessDiskMeasurements represents a MongoDB process database measurements. +// ProcessDatabaseMeasurements represents a MongoDB process database measurements. type ProcessDatabaseMeasurements struct { *ProcessMeasurements DatabaseName string `json:"databaseName"` From cebb5ebf8e2c8287ac22150fe36be6afeee40e80 Mon Sep 17 00:00:00 2001 From: Gustavo Bazan Date: Thu, 9 Apr 2020 13:59:16 +0100 Subject: [PATCH 4/5] Update mongodbatlas/process_disk_measurements.go Co-Authored-By: Andrea Angiolillo --- mongodbatlas/process_disk_measurements.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mongodbatlas/process_disk_measurements.go b/mongodbatlas/process_disk_measurements.go index 2cff87669..9f2d1c143 100644 --- a/mongodbatlas/process_disk_measurements.go +++ b/mongodbatlas/process_disk_measurements.go @@ -29,7 +29,7 @@ type ProcessDiskMeasurements struct { var _ ProcessDiskMeasurementsService = &ProcessDiskMeasurementsServiceOp{} -// List list measurements for a specific Atlas MongoDB disk. +// List lists measurements for a specific Atlas MongoDB disk. // See more: https://docs.atlas.mongodb.com/reference/api/process-disks-measurements/#get-measurements-of-a-disk-for-a-mongodb-process func (s *ProcessDiskMeasurementsServiceOp) List(ctx context.Context, groupID, hostName string, port int, diskName string, opts *ProcessMeasurementListOptions) (*ProcessDiskMeasurements, *Response, error) { From 643d507b35afb19b01b69a6710d152cb64ed0bcf Mon Sep 17 00:00:00 2001 From: Gustavo Bazan Date: Mon, 13 Apr 2020 17:08:29 +0100 Subject: [PATCH 5/5] Update mongodbatlas.go --- mongodbatlas/mongodbatlas.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mongodbatlas/mongodbatlas.go b/mongodbatlas/mongodbatlas.go index ae3a1c41b..2ef6d6488 100644 --- a/mongodbatlas/mongodbatlas.go +++ b/mongodbatlas/mongodbatlas.go @@ -21,7 +21,7 @@ const ( libraryVersion = "0.1" defaultBaseURL = "https://cloud.mongodb.com/api/atlas/v1.0/" userAgent = "go-mongodbatlas" + libraryVersion - mediaType = "application/json" + jsonMediaType = "application/json" gzipMediaType = "application/gzip" ) @@ -275,9 +275,9 @@ func (c *Client) NewRequest(ctx context.Context, method, urlStr string, body int } if body != nil { - req.Header.Set("Content-Type", mediaType) + req.Header.Set("Content-Type", jsonMediaType) } - req.Header.Add("Accept", mediaType) + req.Header.Add("Accept", jsonMediaType) if c.UserAgent != "" { req.Header.Set("User-Agent", c.UserAgent) }