豆豆友情提示:这是一个非官方 GitHub 代理镜像,主要用于网络测试或访问加速。请勿在此进行登录、注册或处理任何敏感信息。进行这些操作请务必访问官方网站 github.com。 Raw 内容也通过此代理提供。
Skip to content

Commit cdb00fc

Browse files
authored
chore: implement bucketized latency reporting for tool invocations (#822)
1 parent 57e07ee commit cdb00fc

File tree

3 files changed

+60
-1
lines changed

3 files changed

+60
-1
lines changed

src/main.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {McpResponse} from './McpResponse.js';
1818
import {Mutex} from './Mutex.js';
1919
import {ClearcutLogger} from './telemetry/clearcut-logger.js';
2020
import {computeFlagUsage} from './telemetry/flag-utils.js';
21+
import {bucketizeLatency} from './telemetry/metric-utils.js';
2122
import {
2223
McpServer,
2324
StdioServerTransport,
@@ -221,7 +222,7 @@ function registerTool(tool: ToolDefinition): void {
221222
void clearcutLogger?.logToolInvocation({
222223
toolName: tool.name,
223224
success,
224-
latencyMs: Date.now() - startTime,
225+
latencyMs: bucketizeLatency(Date.now() - startTime),
225226
});
226227
guard.dispose();
227228
}

src/telemetry/metric-utils.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* @license
3+
* Copyright 2026 Google LLC
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
const LATENCY_BUCKETS = [50, 100, 250, 500, 1000, 2500, 5000, 10000];
8+
9+
export function bucketizeLatency(latencyMs: number): number {
10+
for (const bucket of LATENCY_BUCKETS) {
11+
if (latencyMs <= bucket) {
12+
return bucket;
13+
}
14+
}
15+
return LATENCY_BUCKETS[LATENCY_BUCKETS.length - 1];
16+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/**
2+
* @license
3+
* Copyright 2026 Google LLC
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
import assert from 'node:assert';
8+
import {describe, it} from 'node:test';
9+
10+
import {bucketizeLatency} from '../../src/telemetry/metric-utils.js';
11+
12+
describe('bucketizeLatency', () => {
13+
it('should bucketize values correctly', () => {
14+
assert.strictEqual(bucketizeLatency(0), 50);
15+
assert.strictEqual(bucketizeLatency(25), 50);
16+
assert.strictEqual(bucketizeLatency(50), 50);
17+
18+
assert.strictEqual(bucketizeLatency(51), 100);
19+
assert.strictEqual(bucketizeLatency(100), 100);
20+
21+
assert.strictEqual(bucketizeLatency(101), 250);
22+
assert.strictEqual(bucketizeLatency(250), 250);
23+
24+
assert.strictEqual(bucketizeLatency(499), 500);
25+
assert.strictEqual(bucketizeLatency(500), 500);
26+
27+
assert.strictEqual(bucketizeLatency(900), 1000);
28+
assert.strictEqual(bucketizeLatency(1000), 1000);
29+
30+
assert.strictEqual(bucketizeLatency(2000), 2500);
31+
assert.strictEqual(bucketizeLatency(2500), 2500);
32+
33+
assert.strictEqual(bucketizeLatency(4000), 5000);
34+
assert.strictEqual(bucketizeLatency(5000), 5000);
35+
36+
assert.strictEqual(bucketizeLatency(6000), 10000);
37+
assert.strictEqual(bucketizeLatency(10000), 10000);
38+
39+
assert.strictEqual(bucketizeLatency(10001), 10000);
40+
assert.strictEqual(bucketizeLatency(99999), 10000);
41+
});
42+
});

0 commit comments

Comments
 (0)