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

[AWS] Use namespace for GetListMetrics when exists #41022

Merged
merged 6 commits into from
Oct 8, 2024

Conversation

kaiyan-sheng
Copy link
Contributor

@kaiyan-sheng kaiyan-sheng commented Sep 27, 2024

Proposed commit message

This PR is to change GetListMetricsOutput function (which calls the ListMetrics API) to use namespaces when namespaces are given in AWS CloudWatch configuration in Metricbeat.

Instead of returning all possible metrics from CloudWatch from ALL namespaces and filter later, we only need to query the ListMetrics API to get the metrics under the namespaces that we care about.

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.

@botelastic botelastic bot added the needs_team Indicates that the issue/PR needs a Team:* label label Sep 27, 2024
Copy link
Contributor

mergify bot commented Sep 27, 2024

This pull request does not have a backport label.
If this is a bug or security fix, could you label this PR @kaiyan-sheng? 🙏.
For such, you'll need to label your PR with:

  • The upcoming major version of the Elastic Stack
  • The upcoming minor version of the Elastic Stack (if you're not pushing a breaking change)

To fixup this pull request, you need to add the backport labels for the needed
branches, such as:

  • backport-8./d is the label to automatically backport to the 8./d branch. /d is the digit

Copy link
Contributor

mergify bot commented Sep 27, 2024

backport-8.x has been added to help with the transition to the new branch 8.x.
If you don't need it please use backport-skip label and remove the backport-8.x label.

@mergify mergify bot added the backport-8.x Automated backport to the 8.x branch with mergify label Sep 27, 2024
@kaiyan-sheng kaiyan-sheng added Team:obs-ds-hosted-services Label for the Observability Hosted Services team backport-8.15 Automated backport to the 8.15 branch with mergify labels Sep 27, 2024
@botelastic botelastic bot removed the needs_team Indicates that the issue/PR needs a Team:* label label Sep 27, 2024
@kaiyan-sheng kaiyan-sheng marked this pull request as ready for review September 27, 2024 16:57
@kaiyan-sheng kaiyan-sheng requested a review from a team as a code owner September 27, 2024 16:57
@elasticmachine
Copy link
Collaborator

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

Copy link
Contributor

@Kavindu-Dodan Kavindu-Dodan left a comment

Choose a reason for hiding this comment

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

I have this remark [1] otherwise, looks okay

[1] - https://github.com/elastic/beats/pull/41022/files#r1784739873

if len(namespaceDetailTotal) == 0 {
listMetricsOutput, err = aws.GetListMetricsOutput("*", regionName, m.Period, m.IncludeLinkedAccounts, m.OwningAccount, m.MonitoringAccountID, svcCloudwatch)
if err != nil {
m.Logger().Errorf("Error while retrieving the list of metrics for region %s and namespace %s: %w", regionName, "*", err)
Copy link
Contributor

Choose a reason for hiding this comment

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

Do we need to include the namespace in this error message?

Copy link
Contributor

Choose a reason for hiding this comment

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

Also I think that this is can be a good integration test to include it. WDYT?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

The error message here shows namespace is * because in this if statement we are calling ListMetrics with * all namespaces. The else statement part is the one with a specific namespace.

Copy link
Contributor

Choose a reason for hiding this comment

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

@gizas, most integration tests start the metricset/input and check that they produce a non-zero number of events.

What kind of check do you have in mind?

What do you think about creating a dedicated issue to enhance the integration tests for the cloudwatch metricset?

Copy link
Contributor

Choose a reason for hiding this comment

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

@kaiyan-sheng, this change may increase the number of API calls because we're making one API call for each namespace in the config.

However, it shouldn't make a difference since I don't expect configurations to have more than 1-3 namespaces, right?

Copy link
Contributor

Choose a reason for hiding this comment

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

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@zmoog Yeah that's the original thought when we decide to use "*" instead of individual namespace in this API call. But I think at this point, the benefit of using specific namespaces with a higher number of API calls wins.
I will update the document here: https://www.elastic.co/guide/en/beats/metricbeat/current/metricbeat-module-aws.html#aws-api-requests

Copy link
Contributor Author

@kaiyan-sheng kaiyan-sheng Oct 7, 2024

Choose a reason for hiding this comment

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

We actually already have tests around this but since we are mocking the ListMetrics API and what's returning from the API, the test is no use for distinguish namespaces. As we discussed earlier, I will merge this PR to get the fix in but look into the test later. Thanks!

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@zmoog I tested the pr again with the config below to double check how many times this ListMetrics API will be called. Turned out we are calling it once because namespaces are the same in both parts under metrics:

- module: aws
  period: 60s
  metricsets:
    - cloudwatch
  data_granularity: 60s
  include_linked_accounts: true
  regions:
    - ap-southeast-1
  metrics:
    - dimensions:
        - name: CanaryName
          value: canary1
      namespace: CloudWatchSynthetics
    - dimensions:
        - name: CanaryName
          value: canary2
      namespace: CloudWatchSynthetics

Copy link
Contributor

mergify bot commented Oct 3, 2024

This pull request is now in conflicts. Could you fix it? 🙏
To fixup this pull request, you can check out it locally. See documentation: https://help.github.com/articles/checking-out-pull-requests-locally/

git fetch upstream
git checkout -b cloudwatch_delay upstream/cloudwatch_delay
git merge upstream/main
git push upstream cloudwatch_delay

@zmoog zmoog added the aws Enable builds in the CI for aws cloud testing label Oct 4, 2024
@zmoog
Copy link
Contributor

zmoog commented Oct 4, 2024

/test

@zmoog
Copy link
Contributor

zmoog commented Oct 4, 2024

I added the aws label to trigger the integration tests.

@girodav
Copy link
Contributor

girodav commented Oct 7, 2024

Please keep in mind that:

  • Making multiple ListMetrics API calls may incur additional costs for the user, even though these APIs are generally not the main cost driver.
  • We should update the docs accordingly, stating when each API is called and how.

See this old PR for reference https://github.com/elastic/beats/pull/34055/files

Copy link
Contributor

mergify bot commented Oct 7, 2024

This pull request is now in conflicts. Could you fix it? 🙏
To fixup this pull request, you can check out it locally. See documentation: https://help.github.com/articles/checking-out-pull-requests-locally/

git fetch upstream
git checkout -b cloudwatch_delay upstream/cloudwatch_delay
git merge upstream/main
git push upstream cloudwatch_delay

@kaiyan-sheng kaiyan-sheng merged commit 36327a4 into elastic:main Oct 8, 2024
33 checks passed
@kaiyan-sheng kaiyan-sheng deleted the cloudwatch_delay branch October 8, 2024 14:43
mergify bot pushed a commit that referenced this pull request Oct 8, 2024
* Use namespace for GetListMetrics when exists

(cherry picked from commit 36327a4)
mergify bot pushed a commit that referenced this pull request Oct 8, 2024
* Use namespace for GetListMetrics when exists

(cherry picked from commit 36327a4)
kaiyan-sheng added a commit that referenced this pull request Oct 8, 2024
* Use namespace for GetListMetrics when exists

(cherry picked from commit 36327a4)

Co-authored-by: kaiyan-sheng <[email protected]>
kaiyan-sheng added a commit that referenced this pull request Oct 8, 2024
…xists (#41175)

* [AWS] Use namespace for GetListMetrics when exists (#41022)

* Use namespace for GetListMetrics when exists

(cherry picked from commit 36327a4)

---------

Co-authored-by: kaiyan-sheng <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
aws Enable builds in the CI for aws cloud testing backport-8.x Automated backport to the 8.x branch with mergify backport-8.15 Automated backport to the 8.15 branch with mergify 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.

6 participants