Skip to content

Commit a137a1b

Browse files
committed
chore: add server events
1 parent 937b933 commit a137a1b

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

src/server.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import { mongoLogId } from "mongodb-log-writer";
88
import { ObjectId } from "mongodb";
99
import { Telemetry } from "./telemetry/telemetry.js";
1010
import { UserConfig } from "./config.js";
11+
import { type ServerEvent } from "./telemetry/types.js";
12+
import { type ServerCommand } from "./telemetry/types.js";
1113

1214
export interface ServerOptions {
1315
session: Session;
@@ -20,8 +22,10 @@ export class Server {
2022
private readonly mcpServer: McpServer;
2123
private readonly telemetry: Telemetry;
2224
private readonly userConfig: UserConfig;
25+
private readonly startTime: number;
2326

2427
constructor({ session, mcpServer, userConfig }: ServerOptions) {
28+
this.startTime = Date.now();
2529
this.session = session;
2630
this.telemetry = new Telemetry(session);
2731
this.mcpServer = mcpServer;
@@ -46,12 +50,47 @@ export class Server {
4650
"server",
4751
`Server started with transport ${transport.constructor.name} and agent runner ${this.session.agentRunner?.name}`
4852
);
53+
54+
this.emitServerEvent("start", Date.now() - this.startTime);
4955
};
5056
}
5157

5258
async close(): Promise<void> {
59+
const closeTime = Date.now();
5360
await this.session.close();
5461
await this.mcpServer.close();
62+
63+
this.emitServerEvent("stop", Date.now() - closeTime);
64+
}
65+
66+
67+
/**
68+
* Emits a server event
69+
* @param command - The server command (e.g., "start", "stop", "register", "deregister")
70+
* @param additionalProperties - Additional properties specific to the event
71+
*/
72+
async emitServerEvent(command: ServerCommand, commandDuration: number): Promise<void> {
73+
const event: ServerEvent = {
74+
timestamp: new Date().toISOString(),
75+
source: "mdbmcp",
76+
properties: {
77+
...this.telemetry.getCommonProperties(),
78+
result: "success",
79+
duration_ms: commandDuration,
80+
component: "server",
81+
category: "other",
82+
command: command,
83+
},
84+
};
85+
86+
if (command === "start") {
87+
event.properties.startup_time_ms = commandDuration;
88+
}
89+
if (command === "stop") {
90+
event.properties.runtime_duration_ms = Date.now() - this.startTime;
91+
}
92+
93+
await this.telemetry.emitEvents([event]);
5594
}
5695

5796
private registerTools() {

src/telemetry/telemetry.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Session } from "../session.js";
2-
import { BaseEvent } from "./types.js";
2+
import { BaseEvent, ServerEvent } from "./types.js";
33
import { config } from "../config.js";
44
import logger from "../logger.js";
55
import { mongoLogId } from "mongodb-log-writer";

src/telemetry/types.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* Result type constants for telemetry events
33
*/
44
export type TelemetryResult = "success" | "failure";
5+
export type ServerCommand = "start" | "stop" | "register" | "deregister";
56

67
/**
78
* Base interface for all events
@@ -45,3 +46,14 @@ export interface ToolEvent extends BaseEvent {
4546
is_atlas?: boolean;
4647
} & BaseEvent["properties"];
4748
}
49+
50+
/**
51+
* Interface for server events
52+
*/
53+
export interface ServerEvent extends BaseEvent {
54+
properties: {
55+
command: ServerCommand;
56+
startup_time_ms?: number;
57+
runtime_duration_ms?: number;
58+
} & BaseEvent["properties"];
59+
}

0 commit comments

Comments
 (0)