Track client connect/disconnect events

Summary: By tracking when clients connect and disconnect, we will be able to answer how long does it take for clients to connect

Reviewed By: passy

Differential Revision: D32697702

fbshipit-source-id: b01893f500c97b08eb4434733058f58433d7f4ef
This commit is contained in:
Lorenzo Blasa
2021-12-01 06:34:02 -08:00
committed by Facebook GitHub Bot
parent a8b9059604
commit b37b5ee19e

View File

@@ -43,6 +43,11 @@ import {
getFlipperServerConfig,
} from '../FlipperServerConfig';
type ClientTimestampTracker = {
insecureStart?: number;
secureStart?: number;
};
type ClientInfo = {
connection: ClientConnection | null | undefined;
client: ClientDescription;
@@ -67,6 +72,7 @@ declare interface ServerController {
*/
class ServerController extends EventEmitter implements ServerEventsListener {
connections: Map<string, ClientInfo>;
timestamps: Map<string, ClientTimestampTracker>;
initialized: Promise<void> | null;
secureServer: Promise<ServerAdapter> | null;
@@ -86,6 +92,7 @@ class ServerController extends EventEmitter implements ServerEventsListener {
super();
this.flipperServer = flipperServer;
this.connections = new Map();
this.timestamps = new Map();
this.certificateProvider = new CertificateProvider(
this,
this.logger,
@@ -217,6 +224,18 @@ class ServerController extends EventEmitter implements ServerEventsListener {
}
onSecureConnectionAttempt(clientQuery: SecureClientQuery): void {
const strippedClientQuery = (({device_id, ...o}) => o)(clientQuery);
let id = buildClientId({device_id: 'unknown', ...strippedClientQuery});
const tracker = this.timestamps.get(id);
if (tracker) {
this.timestamps.delete(id);
}
id = buildClientId(clientQuery);
this.timestamps.set(id, {
secureStart: performance.now(),
...tracker,
});
this.logger.track(
'usage',
'trusted-request-handler-called',
@@ -261,6 +280,11 @@ class ServerController extends EventEmitter implements ServerEventsListener {
}
onConnectionAttempt(clientQuery: ClientQuery): void {
const strippedClientQuery = (({device_id, ...o}) => o)(clientQuery);
const id = buildClientId({device_id: 'unknown', ...strippedClientQuery});
this.timestamps.set(id, {
insecureStart: performance.now(),
});
this.logger.track('usage', 'untrusted-request-handler-called', clientQuery);
this.connectionTracker.logConnectionAttempt(clientQuery);
@@ -367,12 +391,7 @@ class ServerController extends EventEmitter implements ServerEventsListener {
// TODO: allocate new object, kept now as is to keep changes minimal
(query as any).app = appNameWithUpdateHint(query);
const id = buildClientId({
app: query.app,
os: query.os,
device: query.device,
device_id: query.device_id,
});
const id = buildClientId(query);
console.info(
`[conn] Matching device for ${query.app} on ${query.device_id}...`,
query,
@@ -426,6 +445,20 @@ class ServerController extends EventEmitter implements ServerEventsListener {
this.connections.set(id, info);
this.flipperServer.emit('client-connected', client);
const tracker = this.timestamps.get(id);
if (tracker) {
const end = performance.now();
const start = tracker.insecureStart
? tracker.insecureStart
: tracker.secureStart;
const elapsed = Math.round(end - start!);
this.logger.track('performance', 'client-connection-tracker', {
'time-to-connection': elapsed,
...query,
});
this.timestamps.delete(id);
}
return client;
}