diff --git a/lib/_http_client.js b/lib/_http_client.js index d1a2d39f63..4606bec2b4 100644 --- a/lib/_http_client.js +++ b/lib/_http_client.js @@ -41,13 +41,14 @@ const { TypedArrayPrototypeSlice, } = primordials; + +const nsolidApi = internalBinding('nsolid_api'); const { nsolid_counts, nsolid_tracer_s, nsolid_span_id_s, nsolid_consts, - pushClientBucket, -} = internalBinding('nsolid_api'); +} = nsolidApi; const net = require('net'); const assert = require('internal/assert'); @@ -736,7 +737,7 @@ function parserOnIncomingClient(res, shouldKeepAlive) { } nsolid_counts[kHttpClientCount]++; - pushClientBucket(now() - req[nsolid_tracer_s]); + nsolidApi.pushClientBucket(now() - req[nsolid_tracer_s]); if (req[kClientRequestStatistics] && hasObserver('http')) { stopPerf(req, kClientRequestStatistics, { diff --git a/lib/dns.js b/lib/dns.js index 593ffb0520..0e1f4b4ec6 100644 --- a/lib/dns.js +++ b/lib/dns.js @@ -28,13 +28,13 @@ const { Symbol, } = primordials; +const nsolidApi = internalBinding('nsolid_api'); const { nsolid_counts, nsolid_tracer_s, nsolid_span_id_s, nsolid_consts, - pushDnsBucket, -} = internalBinding('nsolid_api'); +} = nsolidApi; const cares = internalBinding('cares_wrap'); const { isIP } = require('internal/net'); @@ -134,7 +134,7 @@ let promises = null; // Lazy loaded function onlookup(err, addresses) { const now = perfNow(); - pushDnsBucket(now - this[nsolid_tracer_s]); + nsolidApi.pushDnsBucket(now - this[nsolid_tracer_s]); const span = this[nsolid_span_id_s]; if (err) { @@ -160,7 +160,7 @@ function onlookup(err, addresses) { function onlookupall(err, addresses) { const now = perfNow(); - pushDnsBucket(now - this[nsolid_tracer_s]); + nsolidApi.pushDnsBucket(now - this[nsolid_tracer_s]); const span = this[nsolid_span_id_s]; if (err) { @@ -326,7 +326,7 @@ ObjectDefineProperty(lookup, customPromisifyArgs, function onlookupservice(err, hostname, service) { const now = perfNow(); - pushDnsBucket(now - this[nsolid_tracer_s]); + nsolidApi.pushDnsBucket(now - this[nsolid_tracer_s]); const span = this[nsolid_span_id_s]; if (err) { diff --git a/lib/internal/dns/callback_resolver.js b/lib/internal/dns/callback_resolver.js index 92faf7f86b..9f68cd7bba 100644 --- a/lib/internal/dns/callback_resolver.js +++ b/lib/internal/dns/callback_resolver.js @@ -8,13 +8,13 @@ const { JSONStringify, } = primordials; +const nsolidApi = internalBinding('nsolid_api'); const { nsolid_consts, nsolid_counts, nsolid_tracer_s, nsolid_span_id_s, - pushDnsBucket, -} = internalBinding('nsolid_api'); +} = nsolidApi; const { now: perfNow } = require('internal/perf/utils'); @@ -67,7 +67,7 @@ const kPerfHooksDnsLookupResolveContext = Symbol('kPerfHooksDnsLookupResolveCont function onresolve(err, result, ttls) { const now = perfNow(); - pushDnsBucket(now - this[nsolid_tracer_s]); + nsolidApi.pushDnsBucket(now - this[nsolid_tracer_s]); if (ttls && this.ttl) result = ArrayPrototypeMap( result, (address, index) => ({ address, ttl: ttls[index] })); diff --git a/lib/internal/dns/promises.js b/lib/internal/dns/promises.js index 6d5b5b7f23..901fa81e09 100644 --- a/lib/internal/dns/promises.js +++ b/lib/internal/dns/promises.js @@ -8,13 +8,13 @@ const { Symbol, } = primordials; +const nsolidApi = internalBinding('nsolid_api'); const { nsolid_counts, nsolid_tracer_s, nsolid_span_id_s, nsolid_consts, - pushDnsBucket, -} = internalBinding('nsolid_api'); +} = nsolidApi; const { bindDefaultResolver, @@ -111,7 +111,7 @@ const { function onlookup(err, addresses) { const now = perfNow(); - pushDnsBucket(now - this[nsolid_tracer_s]); + nsolidApi.pushDnsBucket(now - this[nsolid_tracer_s]); const span = this[nsolid_span_id_s]; if (err) { @@ -138,7 +138,7 @@ function onlookup(err, addresses) { function onlookupall(err, addresses) { const now = perfNow(); - pushDnsBucket(now - this[nsolid_tracer_s]); + nsolidApi.pushDnsBucket(now - this[nsolid_tracer_s]); const span = this[nsolid_span_id_s]; if (err) { @@ -302,7 +302,7 @@ function lookup(hostname, options) { function onlookupservice(err, hostname, service) { const now = perfNow(); - pushDnsBucket(now - this[nsolid_tracer_s]); + nsolidApi.pushDnsBucket(now - this[nsolid_tracer_s]); const span = this[nsolid_span_id_s]; if (err) { @@ -391,7 +391,7 @@ function lookupService(address, port) { function onresolve(err, result, ttls) { const now = perfNow(); - pushDnsBucket(now - this[nsolid_tracer_s]); + nsolidApi.pushDnsBucket(now - this[nsolid_tracer_s]); const span = this[nsolid_span_id_s]; if (err) { diff --git a/src/nsolid/nsolid_api.cc b/src/nsolid/nsolid_api.cc index 34f0986890..0acbda85c6 100644 --- a/src/nsolid/nsolid_api.cc +++ b/src/nsolid/nsolid_api.cc @@ -2043,11 +2043,41 @@ static void AgentId(const FunctionCallbackInfo& args) { } -static void PushClientBucket(const FunctionCallbackInfo& args) { - EnvInst* envinst = EnvInst::GetEnvLocalInst(args.GetIsolate()); - CHECK_NE(envinst, nullptr); - CHECK(args[0]->IsNumber()); - envinst->PushClientBucket(args[0].As()->Value()); +void BindingData::SlowPushClientBucket( + const FunctionCallbackInfo& args) { + DCHECK(args[0]->IsNumber()); + PushClientBucketImpl(PrincipalRealm::GetBindingData(args), + args[0].As()->Value()); +} + + +void BindingData::FastPushClientBucket(v8::Local receiver, + double val) { + PushClientBucketImpl(FromJSObject(receiver), val); +} + + +void BindingData::PushClientBucketImpl(BindingData* data, double val) { + data->env()->envinst_->PushClientBucket(val); +} + + +void BindingData::SlowPushDnsBucket( + const FunctionCallbackInfo& args) { + DCHECK(args[0]->IsNumber()); + PushDnsBucketImpl(PrincipalRealm::GetBindingData(args), + args[0].As()->Value()); +} + + +void BindingData::FastPushDnsBucket(v8::Local receiver, + double val) { + PushDnsBucketImpl(FromJSObject(receiver), val); +} + + +void BindingData::PushDnsBucketImpl(BindingData* data, double val) { + data->env()->envinst_->PushDnsBucket(val); } @@ -2070,14 +2100,6 @@ void BindingData::PushServerBucketImpl(BindingData* data, double val) { } -static void PushDnsBucket(const FunctionCallbackInfo& args) { - EnvInst* envinst = EnvInst::GetEnvLocalInst(args.GetIsolate()); - CHECK_NE(envinst, nullptr); - CHECK(args[0]->IsNumber()); - envinst->PushDnsBucket(args[0].As()->Value()); -} - - void BindingData::SlowPushSpanDataDouble( const FunctionCallbackInfo& args) { DCHECK_EQ(args.Length(), 3); @@ -2584,7 +2606,10 @@ void BindingData::Deserialize(Local context, CHECK_NOT_NULL(binding); } - +v8::CFunction BindingData::fast_push_client_bucket_( + v8::CFunction::Make(FastPushClientBucket)); +v8::CFunction BindingData::fast_push_dns_bucket_( + v8::CFunction::Make(FastPushDnsBucket)); v8::CFunction BindingData::fast_push_server_bucket_( v8::CFunction::Make(FastPushServerBucket)); v8::CFunction BindingData::fast_push_span_data_double_( @@ -2605,6 +2630,16 @@ void BindingData::Initialize(Local target, realm->AddBindingData(target); if (binding_data == nullptr) return; + SetFastMethod(context, + target, + "pushClientBucket", + SlowPushClientBucket, + &fast_push_client_bucket_); + SetFastMethod(context, + target, + "pushDnsBucket", + SlowPushDnsBucket, + &fast_push_dns_bucket_); SetFastMethod(context, target, "pushServerBucket", @@ -2622,8 +2657,6 @@ void BindingData::Initialize(Local target, &fast_push_span_data_uint64_); SetMethod(context, target, "agentId", AgentId); - SetMethod(context, target, "pushClientBucket", PushClientBucket); - SetMethod(context, target, "pushDnsBucket", PushDnsBucket); SetMethod(context, target, "pushSpanDataString", PushSpanDataString); SetMethod(context, target, "getEnvMetrics", GetEnvMetrics); SetMethod(context, target, "getProcessMetrics", GetProcessMetrics); @@ -2731,6 +2764,14 @@ void BindingData::Initialize(Local target, void BindingData::RegisterExternalReferences( ExternalReferenceRegistry* registry) { + registry->Register(SlowPushClientBucket); + registry->Register(FastPushClientBucket); + registry->Register(fast_push_client_bucket_.GetTypeInfo()); + + registry->Register(SlowPushDnsBucket); + registry->Register(FastPushDnsBucket); + registry->Register(fast_push_dns_bucket_.GetTypeInfo()); + registry->Register(SlowPushServerBucket); registry->Register(FastPushServerBucket); registry->Register(fast_push_server_bucket_.GetTypeInfo()); @@ -2744,8 +2785,6 @@ void BindingData::RegisterExternalReferences( registry->Register(fast_push_span_data_uint64_.GetTypeInfo()); registry->Register(AgentId); - registry->Register(PushClientBucket); - registry->Register(PushDnsBucket); registry->Register(PushSpanDataString); registry->Register(GetEnvMetrics); registry->Register(GetProcessMetrics); diff --git a/src/nsolid/nsolid_bindings.h b/src/nsolid/nsolid_bindings.h index ee70a3b1bb..99cb44e60b 100644 --- a/src/nsolid/nsolid_bindings.h +++ b/src/nsolid/nsolid_bindings.h @@ -20,6 +20,16 @@ class BindingData : public SnapshotableObject { SET_SELF_SIZE(BindingData) SET_MEMORY_INFO_NAME(BindingData) + static void SlowPushClientBucket( + const v8::FunctionCallbackInfo& args); + static void FastPushClientBucket(v8::Local receiver, double val); + static void PushClientBucketImpl(BindingData* data, double val); + + static void SlowPushDnsBucket( + const v8::FunctionCallbackInfo& args); + static void FastPushDnsBucket(v8::Local receiver, double val); + static void PushDnsBucketImpl(BindingData* data, double val); + static void SlowPushServerBucket( const v8::FunctionCallbackInfo& args); static void FastPushServerBucket(v8::Local receiver, double val); @@ -55,6 +65,8 @@ class BindingData : public SnapshotableObject { ExternalReferenceRegistry* registry); private: + static v8::CFunction fast_push_client_bucket_; + static v8::CFunction fast_push_dns_bucket_; static v8::CFunction fast_push_server_bucket_; static v8::CFunction fast_push_span_data_double_; static v8::CFunction fast_push_span_data_uint64_;