Skip to content

Commit

Permalink
feat(analysis): Added additional metadata to the status of AnalysisRun
Browse files Browse the repository at this point in the history
Signed-off-by: Rohit Agrawal <[email protected]>
  • Loading branch information
agrawroh committed Feb 1, 2022
1 parent 53643c5 commit c02f524
Show file tree
Hide file tree
Showing 34 changed files with 223 additions and 19 deletions.
9 changes: 5 additions & 4 deletions analysis/analysis.go
Original file line number Diff line number Diff line change
Expand Up @@ -325,16 +325,17 @@ func (c *Controller) runMeasurements(run *v1alpha1.AnalysisRun, tasks []metricTa
metricResult := analysisutil.GetResult(run, t.metric.Name)
resultsLock.Unlock()

provider, err := c.newProvider(*logger, t.metric)
if metricResult == nil {
metricResult = &v1alpha1.MetricResult{
Name: t.metric.Name,
Phase: v1alpha1.AnalysisPhaseRunning,
DryRun: dryRunMetricsMap[t.metric.Name],
Name: t.metric.Name,
Phase: v1alpha1.AnalysisPhaseRunning,
DryRun: dryRunMetricsMap[t.metric.Name],
Metadata: provider.GetMetadata(t.metric),
}
}

var newMeasurement v1alpha1.Measurement
provider, err := c.newProvider(*logger, t.metric)
if err != nil {
if t.incompleteMeasurement != nil {
newMeasurement = *t.incompleteMeasurement
Expand Down
36 changes: 36 additions & 0 deletions analysis/analysis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -892,6 +892,7 @@ func TestReconcileAnalysisRunInitial(t *testing.T) {
},
}
f.provider.On("Run", mock.Anything, mock.Anything, mock.Anything).Return(newMeasurement(v1alpha1.AnalysisPhaseSuccessful), nil)
f.provider.On("GetMetadata", mock.Anything, mock.Anything).Return(map[string]string{}, nil)
{
newRun := c.reconcileAnalysisRun(run)
assert.Equal(t, v1alpha1.AnalysisPhaseRunning, newRun.Status.MetricResults[0].Phase)
Expand Down Expand Up @@ -1128,6 +1129,38 @@ func TestResolveMetricArgsUnableToSubstitute(t *testing.T) {
}
}

func TestGetMetadataIsCalled(t *testing.T) {
f := newFixture(t)
defer f.Close()
c, _, _ := f.newController(noResyncPeriodFunc)
arg := "success-rate"
run := &v1alpha1.AnalysisRun{
Spec: v1alpha1.AnalysisRunSpec{
Args: []v1alpha1.Argument{
{
Name: "metric-name",
Value: &arg,
},
},
Metrics: []v1alpha1.Metric{{
Name: "rate",
SuccessCondition: "result[0] > 0",
Provider: v1alpha1.MetricProvider{
Prometheus: &v1alpha1.PrometheusMetric{
Query: "{{args.metric-name}}",
},
},
}},
},
}
metricMetadata := map[string]string{"foo": "bar"}
f.provider.On("Run", mock.Anything, mock.Anything, mock.Anything).Return(newMeasurement(v1alpha1.AnalysisPhaseSuccessful), nil)
f.provider.On("GetMetadata", mock.Anything, mock.Anything).Return(metricMetadata, nil)
newRun := c.reconcileAnalysisRun(run)
assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, newRun.Status.Phase)
assert.Equal(t, metricMetadata, newRun.Status.MetricResults[0].Metadata)
}

// TestSecretContentReferenceSuccess verifies that secret arguments are properly resolved
func TestSecretContentReferenceSuccess(t *testing.T) {
f := newFixture(t)
Expand Down Expand Up @@ -1172,6 +1205,7 @@ func TestSecretContentReferenceSuccess(t *testing.T) {
},
}
f.provider.On("Run", mock.Anything, mock.Anything, mock.Anything).Return(newMeasurement(v1alpha1.AnalysisPhaseSuccessful), nil)
f.provider.On("GetMetadata", mock.Anything, mock.Anything).Return(map[string]string{}, nil)
newRun := c.reconcileAnalysisRun(run)
assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, newRun.Status.Phase)
}
Expand Down Expand Up @@ -1236,6 +1270,7 @@ func TestSecretContentReferenceProviderError(t *testing.T) {
measurement.Message = error.Error()

f.provider.On("Run", mock.Anything, mock.Anything, mock.Anything).Return(measurement)
f.provider.On("GetMetadata", mock.Anything, mock.Anything).Return(map[string]string{}, nil)
newRun := c.reconcileAnalysisRun(run)
logMessage := buf.String()

Expand Down Expand Up @@ -1297,6 +1332,7 @@ func TestSecretContentReferenceAndMultipleArgResolutionSuccess(t *testing.T) {
}

f.provider.On("Run", mock.Anything, mock.Anything, mock.Anything).Return(newMeasurement(v1alpha1.AnalysisPhaseSuccessful), nil)
f.provider.On("GetMetadata", mock.Anything, mock.Anything).Return(map[string]string{}, nil)
newRun := c.reconcileAnalysisRun(run)
assert.Equal(t, v1alpha1.AnalysisPhaseSuccessful, newRun.Status.Phase)
}
Expand Down
1 change: 1 addition & 0 deletions hack/tools.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
//go:build tools
// +build tools

package tools
Expand Down
4 changes: 4 additions & 0 deletions manifests/crds/analysis-run-crd.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2817,6 +2817,10 @@ spec:
type: array
message:
type: string
metadata:
additionalProperties:
type: string
type: object
name:
type: string
phase:
Expand Down
4 changes: 4 additions & 0 deletions manifests/install.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2818,6 +2818,10 @@ spec:
type: array
message:
type: string
metadata:
additionalProperties:
type: string
type: object
name:
type: string
phase:
Expand Down
4 changes: 4 additions & 0 deletions manifests/namespace-install.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2818,6 +2818,10 @@ spec:
type: array
message:
type: string
metadata:
additionalProperties:
type: string
type: object
name:
type: string
phase:
Expand Down
5 changes: 5 additions & 0 deletions metricproviders/cloudwatch/cloudwatch.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ func (p *Provider) Type() string {
return ProviderType
}

// GetMetadata returns any additional metadata which needs to be stored & displayed as part of the metrics result.
func (p *Provider) GetMetadata(metric v1alpha1.Metric) map[string]string {
return nil
}

// Run queries with CloudWatch provider for the metric
func (p *Provider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alpha1.Measurement {
startTime := timeutil.MetaNow()
Expand Down
9 changes: 9 additions & 0 deletions metricproviders/cloudwatch/cloudwatch_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ func TestRunWithQueryError(t *testing.T) {
},
},
}
metricsMetadata := p.GetMetadata(metric)
assert.Nil(t, metricsMetadata)

measurement := p.Run(newAnalysisRun(), metric)
assert.Equal(t, expectedErr.Error(), measurement.Message)
assert.NotNil(t, measurement.StartedAt)
Expand All @@ -103,6 +106,9 @@ func TestRunWithResolveArgsError(t *testing.T) {
},
},
}
metricsMetadata := p.GetMetadata(metric)
assert.Nil(t, metricsMetadata)

measurement := p.Run(newAnalysisRun(), metric)
assert.Equal(t, expectedErr.Error(), measurement.Message)
assert.NotNil(t, measurement.StartedAt)
Expand Down Expand Up @@ -131,6 +137,9 @@ constraint: Member must not be null'`)
},
},
}
metricsMetadata := p.GetMetadata(metric)
assert.Nil(t, metricsMetadata)

measurement := p.Run(newAnalysisRun(), metric)
assert.Equal(t, expectedErr.Error(), measurement.Message)
assert.NotNil(t, measurement.StartedAt)
Expand Down
5 changes: 5 additions & 0 deletions metricproviders/datadog/datadog.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,11 @@ func (p *Provider) Type() string {
return ProviderType
}

// GetMetadata returns any additional metadata which needs to be stored & displayed as part of the metrics result.
func (p *Provider) GetMetadata(metric v1alpha1.Metric) map[string]string {
return nil
}

func (p *Provider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alpha1.Measurement {
startTime := timeutil.MetaNow()

Expand Down
3 changes: 3 additions & 0 deletions metricproviders/datadog/datadog_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,9 @@ func TestRunSuite(t *testing.T) {

provider, _ := NewDatadogProvider(*logCtx, fakeClient)

metricsMetadata := provider.GetMetadata(test.metric)
assert.Nil(t, metricsMetadata)

// Get our result
measurement := provider.Run(newAnalysisRun(), test.metric)

Expand Down
5 changes: 5 additions & 0 deletions metricproviders/graphite/graphite.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ func (p *Provider) Type() string {
return ProviderType
}

// GetMetadata returns any additional metadata which needs to be stored & displayed as part of the metrics result.
func (p *Provider) GetMetadata(metric v1alpha1.Metric) map[string]string {
return nil
}

// Run queries Graphite for the metric.
func (p *Provider) Run(run *v1alpha1.AnalysisRun, metric v1alpha1.Metric) v1alpha1.Measurement {
startTime := timeutil.MetaNow()
Expand Down
6 changes: 6 additions & 0 deletions metricproviders/graphite/graphite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ func TestType(t *testing.T) {
func TestRunSuccessfulEvaluation(t *testing.T) {
response := 10.000000
g := NewGraphiteProvider(newMockAPI(&response, nil), log.Entry{})
metricsMetadata := g.GetMetadata(newTestingMetric())
assert.Nil(t, metricsMetadata)

measurement := g.Run(&v1alpha1.AnalysisRun{}, newTestingMetric())
assert.NotNil(t, measurement.StartedAt)
assert.Equal(t, "[10.000000]", measurement.Value)
Expand All @@ -60,6 +63,9 @@ func TestRunSuccessfulEvaluation(t *testing.T) {
func TestRunFailedEvaluation(t *testing.T) {
response := 5.000000
g := NewGraphiteProvider(newMockAPI(&response, nil), log.Entry{})
metricsMetadata := g.GetMetadata(newTestingMetric())
assert.Nil(t, metricsMetadata)

measurement := g.Run(&v1alpha1.AnalysisRun{}, newTestingMetric())
assert.NotNil(t, measurement.StartedAt)
assert.Equal(t, "[5.000000]", measurement.Value)
Expand Down
5 changes: 5 additions & 0 deletions metricproviders/job/job.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ func (p *JobProvider) Type() string {
return ProviderType
}

// GetMetadata returns any additional metadata which needs to be stored & displayed as part of the metrics result.
func (p *JobProvider) GetMetadata(metric v1alpha1.Metric) map[string]string {
return nil
}

// newJobName returns a new job name for the run and metric. Names must be shortened so that it can
// fit into a 63 character label, since the k8s job controller incorporates the job name into the
// pod spec labels.
Expand Down
5 changes: 5 additions & 0 deletions metricproviders/job/job_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ func TestRun(t *testing.T) {
p := newTestJobProvider()
run := newRunWithJobMetric()
metric := run.Spec.Metrics[0]
metricsMetadata := p.GetMetadata(metric)
assert.Nil(t, metricsMetadata)

measurement := p.Run(run, metric)

assert.Equal(t, v1alpha1.AnalysisPhaseRunning, measurement.Phase)
Expand Down Expand Up @@ -160,6 +163,8 @@ func TestRunCreateFail(t *testing.T) {
fakeClient.PrependReactor("create", "*", func(action kubetesting.Action) (handled bool, ret runtime.Object, err error) {
return true, nil, fmt.Errorf(errMsg)
})
metricsMetadata := p.GetMetadata(run.Spec.Metrics[0])
assert.Nil(t, metricsMetadata)

measurement := p.Run(run, run.Spec.Metrics[0])
assert.Equal(t, v1alpha1.AnalysisPhaseError, measurement.Phase)
Expand Down
5 changes: 5 additions & 0 deletions metricproviders/kayenta/kayenta.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ func (p *Provider) Type() string {
return ProviderType
}

// GetMetadata returns any additional metadata which needs to be stored & displayed as part of the metrics result.
func (p *Provider) GetMetadata(metric v1alpha1.Metric) map[string]string {
return nil
}

func getCanaryConfigId(metric v1alpha1.Metric, p *Provider) (string, error) {

configIdLookupURL := fmt.Sprintf(configIdLookupURLFormat, metric.Provider.Kayenta.Address, metric.Provider.Kayenta.Application, metric.Provider.Kayenta.StorageAccountName)
Expand Down
4 changes: 4 additions & 0 deletions metricproviders/kayenta/kayenta_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,8 @@ func TestRunSuccessfully(t *testing.T) {
{Name: "stable-hash", Value: &stableHash},
{Name: "canary-hash", Value: &canaryHash},
}
metricsMetadata := p.GetMetadata(metric)
assert.Nil(t, metricsMetadata)

measurement := p.Run(run, metric)

Expand Down Expand Up @@ -268,6 +270,8 @@ func TestRunBadJobResponse(t *testing.T) {
{Name: "stable-hash", Value: &stableHash},
{Name: "canary-hash", Value: &canaryHash},
}
metricsMetadata := p.GetMetadata(metric)
assert.Nil(t, metricsMetadata)

measurement := p.Run(run, metric)

Expand Down
3 changes: 3 additions & 0 deletions metricproviders/metricproviders.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ type Provider interface {
GarbageCollect(*v1alpha1.AnalysisRun, v1alpha1.Metric, int) error
// Type gets the provider type
Type() string
// GetMetadata returns any additional metadata which providers need to store/display as part
// of the metric result. For example, Prometheus uses is to store the final resolved queries.
GetMetadata(metric v1alpha1.Metric) map[string]string
}

type ProviderFactory struct {
Expand Down
16 changes: 16 additions & 0 deletions metricproviders/mocks/Provider.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions metricproviders/newrelic/newrelic.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,11 @@ func (p *Provider) Type() string {
return ProviderType
}

// GetMetadata returns any additional metadata which needs to be stored & displayed as part of the metrics result.
func (p *Provider) GetMetadata(metric v1alpha1.Metric) map[string]string {
return nil
}

//NewNewRelicProvider creates a new NewRelic provider
func NewNewRelicProvider(api NewRelicClientAPI, logCtx log.Entry) *Provider {
return &Provider{
Expand Down
12 changes: 12 additions & 0 deletions metricproviders/newrelic/newrelic_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ func TestRunSuccessfully(t *testing.T) {
},
},
}
metricsMetadata := p.GetMetadata(metric)
assert.Nil(t, metricsMetadata)

measurement := p.Run(newAnalysisRun(), metric)
assert.NotNil(t, measurement.StartedAt)
assert.Equal(t, `{"count":10}`, measurement.Value)
Expand All @@ -70,6 +73,9 @@ func TestRunWithTimeseries(t *testing.T) {
},
},
}
metricsMetadata := p.GetMetadata(metric)
assert.Nil(t, metricsMetadata)

measurement := p.Run(newAnalysisRun(), metric)
assert.NotNil(t, measurement.StartedAt)
assert.Equal(t, `[{"count":10},{"count":20},{"count":30}]`, measurement.Value)
Expand All @@ -93,6 +99,9 @@ func TestRunWithFacet(t *testing.T) {
},
},
}
metricsMetadata := p.GetMetadata(metric)
assert.Nil(t, metricsMetadata)

measurement := p.Run(newAnalysisRun(), metric)
assert.NotNil(t, measurement.StartedAt)
assert.Equal(t, `{"average.duration":12.34,"count":10}`, measurement.Value)
Expand All @@ -116,6 +125,9 @@ func TestRunWithMultipleSelectTerms(t *testing.T) {
},
},
}
metricsMetadata := p.GetMetadata(metric)
assert.Nil(t, metricsMetadata)

measurement := p.Run(newAnalysisRun(), metric)
assert.NotNil(t, measurement.StartedAt)
assert.Equal(t, `{"count":10}`, measurement.Value)
Expand Down
Loading

0 comments on commit c02f524

Please sign in to comment.