| import { IRawResponse } from "youtubei.js"; | |
| import { Counter, Registry } from "prom-client"; | |
| export class Metrics { | |
| private METRICS_PREFIX = "invidious_companion_"; | |
| public register = new Registry(); | |
| public createCounter(name: string, help?: string): Counter { | |
| return new Counter({ | |
| name: `${this.METRICS_PREFIX}${name}`, | |
| help: help || "No help has been provided for this metric", | |
| registers: [this.register], | |
| }); | |
| } | |
| public potokenGenerationFailure = this.createCounter( | |
| "potoken_generation_failure_total", | |
| "Number of times that the PoToken generation job has failed for whatever reason", | |
| ); | |
| private innertubeErrorStatusLoginRequired = this.createCounter( | |
| "innertube_error_status_loginRequired_total", | |
| 'Number of times that the status "LOGIN_REQUIRED" has been returned by Innertube API', | |
| ); | |
| private innertubeErrorStatusUnknown = this.createCounter( | |
| "innertube_error_status_unknown_total", | |
| "Number of times that an unknown status has been returned by Innertube API", | |
| ); | |
| private innertubeErrorReasonSignIn = this.createCounter( | |
| "innertube_error_reason_SignIn_total", | |
| 'Number of times that the message "Sign in to confirm you’re not a bot." has been returned by Innertube API', | |
| ); | |
| private innertubeErrorSubreasonProtectCommunity = this.createCounter( | |
| "innertube_error_subreason_ProtectCommunity_total", | |
| 'Number of times that the message "This helps protect our community." has been returned by Innertube API', | |
| ); | |
| private innertubeErrorReasonUnknown = this.createCounter( | |
| "innertube_error_reason_unknown_total", | |
| "Number of times that an unknown reason has been returned by the Innertube API", | |
| ); | |
| private innertubeErrorSubreasonUnknown = this.createCounter( | |
| "innertube_error_subreason_unknown_total", | |
| "Number of times that an unknown subreason has been returned by the Innertube API", | |
| ); | |
| public innertubeSuccessfulRequest = this.createCounter( | |
| "innertube_successful_request_total", | |
| "Number successful requests made to the Innertube API", | |
| ); | |
| private innertubeFailedRequest = this.createCounter( | |
| "innertube_failed_request_total", | |
| "Number failed requests made to the Innertube API for whatever reason", | |
| ); | |
| private checkStatus(videoData: IRawResponse) { | |
| const status = videoData.playabilityStatus?.status; | |
| return { | |
| unplayable: status === | |
| "UNPLAYABLE", | |
| contentCheckRequired: status === | |
| "CONTENT_CHECK_REQUIRED", | |
| loginRequired: status === "LOGIN_REQUIRED", | |
| }; | |
| } | |
| private checkReason(videoData: IRawResponse) { | |
| const reason = videoData.playabilityStatus?.reason; | |
| return { | |
| signInToConfirmAge: reason?.includes( | |
| "Sign in to confirm your age", | |
| ), | |
| SignInToConfirmBot: reason?.includes( | |
| "Sign in to confirm you’re not a bot", | |
| ), | |
| }; | |
| } | |
| private checkSubreason(videoData: IRawResponse) { | |
| const subReason = videoData.playabilityStatus?.errorScreen | |
| ?.playerErrorMessageRenderer | |
| ?.subreason?.runs?.[0]?.text; | |
| return { | |
| thisHelpsProtectCommunity: subReason?.includes( | |
| "This helps protect our community", | |
| ), | |
| }; | |
| } | |
| public checkInnertubeResponse(videoData: IRawResponse) { | |
| this.innertubeFailedRequest.inc(); | |
| const status = this.checkStatus(videoData); | |
| if (status.contentCheckRequired || status.unplayable) return; | |
| if (status.loginRequired) { | |
| this.innertubeErrorStatusLoginRequired.inc(); | |
| const reason = this.checkReason(videoData); | |
| if (reason.signInToConfirmAge) return; | |
| if (reason.SignInToConfirmBot) { | |
| this.innertubeErrorReasonSignIn.inc(); | |
| const subReason = this.checkSubreason(videoData); | |
| if (subReason.thisHelpsProtectCommunity) { | |
| this.innertubeErrorSubreasonProtectCommunity.inc(); | |
| } else { | |
| this.innertubeErrorSubreasonUnknown.inc(); | |
| } | |
| } else { | |
| this.innertubeErrorReasonUnknown.inc(); | |
| } | |
| } else { | |
| this.innertubeErrorStatusUnknown.inc(); | |
| } | |
| } | |
| } | |