github.com/newrelic/newrelic-client-go@v1.1.0/pkg/eventstometrics/eventstometrics.go (about)

     1  package eventstometrics
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"strings"
     8  
     9  	"github.com/newrelic/newrelic-client-go/internal/http"
    10  	"github.com/newrelic/newrelic-client-go/pkg/config"
    11  	nrErrors "github.com/newrelic/newrelic-client-go/pkg/errors"
    12  	"github.com/newrelic/newrelic-client-go/pkg/logging"
    13  )
    14  
    15  // EventsToMetrics is used to communicate with New Relic EventsToMetrics.
    16  type EventsToMetrics struct {
    17  	client http.Client
    18  	config config.Config
    19  	logger logging.Logger
    20  }
    21  
    22  // New is used to create a new EventsToMetrics client instance.
    23  func New(config config.Config) EventsToMetrics {
    24  	client := http.NewClient(config)
    25  	client.SetAuthStrategy(&http.PersonalAPIKeyCapableV2Authorizer{})
    26  
    27  	pkg := EventsToMetrics{
    28  		client: client,
    29  		config: config,
    30  		logger: config.GetLogger(),
    31  	}
    32  
    33  	return pkg
    34  }
    35  
    36  // ListRules retrieves a set of New Relic events to metrics rules by their account ID.
    37  func (e *EventsToMetrics) ListRules(accountID int) ([]EventsToMetricsRule, error) {
    38  	return e.ListRulesWithContext(context.Background(), accountID)
    39  }
    40  
    41  // ListRulesWithContext retrieves a set of New Relic events to metrics rules by their account ID.
    42  func (e *EventsToMetrics) ListRulesWithContext(ctx context.Context, accountID int) ([]EventsToMetricsRule, error) {
    43  	resp := listRulesResponse{}
    44  	vars := map[string]interface{}{
    45  		"accountId": accountID,
    46  	}
    47  
    48  	if err := e.client.NerdGraphQueryWithContext(ctx, listEventsToMetricsRulesQuery, vars, &resp); err != nil {
    49  		return nil, err
    50  	}
    51  
    52  	if len(resp.Actor.Account.EventsToMetrics.AllRules.Rules) == 0 {
    53  		return nil, nrErrors.NewNotFound("")
    54  	}
    55  
    56  	return resp.Actor.Account.EventsToMetrics.AllRules.Rules, nil
    57  }
    58  
    59  // GetRule retrieves one or more New Relic events to metrics rules by their IDs.
    60  func (e *EventsToMetrics) GetRule(accountID int, ruleID string) (*EventsToMetricsRule, error) {
    61  	return e.GetRuleWithContext(context.Background(), accountID, ruleID)
    62  }
    63  
    64  // GetRuleWithContext retrieves one or more New Relic events to metrics rules by their IDs.
    65  func (e *EventsToMetrics) GetRuleWithContext(ctx context.Context, accountID int, ruleID string) (*EventsToMetricsRule, error) {
    66  	rules, err := e.GetRules(accountID, []string{ruleID})
    67  	if err != nil {
    68  		return nil, err
    69  	}
    70  
    71  	return &rules[0], nil
    72  }
    73  
    74  // GetRules retrieves one or more New Relic events to metrics rules by their IDs.
    75  func (e *EventsToMetrics) GetRules(accountID int, ruleIDs []string) ([]EventsToMetricsRule, error) {
    76  	return e.GetRulesWithContext(context.Background(), accountID, ruleIDs)
    77  }
    78  
    79  // GetRulesWithContext retrieves one or more New Relic events to metrics rules by their IDs.
    80  func (e *EventsToMetrics) GetRulesWithContext(ctx context.Context, accountID int, ruleIDs []string) ([]EventsToMetricsRule, error) {
    81  	resp := getRulesResponse{}
    82  	vars := map[string]interface{}{
    83  		"accountId": accountID,
    84  		"ruleIds":   ruleIDs,
    85  	}
    86  
    87  	if err := e.client.NerdGraphQueryWithContext(ctx, getEventsToMetricsRulesQuery, vars, &resp); err != nil {
    88  		return nil, err
    89  	}
    90  
    91  	if len(resp.Actor.Account.EventsToMetrics.RulesByID.Rules) == 0 {
    92  		return nil, nrErrors.NewNotFound("")
    93  	}
    94  
    95  	return resp.Actor.Account.EventsToMetrics.RulesByID.Rules, nil
    96  }
    97  
    98  // CreateRules creates one or more New Relic events to metrics rules.
    99  func (e *EventsToMetrics) CreateRules(createInput []EventsToMetricsCreateRuleInput) ([]EventsToMetricsRule, error) {
   100  	return e.CreateRulesWithContext(context.Background(), createInput)
   101  }
   102  
   103  // CreateRulesWithContext creates one or more New Relic events to metrics rules.
   104  func (e *EventsToMetrics) CreateRulesWithContext(ctx context.Context, createInput []EventsToMetricsCreateRuleInput) ([]EventsToMetricsRule, error) {
   105  	resp := createRuleResponse{}
   106  	vars := map[string]interface{}{
   107  		"createInput": createInput,
   108  	}
   109  
   110  	if err := e.client.NerdGraphQueryWithContext(ctx, eventsToMetricsCreateRuleMutation, vars, &resp); err != nil {
   111  		return nil, err
   112  	}
   113  
   114  	if len(resp.EventsToMetricsCreateRule.Failures) > 0 {
   115  		return nil, errors.New(resp.EventsToMetricsCreateRule.Errors())
   116  	}
   117  
   118  	return resp.EventsToMetricsCreateRule.Successes, nil
   119  }
   120  
   121  // DeleteRules deletes one or more New Relic events to metrics rules.
   122  func (e *EventsToMetrics) DeleteRules(deleteInput []EventsToMetricsDeleteRuleInput) ([]EventsToMetricsRule, error) {
   123  	return e.DeleteRulesWithContext(context.Background(), deleteInput)
   124  }
   125  
   126  // DeleteRulesWithContext deletes one or more New Relic events to metrics rules.
   127  func (e *EventsToMetrics) DeleteRulesWithContext(ctx context.Context, deleteInput []EventsToMetricsDeleteRuleInput) ([]EventsToMetricsRule, error) {
   128  	resp := deleteRuleResponse{}
   129  	vars := map[string]interface{}{
   130  		"deleteInput": deleteInput,
   131  	}
   132  
   133  	if err := e.client.NerdGraphQueryWithContext(ctx, eventsToMetricsDeleteRuleMutation, vars, &resp); err != nil {
   134  		return nil, err
   135  	}
   136  
   137  	if len(resp.EventsToMetricsDeleteRule.Failures) > 0 {
   138  		return nil, errors.New(resp.EventsToMetricsDeleteRule.Errors())
   139  	}
   140  
   141  	return resp.EventsToMetricsDeleteRule.Successes, nil
   142  }
   143  
   144  // UpdateRules updates one or more New Relic events to metrics rules.
   145  func (e *EventsToMetrics) UpdateRules(updateInput []EventsToMetricsUpdateRuleInput) ([]EventsToMetricsRule, error) {
   146  	return e.UpdateRulesWithContext(context.Background(), updateInput)
   147  }
   148  
   149  // UpdateRulesWithContext updates one or more New Relic events to metrics rules.
   150  func (e *EventsToMetrics) UpdateRulesWithContext(ctx context.Context, updateInput []EventsToMetricsUpdateRuleInput) ([]EventsToMetricsRule, error) {
   151  	resp := updateRuleResponse{}
   152  	vars := map[string]interface{}{
   153  		"updateInput": updateInput,
   154  	}
   155  
   156  	if err := e.client.NerdGraphQueryWithContext(ctx, eventsToMetricsUpdateRuleMutation, vars, &resp); err != nil {
   157  		return nil, err
   158  	}
   159  
   160  	if len(resp.EventsToMetricsUpdateRule.Failures) > 0 {
   161  		return nil, errors.New(resp.EventsToMetricsUpdateRule.Errors())
   162  	}
   163  
   164  	return resp.EventsToMetricsUpdateRule.Successes, nil
   165  }
   166  
   167  const (
   168  	// graphqlEventsToMetricsRuleStructFields is the set of fields that we want returned on queries,
   169  	// and should map back directly to the EventsToMetricsRule struct
   170  	graphqlEventsToMetricsRuleStructFields = `
   171  		id
   172  		name
   173  		enabled
   174  		createdAt
   175  		accountId
   176  		description
   177  		nrql
   178  		updatedAt
   179  `
   180  
   181  	graphqlEventsToMetricsMutationStructFields = `
   182  		successes {
   183  		` + graphqlEventsToMetricsRuleStructFields + `
   184  		}
   185  		failures {
   186  			errors {
   187  				description
   188  				reason
   189  			}
   190  		}
   191  `
   192  
   193  	getEventsToMetricsRulesQuery = `query($ruleIds: [ID]!, $accountId: Int!) { actor { account(id: $accountId) { eventsToMetrics { rulesById(ruleIds: $ruleIds) { rules {` +
   194  		graphqlEventsToMetricsRuleStructFields +
   195  		` } } } } } }`
   196  
   197  	listEventsToMetricsRulesQuery = `query($accountId: Int!) { actor { account(id: $accountId) { eventsToMetrics { allRules { rules {` +
   198  		graphqlEventsToMetricsRuleStructFields +
   199  		` } } } } } }`
   200  
   201  	eventsToMetricsCreateRuleMutation = `
   202  		mutation($createInput: [EventsToMetricsCreateRuleInput]!) {
   203  			eventsToMetricsCreateRule(rules: $createInput) {` +
   204  		graphqlEventsToMetricsMutationStructFields +
   205  		` } }`
   206  
   207  	eventsToMetricsDeleteRuleMutation = `
   208  		mutation($deleteInput: [EventsToMetricsDeleteRuleInput]!) {
   209  			eventsToMetricsDeleteRule(deletes: $deleteInput) {` +
   210  		graphqlEventsToMetricsMutationStructFields +
   211  		` } }`
   212  
   213  	eventsToMetricsUpdateRuleMutation = `
   214  		mutation($updateInput: [EventsToMetricsUpdateRuleInput]!) {
   215  			eventsToMetricsUpdateRule(updates: $updateInput) {` +
   216  		graphqlEventsToMetricsMutationStructFields +
   217  		` } }`
   218  )
   219  
   220  type getRulesResponse struct {
   221  	Actor struct {
   222  		Account struct {
   223  			EventsToMetrics struct {
   224  				RulesByID struct {
   225  					Rules []EventsToMetricsRule
   226  				}
   227  			}
   228  		}
   229  	}
   230  }
   231  
   232  type listRulesResponse struct {
   233  	Actor struct {
   234  		Account struct {
   235  			EventsToMetrics struct {
   236  				AllRules struct {
   237  					Rules []EventsToMetricsRule
   238  				}
   239  			}
   240  		}
   241  	}
   242  }
   243  
   244  type createRuleResponse struct {
   245  	EventsToMetricsCreateRule EventsToMetricsCreateRuleResult
   246  }
   247  
   248  type updateRuleResponse struct {
   249  	EventsToMetricsUpdateRule EventsToMetricsUpdateRuleResult
   250  }
   251  
   252  type deleteRuleResponse struct {
   253  	EventsToMetricsDeleteRule EventsToMetricsDeleteRuleResult
   254  }
   255  
   256  func (r EventsToMetricsCreateRuleResult) Errors() string {
   257  	var errors []string
   258  	for _, e := range r.Failures {
   259  		errors = append(errors, e.String())
   260  	}
   261  
   262  	return strings.Join(errors, ", ")
   263  }
   264  
   265  func (f EventsToMetricsCreateRuleFailure) String() string {
   266  	var errors []string
   267  	for _, e := range f.Errors {
   268  		errors = append(errors, e.String())
   269  	}
   270  
   271  	return strings.Join(errors, ", ")
   272  }
   273  
   274  func (r EventsToMetricsUpdateRuleResult) Errors() string {
   275  	var errors []string
   276  	for _, e := range r.Failures {
   277  		errors = append(errors, e.String())
   278  	}
   279  
   280  	return strings.Join(errors, ", ")
   281  }
   282  
   283  func (f EventsToMetricsUpdateRuleFailure) String() string {
   284  	var errors []string
   285  	for _, e := range f.Errors {
   286  		errors = append(errors, e.String())
   287  	}
   288  
   289  	return strings.Join(errors, ", ")
   290  }
   291  
   292  func (r EventsToMetricsDeleteRuleResult) Errors() string {
   293  	var errors []string
   294  	for _, e := range r.Failures {
   295  		errors = append(errors, e.String())
   296  	}
   297  
   298  	return strings.Join(errors, ", ")
   299  }
   300  
   301  func (f EventsToMetricsDeleteRuleFailure) String() string {
   302  	var errors []string
   303  	for _, e := range f.Errors {
   304  		errors = append(errors, e.String())
   305  	}
   306  
   307  	return strings.Join(errors, ", ")
   308  }
   309  
   310  func (e EventsToMetricsError) String() string {
   311  	return fmt.Sprintf("Reason: %s, Description: %s", e.Reason, e.Description)
   312  }