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

feat(performance): create a k6 purge script to run after creating dialogs #1435

Merged
merged 6 commits into from
Nov 11, 2024

Conversation

dagfinno
Copy link
Contributor

@dagfinno dagfinno commented Nov 11, 2024

A script that purges dialogs created by performance tests. Much is copied from common/sentinel.js, but that script didn't quite fit in.
Purges max 200 in one run, searching and purging is time-consuming at the moment

Description

Related Issue(s)

Verification

  • Your code builds clean without any errors or warnings
  • Manual testing done (required)
  • Relevant automated test added (if you find this hard, leave it and we'll help out)

Documentation

  • Documentation is updated (either in docs-directory, Altinnpedia or a separate linked PR in altinn-studio-docs., if applicable)

Summary by CodeRabbit

Summary by CodeRabbit

  • New Features

    • Introduced a new script to automatically purge uncleaned dialogs after tests, enhancing test environment management.
  • Bug Fixes

    • Improved error handling for API responses during the purging process, ensuring more reliable cleanup operations.

@dagfinno dagfinno requested a review from a team as a code owner November 11, 2024 07:47
Copy link
Contributor

coderabbitai bot commented Nov 11, 2024

📝 Walkthrough
📝 Walkthrough

Walkthrough

The pull request introduces a new script, purge-dialogs.js, designed to purge uncleaned dialogs after test executions. It includes functions for fetching dialog IDs based on a sentinel value, initializing the test setup, and purging dialogs for specified service owners. The script supports both single-user and multi-user modes and incorporates error handling to validate the cleanup process.

Changes

File Path Change Summary
tests/k6/tests/serviceowner/performance/purge-dialogs.js - Added function getDialogs(serviceOwner) to fetch dialog IDs for purging.
- Added variable export let options.
- Added function export function setup() for test initialization.
- Added function export default function(serviceOwners) for main execution.
- Added function export function purgeDialogs(serviceOwner) for purging dialogs.

Possibly related PRs

Suggested reviewers

  • oskogstad

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Outside diff range and nitpick comments (3)
tests/k6/tests/serviceowner/performance/purge-dialogs.js (3)

85-85: Clarify single-user mode detection logic

The expression used to determine isSingleUserMode could be simplified for readability. Consider refactoring the logic to make it clearer.

Apply this diff to enhance readability:

- const isSingleUserMode = (options.vus ?? 1) === 1 && (options.iterations ?? 1) === 1 && (options.duration ?? 0) === 0;
+ const vus = options.vus ?? 1;
+ const iterations = options.iterations ?? 1;
+ const duration = options.duration ?? 0;
+ const isSingleUserMode = vus === 1 && iterations === 1 && duration === 0;

102-107: Refactor duplicated 'paramsWithToken' object

The paramsWithToken object is similarly defined in both getDialogs and purgeDialogs. Consider extracting this into a shared helper function or variable to reduce code duplication.

Example of creating a helper function:

function createParamsWithToken(token, additionalHeaders = {}) {
    return {
        headers: {
            Authorization: "Bearer " + token,
            ...additionalHeaders
        }
    };
}

Then modify the code accordingly:

- var paramsWithToken = {
-     headers: {
-         Authorization: "Bearer " + serviceOwner.token
-     },
-     tags: { name: 'purge dialog' }
- }
+ var paramsWithToken = createParamsWithToken(serviceOwner.token, { tags: { name: 'purge dialog' } });

112-112: Use 'let' instead of 'var' for block scoping

Replace var with let to use block-level scoping and prevent potential issues related to hoisting.

Apply this diff:

- for(var i = dialogIdsToPurge.length - 1; i>=0; i--) {
+ for(let i = dialogIdsToPurge.length - 1; i >= 0; i--) {
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between a1e89fb and ef58818.

📒 Files selected for processing (1)
  • tests/k6/tests/serviceowner/performance/purge-dialogs.js (1 hunks)
🔇 Additional comments (1)
tests/k6/tests/serviceowner/performance/purge-dialogs.js (1)

44-49: Review the termination condition logic in the loop

The condition if (dialogIdsToPurge.length < 200) seems arbitrary and might not correctly handle pagination. This could lead to incomplete retrieval of dialogs when there are more than 200 dialogs to purge. Consider revising the logic to ensure all dialogs are fetched.

Would you like to verify if all dialogs are being retrieved when there are more than 200? If so, you can run the following script:

tests/k6/tests/serviceowner/performance/purge-dialogs.js Outdated Show resolved Hide resolved
tests/k6/tests/serviceowner/performance/purge-dialogs.js Outdated Show resolved Hide resolved
dagfinno and others added 4 commits November 11, 2024 08:58
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Copy link

sonarcloud bot commented Nov 11, 2024

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (3)
tests/k6/tests/serviceowner/performance/purge-dialogs.js (3)

47-47: Move logging outside the pagination loop.

The log statement is inside the loop, which will print multiple times during pagination. Consider moving it after the loop for a single summary.

-        console.log("Found " + dialogIdsToPurge.length + " unpurged dialogs");  

And add after line 54:

+    console.log("Found " + dialogIdsToPurge.length + " unpurged dialogs");

58-64: Document the rationale for the 4-minute setup timeout.

The setupTimeout value of '4m' seems arbitrary. Consider adding a comment explaining why this specific duration was chosen and what factors might require adjusting it.


89-89: Improve readability of single-user mode check.

The condition using nullish coalescing could be more readable by extracting it to a helper function or adding comments explaining the logic.

-    const isSingleUserMode = (options.vus ?? 1) === 1 && (options.iterations ?? 1) === 1 && (options.duration ?? 0) === 0;
+    // Check if running in single-user mode:
+    // - Virtual Users (vus) = 1
+    // - Single iteration
+    // - No duration specified
+    const isSingleUserMode = 
+        (options.vus ?? 1) === 1 && 
+        (options.iterations ?? 1) === 1 && 
+        (options.duration ?? 0) === 0;
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between ef58818 and 505df0d.

📒 Files selected for processing (1)
  • tests/k6/tests/serviceowner/performance/purge-dialogs.js (1 hunks)
🔇 Additional comments (3)
tests/k6/tests/serviceowner/performance/purge-dialogs.js (3)

1-16: LGTM! Well-documented with clear purpose and usage.

The documentation and imports are comprehensive and appropriate for a k6 test script.


66-77: LGTM! Well-structured setup with proper validation.

The setup function properly validates inputs and handles errors appropriately.


48-53: ⚠️ Potential issue

Review the artificial limit of 200 dialogs.

The code artificially stops pagination after 200 dialogs. This could leave dialogs unpurged if there are more than 200 matching the sentinel value.

Let's check if this limit could be problematic:

Consider removing this limit or making it configurable:

-        if (dialogIdsToPurge.length < 200) {
-            hasNextPage = response.hasNextPage;
-        }
-        else {
-            hasNextPage = false;
-        }
+        hasNextPage = response.hasNextPage;

@dagfinno dagfinno merged commit 9555d78 into main Nov 11, 2024
5 checks passed
@dagfinno dagfinno deleted the performance/purge-dialogs branch November 11, 2024 09:02
oskogstad pushed a commit that referenced this pull request Nov 12, 2024
🤖 I have created a release *beep* *boop*
---


##
[1.32.0](v1.31.0...v1.32.0)
(2024-11-12)


### Features

* **graphql:** Set max execution depth to 10
([#1431](#1431))
([8845e49](8845e49)),
closes [#1430](#1430)
* **performance:** create a k6 purge script to run after creating
dialogs ([#1435](#1435))
([9555d78](9555d78))
* **performance:** Expands search for serviceowners, improved tracing
and logging
([#1439](#1439))
([b1d6eaf](b1d6eaf))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants