Ah! This looks like it'll be perfect for the use case.  Thanks!

On Mon, Mar 13, 2017 at 2:11 PM, Yang Guo <[email protected]> wrote:
> 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 a topic in the
> Google Groups "v8-dev" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/v8-dev/lKsMY3Nmwg4/unsubscribe.
> To unsubscribe from this group and all its topics, 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