@vpalmisano/webrtcperf 4.1.10 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +685 -235
- package/app.min.js +1 -1
- package/build/src/app.js +3 -1
- package/build/src/app.js.map +1 -1
- package/build/src/config.d.ts +91 -1
- package/build/src/config.js +114 -10
- package/build/src/config.js.map +1 -1
- package/build/src/server.d.ts +1 -1
- package/build/src/server.js +4 -4
- package/build/src/server.js.map +1 -1
- package/build/src/stats.d.ts +3 -3
- package/build/src/stats.js +8 -8
- package/build/src/stats.js.map +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +24 -24
- package/src/app.ts +5 -2
- package/src/config.ts +117 -11
- package/src/server.ts +4 -4
- package/src/stats.ts +9 -9
package/build/src/stats.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/stats.ts"],"names":[],"mappings":"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","sourcesContent":["import axios from 'axios'\nimport chalk from 'chalk'\nimport * as events from 'events'\nimport { Stats as FastStats } from 'fast-stats'\nimport * as fs from 'fs'\nimport * as http from 'http'\nimport * as https from 'https'\nimport json5 from 'json5'\nimport * as path from 'path'\nimport * as promClient from 'prom-client'\nimport { PrometheusContentType } from 'prom-client'\nimport { sprintf } from 'sprintf-js'\nimport * as zlib from 'zlib'\n\nimport { PageStatsNames, RtcStatsMetricNames, parseRtStatKey } from './rtcstats'\nimport { Session } from './session'\nimport { Scheduler, enabledForSession, hideAuth, logger, toPrecision } from './utils'\n\nexport { FastStats }\n\nconst log = logger('webrtcperf:stats')\n\nfunction calculateFailAmountPercentile(stat: FastStats, percentile = 95): number {\n return Math.round(stat.percentile(percentile))\n}\n\n/**\n * StatsWriter\n */\nclass StatsWriter {\n fname: string\n columns: string[]\n private _header_written = false\n\n constructor(fname = 'stats.log', columns: string[]) {\n this.fname = fname\n this.columns = columns\n }\n\n /**\n * push\n * @param dataColumns\n */\n async push(dataColumns: string[]): Promise<void> {\n if (!this._header_written) {\n const data = ['datetime', ...this.columns].join(',') + '\\n'\n await fs.promises.mkdir(path.dirname(this.fname), { recursive: true })\n await fs.promises.writeFile(this.fname, data)\n this._header_written = true\n }\n //\n const data = [Date.now(), ...dataColumns].join(',') + '\\n'\n return fs.promises.appendFile(this.fname, data)\n }\n}\n\n/**\n * formatStatsColumns\n * @param column\n */\nfunction formatStatsColumns(column: string): string[] {\n return [\n `${column}_length`,\n `${column}_sum`,\n `${column}_mean`,\n `${column}_stdev`,\n `${column}_5p`,\n `${column}_95p`,\n `${column}_min`,\n `${column}_max`,\n ]\n}\n\n/** The Stats data collected for each metric. */\ninterface StatsData {\n /** The total samples collected. */\n length: number\n /** The sum of all the samples. */\n sum: number\n /** The average value. */\n mean: number\n /** The standard deviation. */\n stddev: number\n /** The 5th percentile. */\n p5: number\n /** The 95th percentile. */\n p95: number\n /** The minimum value. */\n min: number\n /** The maximum value. */\n max: number\n}\n\ntype StatsDataKey = keyof StatsData\n\nexport interface CollectedStats {\n all: FastStats\n byHost: Record<string, FastStats>\n byCodec: Record<string, FastStats>\n byParticipantAndTrack: Record<string, number>\n}\n\nexport interface CollectedStatsRaw {\n all: number[]\n byHost: Record<string, number[]>\n byCodec: Record<string, number[]>\n byParticipantAndTrack: Record<string, number>\n}\n\n/**\n * Formats the stats for console or for file output.\n * @param s The stats object.\n * @param forWriter If true, format the stats to be written on file.\n */\nfunction formatStats(s: FastStats, forWriter = false): StatsData | string[] {\n if (forWriter) {\n return [\n toPrecision(s.length || 0, 0),\n toPrecision(s.sum || 0),\n toPrecision(s.amean() || 0),\n toPrecision(s.stddev() || 0),\n toPrecision(s.percentile(5) || 0),\n toPrecision(s.percentile(95) || 0),\n toPrecision(s.min || 0),\n toPrecision(s.max || 0),\n ]\n }\n return {\n length: s.length || 0,\n sum: s.sum || 0,\n mean: s.amean() || 0,\n stddev: s.stddev() || 0,\n p5: s.percentile(5) || 0,\n p95: s.percentile(95) || 0,\n min: s.min || 0,\n max: s.max || 0,\n }\n}\n\n/**\n * Formats the console stats title.\n * @param name\n */\nfunction sprintfStatsTitle(name: string): string {\n return sprintf(chalk`-- {bold %(name)s} %(fill)s\\n`, {\n name,\n fill: '-'.repeat(100 - name.length - 4),\n })\n}\n\n/**\n * Formats the console stats header.\n */\nfunction sprintfStatsHeader(): string {\n return (\n sprintfStatsTitle(new Date().toUTCString()) +\n sprintf(\n chalk`{bold %(name)\\' 30s} {bold %(length)\\' 8s} {bold %(sum)\\' 8s} {bold %(mean)\\' 8s} {bold %(stddev)\\' 8s} {bold %(p5)\\' 8s} {bold %(p95)\\' 8s} {bold %(min)\\' 8s} {bold %(max)\\' 8s}\\n`,\n {\n name: 'name',\n length: 'count',\n sum: 'sum',\n mean: 'mean',\n stddev: 'stddev',\n p5: '5p',\n p95: '95p',\n min: 'min',\n max: 'max',\n },\n )\n )\n}\n\n/**\n * Format the stats for console output.\n */\nfunction sprintfStats(\n name: string,\n stats: CollectedStats,\n format = '.2f',\n unit = '',\n scale = 1,\n hideSum = false,\n): string {\n if (!stats?.all.length) {\n return ''\n }\n if (!scale) {\n scale = 1\n }\n const statsData = formatStats(stats.all) as StatsData\n return sprintf(\n chalk`{red {bold %(name)\\' 30s}}` +\n chalk` {bold %(length)\\' 8d}` +\n (hideSum ? ' ' : chalk` {bold %(sum)\\' 8${format}}`) +\n chalk` {bold %(mean)\\' 8${format}}` +\n chalk` {bold %(stddev)\\' 8${format}}` +\n chalk` {bold %(p5)\\' 8${format}}` +\n chalk` {bold %(p95)\\' 8${format}}` +\n chalk` {bold %(min)\\' 8${format}}` +\n chalk` {bold %(max)\\' 8${format}}%(unit)s\\n`,\n {\n name,\n length: statsData.length,\n sum: statsData.sum * scale,\n mean: statsData.mean * scale,\n stddev: statsData.stddev * scale,\n p5: statsData.p5 * scale,\n p95: statsData.p95 * scale,\n min: statsData.min * scale,\n max: statsData.max * scale,\n unit: unit ? chalk` {red {bold ${unit}}}` : '',\n },\n )\n}\n\nconst promPrefix = 'wst_'\n\nconst promCreateGauge = (\n register: promClient.Registry,\n name: string,\n suffix = '',\n labelNames: string[] = [],\n collect?: () => void,\n): promClient.Gauge<string> => {\n return new promClient.Gauge({\n name: `${promPrefix}${name}${suffix && '_' + suffix}`,\n help: `${name} ${suffix}`,\n labelNames,\n registers: [register],\n collect,\n })\n}\n\n/**\n * The alert rule description.\n *\n * Example:\n * ```\n cpu:\n tags:\n - performance\n failPercentile: 90\n p95:\n $gt: 10\n $lt: 100\n $after: 60\n * ```\n * It will check if the `cpu` 95th percentile is lower than 100% and greater than 10%,\n * starting the check after 60s from the test start. The alert results will be\n * grouped into the `performance` category.\n */\nexport type AlertRule = AlertRuleOption & AlertRuleKey\n\n/**\n * The alert rule options.\n */\nexport interface AlertRuleOption {\n /** The alert results will be grouped into the specified categories. */\n tags: string[]\n /** The alert will pass when at least `failPercentile` of the checks (95 by default) are successful. */\n failPercentile?: number\n}\n\n/**\n * The supported alert rule checks.\n */\nexport interface AlertRuleKey {\n /** The total collected samples. */\n length?: AlertRuleValue | AlertRuleValue[]\n /** The sum of the collected samples. */\n sum?: AlertRuleValue | AlertRuleValue[]\n /** The 95th percentile of the collected samples. */\n p95?: AlertRuleValue | AlertRuleValue[]\n /** The 5th percentile of the collected samples. */\n p5?: AlertRuleValue | AlertRuleValue[]\n /** The minimum of the collected samples. */\n min?: AlertRuleValue | AlertRuleValue[]\n /** The maximum of the collected samples. */\n max?: AlertRuleValue | AlertRuleValue[]\n}\n\n/**\n * The alert check operators.\n */\nexport interface AlertRuleValue {\n $eq?: number\n $gt?: number\n $lt?: number\n $gte?: number\n $lte?: number\n $after?: number\n $before?: number\n $skip_lt?: number\n $skip_lte?: number\n $skip_gt?: number\n $skip_gte?: number\n}\n\nconst calculateFailAmount = (checkValue: number, ruleValue: number): number => {\n if (ruleValue) {\n return 100 * Math.min(1, Math.abs(checkValue - ruleValue) / ruleValue)\n } else {\n return 100 * Math.min(1, Math.abs(checkValue))\n }\n}\n\n/**\n * The Stats collector class.\n */\nexport class Stats extends events.EventEmitter {\n readonly statsPath: string\n readonly detailedStatsPath: string\n readonly prometheusPushgateway: string\n readonly prometheusPushgatewayJobName: string\n readonly prometheusPushgatewayAuth?: string\n readonly prometheusPushgatewayGzip?: boolean\n readonly showStats: boolean\n readonly showPageLog: boolean\n readonly statsInterval: number\n readonly rtcStatsTimeout: number\n readonly customMetrics: Record<string, { labels?: string[] }> = {}\n readonly startTimestamp: number\n readonly enableDetailedStats: boolean | string | number\n private readonly startTimestampString: string\n\n readonly sessions = new Map<number, Session>()\n nextSessionId: number\n statsWriter: StatsWriter | null\n detailedStatsWriter: StatsWriter | null\n private scheduler?: Scheduler\n\n private alertRules: Record<string, AlertRule> | null = null\n readonly alertRulesFilename: string\n private readonly alertRulesFailPercentile: number\n private readonly pushStatsUrl: string\n private readonly pushStatsId: string\n private readonly serverSecret: string\n\n private readonly alertRulesReport = new Map<\n string,\n Map<\n string,\n {\n totalFails: number\n totalFailsTime: number\n totalFailsTimePerc: number\n lastFailed: number\n valueStats: FastStats\n failAmountStats: FastStats\n failAmountPercentile: number\n }\n >\n >()\n private gateway: promClient.Pushgateway<PrometheusContentType> | null = null\n\n /* metricConfigGauge: promClient.Gauge<string> | null = null */\n private elapsedTimeMetric: promClient.Gauge<string> | null = null\n private metrics: Record<\n string,\n {\n length: promClient.Gauge<string>\n sum: promClient.Gauge<string>\n mean: promClient.Gauge<string>\n stddev: promClient.Gauge<string>\n p5: promClient.Gauge<string>\n p95: promClient.Gauge<string>\n min: promClient.Gauge<string>\n max: promClient.Gauge<string>\n value?: promClient.Gauge<string>\n alertRules: Record<\n string,\n {\n report: promClient.Gauge<string>\n rule: promClient.Gauge<string>\n mean: promClient.Gauge<string>\n }\n >\n }\n > = {}\n\n private alertTagsMetrics?: promClient.Gauge<string>\n private readonly customMetricsLabels: Record<string, string | undefined>\n\n collectedStats: Record<string, CollectedStats>\n\n collectedStatsConfig = {\n url: '',\n pages: 0,\n startTime: 0,\n }\n externalCollectedStats = new Map<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { addedTime: number; externalStats: any; config: any }\n >()\n pushStatsInstance: axios.AxiosInstance | null = null\n\n private running = false\n\n /**\n * Stats aggregator class.\n */\n constructor({\n statsPath,\n detailedStatsPath,\n prometheusPushgateway,\n prometheusPushgatewayJobName,\n prometheusPushgatewayAuth,\n prometheusPushgatewayGzip,\n showStats,\n showPageLog,\n statsInterval,\n rtcStatsTimeout,\n customMetrics,\n alertRules,\n alertRulesFilename,\n alertRulesFailPercentile,\n pushStatsUrl,\n pushStatsId,\n serverSecret,\n startSessionId,\n startTimestamp,\n enableDetailedStats,\n customMetricsLabels,\n }: {\n statsPath: string\n detailedStatsPath: string\n prometheusPushgateway: string\n prometheusPushgatewayJobName: string\n prometheusPushgatewayAuth: string\n prometheusPushgatewayGzip: boolean\n showStats: boolean\n showPageLog: boolean\n statsInterval: number\n rtcStatsTimeout: number\n customMetrics: string\n alertRules: string\n alertRulesFilename: string\n alertRulesFailPercentile: number\n pushStatsUrl: string\n pushStatsId: string\n serverSecret: string\n startSessionId: number\n startTimestamp: number\n enableDetailedStats: boolean | string | number\n customMetricsLabels?: string\n }) {\n super()\n this.statsPath = statsPath\n this.detailedStatsPath = detailedStatsPath\n this.prometheusPushgateway = prometheusPushgateway\n this.prometheusPushgatewayJobName = prometheusPushgatewayJobName || 'default'\n this.prometheusPushgatewayAuth = prometheusPushgatewayAuth || undefined\n this.prometheusPushgatewayGzip = prometheusPushgatewayGzip\n this.showStats = showStats !== undefined ? showStats : true\n this.showPageLog = !!showPageLog\n this.statsInterval = statsInterval || 10\n this.rtcStatsTimeout = Math.max(rtcStatsTimeout, this.statsInterval)\n if (customMetrics.trim()) {\n this.customMetrics = json5.parse(customMetrics)\n log.debug(`using customMetrics: ${JSON.stringify(this.customMetrics, undefined, 2)}`)\n }\n\n this.collectedStats = this.initCollectedStats()\n this.sessions = new Map()\n this.nextSessionId = startSessionId\n this.startTimestamp = startTimestamp || Date.now()\n this.startTimestampString = new Date(this.startTimestamp).toISOString()\n this.enableDetailedStats = enableDetailedStats\n this.customMetricsLabels = customMetricsLabels\n ? customMetricsLabels.split(',').reduce(\n (p, label) => {\n label = label.trim()\n if (label) {\n p[label] = undefined\n }\n return p\n },\n {} as typeof this.customMetricsLabels,\n )\n : {}\n\n this.statsWriter = null\n this.detailedStatsWriter = null\n if (alertRules.trim()) {\n this.alertRules = json5.parse(alertRules)\n log.debug(`using alertRules: ${JSON.stringify(this.alertRules, undefined, 2)}`)\n }\n this.alertRulesFilename = alertRulesFilename\n this.alertRulesFailPercentile = alertRulesFailPercentile\n this.pushStatsUrl = pushStatsUrl\n this.pushStatsId = pushStatsId\n this.serverSecret = serverSecret\n\n if (this.pushStatsUrl) {\n const httpAgent = new http.Agent({ keepAlive: false })\n const httpsAgent = new https.Agent({\n keepAlive: false,\n rejectUnauthorized: false,\n })\n this.pushStatsInstance = axios.create({\n httpAgent,\n httpsAgent,\n baseURL: this.pushStatsUrl,\n auth: {\n username: 'admin',\n password: this.serverSecret,\n },\n maxBodyLength: 20000000,\n transformRequest: [\n ...(axios.defaults.transformRequest as axios.AxiosRequestTransformer[]),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (data: any, headers?: axios.AxiosRequestHeaders): any => {\n if (headers && typeof data === 'string' && data.length > 16 * 1024) {\n headers['Content-Encoding'] = 'gzip'\n return zlib.gzipSync(data)\n } else {\n return data\n }\n },\n ],\n })\n }\n }\n\n private initCollectedStats(): Record<string, CollectedStats> {\n return this.statsNames.reduce(\n (prev, name: string) => {\n prev[name] = {\n all: new FastStats(),\n byHost: {},\n byCodec: {},\n byParticipantAndTrack: {},\n } as CollectedStats\n return prev\n },\n {} as Record<string, CollectedStats>,\n )\n }\n\n private get statsNames(): string[] {\n return Object.keys(PageStatsNames).concat(Object.keys(RtcStatsMetricNames)).concat(Object.keys(this.customMetrics))\n }\n\n /**\n * consumeSessionId\n * @param tabs the number of tabs to allocate in the same session.\n */\n consumeSessionId(tabs = 1): number {\n const id = this.nextSessionId\n this.nextSessionId += tabs\n return id\n }\n\n /**\n * Adds the session to the list of monitored sessions.\n */\n addSession(session: Session): void {\n log.debug(`addSession ${session.id}`)\n if (this.sessions.has(session.id)) {\n throw new Error(`session id ${session.id} already present`)\n }\n session.once('stop', id => {\n log.debug(`Session ${id} stopped`)\n this.sessions.delete(id)\n })\n this.sessions.set(session.id, session)\n }\n\n /**\n * Removes the session from list of monitored sessions.\n * @param id the Session id\n */\n removeSession(id: number): void {\n log.debug(`removeSession ${id}`)\n this.sessions.delete(id)\n }\n\n /**\n * It updates the custom label value.\n * @param label the custom metric label\n * @param value the custom metric label value\n */\n setCustomMetricLabel(label: string, value: string | undefined): void {\n if (!(label in this.customMetricsLabels)) {\n throw new Error(`Unknown custom metric label: ${label}`)\n }\n this.customMetricsLabels[label] = value\n }\n\n /**\n * start\n */\n async start(): Promise<void> {\n if (this.running) {\n log.warn('already running')\n return\n }\n log.debug('start')\n this.running = true\n\n if (this.statsPath) {\n log.debug(`Logging stats into ${this.statsPath}`)\n const headers = this.statsNames.reduce((v: string[], name) => v.concat(formatStatsColumns(name)), [])\n this.statsWriter = new StatsWriter(this.statsPath, headers)\n }\n\n if (this.detailedStatsPath) {\n log.debug(`Logging stats into ${this.statsPath}`)\n this.detailedStatsWriter = new StatsWriter(this.detailedStatsPath, [\n 'participantName',\n 'trackId',\n ...this.statsNames,\n ])\n }\n\n if (this.prometheusPushgateway) {\n const register = new promClient.Registry()\n const agent = this.prometheusPushgateway.startsWith('https://')\n ? new https.Agent({\n keepAlive: true,\n keepAliveMsecs: 60000,\n maxSockets: 5,\n })\n : new http.Agent({\n keepAlive: true,\n keepAliveMsecs: 60000,\n maxSockets: 5,\n })\n this.gateway = new promClient.Pushgateway(\n this.prometheusPushgateway,\n {\n timeout: 5000,\n auth: this.prometheusPushgatewayAuth,\n rejectUnauthorized: false,\n agent,\n headers: this.prometheusPushgatewayGzip\n ? {\n 'Content-Encoding': 'gzip',\n }\n : undefined,\n },\n register,\n )\n\n // promClient.collectDefaultMetrics({ prefix: promPrefix, register })\n\n this.elapsedTimeMetric = promCreateGauge(\n register,\n 'elapsedTime',\n '',\n ['datetime', ...Object.keys(this.customMetricsLabels)],\n () =>\n this.elapsedTimeMetric?.set(\n {\n datetime: this.startTimestampString,\n ...this.customMetricsLabels,\n },\n (Date.now() - this.startTimestamp) / 1000,\n ),\n )\n\n // Export rtc stats.\n this.statsNames.forEach(name => {\n this.metrics[name] = {\n length: promCreateGauge(register, name, 'length', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n sum: promCreateGauge(register, name, 'sum', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n mean: promCreateGauge(register, name, 'mean', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n stddev: promCreateGauge(register, name, 'stddev', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n p5: promCreateGauge(register, name, 'p5', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n p95: promCreateGauge(register, name, 'p95', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n min: promCreateGauge(register, name, 'min', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n max: promCreateGauge(register, name, 'max', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n alertRules: {},\n }\n\n if (this.enableDetailedStats !== false) {\n this.metrics[name].value = promCreateGauge(register, name, '', [\n 'participantName',\n 'trackId',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ])\n }\n\n if (this.alertRules && this.alertRules[name]) {\n const rule = this.alertRules[name]\n for (const ruleKey of Object.keys(rule)) {\n const ruleName = `alert_${name}_${ruleKey}`\n this.metrics[name].alertRules[ruleName] = {\n report: promCreateGauge(register, ruleName, 'report', [\n 'rule',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n rule: promCreateGauge(register, ruleName, '', [\n 'rule',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n mean: promCreateGauge(register, ruleName, 'mean', [\n 'rule',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n }\n }\n }\n })\n\n if (this.alertRules) {\n this.alertTagsMetrics = promCreateGauge(register, `alert_report`, '', [\n 'datetime',\n 'tag',\n ...Object.keys(this.customMetricsLabels),\n ])\n }\n\n await this.deletePushgatewayStats()\n }\n\n this.scheduler = new Scheduler('stats', this.statsInterval, this.collectStats.bind(this))\n this.scheduler.start()\n }\n\n async deletePushgatewayStats(): Promise<void> {\n if (!this.gateway) {\n return\n }\n try {\n const { resp, body } = await this.gateway.delete({\n jobName: this.prometheusPushgatewayJobName,\n })\n if ((body as string).length) {\n log.warn(`Pushgateway delete error ${(resp as http.ServerResponse).statusCode}: ${body as string}`)\n }\n } catch (err) {\n log.error(`Pushgateway delete error: ${(err as Error).stack}`)\n }\n }\n\n /**\n * collectStats\n */\n async collectStats(now: number): Promise<void> {\n if (!this.running) {\n return\n }\n // log.debug(`statsInterval ${this.sessions.size} sessions`);\n if (!this.sessions.size && !this.externalCollectedStats.size) {\n return\n }\n // Prepare config.\n this.collectedStatsConfig.pages = 0\n this.collectedStatsConfig.startTime = this.startTimestamp\n // Reset collectedStats object.\n const prevByParticipantAndTrackStats = {} as Record<string, Set<string>>\n Object.entries(this.collectedStats).forEach(([name, stats]) => {\n stats.all.reset()\n Object.values(stats.byHost).forEach(s => s.reset())\n Object.values(stats.byCodec).forEach(s => s.reset())\n prevByParticipantAndTrackStats[name] = new Set(Object.keys(stats.byParticipantAndTrack))\n stats.byParticipantAndTrack = {}\n })\n for (const [sessionId, session] of this.sessions.entries()) {\n this.collectedStatsConfig.url = `${hideAuth(session.url)}?${session.urlQuery}`\n this.collectedStatsConfig.pages += session.pages.size || 0\n const sessionStats = await session.updateStats()\n for (const [name, obj] of Object.entries(sessionStats)) {\n if (obj === undefined) {\n return\n }\n //log.log(name, obj)\n try {\n const collectedStats = this.collectedStats[name]\n const prevByParticipantAndTrack = prevByParticipantAndTrackStats[name]\n if (typeof obj === 'number' && isFinite(obj)) {\n collectedStats.all.push(obj)\n } else {\n for (const [key, value] of Object.entries(obj)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (typeof value === 'number' && isFinite(value as any)) {\n collectedStats.all.push(value)\n // Push host label.\n const { trackId, hostName, participantName } = parseRtStatKey(key)\n let stats = collectedStats.byHost[hostName]\n if (!stats) {\n stats = collectedStats.byHost[hostName] = new FastStats()\n }\n stats.push(value)\n // Push participant and track values.\n if (enabledForSession(sessionId, this.enableDetailedStats) && participantName) {\n const label = `${participantName}:${trackId || ''}`\n collectedStats.byParticipantAndTrack[label] = value\n prevByParticipantAndTrack.delete(label)\n }\n } else if (typeof value === 'string') {\n // Codec stats.\n collectedStats.all.push(1)\n let stats = collectedStats.byCodec[value]\n if (!stats) {\n stats = collectedStats.byCodec[value] = new FastStats()\n }\n stats.push(1)\n }\n }\n }\n } catch (err) {\n log.error(`session getStats name: ${name} error: ${(err as Error).stack}`, err)\n }\n }\n }\n // Add external collected stats.\n for (const [id, data] of this.externalCollectedStats.entries()) {\n const { addedTime, externalStats, config } = data\n if (now - addedTime > this.rtcStatsTimeout * 1000) {\n log.debug(`remove externalCollectedStats from ${id}`)\n this.externalCollectedStats.delete(id)\n continue\n }\n log.debug(`add external stats from ${id}`)\n // Add external config settings.\n if (config.url) {\n this.collectedStatsConfig.url = config.url\n }\n if (config.pages) {\n this.collectedStatsConfig.pages += config.pages\n }\n // Add metrics.\n this.statsNames.forEach(name => {\n const stats = externalStats[name] as CollectedStatsRaw\n if (!stats) {\n return\n }\n const collectedStats = this.collectedStats[name]\n const prevByParticipantAndTrack = prevByParticipantAndTrackStats[name]\n collectedStats.all.push(stats.all)\n Object.entries(stats.byHost).forEach(([host, values]) => {\n if (!collectedStats.byHost[host]) {\n collectedStats.byHost[host] = new FastStats()\n }\n collectedStats.byHost[host].push(values)\n })\n Object.entries(stats.byCodec).forEach(([codec, values]) => {\n if (!collectedStats.byCodec[codec]) {\n collectedStats.byCodec[codec] = new FastStats()\n }\n collectedStats.byCodec[codec].push(values)\n })\n Object.entries(stats.byParticipantAndTrack).forEach(([label, value]) => {\n collectedStats.byParticipantAndTrack[label] = value\n prevByParticipantAndTrack.delete(label)\n })\n })\n }\n this.emit('stats', this.collectedStats)\n // Push to an external instance.\n if (this.pushStatsInstance) {\n const pushStats: Record<string, CollectedStatsRaw> = {}\n for (const [name, stats] of Object.entries(this.collectedStats)) {\n pushStats[name] = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n all: (stats.all as any).data,\n byHost: {},\n byCodec: {},\n byParticipantAndTrack: {},\n }\n Object.entries(stats.byHost).forEach(([host, stat]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pushStats[name].byHost[host] = (stat as any).data\n })\n Object.entries(stats.byCodec).forEach(([codec, stat]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pushStats[name].byCodec[codec] = (stat as any).data\n })\n Object.entries(stats.byParticipantAndTrack).forEach(([label, value]) => {\n pushStats[name].byParticipantAndTrack[label] = value\n })\n }\n try {\n const res = await this.pushStatsInstance.put('/collected-stats', {\n id: this.pushStatsId,\n stats: pushStats,\n config: this.collectedStatsConfig,\n })\n log.debug(`pushStats message=${res.data.message}`)\n } catch (err) {\n log.error(`pushStats error: ${(err as Error).stack}`)\n }\n }\n // Check alerts.\n this.checkAlertRules()\n // Show to console.\n this.consoleShowStats()\n\n await Promise.allSettled([\n this.writeStats(),\n this.writeDetailedStats(),\n this.sendToPushGateway(prevByParticipantAndTrackStats),\n this.writeAlertRulesReport(),\n ])\n }\n\n async writeStats() {\n if (!this.statsWriter) return\n const values = this.statsNames.reduce(\n (v: string[], name) => v.concat(formatStats(this.collectedStats[name].all, true) as string[]),\n [],\n )\n await this.statsWriter.push(values)\n }\n\n async writeDetailedStats() {\n if (!this.detailedStatsWriter) return\n const participantTrackStats = new Map<string, Record<string, string>>()\n Object.entries(this.collectedStats).forEach(([name, stats]) => {\n Object.entries(stats.byParticipantAndTrack).forEach(([label, value]) => {\n let stats = participantTrackStats.get(label)\n if (!stats) {\n stats = {}\n participantTrackStats.set(label, stats)\n }\n stats[name] = toPrecision(value, 6)\n })\n })\n for (const [label, trackStats] of participantTrackStats.entries()) {\n const [participantName, trackId] = label.split(':', 2)\n const values = [participantName, trackId]\n for (const name of this.statsNames) {\n values.push(trackStats[name] ?? '')\n }\n await this.detailedStatsWriter.push(values)\n }\n }\n\n /**\n * addCollectedStats\n * @param id\n * @param externalStats\n * @param config\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addExternalCollectedStats(id: string, externalStats: any, config: any): void {\n log.debug(`addExternalCollectedStats from ${id}`)\n const addedTime = Date.now()\n this.externalCollectedStats.set(id, { addedTime, externalStats, config })\n }\n\n /**\n * It display stats on the console.\n */\n consoleShowStats(): void {\n if (!this.showStats) {\n return\n }\n const stats = this.collectedStats\n let out =\n sprintfStatsHeader() +\n sprintfStats('System CPU', stats.usedCpu, '.2f', '%', undefined, true) +\n sprintfStats('System GPU', stats.usedGpu, '.2f', '%', undefined, true) +\n sprintfStats('System Memory', stats.usedMemory, '.2f', '%', undefined, true) +\n sprintfStats('CPU/page', stats.cpu, '.2f', '%') +\n sprintfStats('Memory/page', stats.memory, '.2f', 'MB') +\n sprintfStats('Pages', stats.pages, 'd', '') +\n sprintfStats('Errors', stats.errors, 'd', '') +\n sprintfStats('Warnings', stats.warnings, 'd', '') +\n sprintfStats('Peer Connections', stats.peerConnections, 'd', '') +\n sprintfStats('audioSubscribeDelay', stats.audioSubscribeDelay, 'd', 'ms', undefined, true) +\n sprintfStats('videoSubscribeDelay', stats.videoSubscribeDelay, 'd', 'ms', undefined, true) +\n // inbound audio\n sprintfStatsTitle('Inbound audio') +\n sprintfStats('received', stats.audioBytesReceived, '.2f', 'MB', 1e-6) +\n sprintfStats('rate', stats.audioRecvBitrates, '.2f', 'Kbps', 1e-3) +\n sprintfStats('lost', stats.audioRecvPacketsLost, '.2f', '%', undefined, true) +\n sprintfStats('jitter', stats.audioRecvJitter, '.2f', 's', undefined, true) +\n sprintfStats('avgJitterBufferDelay', stats.audioRecvAvgJitterBufferDelay, '.2f', 'ms', 1e3, true) +\n // inbound video\n sprintfStatsTitle('Inbound video') +\n sprintfStats('received', stats.videoRecvBytes, '.2f', 'MB', 1e-6) +\n sprintfStats('decoded', stats.videoFramesDecoded, 'd', 'frames') +\n sprintfStats('rate', stats.videoRecvBitrates, '.2f', 'Kbps', 1e-3) +\n sprintfStats('lost', stats.videoRecvPacketsLost, '.2f', '%', undefined, true) +\n sprintfStats('jitter', stats.videoRecvJitter, '.2f', 's', undefined, true) +\n sprintfStats('avgJitterBufferDelay', stats.videoRecvAvgJitterBufferDelay, '.2f', 'ms', 1e3, true) +\n sprintfStats('width', stats.videoRecvWidth, 'd', 'px', undefined, true) +\n sprintfStats('height', stats.videoRecvHeight, 'd', 'px', undefined, true) +\n sprintfStats('fps', stats.videoRecvFps, 'd', 'fps', undefined, true) +\n sprintfStats('firCountSent', stats.firCountSent, 'd', '', undefined, true) +\n sprintfStats('pliCountSent', stats.pliCountSent, 'd', '', undefined, true) +\n // outbound audio\n sprintfStatsTitle('Outbound audio') +\n sprintfStats('sent', stats.audioBytesSent, '.2f', 'MB', 1e-6) +\n sprintfStats('retransmitted', stats.audioRetransmittedBytesSent, '.2f', 'MB', 1e-6) +\n sprintfStats('rate', stats.audioSentBitrates, '.2f', 'Kbps', 1e-3) +\n sprintfStats('lost', stats.audioSentPacketsLost, '.2f', '%', undefined, true) +\n sprintfStats('roundTripTime', stats.audioSentRoundTripTime, '.3f', 's', undefined, true) +\n // outbound video\n sprintfStatsTitle('Outbound video') +\n sprintfStats('sent', stats.videoSentBytes, '.2f', 'MB', 1e-6) +\n sprintfStats('retransmitted', stats.videoSentRetransmittedBytes, '.2f', 'MB', 1e-6) +\n sprintfStats('rate', stats.videoSentBitrates, '.2f', 'Kbps', 1e-3) +\n sprintfStats('lost', stats.videoSentPacketsLost, '.2f', '%', undefined, true) +\n sprintfStats('roundTripTime', stats.videoSentRoundTripTime, '.3f', 's', undefined, true) +\n sprintfStats('qualityLimitResolutionChanges', stats.videoQualityLimitationResolutionChanges, 'd', '') +\n sprintfStats('qualityLimitationCpu', stats.videoQualityLimitationCpu, 'd', '%') +\n sprintfStats('qualityLimitationBandwidth', stats.videoQualityLimitationBandwidth, 'd', '%') +\n sprintfStats('sentActiveSpatialLayers', stats.videoSentActiveSpatialLayers, 'd', 'layers', undefined, true) +\n sprintfStats('sentMaxBitrate', stats.videoSentMaxBitrate, '.2f', 'Kbps', 1e-3) +\n sprintfStats('width', stats.videoSentWidth, 'd', 'px', undefined, true) +\n sprintfStats('height', stats.videoSentHeight, 'd', 'px', undefined, true) +\n sprintfStats('fps', stats.videoSentFps, 'd', 'fps', undefined, true) +\n sprintfStats('firCountReceived', stats.videoFirCountReceived, 'd', '', undefined, true) +\n sprintfStats('pliCountReceived', stats.videoPliCountReceived, 'd', '', undefined, true)\n if (this.alertRules) {\n const report = this.formatAlertRulesReport()\n if (report.length) {\n out += sprintfStatsTitle('Alert rules report')\n out += report\n }\n }\n\n if (!this.showPageLog) {\n console.clear()\n }\n console.log(out)\n }\n\n /**\n * sendToPushGateway\n */\n async sendToPushGateway(removedByParticipantAndTrackStats: Record<string, Set<string>>): Promise<void> {\n if (!this.gateway || !this.running) {\n return\n }\n const elapsedSeconds = (Date.now() - this.startTimestamp) / 1000\n const datetime = this.startTimestampString\n\n Object.entries(this.metrics).forEach(([name, metric]) => {\n if (!this.collectedStats[name]) {\n return\n }\n\n const setStats = (stats: FastStats, host: string, codec: string): void => {\n const labels = { host, codec, datetime, ...this.customMetricsLabels }\n const { length, sum, mean, stddev, p5, p95, min, max } = formatStats(stats) as StatsData\n metric.length.set(labels, length)\n metric.sum.set(labels, sum)\n metric.mean.set(labels, mean)\n metric.stddev.set(labels, stddev)\n metric.p5.set(labels, p5)\n metric.p95.set(labels, p95)\n metric.min.set(labels, min)\n metric.max.set(labels, max)\n }\n\n setStats(this.collectedStats[name].all, 'all', 'all')\n Object.entries(this.collectedStats[name].byHost).forEach(([host, stats]) => {\n setStats(stats, host, 'all')\n })\n Object.entries(this.collectedStats[name].byCodec).forEach(([codec, stats]) => {\n setStats(stats, 'all', codec)\n })\n if (metric.value) {\n Object.entries(this.collectedStats[name].byParticipantAndTrack).forEach(([label, value]) => {\n const [participantName, trackId] = label.split(':', 2)\n metric.value?.set(\n {\n participantName,\n trackId,\n datetime,\n ...this.customMetricsLabels,\n },\n value,\n )\n })\n }\n\n // Remove metrics for removed participants and tracks.\n const removedByParticipantAndTrack = removedByParticipantAndTrackStats[name]\n if (removedByParticipantAndTrack) {\n for (const label of removedByParticipantAndTrack) {\n const [participantName, trackId] = label.split(':', 2)\n metric.value?.remove({\n participantName,\n trackId,\n datetime,\n ...this.customMetricsLabels,\n })\n }\n }\n\n // Set alerts metrics.\n if (this.alertRules && this.alertRules[name]) {\n const rule = this.alertRules[name]\n // eslint-disable-next-line prefer-const\n for (let [ruleKey, ruleValues] of Object.entries(rule)) {\n if (ruleKey === 'tags') {\n continue\n }\n if (!Array.isArray(ruleValues)) {\n ruleValues = [ruleValues as AlertRuleValue]\n } else {\n ruleValues = ruleValues as AlertRuleValue[]\n }\n for (const ruleValue of ruleValues) {\n // Send rule values as metrics.\n if (ruleValue.$after !== undefined && elapsedSeconds < ruleValue.$after) {\n continue\n }\n const ruleName = `alert_${name}_${ruleKey}`\n const ruleObj = this.metrics[name].alertRules[ruleName]\n const remove = ruleValue.$before !== undefined && elapsedSeconds > ruleValue.$before\n // Send rule report as metric.\n const ruleDesc = this.getAlertRuleDesc(ruleKey, ruleValue)\n const report = this.alertRulesReport.get(name)\n if (report) {\n const ruleReport = report.get(ruleDesc)\n if (ruleReport) {\n const labels = {\n rule: ruleDesc,\n datetime,\n ...this.customMetricsLabels,\n }\n if (!remove) {\n ruleObj.report.set(labels, ruleReport.failAmountPercentile)\n ruleObj.mean.set(labels, ruleReport.valueStats.amean())\n } else {\n ruleObj.report.remove(labels)\n ruleObj.mean.remove(labels)\n }\n }\n }\n // Send rules values as metrics.\n if (ruleValue.$eq !== undefined) {\n const labels = {\n rule: `${name} ${ruleKey} =`,\n datetime,\n ...this.customMetricsLabels,\n }\n if (!remove) {\n ruleObj.rule.set(labels, ruleValue.$eq)\n } else {\n ruleObj.rule.remove(labels)\n }\n }\n if (ruleValue.$lt !== undefined) {\n const labels = {\n rule: `${name} ${ruleKey} <`,\n datetime,\n ...this.customMetricsLabels,\n }\n if (!remove) {\n ruleObj.rule.set(labels, ruleValue.$lt)\n } else {\n ruleObj.rule.remove(labels)\n }\n }\n if (ruleValue.$lte !== undefined) {\n const labels = {\n rule: `${name} ${ruleKey} <=`,\n datetime,\n ...this.customMetricsLabels,\n }\n if (!remove) {\n ruleObj.rule.set(labels, ruleValue.$lte)\n } else {\n ruleObj.rule.remove(labels)\n }\n }\n if (ruleValue.$gt !== undefined) {\n const labels = {\n rule: `${name} ${ruleKey} >`,\n datetime,\n ...this.customMetricsLabels,\n }\n if (!remove) {\n ruleObj.rule.set(labels, ruleValue.$gt)\n } else {\n ruleObj.rule.remove(labels)\n }\n }\n if (ruleValue.$gte !== undefined) {\n const labels = {\n rule: `${name} ${ruleKey} >=`,\n datetime,\n ...this.customMetricsLabels,\n }\n if (!remove) {\n ruleObj.rule.set(labels, ruleValue.$gte)\n } else {\n ruleObj.rule.remove(labels)\n }\n }\n }\n }\n }\n })\n\n const alertRulesReportTags = this.getAlertRulesTags()\n if (alertRulesReportTags && this.alertTagsMetrics) {\n for (const [tag, stat] of alertRulesReportTags.entries()) {\n this.alertTagsMetrics.set(\n { datetime, tag, ...this.customMetricsLabels },\n calculateFailAmountPercentile(stat, this.alertRulesFailPercentile),\n )\n }\n }\n\n try {\n const { resp, body } = await this.gateway.push({\n jobName: this.prometheusPushgatewayJobName,\n })\n if ((body as string).length) {\n log.warn(`Pushgateway error ${(resp as http.ServerResponse).statusCode}: ${body as string}`)\n }\n } catch (err) {\n log.error(`Pushgateway push error: ${(err as Error).stack}`)\n }\n }\n\n /**\n * alertRuleDesc\n */\n getAlertRuleDesc(ruleKey: string, ruleValue: AlertRuleValue): string {\n const ruleDescs = []\n if (ruleValue.$eq !== undefined) {\n ruleDescs.push(`= ${ruleValue.$eq}`)\n }\n if (ruleValue.$gt !== undefined) {\n ruleDescs.push(`> ${ruleValue.$gt}`)\n }\n if (ruleValue.$gte !== undefined) {\n ruleDescs.push(`>= ${ruleValue.$gte}`)\n }\n if (ruleValue.$lt !== undefined) {\n ruleDescs.push(`< ${ruleValue.$lt}`)\n }\n if (ruleValue.$lte !== undefined) {\n ruleDescs.push(`<= ${ruleValue.$lte}`)\n }\n let ruleDesc = `${ruleKey} ${ruleDescs.join(' and ')}`\n if (ruleValue.$after !== undefined) {\n ruleDesc += ` after ${ruleValue.$after}s`\n }\n if (ruleValue.$before !== undefined) {\n ruleDesc += ` before ${ruleValue.$before}s`\n }\n return ruleDesc\n }\n\n /**\n * checkAlertRules\n */\n checkAlertRules(): void {\n if (!this.alertRules || !this.running) {\n return\n }\n const now = Date.now()\n const elapsedSeconds = (now - this.startTimestamp) / 1000\n\n for (const [key, rule] of Object.entries(this.alertRules)) {\n if (!this.collectedStats[key]) {\n continue\n }\n let failPercentile = this.alertRulesFailPercentile\n const value = formatStats(this.collectedStats[key].all) as StatsData\n // eslint-disable-next-line prefer-const\n for (let [ruleKey, ruleValues] of Object.entries(rule)) {\n if (['tags', 'failPercentile'].includes(ruleKey)) {\n if (ruleKey === 'failPercentile') {\n failPercentile = ruleValues as number\n }\n continue\n }\n if (!Array.isArray(ruleValues)) {\n ruleValues = [ruleValues as AlertRuleValue]\n } else {\n ruleValues = ruleValues as AlertRuleValue[]\n }\n let ruleElapsedSeconds = elapsedSeconds\n for (const ruleValue of ruleValues) {\n if (\n (ruleValue.$after !== undefined && elapsedSeconds < ruleValue.$after) ||\n (ruleValue.$before !== undefined && elapsedSeconds > ruleValue.$before)\n ) {\n continue\n }\n if (ruleValue.$after !== undefined) {\n ruleElapsedSeconds -= ruleValue.$after\n }\n const checkValue = value[ruleKey as StatsDataKey]\n if (!isFinite(checkValue)) {\n continue\n }\n const ruleDesc = this.getAlertRuleDesc(ruleKey, ruleValue)\n let failed = false\n let failAmount = 0\n\n if (\n (ruleValue.$skip_lt !== undefined && checkValue < ruleValue.$skip_lt) ||\n (ruleValue.$skip_lte !== undefined && checkValue <= ruleValue.$skip_lte) ||\n (ruleValue.$skip_gt !== undefined && checkValue > ruleValue.$skip_gt) ||\n (ruleValue.$skip_gte !== undefined && checkValue >= ruleValue.$skip_gte)\n ) {\n continue\n }\n\n if (ruleValue.$eq !== undefined) {\n if (checkValue !== ruleValue.$eq) {\n failed = true\n failAmount = calculateFailAmount(checkValue, ruleValue.$eq)\n }\n } else {\n if (ruleValue.$lt !== undefined) {\n if (checkValue >= ruleValue.$lt) {\n failed = true\n failAmount = calculateFailAmount(checkValue, ruleValue.$lt)\n }\n } else if (ruleValue.$lte !== undefined) {\n if (checkValue > ruleValue.$lte) {\n failed = true\n failAmount = calculateFailAmount(checkValue, ruleValue.$lte)\n }\n }\n if (!failed) {\n if (ruleValue.$gt !== undefined) {\n if (checkValue <= ruleValue.$gt) {\n failed = true\n failAmount = calculateFailAmount(checkValue, ruleValue.$gt)\n }\n } else if (ruleValue.$gte !== undefined) {\n if (checkValue < ruleValue.$gte) {\n failed = true\n failAmount = calculateFailAmount(checkValue, ruleValue.$gte)\n }\n }\n }\n }\n // Report if failed or not.\n this.updateRulesReport(key, checkValue, ruleDesc, failed, failAmount, now, ruleElapsedSeconds, failPercentile)\n }\n }\n }\n }\n\n /**\n * addFailedRule\n */\n updateRulesReport(\n key: string,\n checkValue: number,\n ruleDesc: string,\n failed: boolean,\n failAmount: number,\n now: number,\n elapsedSeconds: number,\n failPercentile: number,\n ): void {\n if (failed) {\n log.debug(\n `updateRulesReport ${key}.${ruleDesc} failed: ${failed} checkValue: ${checkValue} failAmount: ${failAmount} elapsedSeconds: ${elapsedSeconds}`,\n )\n }\n let report = this.alertRulesReport.get(key)\n if (!report) {\n report = new Map()\n this.alertRulesReport.set(key, report)\n }\n let reportValue = report.get(ruleDesc)\n if (!reportValue) {\n reportValue = {\n totalFails: 0,\n totalFailsTime: 0,\n totalFailsTimePerc: 0,\n lastFailed: 0,\n valueStats: new FastStats(),\n failAmountStats: new FastStats(),\n failAmountPercentile: 0,\n }\n report.set(ruleDesc, reportValue)\n }\n if (failed) {\n reportValue.totalFails += 1\n if (reportValue.lastFailed) {\n reportValue.totalFailsTime += (now - reportValue.lastFailed) / 1000\n }\n reportValue.lastFailed = now\n } else {\n reportValue.lastFailed = 0\n }\n reportValue.totalFailsTimePerc = Math.round((100 * reportValue.totalFailsTime) / elapsedSeconds)\n reportValue.valueStats.push(checkValue)\n reportValue.failAmountStats.push(failAmount)\n reportValue.failAmountPercentile = calculateFailAmountPercentile(reportValue.failAmountStats, failPercentile)\n }\n\n getAlertRulesTags(): Map<string, FastStats> | undefined {\n if (!this.alertRules) {\n return\n }\n const alertRulesReportTags = new Map<string, FastStats>()\n for (const [key, report] of this.alertRulesReport.entries()) {\n const tags = this.alertRules[key].tags || []\n for (const tag of tags) {\n if (!alertRulesReportTags.has(tag)) {\n alertRulesReportTags.set(tag, new FastStats())\n }\n }\n for (const reportValue of report.values()) {\n const { failAmountPercentile } = reportValue\n for (const tag of tags) {\n const stat = alertRulesReportTags.get(tag)\n if (!stat) {\n continue\n }\n stat.push(failAmountPercentile)\n }\n }\n }\n return alertRulesReportTags\n }\n\n /**\n * formatAlertRulesReport\n * @param ext\n */\n formatAlertRulesReport(ext: string | null = null): string {\n if (!this.alertRulesReport || !this.alertRules) {\n return ''\n }\n // Update tags values.\n const alertRulesReportTags = this.getAlertRulesTags()!\n // JSON output.\n if (ext === 'json') {\n const out = {\n tags: {} as Record<string, number>,\n reports: {} as Record<\n string,\n {\n totalFails: number\n totalFailsTime: number\n totalFailsTimePerc: number\n failAmount: number\n count: number\n valueAverage: number\n // failAmountStats: number[]\n }\n >,\n }\n for (const [key, report] of this.alertRulesReport.entries()) {\n for (const [reportDesc, reportValue] of report.entries()) {\n const { totalFails, totalFailsTime, valueStats, totalFailsTimePerc, failAmountStats, failAmountPercentile } =\n reportValue\n if (totalFails) {\n out.reports[`${key} ${reportDesc}`] = {\n totalFails,\n totalFailsTime: Math.round(totalFailsTime),\n valueAverage: valueStats.amean(),\n totalFailsTimePerc,\n failAmount: failAmountPercentile,\n count: failAmountStats.length,\n\n // failAmountStats: (failAmountStats as any).data as number[],\n }\n }\n }\n }\n for (const [tag, stat] of alertRulesReportTags.entries()) {\n out.tags[tag] = calculateFailAmountPercentile(stat, this.alertRulesFailPercentile)\n }\n return JSON.stringify(out, null, 2)\n }\n // Textual output.\n let out = ''\n // Calculate max column size.\n let colSize = 20\n for (const [key, report] of this.alertRulesReport.entries()) {\n for (const [reportDesc, reportValue] of report.entries()) {\n const { totalFails, totalFailsTimePerc } = reportValue\n if (totalFails && totalFailsTimePerc > 0) {\n const check = `${key} ${reportDesc}`\n colSize = Math.max(colSize, check.length)\n }\n }\n }\n if (ext) {\n out += sprintf(\n `| %(check)-${colSize}s | %(total)-10s | %(totalFailsTime)-15s | %(totalFailsTimePerc)-15s | %(failAmount)-15s |\\n`,\n {\n check: 'Condition',\n total: 'Fails',\n totalFailsTime: 'Fail time (s)',\n totalFailsTimePerc: 'Fail time (%)',\n failAmount: 'Fail amount %',\n },\n )\n } else {\n out += sprintf(\n chalk`{bold %(check)-${colSize}s} {bold %(total)-10s} {bold %(totalFailsTime)-15s} {bold %(totalFailsTimePerc)-15s} {bold %(failAmount)-15s}\\n`,\n {\n check: 'Condition',\n total: 'Fails',\n totalFailsTime: 'Fail time (s)',\n totalFailsTimePerc: 'Fail time (%)',\n failAmount: 'Fail amount %',\n },\n )\n }\n for (const [key, report] of this.alertRulesReport.entries()) {\n for (const [reportDesc, reportValue] of report.entries()) {\n const { totalFails, totalFailsTime, failAmountPercentile, totalFailsTimePerc } = reportValue\n if (totalFails && totalFailsTimePerc > 0) {\n if (ext) {\n out += sprintf(\n `| %(check)-${colSize}s | %(totalFails)-10s | %(totalFailsTime)-15s | %(totalFailsTimePerc)-15s | %(failAmountPercentile)-15s |\\n`,\n {\n check: `${key} ${reportDesc}`,\n totalFails,\n totalFailsTime: Math.round(totalFailsTime),\n totalFailsTimePerc,\n failAmountPercentile,\n },\n )\n } else {\n out += sprintf(\n chalk`{red {bold %(check)-${colSize}s}} {bold %(totalFails)-10s} {bold %(totalFailsTime)-15s} {bold %(totalFailsTimePerc)-15s} {bold %(failAmountPercentile)-15s}\\n`,\n {\n check: `${key} ${reportDesc}`,\n totalFails,\n totalFailsTime: Math.round(totalFailsTime),\n totalFailsTimePerc,\n failAmountPercentile,\n },\n )\n }\n }\n }\n }\n // Tags report.\n if (ext) {\n out += sprintf(`%(fill)s\\n`, { fill: '-'.repeat(colSize + 15 + 7) })\n\n out += sprintf(`| %(name)-${colSize}s | %(failPerc)-15s |\\n`, {\n name: 'Tag',\n failPerc: 'Fail %',\n })\n } else {\n out += sprintf(`%(fill)s\\n`, { fill: '-'.repeat(colSize + 15) })\n\n out += sprintf(chalk`{bold %(name)-${colSize}s} {bold %(failPerc)-15s}\\n`, {\n name: 'Tag',\n failPerc: 'Fail %',\n })\n }\n for (const [tag, stat] of alertRulesReportTags.entries()) {\n const failPerc = calculateFailAmountPercentile(stat, this.alertRulesFailPercentile)\n if (ext) {\n out += sprintf(`| %(tag)-${colSize}s | %(failPerc)-15s |\\n`, {\n tag,\n failPerc,\n })\n } else {\n const color = failPerc < 5 ? 'green' : failPerc < 25 ? 'yellowBright' : failPerc < 50 ? 'yellow' : 'red'\n\n out += sprintf(chalk`{${color} {bold %(tag)-${colSize}s %(failPerc)-15s}}\\n`, {\n tag,\n failPerc,\n })\n }\n }\n return out\n }\n\n /**\n * writeAlertRulesReport\n */\n async writeAlertRulesReport(): Promise<void> {\n if (!this.alertRules || !this.alertRulesFilename || !this.running) {\n return\n }\n log.debug(`writeAlertRulesReport writing in ${this.alertRulesFilename}`)\n try {\n const ext = this.alertRulesFilename.split('.').slice(-1)[0]\n const report = this.formatAlertRulesReport(ext)\n if (!report.length) {\n return\n }\n let out\n if (ext === 'log') {\n const lines = report.split('\\n').filter(line => line.length)\n const name = `Alert rules report (${new Date().toISOString()})`\n out = sprintf(`-- %(name)s %(fill)s\\n`, {\n name,\n fill: '-'.repeat(Math.max(4, lines[0].length - name.length - 4)),\n })\n out += report\n out += sprintf(`%(fill)s\\n`, {\n fill: '-'.repeat(lines[lines.length - 1].length),\n })\n } else {\n out = report\n }\n await fs.promises.mkdir(path.dirname(this.alertRulesFilename), {\n recursive: true,\n })\n await fs.promises.writeFile(this.alertRulesFilename, out)\n } catch (err) {\n log.error(`writeAlertRulesReport error: ${(err as Error).stack}`)\n }\n }\n\n /**\n * Stop the stats collector and the added Sessions.\n */\n async stop(): Promise<void> {\n if (!this.running) {\n return\n }\n this.running = false\n log.debug('stop')\n if (this.scheduler) {\n this.scheduler.stop()\n this.scheduler = undefined\n }\n\n for (const session of this.sessions.values()) {\n try {\n session.removeAllListeners()\n await session.stop()\n } catch (err) {\n log.error(`session stop error: ${(err as Error).stack}`)\n }\n }\n this.sessions.clear()\n\n this.statsWriter = null\n\n // delete metrics\n if (this.gateway) {\n await this.deletePushgatewayStats()\n this.gateway = null\n this.metrics = {}\n }\n\n this.collectedStats = this.initCollectedStats()\n this.externalCollectedStats.clear()\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/stats.ts"],"names":[],"mappings":"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","sourcesContent":["import axios from 'axios'\nimport chalk from 'chalk'\nimport * as events from 'events'\nimport { Stats as FastStats } from 'fast-stats'\nimport * as fs from 'fs'\nimport * as http from 'http'\nimport * as https from 'https'\nimport json5 from 'json5'\nimport * as path from 'path'\nimport * as promClient from 'prom-client'\nimport { PrometheusContentType } from 'prom-client'\nimport { sprintf } from 'sprintf-js'\nimport * as zlib from 'zlib'\n\nimport { PageStatsNames, RtcStatsMetricNames, parseRtStatKey } from './rtcstats'\nimport { Session } from './session'\nimport { Scheduler, enabledForSession, hideAuth, logger, toPrecision } from './utils'\n\nexport { FastStats }\n\nconst log = logger('webrtcperf:stats')\n\nfunction calculateFailAmountPercentile(stat: FastStats, percentile = 95): number {\n return Math.round(stat.percentile(percentile))\n}\n\n/**\n * StatsWriter\n */\nclass StatsWriter {\n fname: string\n columns: string[]\n private _header_written = false\n\n constructor(fname = 'stats.log', columns: string[]) {\n this.fname = fname\n this.columns = columns\n }\n\n /**\n * push\n * @param dataColumns\n */\n async push(dataColumns: string[]): Promise<void> {\n if (!this._header_written) {\n const data = ['datetime', ...this.columns].join(',') + '\\n'\n await fs.promises.mkdir(path.dirname(this.fname), { recursive: true })\n await fs.promises.writeFile(this.fname, data)\n this._header_written = true\n }\n //\n const data = [Date.now(), ...dataColumns].join(',') + '\\n'\n return fs.promises.appendFile(this.fname, data)\n }\n}\n\n/**\n * formatStatsColumns\n * @param column\n */\nfunction formatStatsColumns(column: string): string[] {\n return [\n `${column}_length`,\n `${column}_sum`,\n `${column}_mean`,\n `${column}_stdev`,\n `${column}_5p`,\n `${column}_95p`,\n `${column}_min`,\n `${column}_max`,\n ]\n}\n\n/** The Stats data collected for each metric. */\ninterface StatsData {\n /** The total samples collected. */\n length: number\n /** The sum of all the samples. */\n sum: number\n /** The average value. */\n mean: number\n /** The standard deviation. */\n stddev: number\n /** The 5th percentile. */\n p5: number\n /** The 95th percentile. */\n p95: number\n /** The minimum value. */\n min: number\n /** The maximum value. */\n max: number\n}\n\ntype StatsDataKey = keyof StatsData\n\nexport interface CollectedStats {\n all: FastStats\n byHost: Record<string, FastStats>\n byCodec: Record<string, FastStats>\n byParticipantAndTrack: Record<string, number>\n}\n\nexport interface CollectedStatsRaw {\n all: number[]\n byHost: Record<string, number[]>\n byCodec: Record<string, number[]>\n byParticipantAndTrack: Record<string, number>\n}\n\n/**\n * Formats the stats for console or for file output.\n * @param s The stats object.\n * @param forWriter If true, format the stats to be written on file.\n */\nfunction formatStats(s: FastStats, forWriter = false): StatsData | string[] {\n if (forWriter) {\n return [\n toPrecision(s.length || 0, 0),\n toPrecision(s.sum || 0),\n toPrecision(s.amean() || 0),\n toPrecision(s.stddev() || 0),\n toPrecision(s.percentile(5) || 0),\n toPrecision(s.percentile(95) || 0),\n toPrecision(s.min || 0),\n toPrecision(s.max || 0),\n ]\n }\n return {\n length: s.length || 0,\n sum: s.sum || 0,\n mean: s.amean() || 0,\n stddev: s.stddev() || 0,\n p5: s.percentile(5) || 0,\n p95: s.percentile(95) || 0,\n min: s.min || 0,\n max: s.max || 0,\n }\n}\n\n/**\n * Formats the console stats title.\n * @param name\n */\nfunction sprintfStatsTitle(name: string): string {\n return sprintf(chalk`-- {bold %(name)s} %(fill)s\\n`, {\n name,\n fill: '-'.repeat(100 - name.length - 4),\n })\n}\n\n/**\n * Formats the console stats header.\n */\nfunction sprintfStatsHeader(): string {\n return (\n sprintfStatsTitle(new Date().toUTCString()) +\n sprintf(\n chalk`{bold %(name)\\' 30s} {bold %(length)\\' 8s} {bold %(sum)\\' 8s} {bold %(mean)\\' 8s} {bold %(stddev)\\' 8s} {bold %(p5)\\' 8s} {bold %(p95)\\' 8s} {bold %(min)\\' 8s} {bold %(max)\\' 8s}\\n`,\n {\n name: 'name',\n length: 'count',\n sum: 'sum',\n mean: 'mean',\n stddev: 'stddev',\n p5: '5p',\n p95: '95p',\n min: 'min',\n max: 'max',\n },\n )\n )\n}\n\n/**\n * Format the stats for console output.\n */\nfunction sprintfStats(\n name: string,\n stats: CollectedStats,\n format = '.2f',\n unit = '',\n scale = 1,\n hideSum = false,\n): string {\n if (!stats?.all.length) {\n return ''\n }\n if (!scale) {\n scale = 1\n }\n const statsData = formatStats(stats.all) as StatsData\n return sprintf(\n chalk`{red {bold %(name)\\' 30s}}` +\n chalk` {bold %(length)\\' 8d}` +\n (hideSum ? ' ' : chalk` {bold %(sum)\\' 8${format}}`) +\n chalk` {bold %(mean)\\' 8${format}}` +\n chalk` {bold %(stddev)\\' 8${format}}` +\n chalk` {bold %(p5)\\' 8${format}}` +\n chalk` {bold %(p95)\\' 8${format}}` +\n chalk` {bold %(min)\\' 8${format}}` +\n chalk` {bold %(max)\\' 8${format}}%(unit)s\\n`,\n {\n name,\n length: statsData.length,\n sum: statsData.sum * scale,\n mean: statsData.mean * scale,\n stddev: statsData.stddev * scale,\n p5: statsData.p5 * scale,\n p95: statsData.p95 * scale,\n min: statsData.min * scale,\n max: statsData.max * scale,\n unit: unit ? chalk` {red {bold ${unit}}}` : '',\n },\n )\n}\n\nconst promPrefix = 'wst_'\n\nconst promCreateGauge = (\n register: promClient.Registry,\n name: string,\n suffix = '',\n labelNames: string[] = [],\n collect?: () => void,\n): promClient.Gauge<string> => {\n return new promClient.Gauge({\n name: `${promPrefix}${name}${suffix && '_' + suffix}`,\n help: `${name} ${suffix}`,\n labelNames,\n registers: [register],\n collect,\n })\n}\n\n/**\n * The alert rule description.\n *\n * Example:\n * ```\n cpu:\n tags:\n - performance\n failPercentile: 90\n p95:\n $gt: 10\n $lt: 100\n $after: 60\n * ```\n * It will check if the `cpu` 95th percentile is lower than 100% and greater than 10%,\n * starting the check after 60s from the test start. The alert results will be\n * grouped into the `performance` category.\n */\nexport type AlertRule = AlertRuleOption & AlertRuleKey\n\n/**\n * The alert rule options.\n */\nexport interface AlertRuleOption {\n /** The alert results will be grouped into the specified categories. */\n tags: string[]\n /** The alert will pass when at least `failPercentile` of the checks (95 by default) are successful. */\n failPercentile?: number\n}\n\n/**\n * The supported alert rule checks.\n */\nexport interface AlertRuleKey {\n /** The total collected samples. */\n length?: AlertRuleValue | AlertRuleValue[]\n /** The sum of the collected samples. */\n sum?: AlertRuleValue | AlertRuleValue[]\n /** The 95th percentile of the collected samples. */\n p95?: AlertRuleValue | AlertRuleValue[]\n /** The 5th percentile of the collected samples. */\n p5?: AlertRuleValue | AlertRuleValue[]\n /** The minimum of the collected samples. */\n min?: AlertRuleValue | AlertRuleValue[]\n /** The maximum of the collected samples. */\n max?: AlertRuleValue | AlertRuleValue[]\n}\n\n/**\n * The alert check operators.\n */\nexport interface AlertRuleValue {\n $eq?: number\n $gt?: number\n $lt?: number\n $gte?: number\n $lte?: number\n $after?: number\n $before?: number\n $skip_lt?: number\n $skip_lte?: number\n $skip_gt?: number\n $skip_gte?: number\n}\n\nconst calculateFailAmount = (checkValue: number, ruleValue: number): number => {\n if (ruleValue) {\n return 100 * Math.min(1, Math.abs(checkValue - ruleValue) / ruleValue)\n } else {\n return 100 * Math.min(1, Math.abs(checkValue))\n }\n}\n\n/**\n * The Stats collector class.\n */\nexport class Stats extends events.EventEmitter {\n readonly statsPath: string\n readonly detailedStatsPath: string\n readonly prometheusPushgateway: string\n readonly prometheusPushgatewayJobName: string\n readonly prometheusPushgatewayAuth?: string\n readonly prometheusPushgatewayGzip?: boolean\n readonly showStats: boolean\n readonly showPageLog: boolean\n readonly statsInterval: number\n readonly rtcStatsTimeout: number\n readonly customMetrics: Record<string, { labels?: string[] }> = {}\n readonly startTimestamp: number\n readonly enableDetailedStats: boolean | string | number\n private readonly startTimestampString: string\n\n readonly sessions = new Map<number, Session>()\n nextSessionId: number\n statsWriter: StatsWriter | null\n detailedStatsWriter: StatsWriter | null\n private scheduler?: Scheduler\n\n private alertRules: Record<string, AlertRule> | null = null\n readonly alertRulesOutput: string\n private readonly alertRulesFailPercentile: number\n private readonly pushStatsUrl: string\n private readonly pushStatsId: string\n private readonly serverSecret: string\n\n private readonly alertRulesReport = new Map<\n string,\n Map<\n string,\n {\n totalFails: number\n totalFailsTime: number\n totalFailsTimePerc: number\n lastFailed: number\n valueStats: FastStats\n failAmountStats: FastStats\n failAmountPercentile: number\n }\n >\n >()\n private gateway: promClient.Pushgateway<PrometheusContentType> | null = null\n\n /* metricConfigGauge: promClient.Gauge<string> | null = null */\n private elapsedTimeMetric: promClient.Gauge<string> | null = null\n private metrics: Record<\n string,\n {\n length: promClient.Gauge<string>\n sum: promClient.Gauge<string>\n mean: promClient.Gauge<string>\n stddev: promClient.Gauge<string>\n p5: promClient.Gauge<string>\n p95: promClient.Gauge<string>\n min: promClient.Gauge<string>\n max: promClient.Gauge<string>\n value?: promClient.Gauge<string>\n alertRules: Record<\n string,\n {\n report: promClient.Gauge<string>\n rule: promClient.Gauge<string>\n mean: promClient.Gauge<string>\n }\n >\n }\n > = {}\n\n private alertTagsMetrics?: promClient.Gauge<string>\n private readonly customMetricsLabels: Record<string, string | undefined>\n\n collectedStats: Record<string, CollectedStats>\n\n collectedStatsConfig = {\n url: '',\n pages: 0,\n startTime: 0,\n }\n externalCollectedStats = new Map<\n string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { addedTime: number; externalStats: any; config: any }\n >()\n pushStatsInstance: axios.AxiosInstance | null = null\n\n private running = false\n\n /**\n * Stats aggregator class.\n */\n constructor({\n statsPath,\n detailedStatsPath,\n prometheusPushgateway,\n prometheusPushgatewayJobName,\n prometheusPushgatewayAuth,\n prometheusPushgatewayGzip,\n showStats,\n showPageLog,\n statsInterval,\n rtcStatsTimeout,\n customMetrics,\n alertRules,\n alertRulesOutput,\n alertRulesFailPercentile,\n pushStatsUrl,\n pushStatsId,\n serverSecret,\n startSessionId,\n startTimestamp,\n enableDetailedStats,\n customMetricsLabels,\n }: {\n statsPath: string\n detailedStatsPath: string\n prometheusPushgateway: string\n prometheusPushgatewayJobName: string\n prometheusPushgatewayAuth: string\n prometheusPushgatewayGzip: boolean\n showStats: boolean\n showPageLog: boolean\n statsInterval: number\n rtcStatsTimeout: number\n customMetrics: string\n alertRules: string\n alertRulesOutput: string\n alertRulesFailPercentile: number\n pushStatsUrl: string\n pushStatsId: string\n serverSecret: string\n startSessionId: number\n startTimestamp: number\n enableDetailedStats: boolean | string | number\n customMetricsLabels?: string\n }) {\n super()\n this.statsPath = statsPath\n this.detailedStatsPath = detailedStatsPath\n this.prometheusPushgateway = prometheusPushgateway\n this.prometheusPushgatewayJobName = prometheusPushgatewayJobName || 'default'\n this.prometheusPushgatewayAuth = prometheusPushgatewayAuth || undefined\n this.prometheusPushgatewayGzip = prometheusPushgatewayGzip\n this.showStats = showStats !== undefined ? showStats : true\n this.showPageLog = !!showPageLog\n this.statsInterval = statsInterval || 10\n this.rtcStatsTimeout = Math.max(rtcStatsTimeout, this.statsInterval)\n if (customMetrics.trim()) {\n this.customMetrics = json5.parse(customMetrics)\n log.debug(`using customMetrics: ${JSON.stringify(this.customMetrics, undefined, 2)}`)\n }\n\n this.collectedStats = this.initCollectedStats()\n this.sessions = new Map()\n this.nextSessionId = startSessionId\n this.startTimestamp = startTimestamp || Date.now()\n this.startTimestampString = new Date(this.startTimestamp).toISOString()\n this.enableDetailedStats = enableDetailedStats\n this.customMetricsLabels = customMetricsLabels\n ? customMetricsLabels.split(',').reduce(\n (p, label) => {\n label = label.trim()\n if (label) {\n p[label] = undefined\n }\n return p\n },\n {} as typeof this.customMetricsLabels,\n )\n : {}\n\n this.statsWriter = null\n this.detailedStatsWriter = null\n if (alertRules.trim()) {\n this.alertRules = json5.parse(alertRules)\n log.debug(`using alertRules: ${JSON.stringify(this.alertRules, undefined, 2)}`)\n }\n this.alertRulesOutput = alertRulesOutput\n this.alertRulesFailPercentile = alertRulesFailPercentile\n this.pushStatsUrl = pushStatsUrl\n this.pushStatsId = pushStatsId\n this.serverSecret = serverSecret\n\n if (this.pushStatsUrl) {\n const httpAgent = new http.Agent({ keepAlive: false })\n const httpsAgent = new https.Agent({\n keepAlive: false,\n rejectUnauthorized: false,\n })\n this.pushStatsInstance = axios.create({\n httpAgent,\n httpsAgent,\n baseURL: this.pushStatsUrl,\n auth: {\n username: 'admin',\n password: this.serverSecret,\n },\n maxBodyLength: 20000000,\n transformRequest: [\n ...(axios.defaults.transformRequest as axios.AxiosRequestTransformer[]),\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (data: any, headers?: axios.AxiosRequestHeaders): any => {\n if (headers && typeof data === 'string' && data.length > 16 * 1024) {\n headers['Content-Encoding'] = 'gzip'\n return zlib.gzipSync(data)\n } else {\n return data\n }\n },\n ],\n })\n }\n }\n\n private initCollectedStats(): Record<string, CollectedStats> {\n return this.statsNames.reduce(\n (prev, name: string) => {\n prev[name] = {\n all: new FastStats(),\n byHost: {},\n byCodec: {},\n byParticipantAndTrack: {},\n } as CollectedStats\n return prev\n },\n {} as Record<string, CollectedStats>,\n )\n }\n\n private get statsNames(): string[] {\n return Object.keys(PageStatsNames).concat(Object.keys(RtcStatsMetricNames)).concat(Object.keys(this.customMetrics))\n }\n\n /**\n * consumeSessionId\n * @param tabs the number of tabs to allocate in the same session.\n */\n consumeSessionId(tabs = 1): number {\n const id = this.nextSessionId\n this.nextSessionId += tabs\n return id\n }\n\n /**\n * Adds the session to the list of monitored sessions.\n */\n addSession(session: Session): void {\n log.debug(`addSession ${session.id}`)\n if (this.sessions.has(session.id)) {\n throw new Error(`session id ${session.id} already present`)\n }\n session.once('stop', id => {\n log.debug(`Session ${id} stopped`)\n this.sessions.delete(id)\n })\n this.sessions.set(session.id, session)\n }\n\n /**\n * Removes the session from list of monitored sessions.\n * @param id the Session id\n */\n removeSession(id: number): void {\n log.debug(`removeSession ${id}`)\n this.sessions.delete(id)\n }\n\n /**\n * It updates the custom label value.\n * @param label the custom metric label\n * @param value the custom metric label value\n */\n setCustomMetricLabel(label: string, value: string | undefined): void {\n if (!(label in this.customMetricsLabels)) {\n throw new Error(`Unknown custom metric label: ${label}`)\n }\n this.customMetricsLabels[label] = value\n }\n\n /**\n * start\n */\n async start(): Promise<void> {\n if (this.running) {\n log.warn('already running')\n return\n }\n log.debug('start')\n this.running = true\n\n if (this.statsPath) {\n log.debug(`Logging stats into ${this.statsPath}`)\n const headers = this.statsNames.reduce((v: string[], name) => v.concat(formatStatsColumns(name)), [])\n this.statsWriter = new StatsWriter(this.statsPath, headers)\n }\n\n if (this.detailedStatsPath) {\n log.debug(`Logging stats into ${this.statsPath}`)\n this.detailedStatsWriter = new StatsWriter(this.detailedStatsPath, [\n 'participantName',\n 'trackId',\n ...this.statsNames,\n ])\n }\n\n if (this.prometheusPushgateway) {\n const register = new promClient.Registry()\n const agent = this.prometheusPushgateway.startsWith('https://')\n ? new https.Agent({\n keepAlive: true,\n keepAliveMsecs: 60000,\n maxSockets: 5,\n })\n : new http.Agent({\n keepAlive: true,\n keepAliveMsecs: 60000,\n maxSockets: 5,\n })\n this.gateway = new promClient.Pushgateway(\n this.prometheusPushgateway,\n {\n timeout: 5000,\n auth: this.prometheusPushgatewayAuth,\n rejectUnauthorized: false,\n agent,\n headers: this.prometheusPushgatewayGzip\n ? {\n 'Content-Encoding': 'gzip',\n }\n : undefined,\n },\n register,\n )\n\n // promClient.collectDefaultMetrics({ prefix: promPrefix, register })\n\n this.elapsedTimeMetric = promCreateGauge(\n register,\n 'elapsedTime',\n '',\n ['datetime', ...Object.keys(this.customMetricsLabels)],\n () =>\n this.elapsedTimeMetric?.set(\n {\n datetime: this.startTimestampString,\n ...this.customMetricsLabels,\n },\n (Date.now() - this.startTimestamp) / 1000,\n ),\n )\n\n // Export rtc stats.\n this.statsNames.forEach(name => {\n this.metrics[name] = {\n length: promCreateGauge(register, name, 'length', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n sum: promCreateGauge(register, name, 'sum', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n mean: promCreateGauge(register, name, 'mean', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n stddev: promCreateGauge(register, name, 'stddev', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n p5: promCreateGauge(register, name, 'p5', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n p95: promCreateGauge(register, name, 'p95', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n min: promCreateGauge(register, name, 'min', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n max: promCreateGauge(register, name, 'max', [\n 'host',\n 'codec',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n alertRules: {},\n }\n\n if (this.enableDetailedStats !== false) {\n this.metrics[name].value = promCreateGauge(register, name, '', [\n 'participantName',\n 'trackId',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ])\n }\n\n if (this.alertRules && this.alertRules[name]) {\n const rule = this.alertRules[name]\n for (const ruleKey of Object.keys(rule)) {\n const ruleName = `alert_${name}_${ruleKey}`\n this.metrics[name].alertRules[ruleName] = {\n report: promCreateGauge(register, ruleName, 'report', [\n 'rule',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n rule: promCreateGauge(register, ruleName, '', [\n 'rule',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n mean: promCreateGauge(register, ruleName, 'mean', [\n 'rule',\n 'datetime',\n ...Object.keys(this.customMetricsLabels),\n ]),\n }\n }\n }\n })\n\n if (this.alertRules) {\n this.alertTagsMetrics = promCreateGauge(register, `alert_report`, '', [\n 'datetime',\n 'tag',\n ...Object.keys(this.customMetricsLabels),\n ])\n }\n\n await this.deletePushgatewayStats()\n }\n\n this.scheduler = new Scheduler('stats', this.statsInterval, this.collectStats.bind(this))\n this.scheduler.start()\n }\n\n async deletePushgatewayStats(): Promise<void> {\n if (!this.gateway) {\n return\n }\n try {\n const { resp, body } = await this.gateway.delete({\n jobName: this.prometheusPushgatewayJobName,\n })\n if ((body as string).length) {\n log.warn(`Pushgateway delete error ${(resp as http.ServerResponse).statusCode}: ${body as string}`)\n }\n } catch (err) {\n log.error(`Pushgateway delete error: ${(err as Error).stack}`)\n }\n }\n\n /**\n * collectStats\n */\n async collectStats(now: number): Promise<void> {\n if (!this.running) {\n return\n }\n // log.debug(`statsInterval ${this.sessions.size} sessions`);\n if (!this.sessions.size && !this.externalCollectedStats.size) {\n return\n }\n // Prepare config.\n this.collectedStatsConfig.pages = 0\n this.collectedStatsConfig.startTime = this.startTimestamp\n // Reset collectedStats object.\n const prevByParticipantAndTrackStats = {} as Record<string, Set<string>>\n Object.entries(this.collectedStats).forEach(([name, stats]) => {\n stats.all.reset()\n Object.values(stats.byHost).forEach(s => s.reset())\n Object.values(stats.byCodec).forEach(s => s.reset())\n prevByParticipantAndTrackStats[name] = new Set(Object.keys(stats.byParticipantAndTrack))\n stats.byParticipantAndTrack = {}\n })\n for (const [sessionId, session] of this.sessions.entries()) {\n this.collectedStatsConfig.url = `${hideAuth(session.url)}?${session.urlQuery}`\n this.collectedStatsConfig.pages += session.pages.size || 0\n const sessionStats = await session.updateStats()\n for (const [name, obj] of Object.entries(sessionStats)) {\n if (obj === undefined) {\n return\n }\n //log.log(name, obj)\n try {\n const collectedStats = this.collectedStats[name]\n const prevByParticipantAndTrack = prevByParticipantAndTrackStats[name]\n if (typeof obj === 'number' && isFinite(obj)) {\n collectedStats.all.push(obj)\n } else {\n for (const [key, value] of Object.entries(obj)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (typeof value === 'number' && isFinite(value as any)) {\n collectedStats.all.push(value)\n // Push host label.\n const { trackId, hostName, participantName } = parseRtStatKey(key)\n let stats = collectedStats.byHost[hostName]\n if (!stats) {\n stats = collectedStats.byHost[hostName] = new FastStats()\n }\n stats.push(value)\n // Push participant and track values.\n if (enabledForSession(sessionId, this.enableDetailedStats) && participantName) {\n const label = `${participantName}:${trackId || ''}`\n collectedStats.byParticipantAndTrack[label] = value\n prevByParticipantAndTrack.delete(label)\n }\n } else if (typeof value === 'string') {\n // Codec stats.\n collectedStats.all.push(1)\n let stats = collectedStats.byCodec[value]\n if (!stats) {\n stats = collectedStats.byCodec[value] = new FastStats()\n }\n stats.push(1)\n }\n }\n }\n } catch (err) {\n log.error(`session getStats name: ${name} error: ${(err as Error).stack}`, err)\n }\n }\n }\n // Add external collected stats.\n for (const [id, data] of this.externalCollectedStats.entries()) {\n const { addedTime, externalStats, config } = data\n if (now - addedTime > this.rtcStatsTimeout * 1000) {\n log.debug(`remove externalCollectedStats from ${id}`)\n this.externalCollectedStats.delete(id)\n continue\n }\n log.debug(`add external stats from ${id}`)\n // Add external config settings.\n if (config.url) {\n this.collectedStatsConfig.url = config.url\n }\n if (config.pages) {\n this.collectedStatsConfig.pages += config.pages\n }\n // Add metrics.\n this.statsNames.forEach(name => {\n const stats = externalStats[name] as CollectedStatsRaw\n if (!stats) {\n return\n }\n const collectedStats = this.collectedStats[name]\n const prevByParticipantAndTrack = prevByParticipantAndTrackStats[name]\n collectedStats.all.push(stats.all)\n Object.entries(stats.byHost).forEach(([host, values]) => {\n if (!collectedStats.byHost[host]) {\n collectedStats.byHost[host] = new FastStats()\n }\n collectedStats.byHost[host].push(values)\n })\n Object.entries(stats.byCodec).forEach(([codec, values]) => {\n if (!collectedStats.byCodec[codec]) {\n collectedStats.byCodec[codec] = new FastStats()\n }\n collectedStats.byCodec[codec].push(values)\n })\n Object.entries(stats.byParticipantAndTrack).forEach(([label, value]) => {\n collectedStats.byParticipantAndTrack[label] = value\n prevByParticipantAndTrack.delete(label)\n })\n })\n }\n this.emit('stats', this.collectedStats)\n // Push to an external instance.\n if (this.pushStatsInstance) {\n const pushStats: Record<string, CollectedStatsRaw> = {}\n for (const [name, stats] of Object.entries(this.collectedStats)) {\n pushStats[name] = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n all: (stats.all as any).data,\n byHost: {},\n byCodec: {},\n byParticipantAndTrack: {},\n }\n Object.entries(stats.byHost).forEach(([host, stat]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pushStats[name].byHost[host] = (stat as any).data\n })\n Object.entries(stats.byCodec).forEach(([codec, stat]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pushStats[name].byCodec[codec] = (stat as any).data\n })\n Object.entries(stats.byParticipantAndTrack).forEach(([label, value]) => {\n pushStats[name].byParticipantAndTrack[label] = value\n })\n }\n try {\n const res = await this.pushStatsInstance.put('/collected-stats', {\n id: this.pushStatsId,\n stats: pushStats,\n config: this.collectedStatsConfig,\n })\n log.debug(`pushStats message=${res.data.message}`)\n } catch (err) {\n log.error(`pushStats error: ${(err as Error).stack}`)\n }\n }\n // Check alerts.\n this.checkAlertRules()\n // Show to console.\n this.consoleShowStats()\n\n await Promise.allSettled([\n this.writeStats(),\n this.writeDetailedStats(),\n this.sendToPushGateway(prevByParticipantAndTrackStats),\n this.writeAlertRulesReport(),\n ])\n }\n\n async writeStats() {\n if (!this.statsWriter) return\n const values = this.statsNames.reduce(\n (v: string[], name) => v.concat(formatStats(this.collectedStats[name].all, true) as string[]),\n [],\n )\n await this.statsWriter.push(values)\n }\n\n async writeDetailedStats() {\n if (!this.detailedStatsWriter) return\n const participantTrackStats = new Map<string, Record<string, string>>()\n Object.entries(this.collectedStats).forEach(([name, stats]) => {\n Object.entries(stats.byParticipantAndTrack).forEach(([label, value]) => {\n let stats = participantTrackStats.get(label)\n if (!stats) {\n stats = {}\n participantTrackStats.set(label, stats)\n }\n stats[name] = toPrecision(value, 6)\n })\n })\n for (const [label, trackStats] of participantTrackStats.entries()) {\n const [participantName, trackId] = label.split(':', 2)\n const values = [participantName, trackId]\n for (const name of this.statsNames) {\n values.push(trackStats[name] ?? '')\n }\n await this.detailedStatsWriter.push(values)\n }\n }\n\n /**\n * addCollectedStats\n * @param id\n * @param externalStats\n * @param config\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addExternalCollectedStats(id: string, externalStats: any, config: any): void {\n log.debug(`addExternalCollectedStats from ${id}`)\n const addedTime = Date.now()\n this.externalCollectedStats.set(id, { addedTime, externalStats, config })\n }\n\n /**\n * It display stats on the console.\n */\n consoleShowStats(): void {\n if (!this.showStats) {\n return\n }\n const stats = this.collectedStats\n let out =\n sprintfStatsHeader() +\n sprintfStats('System CPU', stats.usedCpu, '.2f', '%', undefined, true) +\n sprintfStats('System GPU', stats.usedGpu, '.2f', '%', undefined, true) +\n sprintfStats('System Memory', stats.usedMemory, '.2f', '%', undefined, true) +\n sprintfStats('CPU/page', stats.cpu, '.2f', '%') +\n sprintfStats('Memory/page', stats.memory, '.2f', 'MB') +\n sprintfStats('Pages', stats.pages, 'd', '') +\n sprintfStats('Errors', stats.errors, 'd', '') +\n sprintfStats('Warnings', stats.warnings, 'd', '') +\n sprintfStats('Peer Connections', stats.peerConnections, 'd', '') +\n sprintfStats('audioSubscribeDelay', stats.audioSubscribeDelay, 'd', 'ms', undefined, true) +\n sprintfStats('videoSubscribeDelay', stats.videoSubscribeDelay, 'd', 'ms', undefined, true) +\n // inbound audio\n sprintfStatsTitle('Inbound audio') +\n sprintfStats('received', stats.audioBytesReceived, '.2f', 'MB', 1e-6) +\n sprintfStats('rate', stats.audioRecvBitrates, '.2f', 'Kbps', 1e-3) +\n sprintfStats('lost', stats.audioRecvPacketsLost, '.2f', '%', undefined, true) +\n sprintfStats('jitter', stats.audioRecvJitter, '.2f', 's', undefined, true) +\n sprintfStats('avgJitterBufferDelay', stats.audioRecvAvgJitterBufferDelay, '.2f', 'ms', 1e3, true) +\n // inbound video\n sprintfStatsTitle('Inbound video') +\n sprintfStats('received', stats.videoRecvBytes, '.2f', 'MB', 1e-6) +\n sprintfStats('decoded', stats.videoFramesDecoded, 'd', 'frames') +\n sprintfStats('rate', stats.videoRecvBitrates, '.2f', 'Kbps', 1e-3) +\n sprintfStats('lost', stats.videoRecvPacketsLost, '.2f', '%', undefined, true) +\n sprintfStats('jitter', stats.videoRecvJitter, '.2f', 's', undefined, true) +\n sprintfStats('avgJitterBufferDelay', stats.videoRecvAvgJitterBufferDelay, '.2f', 'ms', 1e3, true) +\n sprintfStats('width', stats.videoRecvWidth, 'd', 'px', undefined, true) +\n sprintfStats('height', stats.videoRecvHeight, 'd', 'px', undefined, true) +\n sprintfStats('fps', stats.videoRecvFps, 'd', 'fps', undefined, true) +\n sprintfStats('firCountSent', stats.firCountSent, 'd', '', undefined, true) +\n sprintfStats('pliCountSent', stats.pliCountSent, 'd', '', undefined, true) +\n // outbound audio\n sprintfStatsTitle('Outbound audio') +\n sprintfStats('sent', stats.audioBytesSent, '.2f', 'MB', 1e-6) +\n sprintfStats('retransmitted', stats.audioRetransmittedBytesSent, '.2f', 'MB', 1e-6) +\n sprintfStats('rate', stats.audioSentBitrates, '.2f', 'Kbps', 1e-3) +\n sprintfStats('lost', stats.audioSentPacketsLost, '.2f', '%', undefined, true) +\n sprintfStats('roundTripTime', stats.audioSentRoundTripTime, '.3f', 's', undefined, true) +\n // outbound video\n sprintfStatsTitle('Outbound video') +\n sprintfStats('sent', stats.videoSentBytes, '.2f', 'MB', 1e-6) +\n sprintfStats('retransmitted', stats.videoSentRetransmittedBytes, '.2f', 'MB', 1e-6) +\n sprintfStats('rate', stats.videoSentBitrates, '.2f', 'Kbps', 1e-3) +\n sprintfStats('lost', stats.videoSentPacketsLost, '.2f', '%', undefined, true) +\n sprintfStats('roundTripTime', stats.videoSentRoundTripTime, '.3f', 's', undefined, true) +\n sprintfStats('qualityLimitResolutionChanges', stats.videoQualityLimitationResolutionChanges, 'd', '') +\n sprintfStats('qualityLimitationCpu', stats.videoQualityLimitationCpu, 'd', '%') +\n sprintfStats('qualityLimitationBandwidth', stats.videoQualityLimitationBandwidth, 'd', '%') +\n sprintfStats('sentActiveSpatialLayers', stats.videoSentActiveSpatialLayers, 'd', 'layers', undefined, true) +\n sprintfStats('sentMaxBitrate', stats.videoSentMaxBitrate, '.2f', 'Kbps', 1e-3) +\n sprintfStats('width', stats.videoSentWidth, 'd', 'px', undefined, true) +\n sprintfStats('height', stats.videoSentHeight, 'd', 'px', undefined, true) +\n sprintfStats('fps', stats.videoSentFps, 'd', 'fps', undefined, true) +\n sprintfStats('firCountReceived', stats.videoFirCountReceived, 'd', '', undefined, true) +\n sprintfStats('pliCountReceived', stats.videoPliCountReceived, 'd', '', undefined, true)\n if (this.alertRules) {\n const report = this.formatAlertRulesReport()\n if (report.length) {\n out += sprintfStatsTitle('Alert rules report')\n out += report\n }\n }\n\n if (!this.showPageLog) {\n console.clear()\n }\n console.log(out)\n }\n\n /**\n * sendToPushGateway\n */\n async sendToPushGateway(removedByParticipantAndTrackStats: Record<string, Set<string>>): Promise<void> {\n if (!this.gateway || !this.running) {\n return\n }\n const elapsedSeconds = (Date.now() - this.startTimestamp) / 1000\n const datetime = this.startTimestampString\n\n Object.entries(this.metrics).forEach(([name, metric]) => {\n if (!this.collectedStats[name]) {\n return\n }\n\n const setStats = (stats: FastStats, host: string, codec: string): void => {\n const labels = { host, codec, datetime, ...this.customMetricsLabels }\n const { length, sum, mean, stddev, p5, p95, min, max } = formatStats(stats) as StatsData\n metric.length.set(labels, length)\n metric.sum.set(labels, sum)\n metric.mean.set(labels, mean)\n metric.stddev.set(labels, stddev)\n metric.p5.set(labels, p5)\n metric.p95.set(labels, p95)\n metric.min.set(labels, min)\n metric.max.set(labels, max)\n }\n\n setStats(this.collectedStats[name].all, 'all', 'all')\n Object.entries(this.collectedStats[name].byHost).forEach(([host, stats]) => {\n setStats(stats, host, 'all')\n })\n Object.entries(this.collectedStats[name].byCodec).forEach(([codec, stats]) => {\n setStats(stats, 'all', codec)\n })\n if (metric.value) {\n Object.entries(this.collectedStats[name].byParticipantAndTrack).forEach(([label, value]) => {\n const [participantName, trackId] = label.split(':', 2)\n metric.value?.set(\n {\n participantName,\n trackId,\n datetime,\n ...this.customMetricsLabels,\n },\n value,\n )\n })\n }\n\n // Remove metrics for removed participants and tracks.\n const removedByParticipantAndTrack = removedByParticipantAndTrackStats[name]\n if (removedByParticipantAndTrack) {\n for (const label of removedByParticipantAndTrack) {\n const [participantName, trackId] = label.split(':', 2)\n metric.value?.remove({\n participantName,\n trackId,\n datetime,\n ...this.customMetricsLabels,\n })\n }\n }\n\n // Set alerts metrics.\n if (this.alertRules && this.alertRules[name]) {\n const rule = this.alertRules[name]\n // eslint-disable-next-line prefer-const\n for (let [ruleKey, ruleValues] of Object.entries(rule)) {\n if (ruleKey === 'tags') {\n continue\n }\n if (!Array.isArray(ruleValues)) {\n ruleValues = [ruleValues as AlertRuleValue]\n } else {\n ruleValues = ruleValues as AlertRuleValue[]\n }\n for (const ruleValue of ruleValues) {\n // Send rule values as metrics.\n if (ruleValue.$after !== undefined && elapsedSeconds < ruleValue.$after) {\n continue\n }\n const ruleName = `alert_${name}_${ruleKey}`\n const ruleObj = this.metrics[name].alertRules[ruleName]\n const remove = ruleValue.$before !== undefined && elapsedSeconds > ruleValue.$before\n // Send rule report as metric.\n const ruleDesc = this.getAlertRuleDesc(ruleKey, ruleValue)\n const report = this.alertRulesReport.get(name)\n if (report) {\n const ruleReport = report.get(ruleDesc)\n if (ruleReport) {\n const labels = {\n rule: ruleDesc,\n datetime,\n ...this.customMetricsLabels,\n }\n if (!remove) {\n ruleObj.report.set(labels, ruleReport.failAmountPercentile)\n ruleObj.mean.set(labels, ruleReport.valueStats.amean())\n } else {\n ruleObj.report.remove(labels)\n ruleObj.mean.remove(labels)\n }\n }\n }\n // Send rules values as metrics.\n if (ruleValue.$eq !== undefined) {\n const labels = {\n rule: `${name} ${ruleKey} =`,\n datetime,\n ...this.customMetricsLabels,\n }\n if (!remove) {\n ruleObj.rule.set(labels, ruleValue.$eq)\n } else {\n ruleObj.rule.remove(labels)\n }\n }\n if (ruleValue.$lt !== undefined) {\n const labels = {\n rule: `${name} ${ruleKey} <`,\n datetime,\n ...this.customMetricsLabels,\n }\n if (!remove) {\n ruleObj.rule.set(labels, ruleValue.$lt)\n } else {\n ruleObj.rule.remove(labels)\n }\n }\n if (ruleValue.$lte !== undefined) {\n const labels = {\n rule: `${name} ${ruleKey} <=`,\n datetime,\n ...this.customMetricsLabels,\n }\n if (!remove) {\n ruleObj.rule.set(labels, ruleValue.$lte)\n } else {\n ruleObj.rule.remove(labels)\n }\n }\n if (ruleValue.$gt !== undefined) {\n const labels = {\n rule: `${name} ${ruleKey} >`,\n datetime,\n ...this.customMetricsLabels,\n }\n if (!remove) {\n ruleObj.rule.set(labels, ruleValue.$gt)\n } else {\n ruleObj.rule.remove(labels)\n }\n }\n if (ruleValue.$gte !== undefined) {\n const labels = {\n rule: `${name} ${ruleKey} >=`,\n datetime,\n ...this.customMetricsLabels,\n }\n if (!remove) {\n ruleObj.rule.set(labels, ruleValue.$gte)\n } else {\n ruleObj.rule.remove(labels)\n }\n }\n }\n }\n }\n })\n\n const alertRulesReportTags = this.getAlertRulesTags()\n if (alertRulesReportTags && this.alertTagsMetrics) {\n for (const [tag, stat] of alertRulesReportTags.entries()) {\n this.alertTagsMetrics.set(\n { datetime, tag, ...this.customMetricsLabels },\n calculateFailAmountPercentile(stat, this.alertRulesFailPercentile),\n )\n }\n }\n\n try {\n const { resp, body } = await this.gateway.push({\n jobName: this.prometheusPushgatewayJobName,\n })\n if ((body as string).length) {\n log.warn(`Pushgateway error ${(resp as http.ServerResponse).statusCode}: ${body as string}`)\n }\n } catch (err) {\n log.error(`Pushgateway push error: ${(err as Error).stack}`)\n }\n }\n\n /**\n * alertRuleDesc\n */\n getAlertRuleDesc(ruleKey: string, ruleValue: AlertRuleValue): string {\n const ruleDescs = []\n if (ruleValue.$eq !== undefined) {\n ruleDescs.push(`= ${ruleValue.$eq}`)\n }\n if (ruleValue.$gt !== undefined) {\n ruleDescs.push(`> ${ruleValue.$gt}`)\n }\n if (ruleValue.$gte !== undefined) {\n ruleDescs.push(`>= ${ruleValue.$gte}`)\n }\n if (ruleValue.$lt !== undefined) {\n ruleDescs.push(`< ${ruleValue.$lt}`)\n }\n if (ruleValue.$lte !== undefined) {\n ruleDescs.push(`<= ${ruleValue.$lte}`)\n }\n let ruleDesc = `${ruleKey} ${ruleDescs.join(' and ')}`\n if (ruleValue.$after !== undefined) {\n ruleDesc += ` after ${ruleValue.$after}s`\n }\n if (ruleValue.$before !== undefined) {\n ruleDesc += ` before ${ruleValue.$before}s`\n }\n return ruleDesc\n }\n\n /**\n * checkAlertRules\n */\n checkAlertRules(): void {\n if (!this.alertRules || !this.running) {\n return\n }\n const now = Date.now()\n const elapsedSeconds = (now - this.startTimestamp) / 1000\n\n for (const [key, rule] of Object.entries(this.alertRules)) {\n if (!this.collectedStats[key]) {\n continue\n }\n let failPercentile = this.alertRulesFailPercentile\n const value = formatStats(this.collectedStats[key].all) as StatsData\n // eslint-disable-next-line prefer-const\n for (let [ruleKey, ruleValues] of Object.entries(rule)) {\n if (['tags', 'failPercentile'].includes(ruleKey)) {\n if (ruleKey === 'failPercentile') {\n failPercentile = ruleValues as number\n }\n continue\n }\n if (!Array.isArray(ruleValues)) {\n ruleValues = [ruleValues as AlertRuleValue]\n } else {\n ruleValues = ruleValues as AlertRuleValue[]\n }\n let ruleElapsedSeconds = elapsedSeconds\n for (const ruleValue of ruleValues) {\n if (\n (ruleValue.$after !== undefined && elapsedSeconds < ruleValue.$after) ||\n (ruleValue.$before !== undefined && elapsedSeconds > ruleValue.$before)\n ) {\n continue\n }\n if (ruleValue.$after !== undefined) {\n ruleElapsedSeconds -= ruleValue.$after\n }\n const checkValue = value[ruleKey as StatsDataKey]\n if (!isFinite(checkValue)) {\n continue\n }\n const ruleDesc = this.getAlertRuleDesc(ruleKey, ruleValue)\n let failed = false\n let failAmount = 0\n\n if (\n (ruleValue.$skip_lt !== undefined && checkValue < ruleValue.$skip_lt) ||\n (ruleValue.$skip_lte !== undefined && checkValue <= ruleValue.$skip_lte) ||\n (ruleValue.$skip_gt !== undefined && checkValue > ruleValue.$skip_gt) ||\n (ruleValue.$skip_gte !== undefined && checkValue >= ruleValue.$skip_gte)\n ) {\n continue\n }\n\n if (ruleValue.$eq !== undefined) {\n if (checkValue !== ruleValue.$eq) {\n failed = true\n failAmount = calculateFailAmount(checkValue, ruleValue.$eq)\n }\n } else {\n if (ruleValue.$lt !== undefined) {\n if (checkValue >= ruleValue.$lt) {\n failed = true\n failAmount = calculateFailAmount(checkValue, ruleValue.$lt)\n }\n } else if (ruleValue.$lte !== undefined) {\n if (checkValue > ruleValue.$lte) {\n failed = true\n failAmount = calculateFailAmount(checkValue, ruleValue.$lte)\n }\n }\n if (!failed) {\n if (ruleValue.$gt !== undefined) {\n if (checkValue <= ruleValue.$gt) {\n failed = true\n failAmount = calculateFailAmount(checkValue, ruleValue.$gt)\n }\n } else if (ruleValue.$gte !== undefined) {\n if (checkValue < ruleValue.$gte) {\n failed = true\n failAmount = calculateFailAmount(checkValue, ruleValue.$gte)\n }\n }\n }\n }\n // Report if failed or not.\n this.updateRulesReport(key, checkValue, ruleDesc, failed, failAmount, now, ruleElapsedSeconds, failPercentile)\n }\n }\n }\n }\n\n /**\n * addFailedRule\n */\n updateRulesReport(\n key: string,\n checkValue: number,\n ruleDesc: string,\n failed: boolean,\n failAmount: number,\n now: number,\n elapsedSeconds: number,\n failPercentile: number,\n ): void {\n if (failed) {\n log.debug(\n `updateRulesReport ${key}.${ruleDesc} failed: ${failed} checkValue: ${checkValue} failAmount: ${failAmount} elapsedSeconds: ${elapsedSeconds}`,\n )\n }\n let report = this.alertRulesReport.get(key)\n if (!report) {\n report = new Map()\n this.alertRulesReport.set(key, report)\n }\n let reportValue = report.get(ruleDesc)\n if (!reportValue) {\n reportValue = {\n totalFails: 0,\n totalFailsTime: 0,\n totalFailsTimePerc: 0,\n lastFailed: 0,\n valueStats: new FastStats(),\n failAmountStats: new FastStats(),\n failAmountPercentile: 0,\n }\n report.set(ruleDesc, reportValue)\n }\n if (failed) {\n reportValue.totalFails += 1\n if (reportValue.lastFailed) {\n reportValue.totalFailsTime += (now - reportValue.lastFailed) / 1000\n }\n reportValue.lastFailed = now\n } else {\n reportValue.lastFailed = 0\n }\n reportValue.totalFailsTimePerc = Math.round((100 * reportValue.totalFailsTime) / elapsedSeconds)\n reportValue.valueStats.push(checkValue)\n reportValue.failAmountStats.push(failAmount)\n reportValue.failAmountPercentile = calculateFailAmountPercentile(reportValue.failAmountStats, failPercentile)\n }\n\n getAlertRulesTags(): Map<string, FastStats> | undefined {\n if (!this.alertRules) {\n return\n }\n const alertRulesReportTags = new Map<string, FastStats>()\n for (const [key, report] of this.alertRulesReport.entries()) {\n const tags = this.alertRules[key].tags || []\n for (const tag of tags) {\n if (!alertRulesReportTags.has(tag)) {\n alertRulesReportTags.set(tag, new FastStats())\n }\n }\n for (const reportValue of report.values()) {\n const { failAmountPercentile } = reportValue\n for (const tag of tags) {\n const stat = alertRulesReportTags.get(tag)\n if (!stat) {\n continue\n }\n stat.push(failAmountPercentile)\n }\n }\n }\n return alertRulesReportTags\n }\n\n /**\n * formatAlertRulesReport\n * @param ext\n */\n formatAlertRulesReport(ext: string | null = null): string {\n if (!this.alertRulesReport || !this.alertRules) {\n return ''\n }\n // Update tags values.\n const alertRulesReportTags = this.getAlertRulesTags()!\n // JSON output.\n if (ext === 'json') {\n const out = {\n tags: {} as Record<string, number>,\n reports: {} as Record<\n string,\n {\n totalFails: number\n totalFailsTime: number\n totalFailsTimePerc: number\n failAmount: number\n count: number\n valueAverage: number\n // failAmountStats: number[]\n }\n >,\n }\n for (const [key, report] of this.alertRulesReport.entries()) {\n for (const [reportDesc, reportValue] of report.entries()) {\n const { totalFails, totalFailsTime, valueStats, totalFailsTimePerc, failAmountStats, failAmountPercentile } =\n reportValue\n if (totalFails) {\n out.reports[`${key} ${reportDesc}`] = {\n totalFails,\n totalFailsTime: Math.round(totalFailsTime),\n valueAverage: valueStats.amean(),\n totalFailsTimePerc,\n failAmount: failAmountPercentile,\n count: failAmountStats.length,\n\n // failAmountStats: (failAmountStats as any).data as number[],\n }\n }\n }\n }\n for (const [tag, stat] of alertRulesReportTags.entries()) {\n out.tags[tag] = calculateFailAmountPercentile(stat, this.alertRulesFailPercentile)\n }\n return JSON.stringify(out, null, 2)\n }\n // Textual output.\n let out = ''\n // Calculate max column size.\n let colSize = 20\n for (const [key, report] of this.alertRulesReport.entries()) {\n for (const [reportDesc, reportValue] of report.entries()) {\n const { totalFails, totalFailsTimePerc } = reportValue\n if (totalFails && totalFailsTimePerc > 0) {\n const check = `${key} ${reportDesc}`\n colSize = Math.max(colSize, check.length)\n }\n }\n }\n if (ext) {\n out += sprintf(\n `| %(check)-${colSize}s | %(total)-10s | %(totalFailsTime)-15s | %(totalFailsTimePerc)-15s | %(failAmount)-15s |\\n`,\n {\n check: 'Condition',\n total: 'Fails',\n totalFailsTime: 'Fail time (s)',\n totalFailsTimePerc: 'Fail time (%)',\n failAmount: 'Fail amount %',\n },\n )\n } else {\n out += sprintf(\n chalk`{bold %(check)-${colSize}s} {bold %(total)-10s} {bold %(totalFailsTime)-15s} {bold %(totalFailsTimePerc)-15s} {bold %(failAmount)-15s}\\n`,\n {\n check: 'Condition',\n total: 'Fails',\n totalFailsTime: 'Fail time (s)',\n totalFailsTimePerc: 'Fail time (%)',\n failAmount: 'Fail amount %',\n },\n )\n }\n for (const [key, report] of this.alertRulesReport.entries()) {\n for (const [reportDesc, reportValue] of report.entries()) {\n const { totalFails, totalFailsTime, failAmountPercentile, totalFailsTimePerc } = reportValue\n if (totalFails && totalFailsTimePerc > 0) {\n if (ext) {\n out += sprintf(\n `| %(check)-${colSize}s | %(totalFails)-10s | %(totalFailsTime)-15s | %(totalFailsTimePerc)-15s | %(failAmountPercentile)-15s |\\n`,\n {\n check: `${key} ${reportDesc}`,\n totalFails,\n totalFailsTime: Math.round(totalFailsTime),\n totalFailsTimePerc,\n failAmountPercentile,\n },\n )\n } else {\n out += sprintf(\n chalk`{red {bold %(check)-${colSize}s}} {bold %(totalFails)-10s} {bold %(totalFailsTime)-15s} {bold %(totalFailsTimePerc)-15s} {bold %(failAmountPercentile)-15s}\\n`,\n {\n check: `${key} ${reportDesc}`,\n totalFails,\n totalFailsTime: Math.round(totalFailsTime),\n totalFailsTimePerc,\n failAmountPercentile,\n },\n )\n }\n }\n }\n }\n // Tags report.\n if (ext) {\n out += sprintf(`%(fill)s\\n`, { fill: '-'.repeat(colSize + 15 + 7) })\n\n out += sprintf(`| %(name)-${colSize}s | %(failPerc)-15s |\\n`, {\n name: 'Tag',\n failPerc: 'Fail %',\n })\n } else {\n out += sprintf(`%(fill)s\\n`, { fill: '-'.repeat(colSize + 15) })\n\n out += sprintf(chalk`{bold %(name)-${colSize}s} {bold %(failPerc)-15s}\\n`, {\n name: 'Tag',\n failPerc: 'Fail %',\n })\n }\n for (const [tag, stat] of alertRulesReportTags.entries()) {\n const failPerc = calculateFailAmountPercentile(stat, this.alertRulesFailPercentile)\n if (ext) {\n out += sprintf(`| %(tag)-${colSize}s | %(failPerc)-15s |\\n`, {\n tag,\n failPerc,\n })\n } else {\n const color = failPerc < 5 ? 'green' : failPerc < 25 ? 'yellowBright' : failPerc < 50 ? 'yellow' : 'red'\n\n out += sprintf(chalk`{${color} {bold %(tag)-${colSize}s %(failPerc)-15s}}\\n`, {\n tag,\n failPerc,\n })\n }\n }\n return out\n }\n\n /**\n * writeAlertRulesReport\n */\n async writeAlertRulesReport(): Promise<void> {\n if (!this.alertRules || !this.alertRulesOutput || !this.running) {\n return\n }\n log.debug(`writeAlertRulesReport writing in ${this.alertRulesOutput}`)\n try {\n const ext = this.alertRulesOutput.split('.').slice(-1)[0]\n const report = this.formatAlertRulesReport(ext)\n if (!report.length) {\n return\n }\n let out\n if (ext === 'log') {\n const lines = report.split('\\n').filter(line => line.length)\n const name = `Alert rules report (${new Date().toISOString()})`\n out = sprintf(`-- %(name)s %(fill)s\\n`, {\n name,\n fill: '-'.repeat(Math.max(4, lines[0].length - name.length - 4)),\n })\n out += report\n out += sprintf(`%(fill)s\\n`, {\n fill: '-'.repeat(lines[lines.length - 1].length),\n })\n } else {\n out = report\n }\n await fs.promises.mkdir(path.dirname(this.alertRulesOutput), {\n recursive: true,\n })\n await fs.promises.writeFile(this.alertRulesOutput, out)\n } catch (err) {\n log.error(`writeAlertRulesReport error: ${(err as Error).stack}`)\n }\n }\n\n /**\n * Stop the stats collector and the added Sessions.\n */\n async stop(): Promise<void> {\n if (!this.running) {\n return\n }\n this.running = false\n log.debug('stop')\n if (this.scheduler) {\n this.scheduler.stop()\n this.scheduler = undefined\n }\n\n for (const session of this.sessions.values()) {\n try {\n session.removeAllListeners()\n await session.stop()\n } catch (err) {\n log.error(`session stop error: ${(err as Error).stack}`)\n }\n }\n this.sessions.clear()\n\n this.statsWriter = null\n\n // delete metrics\n if (this.gateway) {\n await this.deletePushgatewayStats()\n this.gateway = null\n this.metrics = {}\n }\n\n this.collectedStats = this.initCollectedStats()\n this.externalCollectedStats.clear()\n }\n}\n"]}
|