Skip to content

Commit

Permalink
feat(metrics-operator): update dynatrace api to support range.step (#…
Browse files Browse the repository at this point in the history
…1812)

Signed-off-by: Rakshit Gondwal <rakshitgondwal3@gmail.com>
  • Loading branch information
rakshitgondwal committed Aug 16, 2023
1 parent 2558f74 commit 4407fc4
Show file tree
Hide file tree
Showing 2 changed files with 390 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -53,23 +53,53 @@ func (d *KeptnDynatraceProvider) EvaluateQuery(ctx context.Context, metric metri
d.Log.Info("Running query: " + qURL)
ctx, cancel := context.WithTimeout(ctx, 20*time.Second)
defer cancel()
req, err := http.NewRequestWithContext(ctx, "GET", qURL, nil)
result, b, err := d.performRequest(ctx, provider, qURL)
if err != nil {
return "", b, err
}
r := fmt.Sprintf("%f", d.getSingleValue(result))
return r, b, nil
}

func (d *KeptnDynatraceProvider) EvaluateQueryForStep(ctx context.Context, metric metricsapi.KeptnMetric, provider metricsapi.KeptnMetricsProvider) ([]string, []byte, error) {
if metric.Spec.Range == nil {
return nil, nil, fmt.Errorf("spec.range is not defined!")
}
baseURL := d.normalizeAPIURL(provider.Spec.TargetServer)
query := url.QueryEscape(metric.Spec.Query)
qURL := baseURL + "v2/metrics/query?metricSelector=" + query + "&from=now-" + metric.Spec.Range.Interval + "&resolution=" + metric.Spec.Range.Step

d.Log.Info("Running query: " + qURL)
ctx, cancel := context.WithTimeout(ctx, 20*time.Second)
defer cancel()

result, b, err := d.performRequest(ctx, provider, qURL)
if err != nil {
return nil, b, err
}

r := d.getResultSlice(result)
return r, b, nil
}

func (d *KeptnDynatraceProvider) performRequest(ctx context.Context, provider metricsapi.KeptnMetricsProvider, query string) (*DynatraceResponse, []byte, error) {
req, err := http.NewRequestWithContext(ctx, "GET", query, nil)
if err != nil {
d.Log.Error(err, "Error while creating request")
return "", nil, err
return nil, nil, err
}

token, err := getDTSecret(ctx, provider, d.K8sClient)
if err != nil {
return "", nil, err
return nil, nil, err
}

req.Header.Set("Authorization", "Api-Token "+token)
res, err := d.HttpClient.Do(req)

if err != nil {
d.Log.Error(err, "Error while creating request")
return "", nil, err
return nil, nil, err
}
defer func() {
err := res.Body.Close()
Expand All @@ -84,15 +114,14 @@ func (d *KeptnDynatraceProvider) EvaluateQuery(ctx context.Context, metric metri
err = json.Unmarshal(b, &result)
if err != nil {
d.Log.Error(err, "Error while parsing response")
return "", b, err
return nil, b, err
}
if !reflect.DeepEqual(result.Error, Error{}) {
err = fmt.Errorf(ErrAPIMsg, result.Error.Message)
d.Log.Error(err, "Error from Dynatrace provider")
return "", b, err
return nil, b, err
}
r := fmt.Sprintf("%f", d.getSingleValue(result))
return r, b, nil
return &result, b, nil
}

func (d *KeptnDynatraceProvider) normalizeAPIURL(url string) string {
Expand All @@ -106,7 +135,7 @@ func (d *KeptnDynatraceProvider) normalizeAPIURL(url string) string {
return out
}

func (d *KeptnDynatraceProvider) getSingleValue(result DynatraceResponse) float64 {
func (d *KeptnDynatraceProvider) getSingleValue(result *DynatraceResponse) float64 {
var sum float64 = 0
var count uint64 = 0
for _, r := range result.Result {
Expand All @@ -125,3 +154,29 @@ func (d *KeptnDynatraceProvider) getSingleValue(result DynatraceResponse) float6
}
return sum / float64(count)
}

func (d *KeptnDynatraceProvider) getResultSlice(result *DynatraceResponse) []string {
totalValues := 0
for _, r := range result.Result {
for _, points := range r.Data {
for _, v := range points.Values {
if v != nil {
totalValues = totalValues + 1
}
}
}
}

// Initialize resultSlice with the correct length
resultSlice := make([]string, 0, totalValues) // Use a slice with capacity, but length 0
for _, r := range result.Result {
for _, points := range r.Data {
for _, v := range points.Values {
if v != nil {
resultSlice = append(resultSlice, fmt.Sprintf("%f", *v))
}
}
}
}
return resultSlice
}
Loading

0 comments on commit 4407fc4

Please sign in to comment.