// Package metricsscopes provides functions for working with GCP Metrics Scopes // TODO: add link to metrics scopes package metricsscopes import ( "context" "fmt" metricsscope "cloud.google.com/go/monitoring/metricsscope/apiv1" "cloud.google.com/go/monitoring/metricsscope/apiv1/metricsscopepb" "google.golang.org/api/option" ) // Client allows managing GCP Metrics Scopes for the configured scoping project type Client struct { // ScopingProject can either be the project ID or the project number of the // GCP project that will be monitoring other GCP projects scopingProject string options []option.ClientOption } // New creates a metrics scopes Client for the provided scoping project + // client creation options. When using GOOGLE_APPLICATION_CREDENTIALS or // workload identity, no options are required. func New(scopingProject string, opts ...option.ClientOption) *Client { c := &Client{ scopingProject: scopingProject, options: opts, } return c } // createClient creates a metrics scopes client, reduces boilerplate in our // other methods func (c *Client) createClient(ctx context.Context) (client *metricsscope.MetricsScopesClient, err error) { client, err = metricsscope.NewMetricsScopesClient(ctx, c.options...) if err != nil { return nil, fmt.Errorf("Error creating client: %w", err) } return } // Function AddMonitoredProject takes in Context, GoogleApplication Credentials and ProjectID of the Monitored Project and ProjectID // of Scoping Proejct and adds the Monitored Project to MetricsScopes of Scoping Prohect. func (c *Client) AddMonitoredProject(ctx context.Context, projectID string) (*metricsscope.CreateMonitoredProjectOperation, error) { // Creates a client for MetricsScopes. client, clientErr := c.createClient(ctx) if clientErr != nil { return nil, clientErr } defer client.Close() // Creates a Request for Adding Monitored Project to Scoping Project MetricsScopes createReq := &metricsscopepb.CreateMonitoredProjectRequest{ Parent: fmt.Sprintf("locations/global/metricsScopes/%s", c.scopingProject), MonitoredProject: &metricsscopepb.MonitoredProject{ Name: fmt.Sprintf("locations/global/metricsScopes/%s/projects/%s", c.scopingProject, projectID), }, } createResp, createErr := client.CreateMonitoredProject(ctx, createReq) return createResp, createErr } // QueryMetricsScope returns the list of projects currently being monitored by // the scoping project func (c *Client) QueryMetricsScope(ctx context.Context) (*metricsscopepb.MetricsScope, error) { // Creates a client for MetricsScopes. client, clientErr := c.createClient(ctx) if clientErr != nil { return nil, clientErr } defer client.Close() //Creates a Request for getting Scoping Project MetricsScopes scopesReq := &metricsscopepb.GetMetricsScopeRequest{ Name: fmt.Sprintf("locations/global/metricsScopes/%s", c.scopingProject), } scopesResp, scopesErr := client.GetMetricsScope(ctx, scopesReq) return scopesResp, scopesErr } // ListMetricsScope returns the list of projects currently monitoring the input // project (i.e., the scoping projects for the input project ID) func (c *Client) ListMetricsScope(ctx context.Context, projectID string) (*metricsscopepb.ListMetricsScopesByMonitoredProjectResponse, error) { // Creates a client for MetricsScopes. client, clientErr := c.createClient(ctx) if clientErr != nil { return nil, clientErr } defer client.Close() //Creates a Request for Listing MetricsScopes by Monitored Project. listReq := &metricsscopepb.ListMetricsScopesByMonitoredProjectRequest{ MonitoredResourceContainer: fmt.Sprintf("projects/%s", projectID), } listResp, listErr := client.ListMetricsScopesByMonitoredProject(ctx, listReq) return listResp, listErr } // RemoteMetricsScope removes a monitored project from a scoping project func (c *Client) RemoveMetricsScope(ctx context.Context, projectID string) (*metricsscope.DeleteMonitoredProjectOperation, error) { // Creates a client for MetricsScopes. client, clientErr := c.createClient(ctx) if clientErr != nil { return nil, clientErr } defer client.Close() // Creates a request for deleting monitored project from the Scoping Project MetricsScopes. deleteReq := &metricsscopepb.DeleteMonitoredProjectRequest{ Name: fmt.Sprintf("locations/global/metricsScopes/%s/projects/%s", c.scopingProject, projectID), } deleteResp, deleteErr := client.DeleteMonitoredProject(ctx, deleteReq) return deleteResp, deleteErr }