mirror of
https://github.com/denoland/deno.git
synced 2024-11-22 15:06:54 -05:00
feat: update metrics to track different op types (#4221)
This commit is contained in:
parent
cfe4369ded
commit
ff5bba3be8
6 changed files with 136 additions and 40 deletions
30
cli/js/lib.deno.ns.d.ts
vendored
30
cli/js/lib.deno.ns.d.ts
vendored
|
@ -1669,7 +1669,13 @@ declare namespace Deno {
|
||||||
/** **UNSTABLE**: not sure if broken or not */
|
/** **UNSTABLE**: not sure if broken or not */
|
||||||
export interface Metrics {
|
export interface Metrics {
|
||||||
opsDispatched: number;
|
opsDispatched: number;
|
||||||
|
opsDispatchedSync: number;
|
||||||
|
opsDispatchedAsync: number;
|
||||||
|
opsDispatchedAsyncUnref: number;
|
||||||
opsCompleted: number;
|
opsCompleted: number;
|
||||||
|
opsCompletedSync: number;
|
||||||
|
opsCompletedAsync: number;
|
||||||
|
opsCompletedAsyncUnref: number;
|
||||||
bytesSentControl: number;
|
bytesSentControl: number;
|
||||||
bytesSentData: number;
|
bytesSentData: number;
|
||||||
bytesReceived: number;
|
bytesReceived: number;
|
||||||
|
@ -1680,15 +1686,21 @@ declare namespace Deno {
|
||||||
* Receive metrics from the privileged side of Deno.
|
* Receive metrics from the privileged side of Deno.
|
||||||
*
|
*
|
||||||
* > console.table(Deno.metrics())
|
* > console.table(Deno.metrics())
|
||||||
* ┌──────────────────┬────────┐
|
* ┌─────────────────────────┬────────┐
|
||||||
* │ (index) │ Values │
|
* │ (index) │ Values │
|
||||||
* ├──────────────────┼────────┤
|
* ├─────────────────────────┼────────┤
|
||||||
* │ opsDispatched │ 9 │
|
* │ opsDispatched │ 3 │
|
||||||
* │ opsCompleted │ 9 │
|
* │ opsDispatchedSync │ 2 │
|
||||||
* │ bytesSentControl │ 504 │
|
* │ opsDispatchedAsync │ 1 │
|
||||||
* │ bytesSentData │ 0 │
|
* │ opsDispatchedAsyncUnref │ 0 │
|
||||||
* │ bytesReceived │ 856 │
|
* │ opsCompleted │ 3 │
|
||||||
* └──────────────────┴────────┘
|
* │ opsCompletedSync │ 2 │
|
||||||
|
* │ opsCompletedAsync │ 1 │
|
||||||
|
* │ opsCompletedAsyncUnref │ 0 │
|
||||||
|
* │ bytesSentControl │ 73 │
|
||||||
|
* │ bytesSentData │ 0 │
|
||||||
|
* │ bytesReceived │ 375 │
|
||||||
|
* └─────────────────────────┴────────┘
|
||||||
*/
|
*/
|
||||||
export function metrics(): Metrics;
|
export function metrics(): Metrics;
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,13 @@ import { sendSync } from "./dispatch_json.ts";
|
||||||
|
|
||||||
export interface Metrics {
|
export interface Metrics {
|
||||||
opsDispatched: number;
|
opsDispatched: number;
|
||||||
|
opsDispatchedSync: number;
|
||||||
|
opsDispatchedAsync: number;
|
||||||
|
opsDispatchedAsyncUnref: number;
|
||||||
opsCompleted: number;
|
opsCompleted: number;
|
||||||
|
opsCompletedSync: number;
|
||||||
|
opsCompletedAsync: number;
|
||||||
|
opsCompletedAsyncUnref: number;
|
||||||
bytesSentControl: number;
|
bytesSentControl: number;
|
||||||
bytesSentData: number;
|
bytesSentData: number;
|
||||||
bytesReceived: number;
|
bytesReceived: number;
|
||||||
|
@ -12,15 +18,21 @@ export interface Metrics {
|
||||||
/** Receive metrics from the privileged side of Deno.
|
/** Receive metrics from the privileged side of Deno.
|
||||||
*
|
*
|
||||||
* > console.table(Deno.metrics())
|
* > console.table(Deno.metrics())
|
||||||
* ┌──────────────────┬────────┐
|
* ┌─────────────────────────┬────────┐
|
||||||
* │ (index) │ Values │
|
* │ (index) │ Values │
|
||||||
* ├──────────────────┼────────┤
|
* ├─────────────────────────┼────────┤
|
||||||
* │ opsDispatched │ 9 │
|
* │ opsDispatched │ 3 │
|
||||||
* │ opsCompleted │ 9 │
|
* │ opsDispatchedSync │ 2 │
|
||||||
* │ bytesSentControl │ 504 │
|
* │ opsDispatchedAsync │ 1 │
|
||||||
* │ bytesSentData │ 0 │
|
* │ opsDispatchedAsyncUnref │ 0 │
|
||||||
* │ bytesReceived │ 856 │
|
* │ opsCompleted │ 3 │
|
||||||
* └──────────────────┴────────┘
|
* │ opsCompletedSync │ 2 │
|
||||||
|
* │ opsCompletedAsync │ 1 │
|
||||||
|
* │ opsCompletedAsyncUnref │ 0 │
|
||||||
|
* │ bytesSentControl │ 73 │
|
||||||
|
* │ bytesSentData │ 0 │
|
||||||
|
* │ bytesReceived │ 375 │
|
||||||
|
* └─────────────────────────┴────────┘
|
||||||
*/
|
*/
|
||||||
export function metrics(): Metrics {
|
export function metrics(): Metrics {
|
||||||
return sendSync("op_metrics");
|
return sendSync("op_metrics");
|
||||||
|
|
|
@ -4,7 +4,9 @@ import { test, testPerm, assert } from "./test_util.ts";
|
||||||
test(async function metrics(): Promise<void> {
|
test(async function metrics(): Promise<void> {
|
||||||
const m1 = Deno.metrics();
|
const m1 = Deno.metrics();
|
||||||
assert(m1.opsDispatched > 0);
|
assert(m1.opsDispatched > 0);
|
||||||
|
assert(m1.opsDispatchedSync > 0);
|
||||||
assert(m1.opsCompleted > 0);
|
assert(m1.opsCompleted > 0);
|
||||||
|
assert(m1.opsCompletedSync > 0);
|
||||||
assert(m1.bytesSentControl > 0);
|
assert(m1.bytesSentControl > 0);
|
||||||
assert(m1.bytesSentData >= 0);
|
assert(m1.bytesSentData >= 0);
|
||||||
assert(m1.bytesReceived > 0);
|
assert(m1.bytesReceived > 0);
|
||||||
|
@ -16,7 +18,11 @@ test(async function metrics(): Promise<void> {
|
||||||
|
|
||||||
const m2 = Deno.metrics();
|
const m2 = Deno.metrics();
|
||||||
assert(m2.opsDispatched > m1.opsDispatched);
|
assert(m2.opsDispatched > m1.opsDispatched);
|
||||||
|
assert(m2.opsDispatchedSync > m1.opsDispatchedSync);
|
||||||
|
assert(m2.opsDispatchedAsync > m1.opsDispatchedAsync);
|
||||||
assert(m2.opsCompleted > m1.opsCompleted);
|
assert(m2.opsCompleted > m1.opsCompleted);
|
||||||
|
assert(m2.opsCompletedSync > m1.opsCompletedSync);
|
||||||
|
assert(m2.opsCompletedAsync > m1.opsCompletedAsync);
|
||||||
assert(m2.bytesSentControl > m1.bytesSentControl);
|
assert(m2.bytesSentControl > m1.bytesSentControl);
|
||||||
assert(m2.bytesSentData >= m1.bytesSentData + dataMsg.byteLength);
|
assert(m2.bytesSentData >= m1.bytesSentData + dataMsg.byteLength);
|
||||||
assert(m2.bytesReceived > m1.bytesReceived);
|
assert(m2.bytesReceived > m1.bytesReceived);
|
||||||
|
@ -30,6 +36,7 @@ testPerm({ write: true }, function metricsUpdatedIfNoResponseSync(): void {
|
||||||
|
|
||||||
const metrics = Deno.metrics();
|
const metrics = Deno.metrics();
|
||||||
assert(metrics.opsDispatched === metrics.opsCompleted);
|
assert(metrics.opsDispatched === metrics.opsCompleted);
|
||||||
|
assert(metrics.opsDispatchedSync === metrics.opsCompletedSync);
|
||||||
});
|
});
|
||||||
|
|
||||||
testPerm(
|
testPerm(
|
||||||
|
@ -42,5 +49,7 @@ testPerm(
|
||||||
|
|
||||||
const metrics = Deno.metrics();
|
const metrics = Deno.metrics();
|
||||||
assert(metrics.opsDispatched === metrics.opsCompleted);
|
assert(metrics.opsDispatched === metrics.opsCompleted);
|
||||||
|
assert(metrics.opsDispatchedSync === metrics.opsCompletedSync);
|
||||||
|
assert(metrics.opsDispatchedAsync === metrics.opsCompletedAsync);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,10 +1,69 @@
|
||||||
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
|
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
|
||||||
#[derive(Default)]
|
#[derive(Default, Debug)]
|
||||||
pub struct Metrics {
|
pub struct Metrics {
|
||||||
pub ops_dispatched: u64,
|
pub ops_dispatched: u64,
|
||||||
|
pub ops_dispatched_sync: u64,
|
||||||
|
pub ops_dispatched_async: u64,
|
||||||
|
pub ops_dispatched_async_unref: u64,
|
||||||
pub ops_completed: u64,
|
pub ops_completed: u64,
|
||||||
|
pub ops_completed_sync: u64,
|
||||||
|
pub ops_completed_async: u64,
|
||||||
|
pub ops_completed_async_unref: u64,
|
||||||
pub bytes_sent_control: u64,
|
pub bytes_sent_control: u64,
|
||||||
pub bytes_sent_data: u64,
|
pub bytes_sent_data: u64,
|
||||||
pub bytes_received: u64,
|
pub bytes_received: u64,
|
||||||
pub resolve_count: u64,
|
pub resolve_count: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Metrics {
|
||||||
|
fn op_dispatched(&mut self, bytes_sent_control: u64, bytes_sent_data: u64) {
|
||||||
|
self.ops_dispatched += 1;
|
||||||
|
self.bytes_sent_control += bytes_sent_control;
|
||||||
|
self.bytes_sent_data += bytes_sent_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn op_completed(&mut self, bytes_received: u64) {
|
||||||
|
self.ops_completed += 1;
|
||||||
|
self.bytes_received += bytes_received;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn op_sync(
|
||||||
|
&mut self,
|
||||||
|
bytes_sent_control: u64,
|
||||||
|
bytes_sent_data: u64,
|
||||||
|
bytes_received: u64,
|
||||||
|
) {
|
||||||
|
self.ops_dispatched_sync += 1;
|
||||||
|
self.op_dispatched(bytes_sent_control, bytes_sent_data);
|
||||||
|
self.ops_completed_sync += 1;
|
||||||
|
self.op_completed(bytes_received);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn op_dispatched_async(
|
||||||
|
&mut self,
|
||||||
|
bytes_sent_control: u64,
|
||||||
|
bytes_sent_data: u64,
|
||||||
|
) {
|
||||||
|
self.ops_dispatched_async += 1;
|
||||||
|
self.op_dispatched(bytes_sent_control, bytes_sent_data)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn op_dispatched_async_unref(
|
||||||
|
&mut self,
|
||||||
|
bytes_sent_control: u64,
|
||||||
|
bytes_sent_data: u64,
|
||||||
|
) {
|
||||||
|
self.ops_dispatched_async_unref += 1;
|
||||||
|
self.op_dispatched(bytes_sent_control, bytes_sent_data)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn op_completed_async(&mut self, bytes_received: u64) {
|
||||||
|
self.ops_completed_async += 1;
|
||||||
|
self.op_completed(bytes_received);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn op_completed_async_unref(&mut self, bytes_received: u64) {
|
||||||
|
self.ops_completed_async_unref += 1;
|
||||||
|
self.op_completed(bytes_received);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -59,7 +59,13 @@ fn op_metrics(
|
||||||
|
|
||||||
Ok(JsonOp::Sync(json!({
|
Ok(JsonOp::Sync(json!({
|
||||||
"opsDispatched": m.ops_dispatched,
|
"opsDispatched": m.ops_dispatched,
|
||||||
|
"opsDispatchedSync": m.ops_dispatched_sync,
|
||||||
|
"opsDispatchedAsync": m.ops_dispatched_async,
|
||||||
|
"opsDispatchedAsyncUnref": m.ops_dispatched_async_unref,
|
||||||
"opsCompleted": m.ops_completed,
|
"opsCompleted": m.ops_completed,
|
||||||
|
"opsCompletedSync": m.ops_completed_sync,
|
||||||
|
"opsCompletedAsync": m.ops_completed_async,
|
||||||
|
"opsCompletedAsyncUnref": m.ops_completed_async_unref,
|
||||||
"bytesSentControl": m.bytes_sent_control,
|
"bytesSentControl": m.bytes_sent_control,
|
||||||
"bytesSentData": m.bytes_sent_data,
|
"bytesSentData": m.bytes_sent_data,
|
||||||
"bytesReceived": m.bytes_received
|
"bytesReceived": m.bytes_received
|
||||||
|
|
40
cli/state.rs
40
cli/state.rs
|
@ -89,25 +89,40 @@ impl State {
|
||||||
zero_copy.as_ref().map(|b| b.len()).unwrap_or(0) as u64;
|
zero_copy.as_ref().map(|b| b.len()).unwrap_or(0) as u64;
|
||||||
|
|
||||||
let op = dispatcher(control, zero_copy);
|
let op = dispatcher(control, zero_copy);
|
||||||
state.metrics_op_dispatched(bytes_sent_control, bytes_sent_zero_copy);
|
|
||||||
|
|
||||||
match op {
|
match op {
|
||||||
Op::Sync(buf) => {
|
Op::Sync(buf) => {
|
||||||
state.metrics_op_completed(buf.len() as u64);
|
let mut state_ = state.borrow_mut();
|
||||||
|
state_.metrics.op_sync(
|
||||||
|
bytes_sent_control,
|
||||||
|
bytes_sent_zero_copy,
|
||||||
|
buf.len() as u64,
|
||||||
|
);
|
||||||
Op::Sync(buf)
|
Op::Sync(buf)
|
||||||
}
|
}
|
||||||
Op::Async(fut) => {
|
Op::Async(fut) => {
|
||||||
|
let mut state_ = state.borrow_mut();
|
||||||
|
state_
|
||||||
|
.metrics
|
||||||
|
.op_dispatched_async(bytes_sent_control, bytes_sent_zero_copy);
|
||||||
let state = state.clone();
|
let state = state.clone();
|
||||||
let result_fut = fut.map_ok(move |buf: Buf| {
|
let result_fut = fut.map_ok(move |buf: Buf| {
|
||||||
state.metrics_op_completed(buf.len() as u64);
|
let mut state_ = state.borrow_mut();
|
||||||
|
state_.metrics.op_completed_async(buf.len() as u64);
|
||||||
buf
|
buf
|
||||||
});
|
});
|
||||||
Op::Async(result_fut.boxed_local())
|
Op::Async(result_fut.boxed_local())
|
||||||
}
|
}
|
||||||
Op::AsyncUnref(fut) => {
|
Op::AsyncUnref(fut) => {
|
||||||
|
let mut state_ = state.borrow_mut();
|
||||||
|
state_.metrics.op_dispatched_async_unref(
|
||||||
|
bytes_sent_control,
|
||||||
|
bytes_sent_zero_copy,
|
||||||
|
);
|
||||||
let state = state.clone();
|
let state = state.clone();
|
||||||
let result_fut = fut.map_ok(move |buf: Buf| {
|
let result_fut = fut.map_ok(move |buf: Buf| {
|
||||||
state.metrics_op_completed(buf.len() as u64);
|
let mut state_ = state.borrow_mut();
|
||||||
|
state_.metrics.op_completed_async_unref(buf.len() as u64);
|
||||||
buf
|
buf
|
||||||
});
|
});
|
||||||
Op::AsyncUnref(result_fut.boxed_local())
|
Op::AsyncUnref(result_fut.boxed_local())
|
||||||
|
@ -358,21 +373,4 @@ impl State {
|
||||||
)
|
)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn metrics_op_dispatched(
|
|
||||||
&self,
|
|
||||||
bytes_sent_control: u64,
|
|
||||||
bytes_sent_data: u64,
|
|
||||||
) {
|
|
||||||
let mut state = self.borrow_mut();
|
|
||||||
state.metrics.ops_dispatched += 1;
|
|
||||||
state.metrics.bytes_sent_control += bytes_sent_control;
|
|
||||||
state.metrics.bytes_sent_data += bytes_sent_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn metrics_op_completed(&self, bytes_received: u64) {
|
|
||||||
let mut state = self.borrow_mut();
|
|
||||||
state.metrics.ops_completed += 1;
|
|
||||||
state.metrics.bytes_received += bytes_received;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue