Skip to content

k6: group special async function treatment - #2863

Closed
mstoykov wants to merge 3 commits into
masterfrom
asyncGroupSupport
Closed

mstoykov wants to merge 3 commits into
masterfrom
asyncGroupSupport

Conversation

@mstoykov

Copy link
Copy Markdown
Contributor

A group provided with an async function will now:

  1. Treat the whole time it take for the async function promise to finisher the duration of the group.
  2. It will also use goja's AsyncContextTracker to make it so that the code using await within the group will still continue to be tagged with the group after await returns.
  3. Instead of directly calling the async function it schedules it to be called the next time a promise job will work.

The current AsyncContextTracker is only used for this and as such is directly changed in the k6 module. In the future there likely will be API so that multiple modules can use it simultaneously, but that seems way too involved to be included in this change and also currently only group needs this.

fixes #2848 #2728

@mstoykov mstoykov added this to the v0.43.0 milestone Jan 19, 2023
@github-actions
github-actions Bot requested review from codebien and oleiade January 19, 2023 15:08
A group provided with an async function will now:
1. Treat the whole time it take for the async function promise to finisher
   the duration of the group.
2. It will also use goja's AsyncContextTracker to make it so that the code
   using `await` within the group will still continue to be tagged with the
   group after `await` returns.
3. Instead of directly calling the async function it schedules it to be
   called the next time a promise job will work.

The current AsyncContextTracker is only used for this and as such is
directly changed in the `k6` module. In the future there likely will be
API so that multiple modules can use it simultaneously, but that seems
way too involved to be included in this change and also currently only
`group` needs this.

fixes #2848 #2728
@mstoykov mstoykov linked an issue Jan 19, 2023 that may be closed by this pull request
@mstoykov

Copy link
Copy Markdown
Contributor Author

Moving this to a draft in favor of #2875

@mstoykov
mstoykov marked this pull request as draft January 25, 2023 15:15
@mstoykov mstoykov removed this from the v0.43.0 milestone Jan 27, 2023
@aakash3771

Copy link
Copy Markdown

How to get notified when this is fixed?

@mstoykov

Copy link
Copy Markdown
Contributor Author

For more information you likely should follow #2728 as this PR at this time is very unlikely to be merged as is.

@codecov-commenter

Copy link
Copy Markdown

Codecov Report

Attention: Patch coverage is 86.56716% with 9 lines in your changes are missing coverage. Please review.

Project coverage is 76.15%. Comparing base (0b563d4) to head (8101130).
Report is 594 commits behind head on master.

Files Patch % Lines
js/modules/k6/k6.go 83.33% 4 Missing and 1 partial ⚠️
js/modules/k6/asyncGroup.go 89.18% 2 Missing and 2 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #2863      +/-   ##
==========================================
- Coverage   76.15%   76.15%   -0.01%     
==========================================
  Files         217      218       +1     
  Lines       16604    16669      +65     
==========================================
+ Hits        12645    12694      +49     
- Misses       3185     3196      +11     
- Partials      774      779       +5     
Flag Coverage Ξ”
ubuntu 75.97% <86.56%> (-0.01%) ⬇️
windows 75.85% <86.56%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

β˜” View full report in Codecov by Sentry.
πŸ“’ Have feedback on the report? Share it here.

@mstoykov

Copy link
Copy Markdown
Contributor Author

I am closing this PR as it is really unlikely we will go down this route

@mstoykov mstoykov closed this Mar 13, 2024
@mstoykov
mstoykov deleted the asyncGroupSupport branch August 4, 2025 08:00
mstoykov added a commit that referenced this pull request Sep 15, 2026
Add the experimental async-metric-context feature flag and use it to
treat tags and metadata as async-local context. Each promise reaction
receives a cloned snapshot, mutations flow to asynchronous work
created by that reaction, and the interrupted context is restored
when the reaction exits.

Install the Sobek async-context tracker when each VU runtime is created.
This makes propagation available to promises and modules and installs
the tracker before setup or teardown can queue reactions.

Provide common helpers for callbacks that run outside Sobek promise
reactions. Applying a captured context without metadata measured
84.60 ns/op, 32 B/op, and one allocation in five one-second runs with
GOMAXPROCS=1. Four metadata entries measured 480.0 ns/op, 704 B/op, and
five allocations.

Keep the behavior opt-in through --features async-metric-context,
K6_FEATURES, or the JSON features configuration. Disabled runs do not
install the tracker or apply callback snapshots.

Related issues:
  #2728
  #2848
  #3392
  #5435
  #5673

Earlier proposal: #2863
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.

Change how group() calls async functions group doesn't work with async calls well

3 participants