Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Azure Monitor support for multiple aggregation types #39204

Merged

Conversation

zmoog
Copy link
Contributor

@zmoog zmoog commented Apr 24, 2024

Proposed commit message

Fixes two bugs related to supporting multiple aggregation types.

  1. Use aggregation type in MetricRegistry in the cache key.
  2. Create one KeyValuePoint for each aggregation type

(1) Use aggregation type in MetricRegistry in the cache key

The MetricRegistry.NeedsUpdate checks if a metric definition needs an update. If there are multiple metrics config with no dimensions:

  resources:
  - resource_query: "resourceType eq 'Microsoft.EventHub/Namespaces'"
    metrics:
    - aggregations:
        - Maximum
      ignore_unsupported: true
      name:
        - ActiveConnections
      namespace: Microsoft.EventHub/Namespaces
    - aggregations:
        - Minimum
      ignore_unsupported: true
      name:
        - ActiveConnections
      namespace: Microsoft.EventHub/Namespaces
    - aggregations:
        - Average
      ignore_unsupported: true
      name:
        - ActiveConnections
      namespace: Microsoft.EventHub/Namespaces

All three metric configs end up having the same key, ending up skipping the metric collection for the second and third configs.

By adding the aggregation type in the cache key, we can correctly keep track of metric updates.

(2) Create one KeyValuePoint for each aggregation type

Add support for multiple aggregation types in the mapToKeyValuePoints() function to restore support for configs like the following:

  resources:
  - resource_query: "resourceType eq 'Microsoft.EventHub/Namespaces'"
    metrics:
    - namespace: Microsoft.EventHub/Namespaces
      name:
        - ActiveConnections
      aggregations:
        - Average
        - Maximum
        - Minimum
      ignore_unsupported: true
      timegrain: PT1M

I missed this feature in a previous change. Unfortunately, no existing modules or integrations use multiple aggregation types, and no tests exist.

We are adding more tests targeting to cover all existing use cases soon.

Checklist

  • My code follows the style guidelines of this project
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • I have made corresponding change to the default configuration files
  • I have added tests that prove my fix is effective or that my feature works
  • I have added an entry in CHANGELOG.next.asciidoc or CHANGELOG-developer.next.asciidoc.

Author's Checklist

  • Cover all multiple aggregation type use cases with tests

How to test this PR locally

Related issues

Use cases

The PR must support multiple aggregation types in two different variants:

  • multiple aggregation types in one metric group
  • one aggregation type in multiple groups with the same metric

Here are two variants of the metric ActiveConnections with three aggregation types: Maximum, Minimum, and Avergate:

- module: azure
  metricsets:
    - monitor
  enabled: true
  period: 60s
  client_id: '<redacted>'
  client_secret: '<redacted>'
  tenant_id: '<redacted>'
  subscription_id: '<redacted>'
  refresh_list_interval: 600s
  resources:
  - resource_query: "resourceType eq 'Microsoft.EventHub/Namespaces'"
    metrics:
    - aggregations:
        - Maximum
      ignore_unsupported: true
      name:
        - ActiveConnections
      namespace: Microsoft.EventHub/Namespaces
    - aggregations:
        - Minimum
      ignore_unsupported: true
      name:
        - ActiveConnections
      namespace: Microsoft.EventHub/Namespaces
    - aggregations:
        - Average
      ignore_unsupported: true
      name:
        - ActiveConnections
      namespace: Microsoft.EventHub/Namespaces

This variant should be preferred since in needs less API calls to fetch the same data:

- module: azure
  metricsets:
    - monitor
  enabled: true
  period: 60s
  client_id: '<redacted>'
  client_secret: '<redacted>'
  tenant_id: '<redacted>'
  subscription_id: '<redacted>'
  refresh_list_interval: 600s
  resources:
  - resource_query: "resourceType eq 'Microsoft.EventHub/Namespaces'"
    metrics:
    - namespace: Microsoft.EventHub/Namespaces
      name:
        - ActiveConnections
      aggregations:
        - Average
        - Maximum
        - Minimum
      ignore_unsupported: true
      timegrain: PT1M

Screenshots

Logs

@zmoog zmoog added bug Team:obs-ds-hosted-services Label for the Observability Hosted Services team labels Apr 24, 2024
@zmoog zmoog self-assigned this Apr 24, 2024
@botelastic botelastic bot added needs_team Indicates that the issue/PR needs a Team:* label and removed needs_team Indicates that the issue/PR needs a Team:* label labels Apr 24, 2024
@zmoog zmoog added backport-v8.13.0 Automated backport with mergify backport-v8.14.0 Automated backport with mergify labels Apr 24, 2024
@elasticmachine
Copy link
Collaborator

elasticmachine commented Apr 24, 2024

💚 Build Succeeded

the below badges are clickable and redirect to their specific view in the CI or DOCS
Pipeline View Test View Changes Artifacts preview preview

Expand to view the summary

Build stats

  • Duration: 79 min 38 sec

❕ Flaky test report

No test was executed to be analysed.

🤖 GitHub comments

Expand to view the GitHub comments

To re-run your PR in the CI, just comment with:

  • /test : Re-trigger the build.

  • /package : Generate the packages and run the E2E tests.

  • /beats-tester : Run the installation tests with beats-tester.

  • run elasticsearch-ci/docs : Re-trigger the docs validation. (use unformatted text in the comment!)

@zmoog zmoog force-pushed the zmoog/azure-monitor-multiple-aggregation-types branch from 10dce20 to ad70b05 Compare April 29, 2024 03:42
@zmoog zmoog marked this pull request as ready for review April 29, 2024 04:14
@zmoog zmoog requested a review from a team as a code owner April 29, 2024 04:14
@elasticmachine
Copy link
Collaborator

Pinging @elastic/obs-ds-hosted-services (Team:obs-ds-hosted-services)

}},
}},
Type: to.Ptr("Microsoft.Insights/metrics"),
Unit: to.Ptr(armmonitor.MetricUnit("Count")),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wondering if you first save the value of armmonitor.MetricUnit("Count") to a variable and reference here the variable will eliminate this lint error

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, I think you're right.

@@ -43,7 +43,7 @@ func (client *MockService) GetMetricNamespaces(resourceId string) (armmonitor.Me

// GetMetricValues is a mock function for the azure service
func (client *MockService) GetMetricValues(resourceId string, namespace string, timegrain string, timespan string, metricNames []string, aggregations string, filter string) ([]armmonitor.Metric, string, error) {
args := client.Called(resourceId, namespace)
args := client.Called(resourceId, namespace, timegrain, timespan, metricNames, aggregations, filter)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can just add some description what each parameter is here used for
Maybe you can update the GetMetricValues description

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, good point. I'm updating the GetMetricValues description in the interface.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed there is an unused method in the interface. I'll update the docs for the other methods and remove the unused ones in a cleanup PR.

@gizas
Copy link
Contributor

gizas commented Apr 29, 2024

LGTM and the tests run successfully on myside

The MetricRegistry wasn't using the aggregation type in the cache key,
returning the wrong answer to the 'needs update?' question.
Restores support for multiple aggregation types for the same metric
name.

Adding tests for the known use cases, so we don't miss this feature
again in future updates.
I was checking the wrong response values.
@zmoog zmoog force-pushed the zmoog/azure-monitor-multiple-aggregation-types branch from 7f48328 to 7cc4f44 Compare April 29, 2024 16:24
@zmoog zmoog force-pushed the zmoog/azure-monitor-multiple-aggregation-types branch from 7cc4f44 to 2dadc87 Compare April 29, 2024 17:30
@zmoog zmoog merged commit 81fc73e into elastic:main Apr 29, 2024
29 checks passed
@zmoog zmoog deleted the zmoog/azure-monitor-multiple-aggregation-types branch April 29, 2024 20:48
mergify bot pushed a commit that referenced this pull request Apr 29, 2024
* Add aggregation type to the MetricRegistry key

The MetricRegistry wasn't using the aggregation type in the cache key,
returning the wrong answer to the 'needs update?' question.

* Handle multiple aggregation types

Restores support for multiple aggregation types for the same metric
name.

Adding tests for the known use cases so we don't miss this feature
again in future updates.

(cherry picked from commit 81fc73e)
mergify bot pushed a commit that referenced this pull request Apr 29, 2024
* Add aggregation type to the MetricRegistry key

The MetricRegistry wasn't using the aggregation type in the cache key,
returning the wrong answer to the 'needs update?' question.

* Handle multiple aggregation types

Restores support for multiple aggregation types for the same metric
name.

Adding tests for the known use cases so we don't miss this feature
again in future updates.

(cherry picked from commit 81fc73e)
zmoog added a commit that referenced this pull request Apr 30, 2024
…9280)

* Add aggregation type to the MetricRegistry key

The MetricRegistry wasn't using the aggregation type in the cache key,
returning the wrong answer to the 'needs update?' question.

* Handle multiple aggregation types

Restores support for multiple aggregation types for the same metric
name.

Adding tests for the known use cases so we don't miss this feature
again in future updates.

(cherry picked from commit 81fc73e)

Co-authored-by: Maurizio Branca <maurizio.branca@elastic.co>
zmoog added a commit that referenced this pull request Apr 30, 2024
…ation types (#39279)

* Fix Azure Monitor support for multiple aggregation types (#39204)

* Add aggregation type to the MetricRegistry key

The MetricRegistry wasn't using the aggregation type in the cache key,
returning the wrong answer to the 'needs update?' question.

* Handle multiple aggregation types

Restores support for multiple aggregation types for the same metric
name.

Adding tests for the known use cases so we don't miss this feature
again in future updates.

(cherry picked from commit 81fc73e)

* Remove extra changelog entries

---------

Co-authored-by: Maurizio Branca <maurizio.branca@elastic.co>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backport-v8.13.0 Automated backport with mergify backport-v8.14.0 Automated backport with mergify bug Team:obs-ds-hosted-services Label for the Observability Hosted Services team
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Azure Monitor metricset only collect one aggregation type at a time
3 participants