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

     1  //go:build unit
     2  // +build unit
     3  
     4  package plugins
     5  
     6  import (
     7  	"fmt"
     8  	"net/http"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  var (
    16  	testTimestamp, _ = time.Parse(time.RFC3339, time.RFC3339)
    17  
    18  	testComponent = Component{
    19  		ID:   212222915,
    20  		Name: "Redis",
    21  		SummaryMetrics: []SummaryMetric{
    22  			{
    23  				ID:            190174,
    24  				Name:          "Connected Clients",
    25  				Metric:        "Component/Connection/Clients[connections]",
    26  				ValueFunction: "average_value",
    27  				Thresholds: MetricThreshold{
    28  					Caution:  3,
    29  					Critical: 0,
    30  				},
    31  			},
    32  		},
    33  	}
    34  
    35  	testComponentJSON = `{
    36  		"id": 212222915,
    37  		"name": "Redis",
    38  		"summary_metrics": [
    39  			{
    40  				"id": 190174,
    41  				"name": "Connected Clients",
    42  				"metric": "Component/Connection/Clients[connections]",
    43  				"value_function": "average_value",
    44  				"thresholds": {
    45  					"caution": 3,
    46  					"critical": 0
    47  				}
    48  			}
    49  		]
    50  	}`
    51  
    52  	testComponentMetric = ComponentMetric{
    53  		Name: "Component/Memory/RSS[bytes]",
    54  		Values: []string{
    55  			"average_value",
    56  			"total_value",
    57  			"max_value",
    58  			"min_value",
    59  			"standard_deviation",
    60  			"rate",
    61  			"count",
    62  		},
    63  	}
    64  
    65  	testComponentMetricJSON = `{
    66  		"name": "Component/Memory/RSS[bytes]",
    67  		"values": [
    68  			"average_value",
    69  			"total_value",
    70  			"max_value",
    71  			"min_value",
    72  			"standard_deviation",
    73  			"rate",
    74  			"count"
    75  		]
    76  	}`
    77  
    78  	testMetricData = Metric{
    79  		Name: "Component/Memory/RSS[bytes]",
    80  		Timeslices: []MetricTimeslice{
    81  			{
    82  				From: &testTimestamp,
    83  				To:   &testTimestamp,
    84  				Values: map[string]float64{
    85  					"average_value":      10,
    86  					"total_value":        10,
    87  					"max_value":          10,
    88  					"min_value":          10,
    89  					"standard_deviation": 10,
    90  					"rate":               10,
    91  					"count":              10,
    92  				},
    93  			},
    94  		},
    95  	}
    96  
    97  	testMetricDataJSON = fmt.Sprintf(`{
    98          "name": "Component/Memory/RSS[bytes]",
    99          "timeslices": [
   100  			{
   101  				"from": "%[1]s",
   102  				"to": "%[1]s",
   103  				"values": {
   104  					"average_value": 10,
   105  					"total_value": 10,
   106  					"max_value": 10,
   107  					"min_value": 10,
   108  					"standard_deviation": 10,
   109  					"rate": 10,
   110  					"count": 10
   111  				}
   112  			}
   113  		]
   114  	}`, testTimestamp.Format(time.RFC3339))
   115  )
   116  
   117  func TestListComponents(t *testing.T) {
   118  	t.Parallel()
   119  	responseJSON := fmt.Sprintf(`{"components": [%s]}`, testComponentJSON)
   120  	plugins := newMockResponse(t, responseJSON, http.StatusOK)
   121  
   122  	c, err := plugins.ListComponents(nil)
   123  
   124  	require.NoError(t, err)
   125  	require.NotNil(t, c)
   126  	require.Equal(t, &testComponent, c[0])
   127  }
   128  
   129  func TestListComponentsWithParams(t *testing.T) {
   130  	t.Parallel()
   131  	expectedName := "componentName"
   132  	expectedIDs := "123,456"
   133  	expectedPluginID := "1234"
   134  	expectedHealthStatus := "true"
   135  
   136  	plugins := newTestClient(t, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   137  		values := r.URL.Query()
   138  
   139  		name := values.Get("filter[name]")
   140  		if name != expectedName {
   141  			t.Errorf(`expected name filter "%s", received: "%s"`, expectedName, name)
   142  		}
   143  
   144  		ids := values.Get("filter[ids]")
   145  		if ids != expectedIDs {
   146  			t.Errorf(`expected ID filter "%s", received: "%s"`, expectedIDs, ids)
   147  		}
   148  
   149  		pluginID := values.Get("filter[plugin_id]")
   150  		if pluginID != expectedPluginID {
   151  			t.Errorf(`expected plugin ID filter "%s", received: "%s"`, expectedPluginID, pluginID)
   152  		}
   153  
   154  		healthStatus := values.Get("health_status")
   155  		if healthStatus != expectedHealthStatus {
   156  			t.Errorf(`expected health status filter "%s", received: "%s"`, expectedHealthStatus, healthStatus)
   157  		}
   158  
   159  		w.Header().Set("Content-Type", "application/json")
   160  		_, err := w.Write([]byte(`{"applications":[]}`))
   161  
   162  		require.NoError(t, err)
   163  	}))
   164  
   165  	params := ListComponentsParams{
   166  		IDs:          []int{123, 456},
   167  		PluginID:     1234,
   168  		Name:         expectedName,
   169  		HealthStatus: true,
   170  	}
   171  
   172  	c, err := plugins.ListComponents(&params)
   173  
   174  	require.NoError(t, err)
   175  	require.NotNil(t, c)
   176  }
   177  
   178  func TestGetComponent(t *testing.T) {
   179  	t.Parallel()
   180  	responseJSON := fmt.Sprintf(`{"component": %s}`, testComponentJSON)
   181  	plugins := newMockResponse(t, responseJSON, http.StatusOK)
   182  
   183  	c, err := plugins.GetComponent(testComponent.ID)
   184  
   185  	require.NoError(t, err)
   186  	require.NotNil(t, c)
   187  	require.Equal(t, testComponent, *c)
   188  }
   189  
   190  func TestListComponentMetrics(t *testing.T) {
   191  	t.Parallel()
   192  	responseJSON := fmt.Sprintf(`{"metrics": [%s]}`, testComponentMetricJSON)
   193  	plugins := newMockResponse(t, responseJSON, http.StatusOK)
   194  
   195  	m, err := plugins.ListComponentMetrics(testComponent.ID, nil)
   196  
   197  	require.NoError(t, err)
   198  	require.NotNil(t, m)
   199  	require.Equal(t, &testComponentMetric, m[0])
   200  }
   201  
   202  func TestGetComponentMetricData(t *testing.T) {
   203  	t.Parallel()
   204  	responseJSON := fmt.Sprintf(`{
   205  		"metric_data": {
   206  			 "metrics": [%s]
   207  		}
   208  	}`, testMetricDataJSON)
   209  	plugins := newMockResponse(t, responseJSON, http.StatusOK)
   210  
   211  	m, err := plugins.GetComponentMetricData(testComponent.ID, nil)
   212  
   213  	require.NoError(t, err)
   214  	require.NotNil(t, m)
   215  	require.Equal(t, &testMetricData, m[0])
   216  }
   217  
   218  func TestGetComponentMetricDataWithParams(t *testing.T) {
   219  	t.Parallel()
   220  	expectedNames := "componentName"
   221  	expectedValues := "123"
   222  	expectedTo := testTimestamp.Format(time.RFC3339)
   223  	expectedFrom := testTimestamp.Format(time.RFC3339)
   224  	expectedPeriod := "30"
   225  	expectedSummarize := "true"
   226  	expectedRaw := "true"
   227  
   228  	plugins := newTestClient(t, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   229  		values := r.URL.Query()
   230  
   231  		names := values.Get("names[]")
   232  		if names != expectedNames {
   233  			t.Errorf(`expected names filter "%s", received: "%s"`, expectedNames, names)
   234  		}
   235  
   236  		v := values.Get("values[]")
   237  		if v != expectedValues {
   238  			t.Errorf(`expected values filter "%s", received: "%s"`, expectedValues, v)
   239  		}
   240  
   241  		from := values.Get("from")
   242  		if from != expectedFrom {
   243  			t.Errorf(`expected from param "%s", received: "%s"`, expectedFrom, from)
   244  		}
   245  
   246  		to := values.Get("to")
   247  		if to != expectedTo {
   248  			t.Errorf(`expected to param "%s", received: "%s"`, expectedTo, to)
   249  		}
   250  
   251  		period := values.Get("period")
   252  		if period != expectedPeriod {
   253  			t.Errorf(`expected period param "%s", received: "%s"`, expectedPeriod, period)
   254  		}
   255  
   256  		raw := values.Get("raw")
   257  		if raw != expectedRaw {
   258  			t.Errorf(`expected raw param "%s", received: "%s"`, expectedRaw, raw)
   259  		}
   260  
   261  		summarize := values.Get("summarize")
   262  		if summarize != expectedSummarize {
   263  			t.Errorf(`expected summarize param "%s", received: "%s"`, expectedSummarize, summarize)
   264  		}
   265  
   266  		w.Header().Set("Content-Type", "application/json")
   267  		_, err := w.Write([]byte(`{"applications":[]}`))
   268  
   269  		require.NoError(t, err)
   270  	}))
   271  
   272  	params := GetComponentMetricDataParams{
   273  		Names:     []string{"componentName"},
   274  		Values:    []string{"123"},
   275  		From:      &testTimestamp,
   276  		To:        &testTimestamp,
   277  		Period:    30,
   278  		Summarize: true,
   279  		Raw:       true,
   280  	}
   281  	_, err := plugins.GetComponentMetricData(testComponent.ID, &params)
   282  
   283  	require.NoError(t, err)
   284  }