@vpalmisano/webrtcperf 4.0.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.
Files changed (53) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +296 -0
  3. package/app.min.js +2 -0
  4. package/build/src/app.d.ts +6 -0
  5. package/build/src/app.js +207 -0
  6. package/build/src/app.js.map +1 -0
  7. package/build/src/config.d.ts +104 -0
  8. package/build/src/config.js +880 -0
  9. package/build/src/config.js.map +1 -0
  10. package/build/src/generate-config-docs.d.ts +1 -0
  11. package/build/src/generate-config-docs.js +41 -0
  12. package/build/src/generate-config-docs.js.map +1 -0
  13. package/build/src/index.d.ts +9 -0
  14. package/build/src/index.js +26 -0
  15. package/build/src/index.js.map +1 -0
  16. package/build/src/media.d.ts +33 -0
  17. package/build/src/media.js +113 -0
  18. package/build/src/media.js.map +1 -0
  19. package/build/src/rtcstats.d.ts +302 -0
  20. package/build/src/rtcstats.js +418 -0
  21. package/build/src/rtcstats.js.map +1 -0
  22. package/build/src/server.d.ts +173 -0
  23. package/build/src/server.js +639 -0
  24. package/build/src/server.js.map +1 -0
  25. package/build/src/session.d.ts +277 -0
  26. package/build/src/session.js +1552 -0
  27. package/build/src/session.js.map +1 -0
  28. package/build/src/stats.d.ts +243 -0
  29. package/build/src/stats.js +1383 -0
  30. package/build/src/stats.js.map +1 -0
  31. package/build/src/utils.d.ts +249 -0
  32. package/build/src/utils.js +1220 -0
  33. package/build/src/utils.js.map +1 -0
  34. package/build/src/visqol.d.ts +6 -0
  35. package/build/src/visqol.js +61 -0
  36. package/build/src/visqol.js.map +1 -0
  37. package/build/src/vmaf.d.ts +83 -0
  38. package/build/src/vmaf.js +624 -0
  39. package/build/src/vmaf.js.map +1 -0
  40. package/build/tsconfig.tsbuildinfo +1 -0
  41. package/package.json +129 -0
  42. package/src/app.ts +241 -0
  43. package/src/config.ts +852 -0
  44. package/src/generate-config-docs.ts +47 -0
  45. package/src/index.ts +9 -0
  46. package/src/media.ts +151 -0
  47. package/src/rtcstats.ts +507 -0
  48. package/src/server.ts +645 -0
  49. package/src/session.ts +1908 -0
  50. package/src/stats.ts +1668 -0
  51. package/src/utils.ts +1295 -0
  52. package/src/visqol.ts +62 -0
  53. package/src/vmaf.ts +771 -0
@@ -0,0 +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 Object.values(this.collectedStats).forEach(stats => {\n stats.all.reset()\n Object.values(stats.byHost).forEach(s => s.reset())\n Object.values(stats.byCodec).forEach(s => s.reset())\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 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 collectedStats.byParticipantAndTrack[`${participantName}:${trackId || ''}`] = value\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 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 })\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(),\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(): 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 // 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"]}
@@ -0,0 +1,249 @@
1
+ import { Session } from './session';
2
+ export declare const Log: any;
3
+ interface Logger {
4
+ error: (...args: unknown[]) => void;
5
+ warn: (...args: unknown[]) => void;
6
+ info: (...args: unknown[]) => void;
7
+ debug: (...args: unknown[]) => void;
8
+ log: (...args: unknown[]) => void;
9
+ }
10
+ export declare function logger(name: string, options?: {}): Logger;
11
+ export declare class LoggerInterface {
12
+ name?: string;
13
+ private logInit;
14
+ debug(...args: unknown[]): void;
15
+ info(...args: unknown[]): void;
16
+ warn(...args: unknown[]): void;
17
+ error(...args: unknown[]): void;
18
+ log(...args: unknown[]): void;
19
+ }
20
+ /**
21
+ * Resolves the absolute path from the package installation directory.
22
+ * @param relativePath The relative path.
23
+ * @returns The absolute path.
24
+ */
25
+ export declare function resolvePackagePath(relativePath: string): string;
26
+ /**
27
+ * Calculates the sha256 sum.
28
+ * @param data The string input
29
+ */
30
+ export declare function sha256(data: string): string;
31
+ interface ProcessStat {
32
+ cpu: number;
33
+ memory: number;
34
+ }
35
+ /**
36
+ * Returns the process stats.
37
+ * @param pid The process pid
38
+ * @param children If process children should be taken into account.
39
+ * @returns
40
+ */
41
+ export declare function getProcessStats(pid?: number, children?: boolean): Promise<ProcessStat>;
42
+ interface SocketStat {
43
+ recvBytes: number;
44
+ sendBytes: number;
45
+ }
46
+ export declare function getSocketStats(processPid: number): Promise<SocketStat>;
47
+ export interface SystemStats {
48
+ usedCpu: number;
49
+ usedMemory: number;
50
+ usedGpu: number;
51
+ usedGpuMemory: number;
52
+ }
53
+ export declare function getSystemStats(): SystemStats | undefined;
54
+ export declare function startUpdateSystemStats(): void;
55
+ export declare function stopTimers(): void;
56
+ /**
57
+ * Sleeps for the specified amount of time.
58
+ * @param ms
59
+ */
60
+ export declare function sleep(ms: number): Promise<void>;
61
+ declare global {
62
+ let getActiveAudioTracks: () => any[];
63
+ let publisherSetMuted: (muted: boolean) => Promise<void>;
64
+ }
65
+ export declare function startRandomActivateAudio(sessions: Map<number, Session>, randomAudioPeriod: number, randomAudioProbability: number, randomAudioRange: number): void;
66
+ export declare function stopRandomActivateAudio(): void;
67
+ /**
68
+ * Randomly activate audio from one tab at time.
69
+ * @param sessions The sessions Map
70
+ * @param randomAudioPeriod If set, the function will be called in loop
71
+ * @param randomAudioProbability The activation probability
72
+ * @param randomAudioRange The number of pages to include into the automation
73
+ */
74
+ export declare function randomActivateAudio(sessions: Map<number, Session>, randomAudioPeriod: number, randomAudioProbability: number, randomAudioRange: number): Promise<void>;
75
+ /**
76
+ * The {@link downloadUrl} output.
77
+ */
78
+ export interface DownloadData {
79
+ /** Download data. */
80
+ data: string;
81
+ /** Start byte range. */
82
+ start: number;
83
+ /** End byte range. */
84
+ end: number;
85
+ /** Total returned size. */
86
+ total: number;
87
+ }
88
+ /**
89
+ * Downloads the specified `url` to a local file or returning the file content
90
+ * as {@link DownloadData} object.
91
+ * @param url The remote url to download.
92
+ * @param auth The basic authentication (`user:password`).
93
+ * @param outputLocationPath The file output. If not specified, the download
94
+ * content will be returned as {@link DownloadData} instance.
95
+ * @param range The HTTP byte range to download (e.g. `10-100`).
96
+ * @param timeout The download timeout in milliseconds.
97
+ */
98
+ export declare function downloadUrl(url: string, auth?: string, outputLocationPath?: string, range?: string, timeout?: number): Promise<void | DownloadData>;
99
+ /**
100
+ * Uploads the file to the specified `url`.
101
+ * @param filePath The file path to upload.
102
+ * @param url The remote url to upload.
103
+ * @param auth The basic authentication (`user:password`).
104
+ */
105
+ export declare function uploadUrl(filePath: string, url: string, auth?: string): Promise<string>;
106
+ /**
107
+ * Hides the authentication part from an HTTP url.
108
+ * @param data
109
+ */
110
+ export declare function hideAuth(data: string): string;
111
+ /** Exit handler callback. */
112
+ export type ExitHandler = (signal?: string) => Promise<void>;
113
+ /**
114
+ * Register an {@link ExitHandler} callback that will be executed at the
115
+ * nodejs process exit.
116
+ * @param exitHandler
117
+ */
118
+ export declare function registerExitHandler(exitHandler: ExitHandler): void;
119
+ /**
120
+ * Un-registers the {@link ExitHandler} callback.
121
+ * @param exitHandler
122
+ */
123
+ export declare function unregisterExitHandler(exitHandler: ExitHandler): void;
124
+ /**
125
+ * Runs the registered exit handlers immediately.
126
+ * @param signal The process exit signal.
127
+ */
128
+ export declare function runExitHandlersNow(signal?: string): Promise<void>;
129
+ /**
130
+ * Downloads the configured chrome executable if it doesn't exists into the
131
+ * `$HOME/.webrtcperf/chrome` directory.
132
+ * @returns The revision info.
133
+ */
134
+ export declare function checkChromeExecutable(): Promise<string>;
135
+ export declare function clampMinMax(value: number, min: number, max: number): number;
136
+ /** Runs the shell command asynchronously. */
137
+ export declare function runShellCommand(cmd: string, verbose?: boolean, maxBuffer?: number): Promise<{
138
+ stdout: string;
139
+ stderr: string;
140
+ }>;
141
+ /**
142
+ * Resolves the IP address hostname.
143
+ * @param ip The IP address.
144
+ * @param cacheTime The number of milliseconds to keep the resolved hostname
145
+ * into the memory cache.
146
+ * @returns The IP address hostname.
147
+ */
148
+ export declare function resolveIP(ip: string, cacheTime?: number): Promise<string>;
149
+ /**
150
+ * Strips the console logs characters from the provided string.
151
+ * @param str The input string.
152
+ * @returns The strippped string.
153
+ */
154
+ export declare function stripColors(str: string): string;
155
+ /**
156
+ * Returns the GPU usage.
157
+ *
158
+ * On Linux, the `nvidia-smi` should be installed if Nvidia card is used.
159
+ * @returns The GPU usage.
160
+ */
161
+ export declare function systemGpuStats(): Promise<{
162
+ gpu: number;
163
+ mem: number;
164
+ }>;
165
+ /**
166
+ * Schedules a function call at the specified time interval.
167
+ */
168
+ export declare class Scheduler {
169
+ private readonly name;
170
+ private readonly interval;
171
+ private readonly callback;
172
+ private readonly verbose;
173
+ private running;
174
+ private last;
175
+ private errorSum;
176
+ private statsTimeoutId?;
177
+ /**
178
+ * Scheduler.
179
+ * @param name Logging name.
180
+ * @param interval Update interval in seconds.
181
+ * @param callback Callback function.
182
+ * @param verbose Verbose logging.
183
+ */
184
+ constructor(name: string, interval: number, callback: (now: number) => Promise<void>, verbose?: boolean);
185
+ start(): void;
186
+ stop(): void;
187
+ private scheduleNext;
188
+ }
189
+ export declare class PeerConnectionExternal {
190
+ id: number;
191
+ private process;
192
+ private static cache;
193
+ constructor(options?: any);
194
+ static get(id: number): PeerConnectionExternal | undefined;
195
+ createOffer(options: any): Promise<{}>;
196
+ setLocalDescription(description: string): void;
197
+ setRemoteDescription(description: string): void;
198
+ }
199
+ export type PeerConnectionExternalMethod = 'createOffer' | 'setLocalDescription' | 'setRemoteDescription';
200
+ export declare function toTitleCase(s: string): string;
201
+ export declare function getFiles(dir: string, ext: string): Promise<string[]>;
202
+ /**
203
+ * Format number to the specified precision.
204
+ * @param value value to format
205
+ * @param precision precision
206
+ */
207
+ export declare function toPrecision(value: number, precision?: number): string;
208
+ export declare function getDefaultNetworkInterface(): Promise<string>;
209
+ export declare function checkNetworkInterface(device: string): Promise<void>;
210
+ export declare function portForwarder(port: number, listenInterface?: string): Promise<() => void>;
211
+ export declare function pageScreenshot(url: string, filePath: string, width?: number, height?: number, selector?: string, headers?: Record<string, string>, extraCss?: string): Promise<void>;
212
+ export declare function enabledForSession(index: number, value: boolean | string | number): boolean;
213
+ export declare function increaseKey(o: Record<string, number>, key: string, value?: number): void;
214
+ export declare function chunkedPromiseAll<T, R>(items: T[], f: (v: T, index: number) => Promise<R>, chunkSize?: number): Promise<R[]>;
215
+ export declare function maybeNumber(s: string): string | number;
216
+ export declare enum FFProbeProcess {
217
+ Skip = "skip",
218
+ Stop = "stop"
219
+ }
220
+ /**
221
+ * It runs the ffprobe command to extract the video/video frames.
222
+ * @param fpath The file path.
223
+ * @param kind The kind of the media (video or audio).
224
+ * @param entries Which entries to show.
225
+ * @param filters Apply filters.
226
+ * @param frameProcess A function to process the frame. The function return value could be:
227
+ * - the modified frame object
228
+ * - `FFProbeProcess.Skip` to skip the frame from the output
229
+ * - `FFProbeProcess.Stop` to stop processing and immediately return the collected frames.
230
+ */
231
+ export declare function ffprobe(fpath: string, kind?: string, entries?: string, filters?: string, frameProcess?: (_frame: Record<string, string>) => Record<string, string> | FFProbeProcess): Promise<Record<string, string>[]>;
232
+ export declare function buildIvfHeader(width?: number, height?: number, frameRate?: number, fourcc?: string): Buffer<ArrayBuffer>;
233
+ export declare function ffmpeg(command: string | undefined, processFn: (_frame: Buffer) => void): Promise<void>;
234
+ export declare function analyzeColors(fpath: string): Promise<{
235
+ YAvg: number;
236
+ UAvg: number;
237
+ VAvg: number;
238
+ SatAvg: number;
239
+ HueAvg: number;
240
+ }>;
241
+ /**
242
+ * Wait for the process to stop or kill it after the timeout.
243
+ * @param pid The process pid
244
+ * @param timeout The maximum wait time in milliseconds
245
+ * @returns `true` if the process stopped, `false` if the process was killed.
246
+ */
247
+ export declare function waitStopProcess(pid: number, timeout?: number): Promise<boolean>;
248
+ export declare function getDockerLogsPath(): Promise<string>;
249
+ export {};