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 }