Does PromiseHook not offer what you need? Take a look in v8/include/v8.h
and look for PromiseHook.

Cheers,

Yang

On Mon, Mar 13, 2017, 22:06 <[email protected]> wrote:

> Hello,
>
> I am trying to figure out how to maintain state associated with async
> functions across await boundaries. We currently have instrumentation for
> promises which allows us to maintain state in each step of the promise
> chain, unfortunately for us async/await is implemented using only internal
> functions with no exposure to JS-land. This makes it impossible for us to
> instrument it without requiring either user or V8 code modification. The
> app pasted below shows a simple use case where using promises directly
> maintains the correct state while using async/await loses it.
>
> I was exploring this using Node 7.7.1 which uses V8 5.5.372 and found a
> naive solution (see attached await.patch). This shows the spirit of what we
> would like to do. We need async/await to use a JS-land function to add its
> continuation, or otherwise expose some kind of hook, so that we can get in
> there and maintain our state. I looked into upgrading my patch to the
> latest V8 before bringing it here to discuss, but it looks like async/await
> was completely refactored and the JS function AsyncFunctionAwait which my
> patch modified became the C++ function AsyncBuiltinsAssembler::Await (in
> builtins-async.cc) and I am not at all familiar with V8's assemblers.
>
> I would like to know what is the best way forward to get a change into V8
> making async/await instrumentable?
>
> -Bryan
>
> 'use strict';
>
> // Some environment variables to make newrelic keep quiet.
> process.env.NEW_RELIC_NO_CONFIG_FILE = true;
> process.env.NEW_RELIC_APP_NAME = 'async await example';
> process.env.NEW_RELIC_LICENSE_KEY = 'this is not a license';
>
> var newrelic = require('newrelic');
> var Promise = require('bluebird');
> var fs = Promise.promisifyAll(require('fs'));
> var path = require('path');
>
> var pkgPath = path.resolve(__dirname, './package.json');
>
> // A simple async function to show transaction state loss.
> var asyncAwait = newrelic.createBackgroundTransaction('asdf', async
> function() {
>   console.log('async', !!newrelic.agent.tracer.segment);
>   await fs.readFileAsync(pkgPath, 'utf8'); // <-- State lost here.
>   console.log('async', !!newrelic.agent.tracer.segment);
>
>   // Just to show pure promises keeps state.
>   promises();
> });
>
> // Same thing but just with promises.
> var promises = newrelic.createBackgroundTransaction('asdf', function() {
>   console.log('promises', !!newrelic.agent.tracer.segment);
>   return fs.readFileAsync(pkgPath, 'utf8').then(() => {
>     console.log('promises', !!newrelic.agent.tracer.segment);
>     process.exit(0);
>   });
> });
>
> asyncAwait();
>
> --
> --
> v8-dev mailing list
> [email protected]
> http://groups.google.com/group/v8-dev
> ---
> You received this message because you are subscribed to the Google Groups
> "v8-dev" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
-- 
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- 
You received this message because you are subscribed to the Google Groups 
"v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to