精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

通過 Inspector 收集 Node.js 的Trace Event 數(shù)據(jù)

開發(fā) 前端
除了通過 trace_events 模塊之外,Node.js 也實現(xiàn)了通過 Inspector 協(xié)議收集 trace event 數(shù)據(jù),本文介紹基于 inspector 協(xié)議收集 trace event 數(shù)據(jù)的實現(xiàn)。

前言

Node.js 提供了 trace event 的機制,在 Node.js 內(nèi)核代碼里,靜態(tài)地埋了一些點,比如同步文件 IO 耗時,DNS 解析耗時等。每次執(zhí)行這些代碼時,Node.js 就會執(zhí)行這些點的鉤子,從而收集相應(yīng)的數(shù)據(jù)。不過這個能力默認是關(guān)閉的,畢竟對性能會產(chǎn)生影響。我們可以通過 trace_events 模塊打開這個功能。trace_events 模塊會源源不斷地把數(shù)據(jù)寫到一個到多個文件中。除了通過 trace_events 模塊之外,Node.js 也實現(xiàn)了通過 Inspector 協(xié)議收集 trace event 數(shù)據(jù),本文介紹基于 inspector 協(xié)議收集 trace event 數(shù)據(jù)的實現(xiàn)。

首先看一下如何使用這種方式。

const { Session } = require('inspector');
const session = new Session();
session.connect();
function post(message, data) {
return new Promise((resolve, reject) => {
session.post(message, data, (err, result) => {
if (err)
reject(new Error(JSON.stringify(err)));
else
resolve(result);
});
});
}
async function test() {
session.on('NodeTracing.dataCollected', (data) => {
console.log(data.params.value);
});
session.on('NodeTracing.tracingComplete', () => {
console.log('done');
});
const { categories } = await post('NodeTracing.getCategories');
const traceConfig = { includedCategories: categories };
await post('NodeTracing.start', { traceConfig });
setTimeout(() => {
post('NodeTracing.stop');
}, 1000);
}
test();

使用方式比較固定,也比較簡單,trace event 是基于類型的,比如同步文件 IO,DNS 解析。所以第一步首先設(shè)置需要收集的模塊類型,也可以通過 NodeTracing.getCategories 命令獲取當(dāng)前支持的模塊類型。接著通過 NodeTracing.start 開啟數(shù)據(jù)收集,收集一段時間后,通過 NodeTracing.stop 停止數(shù)據(jù)的收集,在這個過程中,收集的數(shù)據(jù)會通過 NodeTracing.dataCollected 事件源源不斷地流向用戶側(cè),我們可以保存這些數(shù)據(jù)后續(xù)進行分析,收集完畢后會觸發(fā) NodeTracing.tracingComplete 事件,從而完成整個過程。下面我們來看一下這些命令的實現(xiàn)。首先看一下整體的架構(gòu)。

之前介紹過 Node.js Inspector 的架構(gòu),本文就不再具體展開介紹。簡單來說,當(dāng)我們通過 js 層的 session 發(fā)送命令時,代碼流程從圖的左邊到右邊,收集到數(shù)據(jù)時,代碼流程從右往左回調(diào) js 層。首先來看一下 NodeTracing.start。Node.js 的 Inspector 框架采用兩級路由的機制,首先通過 NodeTracing 找到一級路由,在 inspetor 里叫 Domain,然后再通過 start 找到二級路由。 來看一下每個路由對應(yīng)的函數(shù)。

m_dispatchMap["NodeTracing.getCategories"] = &DispatcherImpl::getCategories;
m_dispatchMap["NodeTracing.start"] = &DispatcherImpl::start;
m_dispatchMap["NodeTracing.stop"] = &DispatcherImpl::stop;

我們只關(guān)注 start 和 stop 的邏輯。

void DispatcherImpl::start(int callId, const String& method, const ProtocolMessage& message, std::unique_ptr<DictionaryValue> requestMessageObject, ErrorSupport* errors){
protocol::DictionaryValue* object = DictionaryValue::cast(requestMessageObject->get("params"));
protocol::Value* traceConfigValue = object ? object->get("traceConfig") : nullptr;
std::unique_ptr<protocol::NodeTracing::TraceConfig> in_traceConfig = ValueConversions<protocol::NodeTracing::TraceConfig>::fromValue(traceConfigValue, errors);
std::unique_ptr<DispatcherBase::WeakPtr> weak = weakPtr();
DispatchResponse response = m_backend->start(std::move(in_traceConfig));
if (weak->get())
weak->get()->sendResponse(callId, response);
return;
}

start 里調(diào)用了 m_backend->start,根據(jù)架構(gòu)圖可知道 m_backend 的值是 TracingAgent 對象。

DispatchResponse TracingAgent::start(std::unique_ptr<protocol::NodeTracing::TraceConfig> traceConfig) {
std::set<std::string> categories_set;
protocol::Array<std::string>* categories = traceConfig->getIncludedCategories();
for (size_t i = 0; i < categories->length(); i++)
categories_set.insert(categories->get(i));
tracing::AgentWriterHandle* writer = GetTracingAgentWriter();
if (writer != nullptr) {
trace_writer_ =
writer->agent()->AddClient(categories_set,
std::make_unique<InspectorTraceWriter>(
frontend_object_id_, main_thread_),
tracing::Agent::kIgnoreDefaultCategories);
}
return DispatchResponse::OK();
}

最終通過 AddClient 往 tracing 系統(tǒng)注冊了一個消費者。當(dāng)tracing 系統(tǒng)產(chǎn)生數(shù)據(jù)時,就會通過 InspectorTraceWriter 進行消費,看一下這個 InspectorTraceWriter 對象的核心邏輯。

 void AppendTraceEvent(
v8::platform::tracing::TraceObject* trace_event) override {
if (!json_writer_)
json_writer_.reset(TraceWriter::CreateJSONTraceWriter(stream_, "value"));
json_writer_->AppendTraceEvent(trace_event);
}
void Flush(bool) override {
if (!json_writer_)
return;
json_writer_.reset();
std::ostringstream result(
"{\"method\":\"NodeTracing.dataCollected\",\"params\":",
std::ostringstream::ate);
result << stream_.str();
result << "}";
main_thread_->Post(std::make_unique<SendMessageRequest>(frontend_object_id_, result.str()));
stream_.str("");
}

tracing 系統(tǒng)調(diào)用 AppendTraceEvent 進行數(shù)據(jù)的消費,不過這些數(shù)據(jù)會先緩存到內(nèi)存,然后再調(diào)用 Flush 通知真正的消費者,在 Flush 函數(shù)里我們可以看到,通過發(fā)送一個 SendMessageRequest 觸發(fā)了 NodeTracing.dataCollected 事件。接著看一下 SendMessageRequest 的邏輯。

void Call(MainThreadInterface* thread) override {
DeletableFrontendWrapper* frontend_wrapper = static_cast<DeletableFrontendWrapper*>(thread->GetObjectIfExists(object_id_));
if (frontend_wrapper == nullptr) return;
auto frontend = frontend_wrapper->get();
if (frontend != nullptr) {
frontend->sendRawJSONNotification(message_);
}
}
void Frontend::sendRawJSONNotification(String notification){
m_frontendChannel->sendProtocolNotification(InternalRawNotification::fromJSON(std::move(notification)));
}

Call 又調(diào)用了 m_frontendChannel->sendRawJSONNotification,根據(jù)架構(gòu)圖,m_frontendChannel 的值是 ChannelImpl。最后通過 ChannelImpl 通知用戶側(cè)。接著看 stop 的邏輯。

DispatchResponse TracingAgent::stop() {
trace_writer_.reset();
frontend_->tracingComplete();
return DispatchResponse::OK();
}

首先看一下 trace_writer_.reset()。

void AgentWriterHandle::reset() {
if (agent_ != nullptr)
agent_->Disconnect(id_);
agent_ = nullptr;}void Agent::Disconnect(int client) {
if (client == kDefaultHandleId) return;
{
Mutex::ScopedLock lock(initialize_writer_mutex_);
to_be_initialized_.erase(writers_[client].get());
}
ScopedSuspendTracing suspend(tracing_controller_.get(), this);
writers_.erase(client);
categories_.erase(client);

}

接著看 ScopedSuspendTracing。

ScopedSuspendTracing(TracingController* controller, Agent* agent,
bool do_suspend = true)
: controller_(controller), agent_(do_suspend ? agent : nullptr) {
if (do_suspend) {
CHECK(agent_->started_);
controller->StopTracing();
}
}
void TracingController::StopTracing() {
base::MutexGuard lock(mutex_.get());
trace_buffer_->Flush();
}

把所有數(shù)據(jù) Flush 到用戶側(cè)后觸發(fā) tracingComplete 事件。

void Frontend::tracingComplete(){
if (!m_frontendChannel)
return;
m_frontendChannel->sendProtocolNotification(InternalResponse::createNotification("NodeTracing.tracingComplete"));
}

時間關(guān)系,大概介紹到這。

責(zé)任編輯:姜華 來源: 編程雜技
相關(guān)推薦

2021-08-05 05:46:06

Node.jsInspector工具

2022-03-26 16:51:27

Node.jstrace架構(gòu)

2022-08-29 18:15:25

Node.js多線程模型

2021-08-07 07:56:59

Node邏輯對象

2022-04-01 08:02:32

Node.js快照加速hooks

2022-04-02 06:04:03

Node.js代碼緩存V8

2013-11-01 09:34:56

Node.js技術(shù)

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2021-12-25 22:29:57

Node.js 微任務(wù)處理事件循環(huán)

2020-05-29 15:33:28

Node.js框架JavaScript

2012-02-03 09:25:39

Node.js

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js

2011-09-02 14:47:48

Node

2011-09-09 14:23:13

Node.js

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2017-04-24 08:31:26

Node.jsExpress.jsHTTP

2025-07-21 01:00:00

UDP性能QPS

2021-09-26 05:06:04

Node.js模塊機制
點贊
收藏

51CTO技術(shù)棧公眾號

特种兵之深入敌后| 免费看啪啪网站| 波多野结衣高清在线| 日韩欧美午夜| 精品久久久久久久久久久久久久久 | 极品国产人妖chinesets亚洲人妖| 狠狠色狠狠色综合日日五| 日本精品一区二区| 精品美女www爽爽爽视频| 亚洲欧美日韩国产综合精品二区| 中文字幕国产精品久久| 99免费观看视频| 在线看欧美视频| 亚洲伊人色欲综合网| 日韩精品第一页| 欧美 日韩 综合| 麻豆成人av在线| 久久久午夜视频| 99久久久无码国产精品不卡| 欧美日韩破处| 日韩限制级电影在线观看| 精品www久久久久奶水| 色帝国亚洲欧美在线| 久久精品一级爱片| 九九九九九九精品| 国产av无码专区亚洲av| 日韩和欧美的一区| 97国产在线观看| 日韩成人毛片视频| 日韩精品一区二区三区免费观影| 亚洲国产天堂久久综合| 古装做爰无遮挡三级聊斋艳谭| 欧美性理论片在线观看片免费| 亚洲成人动漫在线观看| 干日本少妇视频| 1024免费在线视频| 久久久久久免费网| 狠狠色噜噜狠狠色综合久| 国产女人18毛片水真多| 青青草国产成人av片免费| 欧美一区二区大胆人体摄影专业网站| 欧美日韩大片在线观看| 亚洲精品网址| 久久精品国产综合| 三级影片在线观看| 色小子综合网| 色妞色视频一区二区三区四区| 国产女主播喷水高潮网红在线| 国产精品毛片视频| 精品成人一区二区三区| 年下总裁被打光屁股sp| 亚洲精品福利| 欧美一区二区三区婷婷月色 | 日韩av女优在线观看| 国产精品vip| 久久久在线免费观看| 久久精品国产亚洲av高清色欲| 91成人免费| 美日韩精品视频免费看| 欧美成人aaa片一区国产精品| 久久久久久久久久久妇女| 久久久99久久精品女同性| 99热在线观看精品| 自拍日韩欧美| 久久久久久久久电影| 黄色激情视频在线观看| 日韩午夜在线电影| 日韩av片电影专区| 中文字幕免费在线看| 久久精品国产在热久久| 亚洲在线视频福利| 风流老熟女一区二区三区| www.欧美亚洲| 日韩国产高清一区| 国产一区久久精品| 一区二区国产视频| 丰满爆乳一区二区三区| 成人日韩在线| 欧美日韩1区2区| 深夜视频在线观看| 日韩av网址大全| 一区二区三区高清国产| 国产成人综合在线视频| 亚洲精品美女| 国产精品久久久久免费a∨| 国产裸体无遮挡| 成人性生交大合| 欧美另类高清视频在线| 免费a级在线播放| 一区二区三区在线免费视频| 日韩在线综合网| 欧美极品在线| 亚洲成人黄色在线观看| 少妇人妻好深好紧精品无码| 亚洲一本二本| 奇米四色中文综合久久| 91麻豆国产视频| 91麻豆.com| 中国黄色录像片| 欧美91看片特黄aaaa| 91精品国产乱码| 中文字幕国产专区| 牛牛国产精品| 国产精品偷伦视频免费观看国产 | 九七电影院97理论片久久tvb| 欧美大胆人体bbbb| 在线视频第一页| 精品91在线| 成人福利在线视频| 免费国产在线观看| 一区二区国产视频| 中日韩av在线播放| 亚洲综合图色| 久久久久久欧美| 国产精品特级毛片一区二区三区| caoporn国产精品| 超级碰在线观看| 国产成人毛片| 亚洲欧美激情在线视频| 久久久久人妻一区精品色欧美| 美腿丝袜在线亚洲一区| 久久亚洲精品欧美| heyzo高清在线| 91精品国产乱| 成人在线观看小视频| 免费看黄色91| 日韩福利视频| 伊人久久精品一区二区三区| 精品国产青草久久久久福利| 亚洲综合久久av一区二区三区| 玖玖国产精品视频| 蜜桃传媒视频麻豆一区 | 99国产**精品****| 国产精品免费视频xxxx| 九九在线视频| 欧美性猛交xxxx乱大交3| 国产又粗又长又爽| 亚洲精品乱码| 久久影院理伦片| 麻豆理论在线观看| 日韩电影大全免费观看2023年上| 精品视频久久久久| 国产不卡视频在线观看| 亚洲啊啊啊啊啊| 日韩08精品| 欧美国产日产韩国视频| www日本高清| 洋洋av久久久久久久一区| 日韩欧美中文在线视频| 亚洲美女视频| 超碰97国产在线| 黄色污污视频在线观看| 精品国产乱码久久久久久浪潮| 欧美成人免费观看视频| 粉嫩av亚洲一区二区图片| 欧美一级视频在线播放| 国产精品zjzjzj在线观看| 韩日欧美一区二区| 视频三区在线观看| 在线视频综合导航| 特级西西人体高清大胆| 久久成人免费网站| 国产一二三四区在线观看| 亚洲无线观看| **欧美日韩vr在线| 国产香蕉在线| 欧美精品少妇一区二区三区| 在线观看亚洲网站| 高清不卡一区二区| 久久久久久久久久久视频| 奇米狠狠一区二区三区| 成人h视频在线观看播放| av软件在线观看| 日韩成人在线视频观看| 国产黄色免费视频| 亚洲蜜桃精久久久久久久| wwwxx日本| 久久先锋资源| 潘金莲一级淫片aaaaaa播放1| 成人爽a毛片| 日本中文字幕久久看| 色影视在线观看| 精品av久久707| 波多野结衣午夜| 亚洲综合视频网| 91视频免费观看网站| 狠狠色伊人亚洲综合成人| 欧美精品自拍视频| 色999日韩| 精品国产一区二区三区麻豆免费观看完整版| 另类专区亚洲| 欧美精品手机在线| 黄色网址在线播放| 91精品国产综合久久久蜜臀图片| 成年人午夜视频| 最新国产の精品合集bt伙计| 熟妇人妻久久中文字幕| 美女视频免费一区| 鲁一鲁一鲁一鲁一澡| 国产精品国产一区| 欧美日韩系列| 国产第一页视频| 国产精品一二三四五区| 亚洲一区二区三区在线看| 欧美18—19性高清hd4k| 风间由美一区二区三区在线观看| 哪个网站能看毛片| 欧美99在线视频观看| 日韩少妇中文字幕| 奇米777国产一区国产二区| 成人天堂噜噜噜| 偷拍视频一区二区三区| 国内精品久久久久久| 永久免费av片在线观看全网站| 亚洲电影天堂av| 99国产在线播放| 精品视频免费在线| 欧美 日韩 精品| 亚洲国产精品自拍| 91在线播放观看| 国产精品视频一二三| 爱爱的免费视频| 精品一区二区成人精品| 国产成人久久婷婷精品流白浆| 激情欧美一区二区三区| 桥本有菜av在线| 日韩欧美自拍| 亚洲人体一区| 国内精品久久久久久久久电影网 | 免费看国产黄色片| 亚洲综合电影一区二区三区| 东北少妇不带套对白| 欧美成人久久| 超碰在线免费观看97| 久久久久久久久国产一区| 亚洲视频欧美在线| 日韩精品久久| 亚洲欧美影院| 97视频热人人精品免费| 婷婷久久青草热一区二区| 欧美人妖在线| 欧美在线一区二区三区四区| 中文有码一区| 欧美日韩在线高清| 97视频资源在线观看| 精品国产亚洲日本| 亚洲最大av网| 97久久亚洲| 精品国产乱码一区二区三区四区| 欧美精品中文| 久久免费视频1| 免费久久精品| 午夜精品一区二区三区在线观看| 精品国产美女| 一区一区视频| 欧美va天堂在线| 欧洲精品在线播放| 国产精品久久久久毛片大屁完整版| 日本国产在线播放| 久久久蜜桃一区二区人| 日韩av手机版| 国产九色精品成人porny| 亚洲成人福利视频| 成人免费黄色在线| 国产精品无码一区二区三区免费| 久久综合久久综合久久| 能直接看的av| 亚洲精品国久久99热| 欧美成人aaaaⅴ片在线看| 福利视频第一区| 国产精品国产精品国产| 3751色影院一区二区三区| 亚洲第一视频在线| 日韩精品有码在线观看| 成人高清免费在线播放| 久久亚洲私人国产精品va| 黄色污污视频在线观看| 欧美做受高潮1| 亚洲电影二区| 激情久久av| 欧美韩国日本在线观看| 日韩一区二区高清视频| 美女诱惑黄网站一区| 五月天丁香花婷婷| 99久久精品国产毛片| 99久久99久久精品免费| 亚洲一区二区三区不卡国产欧美 | av电影院在线看| 国产精品劲爆视频| 亚洲成av人片在线观看www| 精品伊人久久大线蕉色首页| 色综合色综合| 欧美亚洲一二三区| 国内精品写真在线观看| 国产精品久久久免费观看| 国产精品成人免费在线| 亚洲日本韩国在线| 欧美精品免费视频| 日韩大胆视频| 久久6免费高清热精品| 日韩欧美一区二区三区免费观看| 91中文字精品一区二区| 精品一区二区三| 男人日女人视频网站| 国产一区二区在线观看视频| 免费观看av网站| 亚洲一区二区三区三| 中文字幕一区二区久久人妻| 亚洲国产日韩欧美在线99| av在线导航| 国产精品视频公开费视频| 精品成人自拍视频| 国产日韩欧美大片| 日本欧美大码aⅴ在线播放| 亚洲天堂美女视频| 亚洲精品国产精品乱码不99| 中文字幕视频在线播放| 日韩精品视频在线观看免费| 污视频在线看网站| 91午夜在线播放| 欧美日韩国产高清电影| 国产成人a亚洲精v品无码| 粉嫩13p一区二区三区| 麻豆明星ai换脸视频| 欧美三级电影一区| 国产在线你懂得| 98精品在线视频| 精品三级av在线导航| 99久热在线精品视频| 黄色日韩网站视频| 国产精品精品软件男同| 欧美天天综合网| 粉嫩av在线播放| 国产精品成熟老女人| 免费一区二区| 欧美 日韩精品| 久久无码av三级| 日本特级黄色片| 亚洲奶大毛多的老太婆| 老司机成人影院| 热re99久久精品国99热蜜月| 亚洲永久网站| 精品少妇人妻一区二区黑料社区 | 日本欧美黄色片| 成人天堂资源www在线| 国产亚洲小视频| 日韩成人xxxx| 中文在线а√在线8| 欧美重口乱码一区二区| 久久久久久黄| 欧美成人久久久免费播放| 欧美唯美清纯偷拍| 国产在线高清视频| 97在线中文字幕| 国语对白精品一区二区| 久久久无码人妻精品无码| 亚洲一区二区三区四区的| 蜜臀av中文字幕| 欧美一级电影免费在线观看| 国产一区二区三区四区五区传媒 | 国产电影一区二区三区| 青草草在线视频| 亚洲精品久久久久久久久久久久久 | 无码国产精品一区二区免费16| 91国内免费在线视频| 亚洲自拍电影| 91亚洲免费视频| 一区二区不卡在线播放| 国产又爽又黄网站亚洲视频123| 欧美中文字幕精品| 欧美国产小视频| 少妇熟女视频一区二区三区| 婷婷开心久久网| av在线资源站| 91九色在线观看| 中日韩男男gay无套| 日本乱子伦xxxx| 日韩一区二区电影在线| 国产精品69xx| 色综合666| 国产成人午夜高潮毛片| 91精品国产综合久久久蜜臀九色| 伊人一区二区三区久久精品 | 欧美视频小说| 极品少妇xxxx精品少妇偷拍| 日韩欧美三级在线观看| 神马久久久久久| 啪啪激情综合网| 久久精品国产露脸对白| 精品动漫一区二区三区| 日本中文字幕在线看| 国产精品区一区| 另类小说欧美激情| 日韩手机在线观看| 俺去了亚洲欧美日韩| 亚州国产精品| 又黄又爽又色的视频| 91黄视频在线观看| 国产三级伦理在线| 影音欧美亚洲|