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

     1  package alerts
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/newrelic/newrelic-client-go/pkg/errors"
     8  )
     9  
    10  // PluginsCondition represents an alert condition for New Relic Plugins.
    11  type PluginsCondition struct {
    12  	ID                int             `json:"id,omitempty"`
    13  	Name              string          `json:"name,omitempty"`
    14  	Enabled           bool            `json:"enabled"`
    15  	Entities          []string        `json:"entities,omitempty"`
    16  	Metric            string          `json:"metric,omitempty"`
    17  	MetricDescription string          `json:"metric_description,omitempty"`
    18  	RunbookURL        string          `json:"runbook_url,omitempty"`
    19  	Terms             []ConditionTerm `json:"terms,omitempty"`
    20  	ValueFunction     string          `json:"value_function,omitempty"`
    21  	Plugin            AlertPlugin     `json:"plugin,omitempty"`
    22  }
    23  
    24  // AlertPlugin represents a plugin to use with a Plugin alert condition.
    25  type AlertPlugin struct {
    26  	ID   string `json:"id,omitempty"`
    27  	GUID string `json:"guid,omitempty"`
    28  }
    29  
    30  // ListPluginsConditions returns alert conditions for New Relic plugins for a given alert policy.
    31  func (a *Alerts) ListPluginsConditions(policyID int) ([]*PluginsCondition, error) {
    32  	return a.ListPluginsConditionsWithContext(context.Background(), policyID)
    33  }
    34  
    35  // ListPluginsConditionsWithContext returns alert conditions for New Relic plugins for a given alert policy.
    36  func (a *Alerts) ListPluginsConditionsWithContext(ctx context.Context, policyID int) ([]*PluginsCondition, error) {
    37  	conditions := []*PluginsCondition{}
    38  	queryParams := listPluginsConditionsParams{
    39  		PolicyID: policyID,
    40  	}
    41  
    42  	nextURL := a.config.Region().RestURL("/alerts_plugins_conditions.json")
    43  
    44  	for nextURL != "" {
    45  		response := pluginsConditionsResponse{}
    46  		resp, err := a.client.GetWithContext(ctx, nextURL, &queryParams, &response)
    47  
    48  		if err != nil {
    49  			return nil, err
    50  		}
    51  
    52  		conditions = append(conditions, response.PluginsConditions...)
    53  
    54  		paging := a.pager.Parse(resp)
    55  		nextURL = paging.Next
    56  	}
    57  
    58  	return conditions, nil
    59  }
    60  
    61  // GetPluginsCondition gets information about an alert condition for a plugin
    62  // given a policy ID and plugin ID.
    63  func (a *Alerts) GetPluginsCondition(policyID int, pluginID int) (*PluginsCondition, error) {
    64  	return a.GetPluginsConditionWithContext(context.Background(), policyID, pluginID)
    65  }
    66  
    67  // GetPluginsConditionWithContext gets information about an alert condition for a plugin
    68  // given a policy ID and plugin ID.
    69  func (a *Alerts) GetPluginsConditionWithContext(ctx context.Context, policyID int, pluginID int) (*PluginsCondition, error) {
    70  	conditions, err := a.ListPluginsConditionsWithContext(ctx, policyID)
    71  
    72  	if err != nil {
    73  		return nil, err
    74  	}
    75  
    76  	for _, condition := range conditions {
    77  		if condition.ID == pluginID {
    78  			return condition, nil
    79  		}
    80  	}
    81  
    82  	return nil, errors.NewNotFoundf("no condition found for policy %d and condition ID %d", policyID, pluginID)
    83  }
    84  
    85  // CreatePluginsCondition creates an alert condition for a plugin.
    86  func (a *Alerts) CreatePluginsCondition(policyID int, condition PluginsCondition) (*PluginsCondition, error) {
    87  	return a.CreatePluginsConditionWithContext(context.Background(), policyID, condition)
    88  }
    89  
    90  // CreatePluginsConditionWithContext creates an alert condition for a plugin.
    91  func (a *Alerts) CreatePluginsConditionWithContext(ctx context.Context, policyID int, condition PluginsCondition) (*PluginsCondition, error) {
    92  	reqBody := pluginConditionRequestBody{
    93  		PluginsCondition: condition,
    94  	}
    95  	resp := pluginConditionResponse{}
    96  
    97  	url := fmt.Sprintf("/alerts_plugins_conditions/policies/%d.json", policyID)
    98  	_, err := a.client.PostWithContext(ctx, a.config.Region().RestURL(url), nil, &reqBody, &resp)
    99  
   100  	if err != nil {
   101  		return nil, err
   102  	}
   103  
   104  	return &resp.PluginsCondition, nil
   105  }
   106  
   107  // UpdatePluginsCondition updates an alert condition for a plugin.
   108  func (a *Alerts) UpdatePluginsCondition(condition PluginsCondition) (*PluginsCondition, error) {
   109  	return a.UpdatePluginsConditionWithContext(context.Background(), condition)
   110  }
   111  
   112  // UpdatePluginsConditionWithContext updates an alert condition for a plugin.
   113  func (a *Alerts) UpdatePluginsConditionWithContext(ctx context.Context, condition PluginsCondition) (*PluginsCondition, error) {
   114  	reqBody := pluginConditionRequestBody{
   115  		PluginsCondition: condition,
   116  	}
   117  	resp := pluginConditionResponse{}
   118  
   119  	url := fmt.Sprintf("/alerts_plugins_conditions/%d.json", condition.ID)
   120  	_, err := a.client.PutWithContext(ctx, a.config.Region().RestURL(url), nil, &reqBody, &resp)
   121  
   122  	if err != nil {
   123  		return nil, err
   124  	}
   125  
   126  	return &resp.PluginsCondition, nil
   127  }
   128  
   129  // DeletePluginsCondition deletes a plugin alert condition.
   130  func (a *Alerts) DeletePluginsCondition(id int) (*PluginsCondition, error) {
   131  	return a.DeletePluginsConditionWithContext(context.Background(), id)
   132  }
   133  
   134  // DeletePluginsConditionWithContext deletes a plugin alert condition.
   135  func (a *Alerts) DeletePluginsConditionWithContext(ctx context.Context, id int) (*PluginsCondition, error) {
   136  	resp := pluginConditionResponse{}
   137  	url := fmt.Sprintf("/alerts_plugins_conditions/%d.json", id)
   138  
   139  	_, err := a.client.DeleteWithContext(ctx, a.config.Region().RestURL(url), nil, &resp)
   140  
   141  	if err != nil {
   142  		return nil, err
   143  	}
   144  
   145  	return &resp.PluginsCondition, nil
   146  }
   147  
   148  type listPluginsConditionsParams struct {
   149  	PolicyID int `url:"policy_id,omitempty"`
   150  }
   151  
   152  type pluginsConditionsResponse struct {
   153  	PluginsConditions []*PluginsCondition `json:"plugins_conditions,omitempty"`
   154  }
   155  
   156  type pluginConditionResponse struct {
   157  	PluginsCondition PluginsCondition `json:"plugins_condition,omitempty"`
   158  }
   159  
   160  type pluginConditionRequestBody struct {
   161  	PluginsCondition PluginsCondition `json:"plugins_condition,omitempty"`
   162  }