@microsoft/dev-tunnels-ssh
Version:
SSH library for Dev Tunnels
124 lines • 6.08 kB
TypeScript
import { CancellationToken, Disposable } from 'vscode-jsonrpc';
import { SessionMetrics } from './sessionMetrics';
/**
* Collects session metrics over time, producing an outline of the timing, speed,
* and quantity of bytes sent/received during the session.
*
* Metrics are recorded across a number of equal time intervals. As the session time
* increases, intervals are expanded to keep the number of intervals under the configured
* maximum. Each expansion doubles the length of all intervals, while combining the metrics
* within each pair of combined intervals. Therefore, a longer session has longer intervals
* and less-granular metrics. In this way, the memory usage (and serialized size) of the
* session contour remains roughly constant regardless of the length of the session.
*
* Metrics exposed via the collection properties on this class may be momentarily
* inconsistent (but will not throw exceptions) if continued session operation causes
* intervals to be expanded while the data is being read concurrently. To avoid any
* inconsistency, hold a lock on the <see cref="SessionContour" /> instance while reading
* data. (Or wait until the session ends.)
*
* A session contour can be exported in a compact form suitable for logging or telemetry.
* Use the code in `SessionContour.kql` to chart a session contour in Azure Data Explorer.
*/
export declare class SessionContour implements Disposable {
private static readonly initialInterval;
/** Current size of the metrics interval, in milliseconds. */
private intervalMs;
/** Number of intervals for which metrics have been recorded. */
private count;
private readonly intervalBytesSent;
private readonly intervalBytesReceived;
private readonly intervalLatencyMin;
private readonly intervalLatencyMax;
private readonly intervalLatencySum;
private readonly intervalLatencyCount;
private readonly intervalLatencyAvg;
private readonly updateQueue;
private readonly updateSemaphore;
private disposed;
/**
* Creates a new instance of the `SessionContour` class.
*
* @param maxIntervals Maximum number of metric intervals to record,
* defaults to 256. Must be a power of two.
*/
constructor(maxIntervals?: number);
/**
* Gets the maximum number of intervals that can be recorded in this contour. Intervals
* are expanded as necesary such that the entire duration of the session is always covered
* by fewer intervals than this limit.
*/
readonly maxIntervals: number;
/**
* Gets the current number of contour intervals with recorded metrics. This is always
* less than `maxIntervals`.
*/
get intervalCount(): number;
/**
* Gets the current time span of each contour interval, in milliseconds. This interval time
* span is doubled as necesary such that the entire duration of the session is always covered
* by fewer intervals than the maximum.
*/
get interval(): number;
/**
* Gets the total number of bytes sent for each interval during the session,
* including all channels and non-channel protocol messages, and including message
* framing, padding, and MAC bytes. The number of values is equal to `intervalCount`.
*/
get bytesSent(): readonly number[];
/**
* Gets the total number of bytes received for each interval during the session,
* including all channels and non-channel protocol messages, and including message
* framing, padding, and MAC bytes. The number of values is equal to `intervalCount`.
*/
get bytesReceived(): readonly number[];
/**
* Gets the minimum recorded round-trip connection latency between client and server for
* each interval during the session. The number of values is equal to `intervalCount`.
*/
get latencyMinMs(): readonly number[];
/**
* Gets the maximum recorded round-trip connection latency between client and server for
* each interval during the session. The number of values is equal to `intervalCount`.
*/
get latencyMaxMs(): readonly number[];
/**
* Gets the average recorded round-trip connection latency between client and server for
* each interval during the session. The number of values is equal to `intervalCount`.
*/
get latencyAverageMs(): readonly number[];
private onMessageSent;
private onMessageReceived;
private onLatencyUpdated;
private onSessionClosed;
/**
* Starts collecting session metrics, and processes the metrics in a backgroud loop until
* cancelled or until the session is closed or the `SessionContour` instance is disposed.
*/
collectMetrics(sessionMetrics: SessionMetrics, cancellation?: CancellationToken): Promise<void>;
private updateInterval;
private expandIntervals;
dispose(): void;
/**
* Serializes the session contour into a compact form suitable for recording in
* logs or telemetry.
*
* This compact serialization format uses one byte per metric per interval, so there is
* some loss of precision, but generally not so much that it affects a visualization. A
* scale factor for each metric is automatically determined and included in the serialized
* header. The size of the serialized encoded data will be a little under 7 bytes per
* interval. With the default interval maximum (256), that comes out to less than 1.75 KB.
*
* Use the code in `SessionContour.kql` to decode and chart this output in
* Azure Data Explorer.
*/
export(): string;
/**
* Deserializes a session contour that was previously exported.
*
* Due to loss in precision, some values in the deserialized contour will not exactly match
* the original, but they will be close.
*/
static import(contourBase64: string): SessionContour;
}
//# sourceMappingURL=sessionContour.d.ts.map