mirror of
https://github.com/nodejs/node.git
synced 2025-08-15 13:48:44 +02:00
report: expose report public native apis
Allows APM vendors to generate a diagnostic report without calling into JavaScript. Like, from their own message channels interrupting the isolate and generating a report on demand. PR-URL: https://github.com/nodejs/node/pull/44255 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
This commit is contained in:
parent
d9b2d2c0dd
commit
cb15fc56d8
10 changed files with 404 additions and 140 deletions
53
test/addons/report-api/binding.cc
Normal file
53
test/addons/report-api/binding.cc
Normal file
|
@ -0,0 +1,53 @@
|
|||
#include <node.h>
|
||||
#include <v8.h>
|
||||
|
||||
using v8::FunctionCallbackInfo;
|
||||
using v8::Isolate;
|
||||
using v8::Local;
|
||||
using v8::Object;
|
||||
using v8::Value;
|
||||
|
||||
void TriggerReport(const FunctionCallbackInfo<Value>& args) {
|
||||
Isolate* isolate = args.GetIsolate();
|
||||
|
||||
node::TriggerNodeReport(
|
||||
isolate, "FooMessage", "BarTrigger", std::string(), Local<Value>());
|
||||
}
|
||||
|
||||
void TriggerReportNoIsolate(const FunctionCallbackInfo<Value>& args) {
|
||||
node::TriggerNodeReport(static_cast<Isolate*>(nullptr),
|
||||
"FooMessage",
|
||||
"BarTrigger",
|
||||
std::string(),
|
||||
Local<Value>());
|
||||
}
|
||||
|
||||
void TriggerReportEnv(const FunctionCallbackInfo<Value>& args) {
|
||||
Isolate* isolate = args.GetIsolate();
|
||||
|
||||
node::TriggerNodeReport(
|
||||
node::GetCurrentEnvironment(isolate->GetCurrentContext()),
|
||||
"FooMessage",
|
||||
"BarTrigger",
|
||||
std::string(),
|
||||
Local<Value>());
|
||||
}
|
||||
|
||||
void TriggerReportNoEnv(const FunctionCallbackInfo<Value>& args) {
|
||||
Isolate* isolate = args.GetIsolate();
|
||||
|
||||
node::TriggerNodeReport(static_cast<node::Environment*>(nullptr),
|
||||
"FooMessage",
|
||||
"BarTrigger",
|
||||
std::string(),
|
||||
Local<Value>());
|
||||
}
|
||||
|
||||
void init(Local<Object> exports) {
|
||||
NODE_SET_METHOD(exports, "triggerReport", TriggerReport);
|
||||
NODE_SET_METHOD(exports, "triggerReportNoIsolate", TriggerReportNoIsolate);
|
||||
NODE_SET_METHOD(exports, "triggerReportEnv", TriggerReportEnv);
|
||||
NODE_SET_METHOD(exports, "triggerReportNoEnv", TriggerReportNoEnv);
|
||||
}
|
||||
|
||||
NODE_MODULE(NODE_GYP_MODULE_NAME, init)
|
9
test/addons/report-api/binding.gyp
Normal file
9
test/addons/report-api/binding.gyp
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
'targets': [
|
||||
{
|
||||
'target_name': 'binding',
|
||||
'sources': [ 'binding.cc' ],
|
||||
'includes': ['../common.gypi'],
|
||||
}
|
||||
]
|
||||
}
|
44
test/addons/report-api/test.js
Normal file
44
test/addons/report-api/test.js
Normal file
|
@ -0,0 +1,44 @@
|
|||
'use strict';
|
||||
|
||||
const common = require('../../common');
|
||||
const assert = require('assert');
|
||||
const path = require('path');
|
||||
const helper = require('../../common/report.js');
|
||||
const tmpdir = require('../../common/tmpdir');
|
||||
|
||||
const binding = path.resolve(__dirname, `./build/${common.buildType}/binding`);
|
||||
const addon = require(binding);
|
||||
|
||||
function myAddonMain(method, hasJavaScriptFrames) {
|
||||
tmpdir.refresh();
|
||||
process.report.directory = tmpdir.path;
|
||||
|
||||
addon[method]();
|
||||
|
||||
const reports = helper.findReports(process.pid, tmpdir.path);
|
||||
assert.strictEqual(reports.length, 1);
|
||||
|
||||
const report = reports[0];
|
||||
helper.validate(report);
|
||||
|
||||
const content = require(report);
|
||||
assert.strictEqual(content.header.event, 'FooMessage');
|
||||
assert.strictEqual(content.header.trigger, 'BarTrigger');
|
||||
|
||||
// Check that the javascript stack is present.
|
||||
if (hasJavaScriptFrames) {
|
||||
assert.strictEqual(content.javascriptStack.stack.findIndex((frame) => frame.match('myAddonMain')), 0);
|
||||
} else {
|
||||
assert.strictEqual(content.javascriptStack, undefined);
|
||||
}
|
||||
}
|
||||
|
||||
const methods = [
|
||||
['triggerReport', true],
|
||||
['triggerReportNoIsolate', false],
|
||||
['triggerReportEnv', true],
|
||||
['triggerReportNoEnv', false],
|
||||
];
|
||||
for (const [method, hasJavaScriptFrames] of methods) {
|
||||
myAddonMain(method, hasJavaScriptFrames);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue