summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartek Iwańczuk <biwanczuk@gmail.com>2020-03-02 19:13:36 +0100
committerGitHub <noreply@github.com>2020-03-02 19:13:36 +0100
commitff5bba3be833b0062b3991b96272c0047c18b62e (patch)
tree18d63cc05874c9d124c20cad9fea4240d21cfcec
parentcfe4369dedcdd885c60b8a5f6c89bc4bb7e5e1e8 (diff)
feat: update metrics to track different op types (#4221)
-rw-r--r--cli/js/lib.deno.ns.d.ts30
-rw-r--r--cli/js/metrics.ts30
-rw-r--r--cli/js/metrics_test.ts9
-rw-r--r--cli/metrics.rs61
-rw-r--r--cli/ops/runtime.rs6
-rw-r--r--cli/state.rs40
6 files changed, 136 insertions, 40 deletions
diff --git a/cli/js/lib.deno.ns.d.ts b/cli/js/lib.deno.ns.d.ts
index 50aab6a35..55cca78cf 100644
--- a/cli/js/lib.deno.ns.d.ts
+++ b/cli/js/lib.deno.ns.d.ts
@@ -1669,7 +1669,13 @@ declare namespace Deno {
/** **UNSTABLE**: not sure if broken or not */
export interface Metrics {
opsDispatched: number;
+ opsDispatchedSync: number;
+ opsDispatchedAsync: number;
+ opsDispatchedAsyncUnref: number;
opsCompleted: number;
+ opsCompletedSync: number;
+ opsCompletedAsync: number;
+ opsCompletedAsyncUnref: number;
bytesSentControl: number;
bytesSentData: number;
bytesReceived: number;
@@ -1680,15 +1686,21 @@ declare namespace Deno {
* Receive metrics from the privileged side of Deno.
*
* > console.table(Deno.metrics())
- * ┌──────────────────┬────────┐
- * │ (index) │ Values │
- * ├──────────────────┼────────┤
- * │ opsDispatched │ 9 │
- * │ opsCompleted │ 9 │
- * │ bytesSentControl │ 504 │
- * │ bytesSentData │ 0 │
- * │ bytesReceived │ 856 │
- * └──────────────────┴────────┘
+ * ┌─────────────────────────┬────────┐
+ * │ (index) │ Values │
+ * ├─────────────────────────┼────────┤
+ * │ opsDispatched │ 3 │
+ * │ opsDispatchedSync │ 2 │
+ * │ opsDispatchedAsync │ 1 │
+ * │ opsDispatchedAsyncUnref │ 0 │
+ * │ opsCompleted │ 3 │
+ * │ opsCompletedSync │ 2 │
+ * │ opsCompletedAsync │ 1 │
+ * │ opsCompletedAsyncUnref │ 0 │
+ * │ bytesSentControl │ 73 │
+ * │ bytesSentData │ 0 │
+ * │ bytesReceived │ 375 │
+ * └─────────────────────────┴────────┘
*/
export function metrics(): Metrics;
diff --git a/cli/js/metrics.ts b/cli/js/metrics.ts
index b735dc6b3..90f22854c 100644
--- a/cli/js/metrics.ts
+++ b/cli/js/metrics.ts
@@ -3,7 +3,13 @@ import { sendSync } from "./dispatch_json.ts";
export interface Metrics {
opsDispatched: number;
+ opsDispatchedSync: number;
+ opsDispatchedAsync: number;
+ opsDispatchedAsyncUnref: number;
opsCompleted: number;
+ opsCompletedSync: number;
+ opsCompletedAsync: number;
+ opsCompletedAsyncUnref: number;
bytesSentControl: number;
bytesSentData: number;
bytesReceived: number;
@@ -12,15 +18,21 @@ export interface Metrics {
/** Receive metrics from the privileged side of Deno.
*
* > console.table(Deno.metrics())
- * ┌──────────────────┬────────┐
- * │ (index) │ Values │
- * ├──────────────────┼────────┤
- * │ opsDispatched │ 9 │
- * │ opsCompleted │ 9 │
- * │ bytesSentControl │ 504 │
- * │ bytesSentData │ 0 │
- * │ bytesReceived │ 856 │
- * └──────────────────┴────────┘
+ * ┌─────────────────────────┬────────┐
+ * │ (index) │ Values │
+ * ├─────────────────────────┼────────┤
+ * │ opsDispatched │ 3 │
+ * │ opsDispatchedSync │ 2 │
+ * │ opsDispatchedAsync │ 1 │
+ * │ opsDispatchedAsyncUnref │ 0 │
+ * │ opsCompleted │ 3 │
+ * │ opsCompletedSync │ 2 │
+ * │ opsCompletedAsync │ 1 │
+ * │ opsCompletedAsyncUnref │ 0 │
+ * │ bytesSentControl │ 73 │
+ * │ bytesSentData │ 0 │
+ * │ bytesReceived │ 375 │
+ * └─────────────────────────┴────────┘
*/
export function metrics(): Metrics {
return sendSync("op_metrics");
diff --git a/cli/js/metrics_test.ts b/cli/js/metrics_test.ts
index 3fc51b78e..3bb5218ef 100644
--- a/cli/js/metrics_test.ts
+++ b/cli/js/metrics_test.ts
@@ -4,7 +4,9 @@ import { test, testPerm, assert } from "./test_util.ts";
test(async function metrics(): Promise<void> {
const m1 = Deno.metrics();
assert(m1.opsDispatched > 0);
+ assert(m1.opsDispatchedSync > 0);
assert(m1.opsCompleted > 0);
+ assert(m1.opsCompletedSync > 0);
assert(m1.bytesSentControl > 0);
assert(m1.bytesSentData >= 0);
assert(m1.bytesReceived > 0);
@@ -16,7 +18,11 @@ test(async function metrics(): Promise<void> {
const m2 = Deno.metrics();
assert(m2.opsDispatched > m1.opsDispatched);
+ assert(m2.opsDispatchedSync > m1.opsDispatchedSync);
+ assert(m2.opsDispatchedAsync > m1.opsDispatchedAsync);
assert(m2.opsCompleted > m1.opsCompleted);
+ assert(m2.opsCompletedSync > m1.opsCompletedSync);
+ assert(m2.opsCompletedAsync > m1.opsCompletedAsync);
assert(m2.bytesSentControl > m1.bytesSentControl);
assert(m2.bytesSentData >= m1.bytesSentData + dataMsg.byteLength);
assert(m2.bytesReceived > m1.bytesReceived);
@@ -30,6 +36,7 @@ testPerm({ write: true }, function metricsUpdatedIfNoResponseSync(): void {
const metrics = Deno.metrics();
assert(metrics.opsDispatched === metrics.opsCompleted);
+ assert(metrics.opsDispatchedSync === metrics.opsCompletedSync);
});
testPerm(
@@ -42,5 +49,7 @@ testPerm(
const metrics = Deno.metrics();
assert(metrics.opsDispatched === metrics.opsCompleted);
+ assert(metrics.opsDispatchedSync === metrics.opsCompletedSync);
+ assert(metrics.opsDispatchedAsync === metrics.opsCompletedAsync);
}
);
diff --git a/cli/metrics.rs b/cli/metrics.rs
index 12a0b3f8f..ea3f90164 100644
--- a/cli/metrics.rs
+++ b/cli/metrics.rs
@@ -1,10 +1,69 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
-#[derive(Default)]
+#[derive(Default, Debug)]
pub struct Metrics {
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_sync: u64,
+ pub ops_completed_async: u64,
+ pub ops_completed_async_unref: u64,
pub bytes_sent_control: u64,
pub bytes_sent_data: u64,
pub bytes_received: 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);
+ }
+}
diff --git a/cli/ops/runtime.rs b/cli/ops/runtime.rs
index ecdb82fd9..b1382ce36 100644
--- a/cli/ops/runtime.rs
+++ b/cli/ops/runtime.rs
@@ -59,7 +59,13 @@ fn op_metrics(
Ok(JsonOp::Sync(json!({
"opsDispatched": m.ops_dispatched,
+ "opsDispatchedSync": m.ops_dispatched_sync,
+ "opsDispatchedAsync": m.ops_dispatched_async,
+ "opsDispatchedAsyncUnref": m.ops_dispatched_async_unref,
"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,
"bytesSentData": m.bytes_sent_data,
"bytesReceived": m.bytes_received
diff --git a/cli/state.rs b/cli/state.rs
index 8ad122036..44ab73034 100644
--- a/cli/state.rs
+++ b/cli/state.rs
@@ -89,25 +89,40 @@ impl State {
zero_copy.as_ref().map(|b| b.len()).unwrap_or(0) as u64;
let op = dispatcher(control, zero_copy);
- state.metrics_op_dispatched(bytes_sent_control, bytes_sent_zero_copy);
match op {
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::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 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
});
Op::Async(result_fut.boxed_local())
}
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 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
});
Op::AsyncUnref(result_fut.boxed_local())
@@ -358,21 +373,4 @@ impl State {
)
.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;
- }
}