@esfaenza/admin-module 20.3.23 → 20.3.24
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/fesm2022/esfaenza-admin-module.mjs +1059 -128
- package/fesm2022/esfaenza-admin-module.mjs.map +1 -1
- package/index.d.ts +405 -32
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esfaenza-admin-module.mjs","sources":["../../../projects/admin-feature/src/lib/models/components/AuditsView.ts","../../../projects/admin-feature/src/lib/tokens.ts","../../../projects/admin-feature/src/lib/components/audits/adm_audits.component.loc.ts","../../../projects/admin-feature/src/lib/services/admin-feature.base.service.ts","../../../projects/admin-feature/src/lib/components/audits/adm_audits.component.ts","../../../projects/admin-feature/src/lib/components/audits/adm_audits.component.html","../../../projects/admin-feature/src/lib/models/shared/KeyValue.ts","../../../projects/admin-feature/src/lib/models/components/ProcessesView.ts","../../../projects/admin-feature/src/lib/components/workers/adm_wrk.component.loc.ts","../../../projects/admin-feature/src/lib/components/workers/adm_wrk.component.ts","../../../projects/admin-feature/src/lib/components/workers/adm_wrk.component.html","../../../projects/admin-feature/src/lib/models/components/ProfilerDataNode.loc.ts","../../../projects/admin-feature/src/lib/models/components/ProfilerDataNode.ts","../../../projects/admin-feature/src/lib/models/components/ProfilerDataNodesView.ts","../../../projects/admin-feature/src/lib/components/profiler/adm_profiler.component.loc.ts","../../../projects/admin-feature/src/lib/components/_shared/node_detail.component.loc.ts","../../../projects/admin-feature/src/lib/components/_shared/node_detail.component.ts","../../../projects/admin-feature/src/lib/components/_shared/node_detail.component.html","../../../projects/admin-feature/src/lib/components/profiler/adm_profiler.component.ts","../../../projects/admin-feature/src/lib/components/profiler/adm_profiler.component.html","../../../projects/admin-feature/src/lib/models/components/ProfilerV2Request.ts","../../../projects/admin-feature/src/lib/pipes/profiler_format.pipe.ts","../../../projects/admin-feature/src/lib/components/profiler_v2/profiler_v2.component.loc.ts","../../../projects/admin-feature/src/lib/components/profiler_v2/profiler_v2.component.ts","../../../projects/admin-feature/src/lib/components/profiler_v2/profiler_v2.component.html","../../../projects/admin-feature/src/lib/models/components/WorkloadReportV2.ts","../../../projects/admin-feature/src/lib/components/workload_v2/workload_v2.component.loc.ts","../../../projects/admin-feature/src/lib/components/workload_v2/workload_v2.component.ts","../../../projects/admin-feature/src/lib/components/workload_v2/workload_v2.component.html","../../../projects/admin-feature/src/lib/models/components/MetricsV2.ts","../../../projects/admin-feature/src/lib/components/metrics_v2/metrics_v2.component.loc.ts","../../../projects/admin-feature/src/lib/components/metrics_v2/metrics_v2_chart.component.ts","../../../projects/admin-feature/src/lib/components/metrics_v2/metrics_v2.component.ts","../../../projects/admin-feature/src/lib/components/metrics_v2/metrics_v2.component.html","../../../projects/admin-feature/src/lib/models/components/TopActivitiesDataView.ts","../../../projects/admin-feature/src/lib/components/topact/topact_search.component.loc.ts","../../../projects/admin-feature/src/lib/components/topact/topact_search.component.ts","../../../projects/admin-feature/src/lib/components/topact/topact_search.component.html","../../../projects/admin-feature/src/lib/models/components/TopActivityV2Enums.ts","../../../projects/admin-feature/src/lib/models/components/TopActivityV2Request.ts","../../../projects/admin-feature/src/lib/components/topact_v2/topact_v2.component.loc.ts","../../../projects/admin-feature/src/lib/components/_shared/session_detail.component.loc.ts","../../../projects/admin-feature/src/lib/components/_shared/session_detail.component.ts","../../../projects/admin-feature/src/lib/components/_shared/session_detail.component.html","../../../projects/admin-feature/src/lib/components/topact_v2/topact_v2.component.ts","../../../projects/admin-feature/src/lib/components/topact_v2/topact_v2.component.html","../../../projects/admin-feature/src/lib/models/components/LocksView.ts","../../../projects/admin-feature/src/lib/components/enqueues/adm_enq.component.loc.ts","../../../projects/admin-feature/src/lib/components/enqueues/adm_enq.component.ts","../../../projects/admin-feature/src/lib/components/enqueues/adm_enq.component.html","../../../projects/admin-feature/src/lib/models/components/MetricsView.ts","../../../projects/admin-feature/src/lib/components/metrics/metrics_search.component.loc.ts","../../../projects/admin-feature/src/lib/components/metrics/metrics_search.component.ts","../../../projects/admin-feature/src/lib/components/metrics/metrics_search.component.html","../../../projects/admin-feature/src/lib/components/logs/adm_logs.component.loc.ts","../../../projects/admin-feature/src/lib/components/logs/adm_logs.component.ts","../../../projects/admin-feature/src/lib/components/logs/adm_logs.component.html","../../../projects/admin-feature/src/lib/models/components/DynamicViewsView.ts","../../../projects/admin-feature/src/lib/components/dynamic_views/adm_dynamic_views.component.loc.ts","../../../projects/admin-feature/src/lib/components/dynamic_views/adm_dynamic_views.component.ts","../../../projects/admin-feature/src/lib/components/dynamic_views/adm_dynamic_views.component.html","../../../projects/admin-feature/src/lib/models/components/QueryView.ts","../../../projects/admin-feature/src/lib/components/mtd_query/mtd_query.component.loc.ts","../../../projects/admin-feature/src/lib/components/mtd_query/mtd_query.component.ts","../../../projects/admin-feature/src/lib/components/mtd_query/mtd_query.component.html","../../../projects/admin-feature/src/lib/models/components/SystemParametersView.ts","../../../projects/admin-feature/src/lib/components/syspars/adm_syspars.component.loc.ts","../../../projects/admin-feature/src/lib/components/syspars/adm_syspars.component.ts","../../../projects/admin-feature/src/lib/components/syspars/adm_syspars.component.html","../../../projects/admin-feature/src/lib/pipes/format_time.pipe.ts","../../../projects/admin-feature/src/lib/admin-feature-messages.ts","../../../projects/admin-feature/src/lib/admin-feature.comms.service.ts","../../../projects/admin-feature/src/lib/admin-feature.module.ts","../../../projects/admin-feature/src/public-api.ts","../../../projects/admin-feature/src/esfaenza-admin-module.ts"],"sourcesContent":["import { AppSearch } from \"@esfaenza/es-table\";\r\nimport { Audit } from \"./Audit\";\r\n\r\nexport class AuditsView extends AppSearch<Audit> {\r\n constructor() {\r\n super();\r\n this.filteraction = '';\r\n this.filterhttp = '';\r\n }\r\n\r\n filterda: string;\r\n filtera: string;\r\n filteruser: string;\r\n filterroute: string;\r\n filteraction: string;\r\n filteraddress: string;\r\n filterhttp: string;\r\n filterargs: string;\r\n filterobjid: string;\r\n filterobjtype: string;\r\n filterconversationid: string;\r\n filterhttpcode: string;\r\n}","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport const ADM_MODULE_PATH: InjectionToken<string> = new InjectionToken<string>('ADM_MODULE_PATH');\r\nexport const ADM_CONVERSATIONS: InjectionToken<boolean> = new InjectionToken<boolean>('ADM_CONVERSATIONS');\r\nexport const ADM_TOPACT_V2: InjectionToken<boolean> = new InjectionToken<boolean>('ADM_TOPACT_V2');\r\nexport const ADM_PROFILER_V2: InjectionToken<boolean> = new InjectionToken<boolean>('ADM_PROFILER_V2');\r\nexport const ADM_WORKLOAD_V2: InjectionToken<boolean> = new InjectionToken<boolean>('ADM_WORKLOAD_V2');\r\nexport const ADM_METRICS_V2: InjectionToken<boolean> = new InjectionToken<boolean>('ADM_METRICS_V2');","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmAuditLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Ricerca Audit Applicativi\", [\"Search Application Audits\"]);\r\n super.set(\"it->en\", \"Utente\", [\"User\"]);\r\n super.set(\"it->en\", \"Chiamata REST\", [\"REST Call\"]);\r\n super.set(\"it->en\", \"Aggiornamento\", [\"Update\"]);\r\n super.set(\"it->en\", \"Route\", [\"Route\"]);\r\n super.set(\"it->en\", \"Azione\", [\"Action\"]);\r\n super.set(\"it->en\", \"Metodo HTTP\", [\"HTTP Method\"]);\r\n super.set(\"it->en\", \"Argomenti\", [\"Arguments\"]);\r\n super.set(\"it->en\", \"ID Oggetto\", [\"Object ID\"]);\r\n super.set(\"it->en\", \"Tipo Oggetto\", [\"Object Type\"]);\r\n super.set(\"it->en\", \"Dati Oggetto\", [\"Object Data\"]);\r\n super.set(\"it->en\", \"Carico gli Audit dell'Applicazione\", [\"Loading Application Audits\"]);\r\n super.set(\"it->en\", \"Data\", [\"Date\"]);\r\n super.set(\"it->en\", \"Indirizzo\", [\"Address\"]);\r\n super.set(\"it->en\", \"Risposta HTTP\", [\"HTTP Response\"]);\r\n super.set(\"it->en\", \"Codice Errore Applicativo\", [\"Application Error Code\"]);\r\n super.set(\"it->en\", \"Cod. Conversation\", [\"Conversation ID\"]);\r\n }\r\n}","// Angular\r\nimport { Injectable, Injector } from \"@angular/core\";\r\nimport { HttpParams } from \"@angular/common/http\";\r\n\r\n// ES\r\nimport { CallResult, MessageService } from \"@esfaenza/extensions\";\r\nimport { HTTPService } from \"@esfaenza/httpservice\";\r\n\r\n// Configurazioni\r\nimport { ProcessesView } from \"../models/components/ProcessesView\";\r\nimport { firstValueFrom, catchError, of, Observable, throwError } from \"rxjs\";\r\nimport { KeyValue } from \"@esfaenza/core/domain\";\r\nimport { TopActivitiesDataView } from \"../models/components/TopActivitiesDataView\";\r\nimport { TopActivityV2Request } from \"../models/components/TopActivityV2Request\";\r\nimport { TopActivityV2Response } from \"../models/components/TopActivityV2Response\";\r\nimport { DirectorInfos } from \"../models/components/DirectorInfos\";\r\nimport { NodeStats } from \"../models/components/NodeStats\";\r\nimport { SessionStats } from \"../models/components/SessionStats\";\r\nimport { ProfilerDataNodesView } from \"../models/components/ProfilerDataNodesView\";\r\nimport { ProfilerV2FlatRequest, ProfilerV2NodeRequest, ProfilerV2TreeRequest } from \"../models/components/ProfilerV2Request\";\r\nimport { ProfilerV2Flat, ProfilerV2NodeStats, ProfilerV2Tree } from \"../models/components/ProfilerV2Response\";\r\nimport { WorkloadReportV2Request, WorkloadSnapshotList, WorkloadSnapshotsRequest } from \"../models/components/WorkloadReportV2\";\r\nimport { MetricsV2CatalogRequest, MetricsV2Info, MetricsV2Request, MetricsV2Sample } from \"../models/components/MetricsV2\";\r\nimport { MetricsView } from \"../models/components/MetricsView\";\r\nimport { Metric } from \"../models/components/Metric\";\r\nimport { LocksView } from \"../models/components/LocksView\";\r\nimport { DynamicViewsView } from \"../models/components/DynamicViewsView\";\r\nimport { AuditsView } from \"../models/components/AuditsView\";\r\nimport { QueryView } from \"../models/components/QueryView\";\r\nimport { SystemParametersView } from \"../models/components/SystemParametersView\";\r\nimport { SystemParameters } from \"../models/components/SystemParameters\";\r\n\r\n// Chiamate ai Repository\r\nconst GET_Director_ChangeProcessConsumerGroup: string = \"/api/Director/ChangeProcessConsumerGroup\";\r\nconst GET_Director_GetConsumerGroups: string = \"/api/Director/GetConsumerGroups#cache\";\r\nconst GET_Director_GetInfos: string = \"/api/Director/GetInfos\";\r\nconst GET_Director_GetMetrics: string = \"/api/Director/GetMetrics\";\r\nconst POST_Director_GetMetrics: string = \"/api/Director/GetMetrics\";\r\nconst POST_Director_GetProfilerDataNodes: string = \"/api/Director/GetProfilerDataNodes\";\r\nconst POST_Director_GetProfilerNode: string = \"/api/Director/GetProfilerNode\";\r\nconst POST_Director_GetProfilerFlat: string = \"/api/Director/GetProfilerFlat\";\r\nconst GET_Director_GetInstanceId: string = \"/api/Director/GetInstanceId\";\r\nconst GET_Director_GetSnapshots: string = \"/api/Director/GetSnapshots\";\r\nconst GET_Director_GetWorkloadReport: string = \"/api/Director/GetWorkloadReport\";\r\nconst POST_Director_GetServerAudits: string = \"/api/Director/GetServerAudits\";\r\nconst POST_Director_GetDynamicViewData: string = \"/api/Director/GetDynamicViewData\";\r\nconst POST_Director_GetServerLocks: string = \"/api/Director/GetServerLocks\";\r\nconst POST_Director_GetServerQuery: string = \"/api/Director/GetServerQuery\";\r\nconst GET_Director_GetServerLogs: string = \"/api/Director/GetServerLogs\";\r\nconst GET_Director_GetDynamicViews: string = \"/api/Director/GetDynamicViews\";\r\nconst POST_Director_GetServerWorkers: string = \"/api/Director/GetServerWorkers\";\r\nconst POST_Director_GetTopActivities: string = \"/api/Director/GetTopActivities\";\r\nconst GET_Director_KillProcess: string = \"/api/Director/KillProcess\";\r\nconst GET_Director_SetProcessTracing: string = \"/api/Director/SetProcessTracing\";\r\nconst GET_Director_GetNodeStats: string = \"/api/Director/GetNodeStats\";\r\nconst GET_Director_GetSessionStats: string = \"/api/Director/GetSessionStats\";\r\nconst POST_Director_GetSystemParameters: string = \"/api/Director/GetSystemParameters\";\r\nconst POST_Director_UpdatSystemParameter: string = \"/api/Director/UpdatSystemParameter\";\r\nconst GET_Director_ResetSystemParameter: string = \"/api/Director/ResetSystemParameter\";\r\nconst GET_Director_GetInstances: string = \"/api/Director/GetInstances\";\r\nconst GET_Director_GetLogTargets: string = \"/api/Director/GetLogTargets\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class AdminModuleBaseService {\r\n public http: HTTPService;\r\n public msgExts: MessageService;\r\n\r\n constructor(private injector: Injector) {\r\n this.http = this.injector.get(HTTPService);\r\n this.msgExts = this.injector.get(MessageService);\r\n }\r\n\r\n public async getServerWorkers(be: string, sv: ProcessesView): Promise<ProcessesView> {\r\n var pars = new HttpParams().set(\"be\", be);\r\n\r\n let ret: ProcessesView = await firstValueFrom(this.http.post<ProcessesView>(POST_Director_GetServerWorkers, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async doSetProcessTracing(be: string, instanceid: string, sid: string, serial: string, enable: string): Promise<string> {\r\n var pars = new HttpParams()\r\n .set(\"instanceid\", instanceid ?? \"\")\r\n .set(\"sid\", sid ?? \"\")\r\n .set(\"serial\", serial ?? \"\")\r\n .set(\"enable\", enable ?? \"\")\r\n .set(\"be\", be ?? \"\");\r\n\r\n let ret: string = await firstValueFrom(this.http.get<string>(GET_Director_SetProcessTracing, pars));\r\n return ret;\r\n }\r\n\r\n public async doKillProcess(be: string, instanceid: string, sid: string, serial: string): Promise<string> {\r\n var pars = new HttpParams()\r\n .set(\"instanceid\", instanceid ?? \"\")\r\n .set(\"sid\", sid ?? \"\")\r\n .set(\"serial\", serial ?? \"\")\r\n .set(\"be\", be ?? \"\");\r\n\r\n let ret: string = await firstValueFrom(this.http.get<string>(GET_Director_KillProcess, pars));\r\n return ret;\r\n }\r\n\r\n public async doChangeProcessConsumerGroup(be: string, instanceid: string, sid: string, serial: string, consumerGroup: string): Promise<string> {\r\n var pars = new HttpParams()\r\n .set(\"instanceid\", instanceid ?? \"\")\r\n .set(\"sid\", sid ?? \"\")\r\n .set(\"serial\", serial ?? \"\")\r\n .set(\"consumer_group\", consumerGroup ?? \"\")\r\n .set(\"be\", be ?? \"\");\r\n\r\n let ret: string = await firstValueFrom(this.http.get<string>(GET_Director_ChangeProcessConsumerGroup, pars));\r\n return ret;\r\n }\r\n\r\n public async getConsumerGroups(be: string): Promise<KeyValue[]> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n\r\n let ret: KeyValue[] = await firstValueFrom(this.http.get<KeyValue[]>(GET_Director_GetConsumerGroups, pars));\r\n return ret;\r\n }\r\n\r\n public async getServerLogs(be: string, from: string, to: string, instance: string, target: string): Promise<string> {\r\n var pars = new HttpParams().set(\"from\", from ?? \"\").set(\"to\", to ?? \"\").set(\"instance\", instance ?? \"\").set(\"target\", target ?? \"\").set(\"be\", be ?? \"\");\r\n let ret: string = await firstValueFrom(this.http.get<string>(GET_Director_GetServerLogs, pars));\r\n return ret;\r\n }\r\n\r\n public async getTopActivities(be: string, sv: TopActivitiesDataView): Promise<TopActivitiesDataView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: TopActivitiesDataView = await firstValueFrom(this.http.post<TopActivitiesDataView>(POST_Director_GetTopActivities, sv, pars));\r\n return ret;\r\n }\r\n\r\n // Stesso URL di getTopActivities: con DirectorFeature.TopActivityV2 attivo il backend-for-frontend risponde con il contratto v2\r\n public async getTopActivitiesV2(be: string, req: TopActivityV2Request): Promise<TopActivityV2Response> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: TopActivityV2Response = await this.v2Call(this.http.post<TopActivityV2Response>(POST_Director_GetTopActivities, req, pars, \"\", false));\r\n return ret;\r\n }\r\n\r\n // Stesso URL di getProfilerDataNodes: con DirectorFeature.ProfilerV2 attivo il backend-for-frontend risponde con l'albero del profiler v2\r\n public async getProfilerTreeV2(be: string, req: ProfilerV2TreeRequest): Promise<ProfilerV2Tree> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: ProfilerV2Tree = await this.v2Call(this.http.post<ProfilerV2Tree>(POST_Director_GetProfilerDataNodes, req, pars, \"\", false));\r\n return ret;\r\n }\r\n\r\n // null se il nodo non c'è nelle istanze o nella finestra scelte\r\n public async getProfilerNodeV2(be: string, req: ProfilerV2NodeRequest): Promise<ProfilerV2NodeStats> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: ProfilerV2NodeStats = await this.v2Call(this.http.post<ProfilerV2NodeStats>(POST_Director_GetProfilerNode, req, pars, \"\", false));\r\n return ret;\r\n }\r\n\r\n public async getProfilerFlatV2(be: string, req: ProfilerV2FlatRequest): Promise<ProfilerV2Flat> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: ProfilerV2Flat = await this.v2Call(this.http.post<ProfilerV2Flat>(POST_Director_GetProfilerFlat, req, pars, \"\", false));\r\n return ret;\r\n }\r\n\r\n // Le chiamate delle pagine v2 non usano la gestione errori di HTTPService, che in caso di errore restituisce un Observable che non termina mai:\r\n // l'await resterebbe appeso e la pagina bloccata in caricamento. L'errore arriva al chiamante (vedi errorText), tranne la sessione scaduta:\r\n // per quella ripeto una chiamata qualsiasi con la gestione standard, così il redirect al login lo fa HTTPService come sulle altre pagine\r\n private v2<T>(call: Observable<T>): Observable<T> {\r\n return call.pipe(catchError(err => {\r\n if (err?.status == 401)\r\n this.http.get<KeyValue[]>(GET_Director_GetInstances, new HttpParams()).subscribe();\r\n return throwError(() => err);\r\n }));\r\n }\r\n\r\n private v2Call<T>(call: Observable<T>): Promise<T> {\r\n return firstValueFrom(this.v2(call));\r\n }\r\n\r\n // Istanza che risponde alla chiamata, facoltativa: se il backend non la dà la pagina va avanti senza\r\n public async getInstanceId(be: string): Promise<string> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: string = await firstValueFrom(this.http.get<string>(GET_Director_GetInstanceId, pars, null, false).pipe(catchError(_ => of(null as string))));\r\n return ret;\r\n }\r\n\r\n // Testo di un errore delle chiamate v2: il backend-for-frontend manda il messaggio come stringa JSON (542 per i 400 del backend).\r\n // Solo la prima riga, perché i 500 portano lo stack\r\n public errorText(err: any): string {\r\n let message = typeof err?.error === \"string\" ? err.error : err?.error?.message ?? err?.message ?? \"\";\r\n return String(message).split(/\\r?\\n/)[0];\r\n }\r\n\r\n public async getInfos(be: string): Promise<DirectorInfos> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: DirectorInfos = await firstValueFrom(this.http.get<DirectorInfos>(GET_Director_GetInfos, pars, null, false).pipe(catchError(_ => of(null as DirectorInfos))));\r\n return ret;\r\n }\r\n\r\n public async getNodeStats(be: string, nodeId: string, global: boolean = false): Promise<NodeStats> {\r\n let pars = new HttpParams().set(\"nodeId\", nodeId ?? \"\").set(\"be\", be ?? \"\").set(\"global\", global);\r\n let ret: NodeStats = await firstValueFrom(this.http.get<NodeStats>(GET_Director_GetNodeStats, pars));\r\n return ret;\r\n }\r\n\r\n public async getSessionStats(be: string, sid: string, serial: string, instance: string): Promise<SessionStats> {\r\n let pars = new HttpParams().set('sid', sid ?? \"\").set('serial', serial ?? \"\").set('instanceid', instance ?? \"\").set(\"be\", be ?? \"\");\r\n let ret: SessionStats = await firstValueFrom(this.http.get<SessionStats>(GET_Director_GetSessionStats, pars));\r\n return ret;\r\n }\r\n\r\n public async getProfilerDataNodes(be: string, sv: ProfilerDataNodesView): Promise<ProfilerDataNodesView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: ProfilerDataNodesView = await firstValueFrom(this.http.post<ProfilerDataNodesView>(POST_Director_GetProfilerDataNodes, sv, pars));\r\n return ret;\r\n }\r\n\r\n public downloadWorkloadReport(be: string, from: string, to: string, global: boolean = false) {\r\n let pars = new HttpParams().set(\"from\", from ?? \"\").set(\"to\", to ?? \"\").set(\"be\", be ?? \"\").set(\"global\", global);\r\n this.http.getFileNative(GET_Director_GetWorkloadReport, pars);\r\n }\r\n\r\n // Stesso URL di downloadWorkloadReport: con DirectorFeature.WorkloadReportV2 attivo il backend-for-frontend non manda più un file\r\n // ma l'HTML del report come stringa JSON. Restituisce l'Observable perché la generazione dura qualche secondo e si può annullare\r\n public getWorkloadReportV2(be: string, req: WorkloadReportV2Request): Observable<string> {\r\n let pars = new HttpParams().set(\"be\", be ?? \"\");\r\n if (req.snapFrom != null)\r\n pars = pars.set(\"snapFrom\", req.snapFrom).set(\"snapTo\", req.snapTo);\r\n if (req.global != null)\r\n pars = pars.set(\"global\", req.global);\r\n for (let id of req.instanceIds ?? [])\r\n pars = pars.append(\"instanceIds\", id);\r\n return this.v2(this.http.get<string>(GET_Director_GetWorkloadReport, pars, null, false));\r\n }\r\n\r\n // Stesso URL di getMetricsList: con DirectorFeature.MetricsV2 attivo il backend-for-frontend risponde con il catalogo (nome, tipo, unità, istanze)\r\n public async getMetricsCatalogV2(be: string, req: MetricsV2CatalogRequest): Promise<MetricsV2Info[]> {\r\n let pars = new HttpParams().set(\"be\", be ?? \"\");\r\n if (req.global != null)\r\n pars = pars.set(\"global\", req.global);\r\n for (let id of req.instanceIds ?? [])\r\n pars = pars.append(\"instanceIds\", id);\r\n let ret: MetricsV2Info[] = await this.v2Call(this.http.get<MetricsV2Info[]>(GET_Director_GetMetrics, pars, null, false));\r\n return ret;\r\n }\r\n\r\n // Stesso URL di getMetrics: con DirectorFeature.MetricsV2 attivo il backend-for-frontend risponde con i campioni del backend così come sono\r\n public async getMetricsV2(be: string, req: MetricsV2Request): Promise<MetricsV2Sample[]> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: MetricsV2Sample[] = await this.v2Call(this.http.post<MetricsV2Sample[]>(POST_Director_GetMetrics, req, pars, \"\", false));\r\n return ret;\r\n }\r\n\r\n public async getWorkloadSnapshots(be: string, req: WorkloadSnapshotsRequest): Promise<WorkloadSnapshotList> {\r\n let pars = new HttpParams().set(\"be\", be ?? \"\");\r\n if (req.from)\r\n pars = pars.set(\"from\", req.from);\r\n if (req.to)\r\n pars = pars.set(\"to\", req.to);\r\n for (let id of req.instanceIds ?? [])\r\n pars = pars.append(\"instanceIds\", id);\r\n let ret: WorkloadSnapshotList = await this.v2Call(this.http.get<WorkloadSnapshotList>(GET_Director_GetSnapshots, pars, null, false));\r\n return ret;\r\n }\r\n\r\n public async getMetrics(be: string, sv: MetricsView): Promise<MetricsView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: MetricsView = await firstValueFrom(this.http.post<MetricsView>(POST_Director_GetMetrics, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async getMetricsList(be: string, from: string, to: string): Promise<Metric[]> {\r\n let pars = new HttpParams()\r\n .set(\"from\", from ?? \"\")\r\n .set(\"to\", to ?? \"\")\r\n .set(\"be\", be ?? \"\");\r\n\r\n let ret: Metric[] = await firstValueFrom(this.http.get<Metric[]>(GET_Director_GetMetrics, pars));\r\n return ret.sort((a, b) => a.name.localeCompare(b.name));\r\n }\r\n\r\n public async getServerLocks(be: string, sv: LocksView): Promise<LocksView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: LocksView = await firstValueFrom(this.http.post<LocksView>(POST_Director_GetServerLocks, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async getServerQuery(be: string, sv: QueryView): Promise<QueryView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: QueryView = await firstValueFrom(this.http.post<QueryView>(POST_Director_GetServerQuery, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async getDynamicViewData(be: string, sv: DynamicViewsView): Promise<DynamicViewsView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: DynamicViewsView = await firstValueFrom(this.http.post<DynamicViewsView>(POST_Director_GetDynamicViewData, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async getDynamicViews(be: string): Promise<KeyValue[]> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: KeyValue[] = await firstValueFrom(this.http.get<KeyValue[]>(GET_Director_GetDynamicViews, pars));\r\n return ret;\r\n }\r\n\r\n public async getServerAudits(be: string, sv: AuditsView): Promise<AuditsView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: AuditsView = await firstValueFrom(this.http.post<AuditsView>(POST_Director_GetServerAudits, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async getSystemParameters(be: string, sv: SystemParametersView): Promise<SystemParametersView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: SystemParametersView = await firstValueFrom(this.http.post<SystemParametersView>(POST_Director_GetSystemParameters, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async getInstances(be: string): Promise<KeyValue[]> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: KeyValue[] = await firstValueFrom(this.http.get<KeyValue[]>(GET_Director_GetInstances, pars));\r\n return ret;\r\n }\r\n\r\n \r\n public async getLogTargets(be: string, instance: string): Promise<KeyValue[]> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\").set(\"instance\", instance ?? \"\");\r\n let ret: KeyValue[] = await firstValueFrom(this.http.get<KeyValue[]>(GET_Director_GetLogTargets, pars));\r\n return ret;\r\n }\r\n\r\n public async updateSystemParameter(be: string, dto: SystemParameters): Promise<string> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: string = await firstValueFrom(this.http.post<string>(POST_Director_UpdatSystemParameter, dto, pars));\r\n return ret;\r\n }\r\n\r\n public async resetSystemParameter(be: string, parId: string, level: string): Promise<string> {\r\n let pars = new HttpParams()\r\n .set(\"parId\", parId)\r\n .set(\"level\", level)\r\n .set(\"be\", be ?? \"\");\r\n\r\n let ret: string = await firstValueFrom(this.http.get<string>(GET_Director_ResetSystemParameter, pars));\r\n return ret;\r\n }\r\n}","// Angular\r\nimport { Component, Inject } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { InterComService, InboundMessageTypes, ClipboardService } from \"@esfaenza/extensions\";\r\n\r\n// Applicazione\r\nimport { AuditsView } from \"../../models/components/AuditsView\";\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { ADM_MODULE_PATH, ADM_CONVERSATIONS } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmAuditLoc } from \"./adm_audits.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\n\r\ndeclare var dayjs;\r\n\r\n@Component({\r\n selector: \"adm_audits\",\r\n viewProviders: [{ provide: LocalizationService, useClass: AdmAuditLoc }],\r\n templateUrl: \"./adm_audits.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmAuditsComponent {\r\n\r\n public searchView: AuditsView = new AuditsView();\r\n public Actions: KeyValue[] = [];\r\n public HttpMethods: KeyValue[] = [];\r\n public searchInProgress: boolean = false;\r\n public storageSub: any;\r\n\r\n private be: string;\r\n\r\n constructor(\r\n public lc: LocalizationService,\r\n private intercom: InterComService,\r\n private localStorage: PreferencesService,\r\n private route: ActivatedRoute,\r\n private location: Location,\r\n private adms: AdminModuleBaseService,\r\n public exts: ClipboardService,\r\n @Inject(ADM_MODULE_PATH) private mod: string,\r\n @Inject(ADM_CONVERSATIONS) public usesConversations: boolean) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n\r\n this.HttpMethods = [\r\n { id: \"GET\", description: \"GET\" },\r\n { id: \"POST\", description: \"POST\" },\r\n { id: \"PUT\", description: \"PUT\" },\r\n { id: \"PATCH\", description: \"PATCH\" },\r\n { id: \"DELETE\", description: \"DELETE\" }\r\n ];\r\n\r\n this.Actions = [\r\n { id: \"C\", description: this.lc.loc(\"Chiamata REST\") },\r\n { id: \"U\", description: this.lc.loc(\"Aggiornamento\") },\r\n { id: \"D\", description: this.lc.loc(\"Elimina\") }\r\n ];\r\n }\r\n\r\n ngOnInit() {\r\n this.storageSub = this.route.queryParams.subscribe(params => { this.Init(params[\"ignoreStorage\"]); });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n async Init(ignoreStorage) {\r\n let item = await this.localStorage.getItem<AuditsView>(\"HotAudittato\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/serveraudits`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotAudittato\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: AuditsView) {\r\n //Se ho la HotPotato vuol dire che sono appena tornato dall'edit/nuovo. Rifaccio la ricerca in base ai filtri precedenti\r\n //Altirmenti genero il modello nuovo normalmente\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetProcesses(this.searchView);\r\n }\r\n else {\r\n this.searchView = new AuditsView();\r\n this.searchView.filterda = dayjs().add(-1, \"month\").format(this.lc.token(\"getSmallDateFormat\"));\r\n this.searchView.filtera = dayjs().format(this.lc.token(\"getSmallDateFormat\"));\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n this.searchInProgress = true;\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n this.POSTGetProcesses(this.searchView);\r\n }\r\n\r\n async POSTGetProcesses(data: AuditsView) {\r\n this.searchView = await this.adms.getServerAudits(this.be, data);\r\n this.searchInProgress = false;\r\n this.localStorage.setItem(\"HotAudittato\", this.searchView).subscribe();\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Ricerca Audit Applicativi' | localize: lc}}</span>\n </div>\n <div class=\"card-body widget-body\">\n <div class=\"col-md-12 bottom-15\">\n <form role=\"form\">\n <div class=\"row\">\n <div class=\"col-md-11\">\n <div class=\"col-md-12 row app-no-padding app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-date [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterda\" name=\"filterda\" [Placeholder]=\"'Da' | localize: lc\"></form-date>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-date [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtera\" name=\"filtera\" [Placeholder]=\"'A' | localize: lc\"></form-date>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filteruser\" name=\"filteruser\" [Placeholder]=\"'Utente' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filteraddress\" name=\"filteraddress\" [Placeholder]=\"'Indirizzo' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterroute\" name=\"filterroute\" [Placeholder]=\"'Route' | localize : lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [Placeholder]=\"'Azione' | localize: lc\" [(ngModel)]=\"searchView.filteraction\" name=\"filteraction\" [Source]=\"Actions\"></form-select>\n </div>\n </div>\n <div class=\"col-md-12 row app-no-padding\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [Placeholder]=\"'Metodo HTTP' | localize: lc\" [(ngModel)]=\"searchView.filterhttp\" name=\"filterhttp\" [Source]=\"HttpMethods\"></form-select>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterargs\" name=\"filterargs\" [Placeholder]=\"'Argomenti' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterobjid\" name=\"filterobjid\" [Placeholder]=\"'ID Oggetto' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterobjtype\" name=\"filterobjtype\" [Placeholder]=\"'Tipo Oggetto' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterhttpcode\" name=\"filterhttpcode\" [Placeholder]=\"'Risposta HTTP' | localize: lc\"></form-input>\n </div>\n <!-- Per ora commentato -->\n <!-- <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" *ngIf=\"usesConversations\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterconversationid\" name=\"filterconversationid\" [Placeholder]=\"'Cod. Conversation' | localize: lc\"></form-input>\n </div> -->\n </div>\n </div>\n <div class=\"col-md-1 app-no-padding\">\n <button [disabled]=\"searchInProgress\" class=\"input-group-addon btn app-btn-search\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n </div>\n </form>\n </div>\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!searchView) {\n <p><em>{{'Carico gli Audit dell\\'Applicazione' | localize: lc}}...</em></p>\n }\n @if (searchView) {\n <div>\n <es-table [(ngModel)]=\"searchView\" [MultipleOrderingDirectives]=\"true\" (onSearchRequest)=\"sendSearch($event);\">\n <span *th=\"'Timestamp'\">{{'Data' | localize: lc}}</span>\n <span *th=\"'User'\">{{'Utente' | localize: lc}}</span>\n <span *th=\"'RemoteAddress'\">{{'Indirizzo' | localize: lc}}</span>\n <span *th=\"'Action'\">{{'Azione' | localize: lc}}</span>\n <span *th=\"'HttpMethod'\">{{'Metodo HTTP' | localize: lc}}</span>\n <span *th=\"'Route'\">{{'Route' | localize : lc}}</span>\n <span *th=\"'Args'\">{{'Argomenti' | localize: lc}}</span>\n <span *th=\"'HttpResponse'\">{{'Risposta HTTP' | localize: lc}}</span>\n <span *th=\"'NonStdErrorMessage'\">{{'Codice Errore Applicativo' | localize: lc}}</span>\n <span *th=\"'ConvId'; If: usesConversations\">{{'Cod. Conversation' | localize: lc}}</span>\n <span *th=\"'ObjectType'\">{{'Tipo Oggetto' | localize: lc}}</span>\n <span *th=\"'ObjectId'\">{{'ID Oggetto' | localize: lc}}</span>\n <span *th=\"'ObjectData'\">{{'Dati Oggetto' | localize: lc}}</span>\n <strong *td=\"'Timestamp'; let item\">{{item.timestamp | loc_date:'DD/MM/YYYY HH:mm:ss'}}</strong>\n <span *td=\"'User'; let item\">{{item.user}}</span>\n <span *td=\"'RemoteAddress'; let item\">{{item.address}}</span>\n <span *td=\"'Action'; let item\">{{item.action}}</span>\n <span *td=\"'HttpMethod'; let item\">{{item.httpmethod}}</span>\n <span *td=\"'Route'; let item\">{{item.route}}</span>\n <span *td=\"'Args'; let item\" class=\"app-pointer\" title=\"Click per copiarlo nella clipboard\" (click)=\"exts.copyTextToClipboard(item.args)\">{{item.args}}</span>\n <span *td=\"'HttpResponse'; let item\">{{item.httpresponse}}</span>\n <span *td=\"'NonStdErrorMessage'; let item\">{{item.mdmerrorcode}}</span>\n <span *td=\"'ConvId'; If: usesConversations; let item\">{{item.conversationid}}</span>\n <span *td=\"'ObjectType'; let item\">{{item.objecttype}}</span>\n <span *td=\"'ObjectId'; let item\">{{item.objectid}}</span>\n <span *td=\"'ObjectData'; let item\">{{item.objectdata}}</span>\n </es-table>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n</div>","export class KeyValue {\r\n constructor(public id: string, public description: string) { }\r\n}","import { AppSearch, GenericItem } from \"@esfaenza/es-table\";\r\n\r\nexport class ProcessesView extends AppSearch<GenericItem> {\r\n constructor() { super(); }\r\n\r\n filtertenant: string;\r\n filteruser: string;\r\n filterstate: string;\r\n filterglobal: boolean;\r\n filtertype: string;\r\n filterthreadtype: string;\r\n filterthreadstatus: string;\r\n filterinwait: boolean;\r\n filtersid: string;\r\n filtertid: string;\r\n filtermtid: string;\r\n filterdcid: boolean;\r\n\r\n filterbe: string;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmWrkLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Gruppo di Consumo modificato con successo\", [\"Consumer Group succesfully changed\"]);\r\n super.set(\"it->en\", \"Errori nella modifica del Gruppo di Consumo\", [\"Errors changing Consumer Group\"]);\r\n super.set(\"it->en\", \"Modifica Gruppo di Consumo\", [\"Change Consumer Group\"]);\r\n super.set(\"it->en\", \"Nuovo Gruppo di Consumo\", [\"New Consumer Group\"]);\r\n super.set(\"it->en\", \"Tipo Thread\", [\"Thread Type\"]);\r\n super.set(\"it->en\", \"Stato Thread\", [\"Thread Status\"]);\r\n super.set(\"it->en\", \"Tipo\", [\"Type\"]);\r\n super.set(\"it->en\", \"Stato\", [\"State\"]);\r\n super.set(\"it->en\", \"SID\", [\"SID\"]);\r\n super.set(\"it->en\", \"TID\", [\"TID\"]);\r\n super.set(\"it->en\", \"In Attesa\", [\"In Wait\"]);\r\n super.set(\"it->en\", \"Push dedicato connesso\", [\"Dedicated push connected\"]);\r\n super.set(\"it->en\", \"Ricerca globale\", [\"Global search\"]);\r\n super.set(\"it->en\", \"Ricerca Processi Applicativi\", [\"Search Application Processes\"]);\r\n super.set(\"it->en\", \"Tenant\", [\"Tenant\"]);\r\n super.set(\"it->en\", \"Errori nella modifica del Tracing del Processo\", [\"Errors toggling Process Tracing\"]);\r\n super.set(\"it->en\", \"Utente\", [\"User\"]);\r\n super.set(\"it->en\", \"Carico i Processi Applicativi\", [\"Loading Application Processes\"]);\r\n super.set(\"it->en\", \"Attiva Tracing Processo\", [\"Activate Process Tracing\"]);\r\n super.set(\"it->en\", \"Disattiva Tracing Progetto\", [\"Deactivate Process Tracing\"]);\r\n super.set(\"it->en\", \"Ammazza Processo\", [\"Kill Process\"]);\r\n super.set(\"it->en\", \"Errori durante la Kill del Processo\", [\"Errors killing the Process\"]);\r\n super.set(\"it->en\", \"Processo ucciso con successo\", [\"Process succesfully killed\"]);\r\n super.set(\"it->en\", \"Conferma Terminazione del Processo\", [\"Confirm Process Kill\"]);\r\n super.set(\"it->en\", \"Sei sicuro di voler Terminare il processo selezionato? L'utente relativo sara' disconnesso\", [\"Are you sure you wish to kill the selected process? The associated user will be disconnected\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject, ViewChild } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\nimport { NgForm } from \"@angular/forms\";\r\n\r\n// Configurazioni\r\nimport { InboundMessageTypes, InterComService, MessageService, UtilityService } from \"@esfaenza/extensions\";\r\nimport { EsTableOperationDefinition } from \"@esfaenza/es-table\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { ModalDirective } from \"ngx-bootstrap/modal\";\r\n\r\n// Applicazione\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { ProcessesView } from \"../../models/components/ProcessesView\";\r\nimport { ADM_MODULE_PATH } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmWrkLoc } from \"./adm_wrk.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { GenericItem } from \"@esfaenza/core/domain\";\r\n\r\n@Component({\r\n selector: \"adm_wrk\",\r\n viewProviders: [{ provide: LocalizationService, useClass: AdmWrkLoc }],\r\n templateUrl: \"./adm_wrk.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmWrkComponent {\r\n\r\n private globalFilterValue = null;\r\n\r\n public searchView: ProcessesView = new ProcessesView();\r\n public DynamicOps: EsTableOperationDefinition[] = [];\r\n public storageSub: any;\r\n public valueToShow: string = \"\";\r\n\r\n public Types: KeyValue[] = [];\r\n public States: KeyValue[] = [];\r\n public ThreadTypes: KeyValue[] = [];\r\n public ThreadStatuses: KeyValue[] = [];\r\n\r\n private be: string;\r\n constructor(\r\n private utiExts: UtilityService,\r\n private msgExts: MessageService,\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private location: Location,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string) {\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.DynamicOps = [\r\n new EsTableOperationDefinition(\"trace_on\", this.lc.loc(\"Attiva Tracing Processo\"), \"fa fa-circle text-danger\", \"\", \"trace_enabled\", \"N\"),\r\n new EsTableOperationDefinition(\"trace_off\", this.lc.loc(\"Disattiva Tracing Progetto\"), \"fa fa-circle text-success\", \"\", \"trace_enabled\", \"Y\"),\r\n new EsTableOperationDefinition(\"kill\", this.lc.loc(\"Ammazza Processo\"), \"fa fa-ban text-danger\"),\r\n new EsTableOperationDefinition(\"change_cg\", this.lc.loc(\"Modifica Gruppo di Consumo\"), \"fa fa-edit text-info\")\r\n ];\r\n }\r\n\r\n ngOnInit() {\r\n this.storageSub = this.route.queryParams.subscribe(params => {\r\n this.Init(params[\"ignoreStorage\"]);\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n Init(ignoreStorage) {\r\n this.Types = [new KeyValue(\"USER\", \"USER\"), new KeyValue(\"BACKGROUND\", \"BACKGROUND\"), new KeyValue(\"JOB\", \"JOB\")];\r\n this.States = [new KeyValue(\"ACTIVE\", \"ACTIVE\"), new KeyValue(\"INACTIVE\", \"INACTIVE\"), new KeyValue(\"KILLED\", \"KILLED\")];\r\n this.ThreadTypes = [\"APITHREAD\", \"APIPUSHTHREAD\", \"BACKGROUNDTHREAD\", \"JOBTHREAD\", \"PARALLELSLAVETHREAD\"].map(t => new KeyValue(t, t));\r\n this.ThreadStatuses = [\"ACTIVE\", \"IDLE\", \"THROTTLING\", \"KILLED\"].map(t => new KeyValue(t, t));\r\n this.doInit(ignoreStorage);\r\n }\r\n\r\n async doInit(ignoreStorage) {\r\n let item = await this.localStorage.getItem<ProcessesView>(\"HotProcessato\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/serverworkers`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotProcessato\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: ProcessesView) {\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetServerWorkers();\r\n }\r\n else {\r\n this.searchView = new ProcessesView();\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n this.searchView.searchinprogress = true;\r\n this.searchView.columns = [];\r\n this.searchView.column_ordering = [];\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n this.POSTGetServerWorkers();\r\n }\r\n\r\n async POSTGetServerWorkers() {\r\n // Switch cattivo per resettare la tabella quando cambia il global (dato che potrebbero cambiare le colonne)\r\n // La casistica è esplicitamente non supportata dall'estable quindi abbozzo un hard refresh da qui...\r\n if (this.globalFilterValue != null && this.globalFilterValue != this.searchView.filterglobal) {\r\n let prevSearchView = this.utiExts.deepClone(this.searchView);\r\n this.searchView = null;\r\n requestAnimationFrame(async () => {\r\n this.globalFilterValue = prevSearchView.filterglobal;\r\n this.searchView = await this.adms.getServerWorkers(this.be, prevSearchView);\r\n this.searchView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotProcessato\", this.searchView).subscribe();\r\n });\r\n }\r\n else {\r\n this.globalFilterValue = this.searchView.filterglobal || false;\r\n this.searchView = await this.adms.getServerWorkers(this.be, this.searchView);\r\n this.searchView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotProcessato\", this.searchView).subscribe();\r\n }\r\n }\r\n\r\n async prepareExport(callback) {\r\n var view = JSON.parse(JSON.stringify(this.searchView));\r\n view.page = 1;\r\n view.itemsperpageoverride = 9999999;\r\n let tmp = await this.adms.getServerWorkers(this.be, view);\r\n callback(tmp.items, GenericItem);\r\n }\r\n\r\n back() {\r\n this.location.back();\r\n }\r\n\r\n onOperation(event: { id: string, item: any }) {\r\n switch (event.id) {\r\n case \"trace_on\": this.toggleTracing(event.item, true); break;\r\n case \"trace_off\": this.toggleTracing(event.item, false); break;\r\n case \"kill\": this.killProcess(event.item); break;\r\n case \"change_cg\": this.changeProcessCg(event.item); break;\r\n }\r\n }\r\n\r\n async toggleTracing(process: any, tracing: boolean) {\r\n let res = await this.adms.doSetProcessTracing(this.be, (process.properties[\"inst_id\"] || process.properties[\"INST_ID\"] || \"\"), process.properties[\"sid\"] || process.properties[\"SID\"], process.properties[\"serial\"] || process.properties[\"SERIAL\"], tracing.toString());\r\n this.msgExts.manageStringResponse(res, \"\", this.lc.loc(\"Errori nella modifica del Tracing del Processo\"), () => this.sendSearch());\r\n }\r\n\r\n killProcess(process: any) {\r\n this.msgExts.simpleWarningWithChoice(\r\n this.lc.loc(\"Conferma Terminazione del Processo\"),\r\n this.lc.loc(\"Sei sicuro di voler Terminare il processo selezionato? L'utente relativo sara' disconnesso\"),\r\n async () => {\r\n let res = await this.adms.doKillProcess(this.be, (process.properties[\"inst_id\"] || process.properties[\"INST_ID\"] || \"\"), process.properties[\"sid\"] || process.properties[\"SID\"], process.properties[\"serial\"] || process.properties[\"SERIAL\"]);\r\n this.msgExts.manageStringResponse(res, this.lc.loc(\"Processo ucciso con successo\"), this.lc.loc(\"Errori durante la Kill del Processo\"), () => this.sendSearch());\r\n });\r\n }\r\n\r\n //********************************************** Gestione modifica Consumer Group ***************************************\r\n\r\n newCg: string = \"\";\r\n CGs: KeyValue[] = [];\r\n CgDictionariesLoaded: boolean = false;\r\n ProcessOnEdit: any;\r\n\r\n @ViewChild(\"cgFrom\") cgFrom: NgForm;\r\n @ViewChild(\"dlgChangeCg\") dlgChangeCg: ModalDirective;\r\n\r\n changeProcessCg(process: any) {\r\n this.ProcessOnEdit = process;\r\n if (!this.CgDictionariesLoaded) {\r\n this.loadCgDictionaries();\r\n this.CgDictionariesLoaded = true;\r\n }\r\n this.setupChangeCg();\r\n this.dlgChangeCg.show();\r\n }\r\n\r\n async loadCgDictionaries() {\r\n this.CGs = await this.adms.getConsumerGroups(this.be);\r\n }\r\n\r\n setupChangeCg() {\r\n this.utiExts.cleanForm(this.cgFrom)\r\n setTimeout(() => { this.newCg = \"\" });\r\n }\r\n\r\n async doChangeCg() {\r\n let res = await this.adms.doChangeProcessConsumerGroup(this.be, this.ProcessOnEdit.properties[\"inst_id\"] || this.ProcessOnEdit.properties[\"INST_ID\"], this.ProcessOnEdit.properties[\"sid\"] || this.ProcessOnEdit.properties[\"SID\"], this.ProcessOnEdit.properties[\"serial\"] || this.ProcessOnEdit.properties[\"SERIAL\"], this.newCg);\r\n this.msgExts.manageStringResponse(res, this.lc.loc(\"Gruppo di Consumo modificato con successo\"), this.lc.loc(\"Errori nella modifica del Gruppo di Consumo\"), () => this.sendSearch());\r\n return true;\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Ricerca Processi Applicativi' | localize: lc}}</span>\n </div>\n <div class=\"card-body widget-body\">\n @if (searchView) {\n <div class=\"col-md-12 bottom-15\">\n <form role=\"form\">\n <div class=\"row\">\n <div class=\"col-md-11\">\n <div class=\"col-md-12 row app-no-padding app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-1 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterglobal\" name=\"filterglobal\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterglobal = !searchView.filterglobal\">{{'Ricerca globale' | localize: lc}}</span>\n </div>\n <div class=\"col-xl-2 col-lg-1 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtersid\" name=\"filtersid\" [Placeholder]=\"'SID'| localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtertype\" name=\"filtertype\" [Placeholder]=\"'Tipo' | localize: lc\" [Source]=\"Types\"></form-select>\n </div>\n <div class=\"col-xl-2 col-lg-1 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtertenant\" name=\"filterTenant\" [Placeholder]=\"'Tenant' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filteruser\" name=\"filterUser\" [Placeholder]=\"'Utente' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterstate\" name=\"filterState\" [Placeholder]=\"'Stato' | localize: lc\" [Source]=\"States\"></form-select>\n </div>\n </div>\n <div class=\"col-md-12 row app-no-padding\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtertid\" name=\"filtertid\" [Placeholder]=\"'TID'| localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtermtid\" name=\"filtermtid\" [Placeholder]=\"'Thread gestito'| localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterthreadtype\" name=\"filterthreadtype\" [Placeholder]=\"'Tipo Thread' | localize: lc\" [Source]=\"ThreadTypes\"></form-select>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterthreadstatus\" name=\"filterthreadstatus\" [Placeholder]=\"'Stato Thread' | localize: lc\" [Source]=\"ThreadStatuses\"></form-select>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterinwait\" name=\"filterinwait\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterinwait = !searchView.filterinwait\">{{'In Attesa' | localize: lc}}</span>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterdcid\" name=\"filterdcid\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterdcid = !searchView.filterdcid\">{{'Push dedicato connesso' | localize: lc}}</span>\n </div>\n </div>\n </div>\n <div class=\"col-md-1 app-no-padding\">\n <button [disabled]=\"searchView.searchinprogress\" class=\"input-group-addon btn app-btn-search\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n </div>\n </form>\n </div>\n }\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!searchView) {\n <p><em>{{'Carico i Processi Applicativi' | localize: lc}}...</em></p>\n }\n @if (searchView) {\n <div>\n <es-table [(ngModel)]=\"searchView\" [DynamicOperations]=\"DynamicOps\" [Export]=\"true\" [ColumnsOrdering]=\"false\"\n [ExportFileName]=\"'Application Processes.csv'\" [ExportFunction]=\"prepareExport.bind(this)\" [AutoUpdate]=\"true\"\n [OrderByColumn]=\"true\" (onSearchRequest)=\"sendSearch($event);\" (onDynamicOperation)=\"onOperation($event)\">\n <span class=\"app-nowrap\" *td=\"'full_wait_stack'; let value\">\n <span class=\"fa fa-list app-pointer\" (click)=\"valueToShow = value; dlgValue.show();\"></span> \n {{value.length > 70 ? value.substr(0, 67) + '...' : value}}\n </span>\n </es-table>\n </div>\n }\n </div>\n </div>\n <div class=\"app-margin-top-15\">\n <button class=\"btn btn-secondary pull-left\" type=\"button\" (click)=\"back()\">{{'Indietro' | localize: lc}}</button>\n <div class=\"clearfix\"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div bsModal #dlgChangeCg=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-lg\" emaDraggable>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">{{'Modifica Gruppo di Consumo' | localize: lc}}</h4>\n <button type=\"button\" class=\"close pull-right\" (click)=\"dlgChangeCg.hide()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <form novalidate #cgFrom=\"ngForm\" (ngSubmit)=\"cgFrom.valid && doChangeCg() && dlgChangeCg.hide()\">\n <div class=\"modal-body\">\n <form-select [Label]=\"'Nuovo Gruppo di Consumo' | localize: lc\" [(ngModel)]=\"newCg\" name=\"newCg\" [Source]=\"CGs\" required [Last]=\"true\"></form-select>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary app-margin-right-5\" (click)=\"dlgChangeCg.hide()\">{{'Chiudi' | localize: lc}}</button>\n <button type=\"submit\" class=\"btn btn-primary\">{{'Conferma' | localize: lc}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n\n<div bsModal #dlgValue=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-xl\" app-draggable=\".modal-header\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title pull-left\">\n Full Wait Stack\n </h5>\n <button type=\"button\" class=\"close pull-right\" (click)=\"dlgValue.hide()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body app-padidng-bottom-20 app-padding-top-20\">\n <span class=\"app-wrap\">\n {{valueToShow}}\n </span>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"dlgValue.hide()\">Chiudi</button>\n </div>\n </div>\n </div>\n</div>","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class ProfilerDataNodeLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"ID Padre\", [\"Parent ID\"]);\r\n super.set(\"it->en\", \"ID\", [\"ID\"]);\r\n super.set(\"it->en\", \"Descrizione\", [\"Description\"]);\r\n super.set(\"it->en\", \"Chiamate\", [\"Calls\"]);\r\n super.set(\"it->en\", \"Tempo\", [\"Time\"]);\r\n super.set(\"it->en\", \"Tempo Max\", [\"Peak Time\"]);\r\n super.set(\"it->en\", \"Tempo Min\", [\"Min. Time\"]);\r\n super.set(\"it->en\", \"Tempo Medio\", [\"Avg. Time\"]);\r\n super.set(\"it->en\", \"Tempo Specifico\", [\"Specific Time\"])\r\n super.set(\"it->en\", \"Percentuale\", [\"Percentage\"]);\r\n super.set(\"it->en\", \"Chiamate Periodo\", [\"Calls for Period\"]);\r\n super.set(\"it->en\", \"Tempo Periodo\", [\"Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Max Periodo\", [\"Peak Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Min Periodo\", [\"Min. Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Medio Periodo\", [\"Avg. Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Specifico Periodo\", [\"Specific Time for Period\"]);\r\n super.set(\"it->en\", \"Percentuale Periodo\", [\"Percentage for Period\"]);\r\n super.set(\"it->en\", \"Nome Tipologia Evento\", [\"Event Type Name\"])\r\n super.set(\"it->en\", \"Nome Classe Attesa\", [\"Wait Class Name\"]);\r\n }\r\n}","import { Export, ExportLocalization } from \"@esfaenza/extensions\";\r\n\r\nimport { ProfilerDataNodeLoc } from \"./ProfilerDataNode.loc\";\r\n\r\n@ExportLocalization(ProfilerDataNodeLoc)\r\nexport class ProfilerDataNode {\r\n @Export(10, \"ID Padre\")\r\n parentid: string;\r\n @Export(20, \"ID\")\r\n id: string;\r\n @Export(30, \"Descrizione\")\r\n description: string;\r\n @Export(40, \"Chiamate\")\r\n calls: number;\r\n @Export(50, \"Tempo\")\r\n time: number;\r\n @Export(60, \"Tempo Max\")\r\n peaktime: number;\r\n @Export(70, \"Tempo Min\")\r\n mintime: number;\r\n @Export(80, \"Tempo Medio\")\r\n avgtime: number;\r\n @Export(90, \"Tempo Specifico\")\r\n timewithoutchildren: number;\r\n @Export(100, \"Percentuale\")\r\n percentage: number;\r\n @Export(110, \"Chiamate Periodo\")\r\n snapdeltacalls: number;\r\n @Export(120, \"Tempo Periodo\")\r\n snapdeltatime: number;\r\n @Export(130, \"Tempo Max Periodo\")\r\n snappeaktime: number;\r\n @Export(140, \"Tempo Min Periodo\")\r\n snapmintime: number;\r\n @Export(150, \"Tempo Medio Periodo\")\r\n snapavgtime: number;\r\n @Export(160, \"Tempo Specifico Periodo\")\r\n snaptimewithoutchildren: number;\r\n @Export(170, \"Percentuale Periodo\")\r\n snappercentage: number;\r\n @Export(180, \"Nome Tipologia Evento\")\r\n eventtypename: string;\r\n @Export(190, \"Nome Classe Attesa\")\r\n waitclassname: string;\r\n}","import { AppSearch } from \"@esfaenza/es-table\";\r\nimport { ProfilerDataNode } from \"./ProfilerDataNode\";\r\n\r\nexport class ProfilerDataNodesView extends AppSearch<ProfilerDataNode>{\r\n constructor() { super(); }\r\n\r\n filterfrom: string;\r\n filterto: string;\r\n filterglobal: boolean;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmProfilerComponentLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Profiler del Server\", [\"Server Profiler\"]);\r\n super.set(\"it->en\", \"Carico i Dati\", [\"Loading Data\"]);\r\n super.set(\"it->en\", \"ID\", [\"ID\"]);\r\n super.set(\"it->en\", \"Descrizione\", [\"Description\"]);\r\n super.set(\"it->en\", \"Chiamate\", [\"Calls\"]);\r\n super.set(\"it->en\", \"Tempo\", [\"Time\"]);\r\n super.set(\"it->en\", \"Tempo Max\", [\"Peak Time\"]);\r\n super.set(\"it->en\", \"Tempo Min\", [\"Min. Time\"]);\r\n super.set(\"it->en\", \"Tempo Medio\", [\"Avg. Time\"]);\r\n super.set(\"it->en\", \"Tempo Specifico\", [\"Specific Time\"]);\r\n super.set(\"it->en\", \"Percentuale\", [\"Percentage\"]);\r\n super.set(\"it->en\", \"Chiamate Periodo\", [\"Calls for Period\"]);\r\n super.set(\"it->en\", \"Tempo Periodo\", [\"Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Max Periodo\", [\"Peak Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Min Periodo\", [\"Min. Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Medio Periodo\", [\"Avg. Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Specifico Periodo\", [\"Specific Time for Period\"]);\r\n super.set(\"it->en\", \"Percentuale Periodo\", [\"Percentage for Period\"]);\r\n super.set(\"it->en\", \"Nome Tipologia Evento\", [\"Event Type Name\"]);\r\n super.set(\"it->en\", \"Nome Classe Attesa\", [\"Wait Class Name\"]);\r\n }\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class NodeDetailLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Sessioni Attive\", [\"Active Sessions\"]);\r\n super.set(\"it->en\", \"Dettaglio Attività Nodo\", [\"Activity Node Details\"]);\r\n super.set(\"it->en\", \"Tipo Evento\", [\"Event Type\"]);\r\n super.set(\"it->en\", \"Tempo Trascorso (Con Figli)\", [\"Elapsed (With Children)\"]);\r\n super.set(\"it->en\", \"Classe Attesa\", [\"Wait Class\"]);\r\n super.set(\"it->en\", \"Tempo Trascorso\", [\"Elapsed (No Children)\"]);\r\n super.set(\"it->en\", \"Stack di Attesa\", [\"Wait Stack\"]);\r\n super.set(\"it->en\", \"Utilizzo Risorse\", [\"Resources Usage\"]);\r\n super.set(\"it->en\", \"Esecuzioni\", [\"Executions\"]);\r\n\t\tsuper.set(\"it->en\", \"Dettaglio evento\", [\"Event detail\"]);\r\n }\r\n}","// Angular\r\nimport { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\nimport { BaseInterval, KeyValueColor, LineChartData, LineSerie, PieChartData } from \"@esfaenza/es-charts\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n// Applicazione\r\nimport { NodeStats } from \"../../models/components/NodeStats\";\r\n\r\n// Localizzazione\r\nimport { NodeDetailLoc } from \"./node_detail.component.loc\";\r\n\r\n@Component({\r\n selector: \"node-detail\",\r\n viewProviders: [{ provide: LocalizationService, useClass: NodeDetailLoc }],\r\n templateUrl: \"./node_detail.component.html\",\r\n standalone: false\r\n})\r\nexport class NodeDetailComponent {\r\n\r\n @Input() NodeDetails: NodeStats;\r\n\r\n @Output() onClose: EventEmitter<boolean> = new EventEmitter<boolean>();\r\n\r\n constructor(public lc: LocalizationService) { }\r\n\r\n ngOnInit() {\r\n let serie = new LineSerie(this.lc.loc(\"Sessioni Attive\"), this.NodeDetails.activesessions, null);\r\n this.NodeDetails.sessionchart = new LineChartData([serie]);\r\n this.NodeDetails.loadchart = new PieChartData([\r\n new KeyValueColor(\"CPU\", this.NodeDetails.cpuperc),\r\n new KeyValueColor(\"Wait\", this.NodeDetails.waitperc),\r\n new KeyValueColor(\"DB\", this.NodeDetails.dbperc),\r\n new KeyValueColor(\"Script\", this.NodeDetails.scriptperc),\r\n new KeyValueColor(\"Throttle\", this.NodeDetails.throttleperc),\r\n new KeyValueColor(\"Sleep\", this.NodeDetails.sleepperc),\r\n new KeyValueColor(\"Networking\", this.NodeDetails.networkperc),\r\n new KeyValueColor(\"IO\", this.NodeDetails.ioperc)\r\n ]);\r\n }\r\n\r\n closeDialog() {\r\n this.onClose.emit(true);\r\n }\r\n}","<div class=\"modal-dialog modal-xl\" emaDraggable>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">\n {{'Dettaglio Attività Nodo' | localize: lc}}\n @if (NodeDetails) {\n <span> {{NodeDetails.nodeid}}</span>\n }\n </h4>\n <button type=\"button\" class=\"close pull-right\" (click)=\"closeDialog()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n @if (NodeDetails) {\n <div class=\"modal-body\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <strong>{{'Tipo Evento' | localize: lc}}</strong>: {{NodeDetails.eventtypedesc}} <strong>{{'Classe Attesa' | localize: lc}}</strong>: {{NodeDetails.waitclassname}}\n </div>\n <div class=\"col-md-6\">\n <strong>{{'Tempo Trascorso (Con Figli)' | localize: lc}}</strong>: {{NodeDetails.elapsed}} s\n </div>\n <div class=\"col-md-6\">\n <strong>{{'Esecuzioni' | localize: lc}}</strong>: {{NodeDetails.executions}}\n </div>\n <div class=\"col-md-6\">\n <strong>{{'Tempo Trascorso' | localize: lc}}</strong>: {{NodeDetails.elapsedlesschildren}} s\n </div>\n </div>\n <div>\n <h5 class=\"app-margin-top-10\"><strong>{{'Dettaglio evento' | localize: lc}}</strong></h5>\n {{NodeDetails.nodedescription}}\n </div>\n @if ((NodeDetails?.waitstack?.length || 0) > 0) {\n <div style=\"max-height: 200px; overflow: auto\">\n <h5 class=\"app-margin-top-10\"><strong>{{'Stack di Attesa' | localize: lc}}</strong></h5>\n @for (wait of NodeDetails.waitstack; track wait; let i = $index) {\n <div>\n @for (_ of [].constructor(i+1); track _) {\n -\n } {{wait.nodeid}} - {{wait.nodedescription}}: \n <strong>{{'Tipo Evento' | localize: lc}}</strong>: {{wait.eventtypedesc}} \n <strong>{{'Classe Attesa' | localize: lc}}</strong>: {{wait.waitclassname}}\n </div>\n }\n </div>\n }\n @if ((NodeDetails?.foundininstanceids?.length || 0) > 0) {\n <div style=\"max-height: 200px; overflow: auto\">\n <h5 class=\"app-margin-top-10\"><strong>{{'Presente nelle seguenti istanze' | localize: lc}}</strong></h5>\n @for (instid of NodeDetails.foundininstanceids; track instid; let i = $index) {\n <div style=\"margin-right: 15px;\">\n {{instid}}\n </div>\n }\n </div>\n }\n <div style=\"height: 200px;\">\n <h5 class=\"app-margin-top-10\"><strong>{{'Utilizzo Risorse' | localize: lc}}</strong></h5>\n @if (NodeDetails.sessionchart) {\n <es-line-chart\n [MinGridDistance]=\"65\"\n [Timeline]=\"false\"\n [FinalInstants]=\"false\"\n [LegendPadding]=\"{top: 0, bottom: 7, right: 0, left: 10}\"\n [Fill]=\"true\"\n [MergeDatasets]=\"true\"\n [Data]=\"NodeDetails.sessionchart\"\n [Legend]=\"true\"\n name=\"nodeDetailSessionChart\"\n [DataGroupingThreshold]=\"99999999\"></es-line-chart>\n }\n </div>\n <div style=\"height: 200px;\">\n @if (NodeDetails.loadchart) {\n <es-pie-chart [Legend]=\"true\" [Data]=\"NodeDetails.loadchart\" name=\"nodeDetailLoadChart\"></es-pie-chart>\n }\n </div>\n </div>\n }\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"closeDialog()\">{{'Chiudi' | localize: lc}}</button>\n </div>\n </div>\n </div>","// Angular\r\nimport { Component, Inject, Optional } from \"@angular/core\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\nimport { HTTPService } from \"@esfaenza/httpservice\";\r\n\r\n// Applicazione\r\nimport { ProfilerDataNode } from \"../../models/components/ProfilerDataNode\";\r\nimport { ProfilerDataNodesView } from \"../../models/components/ProfilerDataNodesView\";\r\nimport { NodeStats } from \"../../models/components/NodeStats\";\r\n\r\nimport { ADM_MODULE_PATH, ADM_WORKLOAD_V2 } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmProfilerComponentLoc } from \"./adm_profiler.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\n\r\n@Component({\r\n selector: \"adm_profiler\",\r\n providers: [{ provide: LocalizationService, useClass: AdmProfilerComponentLoc }],\r\n templateUrl: \"./adm_profiler.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmProfilerComponent {\r\n public searchView: ProfilerDataNodesView = new ProfilerDataNodesView();\r\n public storageSub: any;\r\n\r\n public NodeDetails: NodeStats;\r\n private be: string;\r\n\r\n constructor(\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private location: Location,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService,\r\n private router: Router,\r\n @Inject(ADM_MODULE_PATH) private mod: string,\r\n @Optional() @Inject(ADM_WORKLOAD_V2) public workloadV2: boolean) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n ngOnInit() {\r\n this.storageSub = this.route.queryParams.subscribe(params => {\r\n this.Init(params[\"ignoreStorage\"]);\r\n });\r\n }\r\n\r\n Init(ignoreStore) {\r\n this.doInit(ignoreStore);\r\n }\r\n\r\n async doInit(ignoreStorage) {\r\n let item = await this.localStorage.getItem<ProfilerDataNodesView>(\"HotSearchProfilato\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/profiler`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotSearchProfilato\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: ProfilerDataNodesView) {\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetItems(this.searchView);\r\n }\r\n else {\r\n this.searchView = new ProfilerDataNodesView();\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n this.searchView.searchinprogress = true;\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n this.POSTGetItems(this.searchView);\r\n }\r\n\r\n // Con DirectorFeature.WorkloadReportV2 lo stesso URL non dà più un file: il report ha la sua pagina\r\n downloadWorkloadReport() {\r\n if (this.workloadV2) {\r\n this.router.navigate([`/pages/${this.mod}/workload`, ...(this.be ? [this.be] : [])]);\r\n return;\r\n }\r\n this.adms.downloadWorkloadReport(this.be, this.searchView.filterfrom, this.searchView.filterto, this.searchView.filterglobal);\r\n }\r\n\r\n async POSTGetItems(data: ProfilerDataNodesView) {\r\n this.searchView = await this.adms.getProfilerDataNodes(this.be, data);\r\n this.searchView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotSearchProfilato\", this.searchView).subscribe();\r\n }\r\n\r\n async prepareExport(dataCallBack) {\r\n var view = JSON.parse(JSON.stringify(this.searchView));\r\n view.page = 1;\r\n view.itemsperpageoverride = 9999999;\r\n let res = await this.adms.getProfilerDataNodes(this.be, view);\r\n dataCallBack(res.items, ProfilerDataNode);\r\n }\r\n\r\n loadNodeDetails(nodeId: string) {\r\n this.NodeDetails = null;\r\n requestAnimationFrame(async () => {\r\n this.NodeDetails = await this.adms.getNodeStats(this.be, nodeId);\r\n });\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Profiler del Server' | localize: lc}}</span> \n </div>\n <div class=\"card-body widget-body\">\n <div class=\"col-md-12 bottom-15\">\n <form role=\"form\">\n <div class=\"row app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-date [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterfrom\" name=\"filterfrom\" [Placeholder]=\"'Da' | localize: lc\"></form-date>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-date [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterto\" name=\"filterto\" [Placeholder]=\"'A' | localize: lc\"></form-date>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterglobal\" name=\"filterglobal\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterglobal = !searchView.filterglobal\">{{'Globale' | localize: lc}}</span>\n </div>\n\n <button [disabled]=\"searchView.searchinprogress\" class=\"input-group-addon btn app-btn-search app-margin-top-20 app-margin-right-5\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n <button class=\"input-group-addon btn app-btn-search app-margin-top-20\" (click)=\"downloadWorkloadReport()\" type=\"submit\" [title]=\"workloadV2 ? 'Workload report' : ''\"><i class=\"fa\" [class.fa-download]=\"!workloadV2\" [class.fa-file-text]=\"workloadV2\"></i></button>\n </div>\n </form>\n </div>\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!searchView) {\n <p><em>{{'Carico i Dati' | localize: lc}}</em></p>\n }\n @if (searchView) {\n <div>\n <es-table [(ngModel)]=\"searchView\" [Hierarchy]=\"true\" [OrderByColumn]=\"false\" [ParentKey]=\"'parentid'\"\n [OwnKey]=\"'id'\" [StartsExpanded]=\"false\" [ExportFunction]=\"prepareExport.bind(this)\" [Export]=\"true\"\n [ExportFileName]=\"'Profiler Export.csv'\" [HidePaging]=\"true\" (onSearchRequest)=\"sendSearch($event);\">\n <span *th=\"'1'\">{{'ID' | localize : lc}}</span>\n <span *th=\"'2'\">{{'Descrizione' | localize: lc}}</span>\n <span *th=\"'3'\">{{'Chiamate' | localize: lc}}</span>\n <span *th=\"'4'\">{{'Tempo' | localize: lc}}</span>\n <span *th=\"'5'\">{{'Tempo Max' | localize: lc}}</span>\n <span *th=\"'6'\">{{'Tempo Min' | localize: lc}}</span>\n <span *th=\"'7'\">{{'Tempo Medio' | localize: lc}}</span>\n <span *th=\"'8'\">{{'Tempo Specifico' | localize: lc}}</span>\n <span *th=\"'9'\">{{'Percentuale' | localize: lc}}</span>\n <span *th=\"'10'\">{{'Chiamate Periodo' | localize: lc}}</span>\n <span *th=\"'11'\">{{'Tempo Periodo' | localize: lc}}</span>\n <span *th=\"'12'\">{{'Tempo Max Periodo' | localize: lc}}</span>\n <span *th=\"'13'\">{{'Tempo Min Periodo' | localize: lc}}</span>\n <span *th=\"'14'\">{{'Tempo Medio Periodo' | localize: lc}}</span>\n <span *th=\"'15'\">{{'Tempo Specifico Periodo' | localize: lc}}</span>\n <span *th=\"'16'\">{{'Percentuale Periodo' | localize: lc}}</span>\n <span *th=\"'17'\">{{'Nome Tipologia Evento' | localize: lc}}</span>\n <span *th=\"'18'\">{{'Nome Classe Attesa' | localize: lc}}</span>\n <span *th=\"'19'\">{{'Numero Istanze' | localize: lc}}</span>\n <span *td=\"'1'; let item\"><span class=\"app-link app-inline\" (click)=\"loadNodeDetails(item.id); dlgNodeDetails.show();\">{{item.id}}</span></span>\n <span *td=\"'2'; let item\" title=\"{{item.description}}\">{{item.description.length <= 50 ? item.description : item.description.substr(0,50) + \"[...]\" }}</span>\n <span *td=\"'3'; let item\">{{item.calls}}</span>\n <span *td=\"'4'; let item\">{{item.time}}</span>\n <span *td=\"'5'; let item\">{{item.peaktime}}</span>\n <span *td=\"'6'; let item\">{{item.mintime}}</span>\n <span *td=\"'7'; let item\">{{item.avgtime}}</span>\n <span *td=\"'8'; let item\">{{item.timewithoutchildren }}</span>\n <span *td=\"'9'; let item\">{{item.percentage}}</span>\n <span *td=\"'10' let item\">{{item.snapdeltacalls}}</span>\n <span *td=\"'11' let item\">{{item.snapdeltatime}}</span>\n <span *td=\"'12' let item\">{{item.snappeaktime}}</span>\n <span *td=\"'13' let item\">{{item.snapmintime}}</span>\n <span *td=\"'14' let item\">{{item.snapavgtime}}</span>\n <span *td=\"'15' let item\">{{item.snaptimewithoutchildren}}</span>\n <span *td=\"'16' let item\">{{item.snappercentage}}</span>\n <span *td=\"'17' let item\">{{item.eventtypename}}</span>\n <span *td=\"'18' let item\">{{item.waitclassname}}</span>\n <span *td=\"'19' let item\">{{item.numinstances}}</span>\n </es-table>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div bsModal #dlgNodeDetails=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\n @if (NodeDetails) {\n <node-detail [NodeDetails]=\"NodeDetails\" (onClose)=\"dlgNodeDetails.hide()\"></node-detail>\n }\n</div>","// Ordinamento decrescente del profiler v2 (figli nell'albero, righe nella vista per nome). I numeri sono quelli del backend\r\nexport enum ProfilerOrderBy {\r\n Time = 0,\r\n TimeLessChildren = 1,\r\n Calls = 2,\r\n AvgTime = 3,\r\n PeakTime = 4,\r\n SnapDeltaTime = 5,\r\n SnapDeltaTimeLessChildren = 6,\r\n SnapDeltaCalls = 7,\r\n ActiveThreads = 8\r\n}\r\n\r\n// Parametri comuni del profiler v2 (specifica \"Profiler gerarchico\"): date in ISO UTC (…Z), campi non valorizzati = default del backend.\r\n// Il backend-for-frontend legge i nomi senza badare a maiuscole e minuscole e li inoltra in query string\r\nexport class ProfilerV2Request {\r\n realTime?: boolean;\r\n global?: boolean;\r\n instanceId?: string;\r\n snapFrom?: string;\r\n snapTo?: string;\r\n}\r\n\r\n// Albero: con search il backend ignora maxDepth, maxChildren e minPercentage\r\nexport class ProfilerV2TreeRequest extends ProfilerV2Request {\r\n rootNodeId?: string;\r\n maxDepth?: number;\r\n maxChildren?: number;\r\n minPercentage?: number;\r\n orderBy?: ProfilerOrderBy;\r\n search?: string;\r\n}\r\n\r\nexport class ProfilerV2NodeRequest extends ProfilerV2Request {\r\n nodeId: string;\r\n}\r\n\r\n// Eventi per nome: un evento per riga sommato su tutti i percorsi\r\nexport class ProfilerV2FlatRequest extends ProfilerV2Request {\r\n orderBy?: ProfilerOrderBy;\r\n top?: number;\r\n search?: string;\r\n eventType?: string;\r\n includeIdle?: boolean;\r\n}\r\n","// Angular\r\nimport { formatNumber } from \"@angular/common\";\r\nimport { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n// Formati del profiler v2 (specifica \"Profiler gerarchico\"): durate nell'unità più leggibile, interi con il separatore\r\n// delle migliaia italiano, percentuali con un decimale sotto 10. Un dato mancante è \"—\"\r\n@Pipe({ name: \"pv2fmt\" })\r\nexport class ProfilerFormatPipe implements PipeTransform {\r\n\r\n transform(value: number, kind: \"dur\" | \"int\" | \"pct\"): string {\r\n if (value == null || isNaN(value))\r\n return \"—\";\r\n switch (kind) {\r\n case \"dur\": return formatDuration(value);\r\n case \"pct\": return formatPercentage(value);\r\n default: return formatNumber(value, \"it\", \"1.0-0\");\r\n }\r\n }\r\n}\r\n\r\n// Secondi: \"850 µs\", \"4,27 ms\", \"312,5 ms\", \"8,41 s\", \"4 min 12 s\", \"3 h 20 min\", \"76 h\"\r\nexport function formatDuration(seconds: number): string {\r\n if (seconds == null || isNaN(seconds))\r\n return \"—\";\r\n let abs = Math.abs(seconds);\r\n if (abs < 0.001)\r\n return `${formatNumber(seconds * 1000000, \"it\", \"1.0-0\")} µs`;\r\n if (abs < 1)\r\n return `${formatNumber(seconds * 1000, \"it\", abs < 0.01 ? \"1.2-2\" : \"1.1-1\")} ms`;\r\n if (abs < 60)\r\n return `${formatNumber(seconds, \"it\", abs < 10 ? \"1.2-2\" : \"1.1-1\")} s`;\r\n if (abs < 3600)\r\n return `${Math.floor(abs / 60)} min ${Math.floor(abs % 60)} s`;\r\n if (abs < 48 * 3600)\r\n return `${Math.floor(abs / 3600)} h ${Math.floor(abs % 3600 / 60)} min`;\r\n return `${formatNumber(Math.floor(abs / 3600), \"it\", \"1.0-0\")} h`;\r\n}\r\n\r\n// Da 0 a 100: \"4,2%\", \"34%\"\r\nexport function formatPercentage(value: number): string {\r\n if (value == null || isNaN(value))\r\n return \"—\";\r\n return `${formatNumber(value, \"it\", Math.abs(value) < 10 ? \"1.1-1\" : \"1.0-0\")}%`;\r\n}\r\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmProfilerV2Loc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Profiler del Server\", [\"Server Profiler\"]);\r\n super.set(\"it->en\", \"Errore\", [\"Error\"]);\r\n\r\n // Barra dei comandi e riga della finestra\r\n super.set(\"it->en\", \"Sorgente\", [\"Source\"]);\r\n super.set(\"it->en\", \"Storico\", [\"History\"]);\r\n super.set(\"it->en\", \"Istanze\", [\"Instances\"]);\r\n super.set(\"it->en\", \"Questa istanza\", [\"This instance\"]);\r\n super.set(\"it->en\", \"Tutto il cluster\", [\"Whole cluster\"]);\r\n super.set(\"it->en\", \"istanze\", [\"instances\"]);\r\n super.set(\"it->en\", \"istanza\", [\"instance\"]);\r\n super.set(\"it->en\", \"Solo\", [\"Only\"]);\r\n super.set(\"it->en\", \"Dal\", [\"From\"]);\r\n super.set(\"it->en\", \"Al\", [\"To\"]);\r\n super.set(\"it->en\", \"Valori\", [\"Values\"]);\r\n super.set(\"it->en\", \"Dall'avvio\", [\"Since start\"]);\r\n super.set(\"it->en\", \"Dall'ultimo snapshot\", [\"Since last snapshot\"]);\r\n super.set(\"it->en\", \"Aggiorna\", [\"Refresh\"]);\r\n super.set(\"it->en\", \"Scarica il workload report\", [\"Download the workload report\"]);\r\n super.set(\"it->en\", \"Workload report\", [\"Workload report\"]);\r\n super.set(\"it->en\", \"Delta dall'ultimo snapshot delle\", [\"Delta since the last snapshot at\"]);\r\n super.set(\"it->en\", \"min fa\", [\"min ago\"]);\r\n super.set(\"it->en\", \"s fa\", [\"s ago\"]);\r\n super.set(\"it->en\", \"mai\", [\"never\"]);\r\n super.set(\"it->en\", \"Snapshot dalle\", [\"Snapshots from\"]);\r\n super.set(\"it->en\", \"alle\", [\"to\"]);\r\n super.set(\"it->en\", \"Nessuno snapshot termina nella finestra scelta\", [\"No snapshot ends in the chosen window\"]);\r\n super.set(\"it->en\", \"nodi nell'albero\", [\"nodes in the tree\"]);\r\n super.set(\"it->en\", \"nella risposta\", [\"in the response\"]);\r\n super.set(\"it->en\", \"eventi distinti\", [\"distinct events\"]);\r\n super.set(\"it->en\", \"Caricamento…\", [\"Loading…\"]);\r\n\r\n // Vista e ordinamenti\r\n super.set(\"it->en\", \"Albero\", [\"Tree\"]);\r\n super.set(\"it->en\", \"Per nome\", [\"By name\"]);\r\n super.set(\"it->en\", \"Ordina per\", [\"Sort by\"]);\r\n super.set(\"it->en\", \"Tempo\", [\"Time\"]);\r\n super.set(\"it->en\", \"Tempo proprio\", [\"Self time\"]);\r\n super.set(\"it->en\", \"Chiamate\", [\"Calls\"]);\r\n super.set(\"it->en\", \"Tempo medio\", [\"Average time\"]);\r\n super.set(\"it->en\", \"Picco\", [\"Peak\"]);\r\n super.set(\"it->en\", \"Δ Tempo\", [\"Δ Time\"]);\r\n super.set(\"it->en\", \"Δ Tempo proprio\", [\"Δ Self time\"]);\r\n super.set(\"it->en\", \"Δ Chiamate\", [\"Δ Calls\"]);\r\n super.set(\"it->en\", \"Thread attivi\", [\"Active threads\"]);\r\n super.set(\"it->en\", \"Tutti\", [\"All\"]);\r\n super.set(\"it->en\", \"Nessuna\", [\"None\"]);\r\n\r\n // Albero\r\n super.set(\"it->en\", \"Cerca nei nomi o per id\", [\"Search names or by id\"]);\r\n super.set(\"it->en\", \"Per esempio MRD_METERREADINGS, ENQUEUE, ProfilesMgr\", [\"For example MRD_METERREADINGS, ENQUEUE, ProfilesMgr\"]);\r\n super.set(\"it->en\", \"Figli per nodo\", [\"Children per node\"]);\r\n super.set(\"it->en\", \"Soglia\", [\"Threshold\"]);\r\n super.set(\"it->en\", \"Chiudi\", [\"Close\"]);\r\n super.set(\"it->en\", \"Il nodo non c'è nelle istanze scelte: l'albero riparte da Idle.\", [\"The node is not in the chosen instances: the tree starts again from Idle.\"]);\r\n super.set(\"it->en\", \"nodi trovati, con i loro antenati.\", [\"nodes found, with their ancestors.\"]);\r\n super.set(\"it->en\", \"I nodi trovati sono più di 1.000: sono mostrati i primi per l'ordinamento scelto.\", [\"More than 1,000 nodes found: the first ones by the chosen sort order are shown.\"]);\r\n super.set(\"it->en\", \"Nessun nodo contiene\", [\"No node contains\"]);\r\n super.set(\"it->en\", \"Nodo\", [\"Node\"]);\r\n super.set(\"it->en\", \"% del padre\", [\"% of parent\"]);\r\n super.set(\"it->en\", \"Δ Proprio\", [\"Δ Self\"]);\r\n super.set(\"it->en\", \"Medio\", [\"Average\"]);\r\n super.set(\"it->en\", \"Thread ora\", [\"Threads now\"]);\r\n super.set(\"it->en\", \"del padre\", [\"of parent\"]);\r\n super.set(\"it->en\", \"del nodo di primo livello\", [\"of the first-level node\"]);\r\n super.set(\"it->en\", \"Esecuzione in corso da\", [\"Execution running for\"]);\r\n super.set(\"it->en\", \"forse bloccata\", [\"possibly stuck\"]);\r\n super.set(\"it->en\", \"Caricamento dei figli…\", [\"Loading children…\"]);\r\n super.set(\"it->en\", \"figli non mostrati\", [\"children not shown\"]);\r\n super.set(\"it->en\", \"chiamate\", [\"calls\"]);\r\n super.set(\"it->en\", \"Mostra tutti\", [\"Show all\"]);\r\n super.set(\"it->en\", \"Nessuno snapshot termina nella finestra scelta: allargala o spostala indietro.\", [\"No snapshot ends in the chosen window: widen it or move it back.\"]);\r\n super.set(\"it->en\", \"Il nodo non c'è nelle istanze scelte.\", [\"The node is not in the chosen instances.\"]);\r\n\r\n // Eventi per nome\r\n super.set(\"it->en\", \"Cerca nei nomi\", [\"Search names\"]);\r\n super.set(\"it->en\", \"Tipo\", [\"Type\"]);\r\n super.set(\"it->en\", \"Righe\", [\"Rows\"]);\r\n super.set(\"it->en\", \"Anche gli eventi idle\", [\"Include idle events\"]);\r\n super.set(\"it->en\", \"Evento\", [\"Event\"]);\r\n super.set(\"it->en\", \"Percorsi\", [\"Paths\"]);\r\n super.set(\"it->en\", \"% proprio\", [\"% self\"]);\r\n super.set(\"it->en\", \"Picco dall'avvio\", [\"Peak since start\"]);\r\n super.set(\"it->en\", \"Thread\", [\"Threads\"]);\r\n super.set(\"it->en\", \"Nodi con più tempo\", [\"Nodes with the most time\"]);\r\n super.set(\"it->en\", \"Dettaglio\", [\"Details\"]);\r\n super.set(\"it->en\", \"Apri nell'albero\", [\"Open in tree\"]);\r\n super.set(\"it->en\", \"altri\", [\"more\"]);\r\n super.set(\"it->en\", \"Nessun evento con questi filtri.\", [\"No events match these filters.\"]);\r\n super.set(\"it->en\", \"mostrati i primi\", [\"showing the first\"]);\r\n super.set(\"it->en\", \"La percentuale è sul tempo proprio di tutti gli eventi non idle.\", [\"The percentage is of the self time of all non-idle events.\"]);\r\n\r\n // Dettaglio\r\n super.set(\"it->en\", \"Seleziona un nodo per vederne il dettaglio.\", [\"Select a node to see its details.\"]);\r\n super.set(\"it->en\", \"Il nodo non c'è nelle istanze o nella finestra scelte.\", [\"The node is not in the chosen instances or window.\"]);\r\n super.set(\"it->en\", \"Copia\", [\"Copy\"]);\r\n super.set(\"it->en\", \"Copiato\", [\"Copied\"]);\r\n super.set(\"it->en\", \"Percorso\", [\"Path\"]);\r\n super.set(\"it->en\", \"Nella finestra\", [\"In window\"]);\r\n super.set(\"it->en\", \"Esecuzioni\", [\"Executions\"]);\r\n super.set(\"it->en\", \"Tempo totale\", [\"Total time\"]);\r\n super.set(\"it->en\", \"Minimo\", [\"Minimum\"]);\r\n super.set(\"it->en\", \"Adesso\", [\"Now\"]);\r\n super.set(\"it->en\", \"Thread dentro\", [\"Threads inside\"]);\r\n super.set(\"it->en\", \"Esecuzione più lunga\", [\"Longest execution\"]);\r\n super.set(\"it->en\", \"Ultima uscita\", [\"Last exit\"]);\r\n super.set(\"it->en\", \"Tempo proprio del sottoalbero per tipo\", [\"Subtree self time by type\"]);\r\n super.set(\"it->en\", \"Sessioni attive sul nodo e sui discendenti\", [\"Active sessions on node and descendants\"]);\r\n super.set(\"it->en\", \"Media\", [\"Average\"]);\r\n super.set(\"it->en\", \"picco\", [\"peak\"]);\r\n super.set(\"it->en\", \"sessioni\", [\"sessions\"]);\r\n super.set(\"it->en\", \"punti dell'API\", [\"API points\"]);\r\n super.set(\"it->en\", \"uno al secondo\", [\"one per second\"]);\r\n super.set(\"it->en\", \"uno ogni\", [\"one every\"]);\r\n super.set(\"it->en\", \"raggruppati a\", [\"grouped by\"]);\r\n super.set(\"it->en\", \"Nessun campione in memoria per questa finestra: il grafico copre solo le ultime due ore circa.\", [\"No in-memory samples for this window: the chart only covers about the last two hours.\"]);\r\n super.set(\"it->en\", \"Per istanza\", [\"By instance\"]);\r\n super.set(\"it->en\", \"Istanza\", [\"Instance\"]);\r\n super.set(\"it->en\", \"Proprio\", [\"Self\"]);\r\n super.set(\"it->en\", \"figli diretti\", [\"direct children\"]);\r\n super.set(\"it->en\", \"discendenti\", [\"descendants\"]);\r\n super.set(\"it->en\", \"Apri come radice\", [\"Open as root\"]);\r\n }\r\n}\r\n","// Angular\r\nimport { formatNumber, Location } from \"@angular/common\";\r\nimport { Component, Inject, Optional } from \"@angular/core\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { DateService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { firstValueFrom } from \"rxjs\";\r\n\r\n// Modelli\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { ProfilerOrderBy, ProfilerV2FlatRequest, ProfilerV2NodeRequest, ProfilerV2Request, ProfilerV2TreeRequest } from \"../../models/components/ProfilerV2Request\";\r\nimport { ProfilerV2ActiveSession, ProfilerV2Flat, ProfilerV2FlatItem, ProfilerV2Node, ProfilerV2NodeStats, ProfilerV2Tree } from \"../../models/components/ProfilerV2Response\";\r\nimport { formatDuration } from \"../../pipes/profiler_format.pipe\";\r\n\r\n// Applicazione\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { ADM_MODULE_PATH, ADM_WORKLOAD_V2 } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmProfilerV2Loc } from \"./profiler_v2.component.loc\";\r\n\r\ndeclare var dayjs;\r\n\r\nconst STORAGE_KEY = \"HotSearchProfilerV2\";\r\nconst INSTANCE_THIS = \"@this\";\r\nconst INSTANCE_ALL = \"@all\";\r\n// All'apertura la radice con due livelli (R6), poi i figli si chiedono un livello alla volta\r\nconst TREE_DEPTH = 2;\r\nconst SEARCH_MIN_CHARS = 2;\r\nconst SEARCH_DELAY_MS = 400;\r\nconst DATES_DELAY_MS = 600;\r\n// Muovendosi con la tastiera il dettaglio si chiede dopo una breve pausa, non a ogni tasto\r\nconst DETAIL_DELAY_MS = 180;\r\n// Esecuzione in corso da più di così: forse bloccata (R15)\r\nconst LONG_RUNNING_SECONDS = 60;\r\nconst CHART_POINTS = 160;\r\n\r\n// Ogni tipo di evento ha un colore fisso, gli stessi della Top Activity v2. Wait e sleep di classe Idle usano quello di Idle\r\nconst TYPE_COLORS: { [type: string]: string } = {\r\n Idle: \"#bdbdbd\", Cpu: \"#43a047\", Database: \"#1e88e5\", Wait: \"#fdd835\", Script: \"#8e24aa\", Network: \"#8d6e63\", IO: \"#00acc1\", Sleep: \"#90a4ae\", Throttle: \"#fb8c00\"\r\n};\r\nconst TYPE_LABELS: { [type: string]: string } = {\r\n Idle: \"Idle\", Cpu: \"CPU\", Database: \"DB\", Wait: \"Wait\", Script: \"Script\", Network: \"Net\", IO: \"I/O\", Sleep: \"Sleep\", Throttle: \"Throttle\"\r\n};\r\nconst EVENT_TYPES = [\"Cpu\", \"Database\", \"Wait\", \"Script\", \"Network\", \"IO\", \"Sleep\", \"Throttle\"];\r\n\r\n// Passando ai valori dall'ultimo snapshot l'ordinamento passa alla chiave corrispondente, e viceversa (R4)\r\nconst TO_SNAP: { [order: number]: ProfilerOrderBy } = {\r\n [ProfilerOrderBy.Time]: ProfilerOrderBy.SnapDeltaTime,\r\n [ProfilerOrderBy.TimeLessChildren]: ProfilerOrderBy.SnapDeltaTimeLessChildren,\r\n [ProfilerOrderBy.Calls]: ProfilerOrderBy.SnapDeltaCalls\r\n};\r\nconst TO_BASE: { [order: number]: ProfilerOrderBy } = {\r\n [ProfilerOrderBy.SnapDeltaTime]: ProfilerOrderBy.Time,\r\n [ProfilerOrderBy.SnapDeltaTimeLessChildren]: ProfilerOrderBy.TimeLessChildren,\r\n [ProfilerOrderBy.SnapDeltaCalls]: ProfilerOrderBy.Calls\r\n};\r\n\r\nexport class ProfilerV2Row {\r\n kind: \"node\" | \"loading\" | \"omitted\";\r\n node: ProfilerV2Node;\r\n depth: number;\r\n key: string;\r\n}\r\n\r\nexport class ProfilerV2TypePart {\r\n type: string;\r\n label: string;\r\n color: string;\r\n percentage: number;\r\n}\r\n\r\nexport class ProfilerV2Chart {\r\n area: string;\r\n line: string;\r\n color: string;\r\n max: number;\r\n lastX: number;\r\n lastY: number;\r\n start: string;\r\n middle: string;\r\n end: string;\r\n average: number;\r\n peak: number;\r\n points: number;\r\n interval: number;\r\n group: number;\r\n}\r\n\r\n// Preferenze ricordate fra una visita e l'altra (sorgente, istanze, finestra e radice ripartono dai default)\r\nclass ProfilerV2Settings {\r\n orderBy: string;\r\n maxChildren: string;\r\n minPercentage: string;\r\n snapValues: boolean;\r\n flatOrderBy: string;\r\n flatTop: string;\r\n}\r\n\r\n@Component({\r\n selector: \"profiler_v2\",\r\n providers: [{ provide: LocalizationService, useClass: AdmProfilerV2Loc }],\r\n templateUrl: \"./profiler_v2.component.html\",\r\n styleUrls: [\"./profiler_v2.component.scss\"],\r\n standalone: false\r\n})\r\nexport class AdmProfilerV2Component {\r\n public readonly EventTypes = EVENT_TYPES;\r\n\r\n // Barra dei comandi\r\n public live: boolean = true;\r\n // Di default tutto il cluster, come nella Top Activity v2\r\n public instance: string = INSTANCE_ALL;\r\n public filterfrom: string = \"\";\r\n public filterto: string = \"\";\r\n // Valori dall'ultimo snapshot invece che dall'avvio (solo live)\r\n public snapValues: boolean = false;\r\n public view: \"tree\" | \"flat\" = \"tree\";\r\n\r\n // Albero\r\n public orderBy: string = String(ProfilerOrderBy.Time);\r\n // \"0\" = tutti, nessuna soglia\r\n public maxChildren: string = \"25\";\r\n public minPercentage: string = \"0\";\r\n public searchText: string = \"\";\r\n public activeSearch: string = \"\";\r\n public tree: ProfilerV2Tree;\r\n public rows: ProfilerV2Row[] = [];\r\n public treeLoading: boolean = false;\r\n public treeError: string;\r\n public treeNotice: string;\r\n public matchCount: number = 0;\r\n\r\n // Eventi per nome\r\n public flatSearch: string = \"\";\r\n // \"*\" = tutti i tipi (con un id vuoto la select mostrerebbe il segnaposto invece di \"Tutti\")\r\n public flatType: string = \"*\";\r\n public flatOrderBy: string = String(ProfilerOrderBy.TimeLessChildren);\r\n public flatTop: string = \"100\";\r\n public flatIncludeIdle: boolean = false;\r\n public flat: ProfilerV2Flat;\r\n public flatLoading: boolean = false;\r\n public flatError: string;\r\n public openFlat: Set<string> = new Set();\r\n\r\n // Dettaglio\r\n public selectedId: string;\r\n public detail: ProfilerV2NodeStats;\r\n public detailLoading: boolean = false;\r\n public detailMissing: boolean = false;\r\n public detailError: string;\r\n public typeParts: ProfilerV2TypePart[] = [];\r\n public chart: ProfilerV2Chart;\r\n public copied: boolean = false;\r\n\r\n // Sorgenti di select e pulsanti\r\n public Instances: KeyValue[] = [];\r\n public TreeOrders: KeyValue[] = [];\r\n public FlatOrders: KeyValue[] = [];\r\n public TreeOrderOptions: KeyValue[] = [];\r\n public FlatOrderOptions: KeyValue[] = [];\r\n public ChildrenOptions: KeyValue[] = [];\r\n public ThresholdOptions: KeyValue[] = [];\r\n public FlatTypes: KeyValue[] = [];\r\n public FlatRows: KeyValue[] = [];\r\n\r\n private be: string;\r\n private instanceId: string;\r\n private instanceIds: string[] = [];\r\n private rootId: string = null;\r\n private nodes: Map<string, ProfilerV2Node> = new Map();\r\n private parents: Map<string, ProfilerV2Node> = new Map();\r\n private expanded: Set<string> = new Set();\r\n private expandedBeforeSearch: Set<string>;\r\n // Nodi di cui children è completo per i parametri correnti, anche se vuoto (per esempio tutti sotto la soglia)\r\n private loaded: Set<string> = new Set();\r\n private loadingChildren: Set<string> = new Set();\r\n // Una risposta arrivata dopo un ricaricamento successivo si scarta\r\n private treeGeneration: number = 0;\r\n private flatGeneration: number = 0;\r\n private detailGeneration: number = 0;\r\n private searchTimer: any;\r\n private flatSearchTimer: any;\r\n private datesTimer: any;\r\n private detailTimer: any;\r\n\r\n constructor(\r\n public dateExts: DateService,\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private location: Location,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string,\r\n @Optional() @Inject(ADM_WORKLOAD_V2) public workloadV2: boolean) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.buildSources();\r\n\r\n let saved = this.route.snapshot.queryParams[\"ignoreStorage\"] ? null : await firstValueFrom(this.localStorage.getItem<ProfilerV2Settings>(STORAGE_KEY), { defaultValue: null });\r\n if (saved)\r\n this.applySettings(saved);\r\n\r\n // Gli id sono stabili: la radice può stare nell'indirizzo della pagina\r\n this.rootId = this.route.snapshot.queryParams[\"root\"] || null;\r\n\r\n this.loadInstances();\r\n this.loadTree(false);\r\n }\r\n\r\n ngOnDestroy() {\r\n clearTimeout(this.searchTimer);\r\n clearTimeout(this.flatSearchTimer);\r\n clearTimeout(this.datesTimer);\r\n clearTimeout(this.detailTimer);\r\n }\r\n\r\n // #region Barra dei comandi\r\n\r\n setLive(live: boolean) {\r\n if (this.live == live)\r\n return;\r\n this.live = live;\r\n\r\n if (!live) {\r\n // Sullo storico non ci sono i valori dall'ultimo snapshot né i thread attivi (R30)\r\n this.snapValues = false;\r\n this.orderBy = String(+this.orderBy == ProfilerOrderBy.ActiveThreads ? ProfilerOrderBy.Time : TO_BASE[+this.orderBy] ?? +this.orderBy);\r\n this.flatOrderBy = String(+this.flatOrderBy == ProfilerOrderBy.ActiveThreads ? ProfilerOrderBy.TimeLessChildren : TO_BASE[+this.flatOrderBy] ?? +this.flatOrderBy);\r\n // Default: le quattro ore che finiscono all'ultimo snapshot\r\n if (!this.filterfrom || !this.filterto) {\r\n let lastSnapshot = this.parseUtc((this.view == \"tree\" ? this.tree?.snapFrom : this.flat?.snapFrom) ?? null) ?? this.floorHour(new Date());\r\n this.filterto = this.fmt(lastSnapshot);\r\n this.filterfrom = this.fmt(new Date(lastSnapshot.getTime() - 4 * 3600 * 1000));\r\n }\r\n }\r\n this.updateOrderOptions();\r\n this.reloadAll();\r\n }\r\n\r\n setInstance(id: string) {\r\n this.instance = id;\r\n this.reloadAll();\r\n }\r\n\r\n datesChanged() {\r\n clearTimeout(this.datesTimer);\r\n this.datesTimer = setTimeout(() => {\r\n if (this.toDate(this.filterfrom) && this.toDate(this.filterto))\r\n this.reloadAll();\r\n }, DATES_DELAY_MS);\r\n }\r\n\r\n // Cambia colonne e intestazioni; richiama il server solo se cambia anche l'ordinamento\r\n setSnapValues(on: boolean) {\r\n if (this.snapValues == on)\r\n return;\r\n this.snapValues = on;\r\n\r\n let map = on ? TO_SNAP : TO_BASE;\r\n let treeOrder = String(map[+this.orderBy] ?? +this.orderBy);\r\n // La vista per nome non propone Δ Tempo: lì Tempo resta Tempo\r\n let flatMapped = map[+this.flatOrderBy];\r\n let flatOrder = String(flatMapped != null && flatMapped != ProfilerOrderBy.SnapDeltaTime ? flatMapped : +this.flatOrderBy);\r\n let reload = this.view == \"tree\" ? treeOrder != this.orderBy : flatOrder != this.flatOrderBy;\r\n this.orderBy = treeOrder;\r\n this.flatOrderBy = flatOrder;\r\n this.saveSettings();\r\n if (reload)\r\n this.reloadView();\r\n }\r\n\r\n setView(view: \"tree\" | \"flat\") {\r\n if (this.view == view)\r\n return;\r\n this.view = view;\r\n this.reloadView();\r\n }\r\n\r\n // Aggiorna: la vista corrente e il dettaglio aperto (niente aggiornamento automatico, R5)\r\n reloadAll() {\r\n this.reloadView();\r\n if (this.selectedId)\r\n this.loadDetail(this.selectedId);\r\n }\r\n\r\n private reloadView() {\r\n if (this.view == \"tree\")\r\n this.loadTree(true);\r\n else\r\n this.loadFlat();\r\n }\r\n\r\n // Con DirectorFeature.WorkloadReportV2 il report non è più un file da scaricare: ha la sua pagina\r\n downloadWorkloadReport() {\r\n if (this.workloadV2) {\r\n this.router.navigate([`/pages/${this.mod}/workload`, ...(this.be ? [this.be] : [])]);\r\n return;\r\n }\r\n let from = this.live ? \"\" : this.filterfrom;\r\n let to = this.live ? \"\" : this.filterto;\r\n this.adms.downloadWorkloadReport(this.be, from, to, this.instance != INSTANCE_THIS);\r\n }\r\n\r\n get instanceLabel(): string {\r\n return this.Instances.find(t => t.id == this.instance)?.description ?? \"\";\r\n }\r\n\r\n get loading(): boolean {\r\n return this.view == \"tree\" ? this.treeLoading : this.flatLoading;\r\n }\r\n\r\n // Vista corrente, per la riga della finestra\r\n get current(): { snapFrom: string, snapTo: string } {\r\n return this.view == \"tree\" ? this.tree : this.flat;\r\n }\r\n\r\n private baseRequest<T extends ProfilerV2Request>(req: T): T {\r\n req.realTime = this.live;\r\n // Dietro un bilanciatore \"questa istanza\" cambia da una chiamata all'altra: si manda sempre l'istanza esplicita o global (R3)\r\n if (this.instance == INSTANCE_ALL)\r\n req.global = true;\r\n else if (this.instance != INSTANCE_THIS)\r\n req.instanceId = this.instance;\r\n else if (this.instanceId)\r\n req.instanceId = this.instanceId;\r\n\r\n if (!this.live) {\r\n req.snapFrom = this.toDate(this.filterfrom)?.toISOString();\r\n req.snapTo = this.toDate(this.filterto)?.toISOString();\r\n }\r\n return req;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Albero\r\n\r\n setOrderBy(id: string) {\r\n this.orderBy = id;\r\n this.saveSettings();\r\n this.loadTree(true);\r\n }\r\n\r\n setMaxChildren(id: string) {\r\n this.maxChildren = id;\r\n this.saveSettings();\r\n this.loadTree(true);\r\n }\r\n\r\n setMinPercentage(id: string) {\r\n this.minPercentage = id;\r\n this.saveSettings();\r\n this.loadTree(true);\r\n }\r\n\r\n searchChanged() {\r\n clearTimeout(this.searchTimer);\r\n this.searchTimer = setTimeout(() => {\r\n let text = (this.searchText ?? \"\").trim();\r\n let next = text.length >= SEARCH_MIN_CHARS ? text : \"\";\r\n if (next == this.activeSearch)\r\n return;\r\n\r\n // Svuotando la ricerca si torna all'albero di prima, con gli stessi nodi aperti\r\n if (!this.activeSearch)\r\n this.expandedBeforeSearch = new Set(this.expanded);\r\n else if (!next)\r\n this.expanded = this.expandedBeforeSearch ?? new Set();\r\n this.activeSearch = next;\r\n this.loadTree(!next);\r\n }, SEARCH_DELAY_MS);\r\n }\r\n\r\n clearSearch() {\r\n this.searchText = \"\";\r\n this.searchChanged();\r\n }\r\n\r\n // Nodo come radice (R13); Idle si chiede senza rootNodeId\r\n setRoot(id: string) {\r\n this.rootId = id && id != this.rootPathIdle ? id : null;\r\n this.searchText = \"\";\r\n this.activeSearch = \"\";\r\n this.expanded.clear();\r\n this.treeNotice = null;\r\n this.view = \"tree\";\r\n this.updateUrl();\r\n this.loadTree(false);\r\n }\r\n\r\n private get rootPathIdle(): string {\r\n let root = this.tree?.idleNode;\r\n return root?.level == 0 ? root.nodeId : this.tree?.rootPath?.[0]?.nodeId;\r\n }\r\n\r\n async loadTree(keepExpanded: boolean) {\r\n let generation = ++this.treeGeneration;\r\n let searching = !!this.activeSearch;\r\n let previous = keepExpanded ? [...this.expanded] : [];\r\n\r\n let req = this.baseRequest(new ProfilerV2TreeRequest());\r\n req.orderBy = +this.orderBy;\r\n if (this.rootId)\r\n req.rootNodeId = this.rootId;\r\n if (searching)\r\n req.search = this.activeSearch;\r\n else {\r\n req.maxDepth = TREE_DEPTH;\r\n if (+this.maxChildren > 0)\r\n req.maxChildren = +this.maxChildren;\r\n if (+this.minPercentage > 0)\r\n req.minPercentage = +this.minPercentage;\r\n }\r\n\r\n this.treeLoading = true;\r\n this.treeError = null;\r\n try {\r\n let res = await this.adms.getProfilerTreeV2(this.be, req);\r\n if (generation != this.treeGeneration)\r\n return;\r\n\r\n // Radice non trovata (R23): lo si dice e si torna a Idle\r\n if (res && !res.idleNode && res.snapFrom && this.rootId) {\r\n this.rootId = null;\r\n this.updateUrl();\r\n this.treeNotice = this.lc.loc(\"Il nodo non c'è nelle istanze scelte: l'albero riparte da Idle.\");\r\n this.loadTree(false);\r\n return;\r\n }\r\n\r\n this.tree = res;\r\n this.nodes.clear();\r\n this.parents.clear();\r\n this.loaded.clear();\r\n this.loadingChildren.clear();\r\n // I nodi che erano aperti restano aperti: quelli che non sono ancora arrivati si riaprono quando arrivano i figli del padre\r\n this.expanded = new Set(searching ? [] : previous);\r\n\r\n let root = res?.idleNode;\r\n if (root) {\r\n this.ingest(root, null, searching ? null : TREE_DEPTH, searching);\r\n this.expanded.add(root.nodeId);\r\n }\r\n\r\n if (searching) {\r\n // L'albero della ricerca contiene solo i percorsi dei nodi trovati e si mostra tutto aperto\r\n this.nodes.forEach(t => { if (t.children?.length) this.expanded.add(t.nodeId); });\r\n this.matchCount = [...this.nodes.values()].filter(t => t.searchMatch).length;\r\n }\r\n this.buildRows();\r\n this.nodes.forEach(t => this.reopen(t, generation));\r\n }\r\n catch (err) {\r\n if (generation == this.treeGeneration)\r\n this.treeError = this.errorMessage(err);\r\n }\r\n finally {\r\n if (generation == this.treeGeneration)\r\n this.treeLoading = false;\r\n }\r\n }\r\n\r\n private ingest(node: ProfilerV2Node, parent: ProfilerV2Node, depthLeft: number, partial: boolean) {\r\n this.nodes.set(node.nodeId, node);\r\n if (parent)\r\n this.parents.set(node.nodeId, parent);\r\n // Oltre il limite di profondità, o nella ricerca, i figli non sono tutti: si chiedono quando il nodo si apre\r\n if (!partial && (depthLeft == null || depthLeft > 0))\r\n this.loaded.add(node.nodeId);\r\n for (let child of node.children ?? [])\r\n this.ingest(child, node, depthLeft == null ? null : depthLeft - 1, partial);\r\n }\r\n\r\n // Un nodo aperto senza figli caricati (dopo un ricaricamento o \"Mostra tutti\" del padre) li chiede\r\n private reopen(node: ProfilerV2Node, generation: number) {\r\n if (this.expanded.has(node.nodeId) && this.needsChildren(node) && !this.loadingChildren.has(node.nodeId))\r\n this.loadChildren(node, false, generation);\r\n }\r\n\r\n hasChildren(node: ProfilerV2Node): boolean {\r\n return node.numChildren > 0;\r\n }\r\n\r\n isExpanded(node: ProfilerV2Node): boolean {\r\n return this.expanded.has(node.nodeId);\r\n }\r\n\r\n private needsChildren(node: ProfilerV2Node): boolean {\r\n return node.numChildren > 0 && !node.children?.length && !this.loaded.has(node.nodeId);\r\n }\r\n\r\n toggle(node: ProfilerV2Node, event?: Event) {\r\n event?.stopPropagation();\r\n if (!this.hasChildren(node))\r\n return;\r\n if (this.expanded.has(node.nodeId)) {\r\n this.expanded.delete(node.nodeId);\r\n this.buildRows();\r\n return;\r\n }\r\n this.expanded.add(node.nodeId);\r\n if (this.needsChildren(node))\r\n this.loadChildren(node, false);\r\n else\r\n this.buildRows();\r\n }\r\n\r\n // R9: la stessa chiamata dei figli senza maxChildren e minPercentage\r\n showAll(node: ProfilerV2Node, event: Event) {\r\n event.stopPropagation();\r\n this.loadChildren(node, true);\r\n }\r\n\r\n // R8: i figli di un nodo, che sostituiscono children e omitted* del nodo\r\n private async loadChildren(node: ProfilerV2Node, all: boolean, generation: number = this.treeGeneration) {\r\n let req = this.baseRequest(new ProfilerV2TreeRequest());\r\n req.rootNodeId = node.nodeId;\r\n req.maxDepth = 1;\r\n req.orderBy = +this.orderBy;\r\n if (!all && +this.maxChildren > 0)\r\n req.maxChildren = +this.maxChildren;\r\n if (!all && +this.minPercentage > 0)\r\n req.minPercentage = +this.minPercentage;\r\n\r\n this.loadingChildren.add(node.nodeId);\r\n this.buildRows();\r\n try {\r\n let res = await this.adms.getProfilerTreeV2(this.be, req);\r\n if (generation != this.treeGeneration)\r\n return;\r\n\r\n let fresh = res?.idleNode;\r\n node.children = fresh?.children ?? [];\r\n node.numChildren = fresh?.numChildren ?? node.children.length;\r\n node.omittedChildren = fresh?.omittedChildren ?? 0;\r\n node.omittedCalls = fresh?.omittedCalls ?? 0;\r\n node.omittedTime = fresh?.omittedTime ?? 0;\r\n node.omittedSnapDeltaTime = fresh?.omittedSnapDeltaTime ?? 0;\r\n for (let child of node.children)\r\n this.ingest(child, node, 0, false);\r\n this.loaded.add(node.nodeId);\r\n node.children.forEach(t => this.reopen(t, generation));\r\n }\r\n catch (err) {\r\n if (generation == this.treeGeneration) {\r\n this.expanded.delete(node.nodeId);\r\n this.treeError = this.errorMessage(err);\r\n }\r\n }\r\n finally {\r\n if (generation == this.treeGeneration) {\r\n this.loadingChildren.delete(node.nodeId);\r\n this.buildRows();\r\n }\r\n }\r\n }\r\n\r\n private buildRows() {\r\n let rows: ProfilerV2Row[] = [];\r\n if (this.tree?.idleNode)\r\n this.addRows(rows, this.tree.idleNode, 0);\r\n this.rows = rows;\r\n }\r\n\r\n private addRows(rows: ProfilerV2Row[], node: ProfilerV2Node, depth: number) {\r\n rows.push({ kind: \"node\", node: node, depth: depth, key: node.nodeId });\r\n if (!this.expanded.has(node.nodeId))\r\n return;\r\n\r\n let loading = this.loadingChildren.has(node.nodeId);\r\n if (loading)\r\n rows.push({ kind: \"loading\", node: node, depth: depth + 1, key: node.nodeId + \"#loading\" });\r\n for (let child of node.children ?? [])\r\n this.addRows(rows, child, depth + 1);\r\n if (!loading && node.omittedChildren > 0 && !this.needsChildren(node))\r\n rows.push({ kind: \"omitted\", node: node, depth: depth + 1, key: node.nodeId + \"#omitted\" });\r\n }\r\n\r\n // Clic: selezione e dettaglio. Doppio clic: apre o chiude\r\n rowClicked(node: ProfilerV2Node) {\r\n this.select(node.nodeId);\r\n }\r\n\r\n // Su e giù cambiano nodo, destra apre (o scende al primo figlio), sinistra chiude (o sale al padre)\r\n treeKeydown(event: KeyboardEvent) {\r\n let nodeRows = this.rows.filter(t => t.kind == \"node\");\r\n let index = nodeRows.findIndex(t => t.node.nodeId == this.selectedId);\r\n let current = index >= 0 ? nodeRows[index].node : null;\r\n let target: ProfilerV2Node = null;\r\n\r\n switch (event.key) {\r\n case \"ArrowDown\":\r\n target = nodeRows[Math.min(nodeRows.length - 1, index + 1)]?.node;\r\n break;\r\n case \"ArrowUp\":\r\n target = nodeRows[Math.max(0, index - 1)]?.node;\r\n break;\r\n case \"ArrowRight\":\r\n if (current && this.hasChildren(current) && !this.isExpanded(current))\r\n this.toggle(current);\r\n else if (current && this.isExpanded(current))\r\n target = current.children?.[0];\r\n break;\r\n case \"ArrowLeft\":\r\n if (current && this.isExpanded(current) && this.hasChildren(current))\r\n this.toggle(current);\r\n else if (current)\r\n target = this.parents.get(current.nodeId);\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n if (target) {\r\n this.select(target.nodeId, true);\r\n setTimeout(() => document.getElementById(\"pv2-row-\" + target.nodeId)?.scrollIntoView({ block: \"nearest\" }));\r\n }\r\n }\r\n\r\n isIdle(type: string, waitClass: string): boolean {\r\n return type == \"Idle\" || ((type == \"Wait\" || type == \"Sleep\") && waitClass == \"Idle\");\r\n }\r\n\r\n // Esecuzione in corso da più di un minuto su un nodo non idle (solo live)\r\n isLongRunning(type: string, waitClass: string, activeMaxTime: number): boolean {\r\n return this.live && !this.isIdle(type, waitClass) && (activeMaxTime ?? 0) >= LONG_RUNNING_SECONDS;\r\n }\r\n\r\n // Con la ricerca la parte del nome che corrisponde è evidenziata\r\n nameParts(name: string, search: string): { text: string, hit: boolean }[] {\r\n if (!search || !name)\r\n return [{ text: name ?? \"\", hit: false }];\r\n let parts: { text: string, hit: boolean }[] = [];\r\n let lower = name.toLowerCase();\r\n let needle = search.toLowerCase();\r\n let from = 0;\r\n let at = lower.indexOf(needle);\r\n while (at >= 0) {\r\n if (at > from)\r\n parts.push({ text: name.substring(from, at), hit: false });\r\n parts.push({ text: name.substring(at, at + needle.length), hit: true });\r\n from = at + needle.length;\r\n at = lower.indexOf(needle, from);\r\n }\r\n if (from < name.length)\r\n parts.push({ text: name.substring(from), hit: false });\r\n return parts;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Valori secondo la modalità (dall'avvio o dall'ultimo snapshot)\r\n\r\n get snapMode(): boolean {\r\n return this.live && this.snapValues;\r\n }\r\n\r\n calls(node: ProfilerV2Node): number { return this.snapMode ? node.snapDeltaCalls : node.calls; }\r\n time(node: ProfilerV2Node): number { return this.snapMode ? node.snapDeltaTime : node.time; }\r\n self(node: ProfilerV2Node): number { return this.snapMode ? node.snapDeltaTimeLessChildren : node.timeLessChildren; }\r\n avg(node: ProfilerV2Node): number { return this.snapMode ? node.snapDeltaAvgTime : node.avgTime; }\r\n peak(node: ProfilerV2Node): number { return this.snapMode ? node.snapPeakTime : node.peakTime; }\r\n parentPerc(node: ProfilerV2Node): number { return this.snapMode ? node.snapParentPercentage : node.parentPercentage; }\r\n firstLevelPerc(node: ProfilerV2Node): number { return this.snapMode ? node.snapPercentage : node.percentage; }\r\n omittedTime(node: ProfilerV2Node): number { return this.snapMode ? node.omittedSnapDeltaTime : node.omittedTime; }\r\n\r\n flatCalls(item: ProfilerV2FlatItem): number { return this.snapMode ? item.snapDeltaCalls : item.calls; }\r\n flatSelf(item: ProfilerV2FlatItem): number { return this.snapMode ? item.snapDeltaTimeLessChildren : item.timeLessChildren; }\r\n flatPerc(item: ProfilerV2FlatItem): number { return this.snapMode ? item.snapPercentage : item.percentage; }\r\n flatTime(item: ProfilerV2FlatItem): number { return this.snapMode ? item.snapDeltaTime : item.time; }\r\n // La vista per nome non ha il medio dei delta: si calcola\r\n flatAvg(item: ProfilerV2FlatItem): number { return this.snapMode ? (item.snapDeltaCalls > 0 ? item.snapDeltaTime / item.snapDeltaCalls : null) : item.avgTime; }\r\n\r\n // #endregion\r\n\r\n // #region Eventi per nome\r\n\r\n flatChanged() {\r\n this.saveSettings();\r\n this.loadFlat();\r\n }\r\n\r\n setFlatTop(id: string) {\r\n this.flatTop = id;\r\n this.flatChanged();\r\n }\r\n\r\n flatSearchChanged() {\r\n clearTimeout(this.flatSearchTimer);\r\n this.flatSearchTimer = setTimeout(() => this.loadFlat(), SEARCH_DELAY_MS);\r\n }\r\n\r\n async loadFlat() {\r\n let generation = ++this.flatGeneration;\r\n let req = this.baseRequest(new ProfilerV2FlatRequest());\r\n req.orderBy = +this.flatOrderBy;\r\n req.top = +this.flatTop;\r\n let search = (this.flatSearch ?? \"\").trim();\r\n if (search)\r\n req.search = search;\r\n if (this.flatType && this.flatType != \"*\")\r\n req.eventType = this.flatType;\r\n if (this.flatIncludeIdle)\r\n req.includeIdle = true;\r\n\r\n this.flatLoading = true;\r\n this.flatError = null;\r\n try {\r\n let res = await this.adms.getProfilerFlatV2(this.be, req);\r\n if (generation != this.flatGeneration)\r\n return;\r\n this.flat = res;\r\n this.openFlat.clear();\r\n }\r\n catch (err) {\r\n if (generation == this.flatGeneration)\r\n this.flatError = this.errorMessage(err);\r\n }\r\n finally {\r\n if (generation == this.flatGeneration)\r\n this.flatLoading = false;\r\n }\r\n }\r\n\r\n flatKey(item: ProfilerV2FlatItem): string {\r\n return `${item.eventTypeName}|${item.waitClassName}|${item.nodeName}`;\r\n }\r\n\r\n toggleFlat(item: ProfilerV2FlatItem) {\r\n let key = this.flatKey(item);\r\n if (this.openFlat.has(key))\r\n this.openFlat.delete(key);\r\n else\r\n this.openFlat.add(key);\r\n }\r\n\r\n // R20: dall'elenco dei nodi di un evento, apri nell'albero\r\n openInTree(nodeId: string, event: Event) {\r\n event.stopPropagation();\r\n this.setRoot(nodeId);\r\n this.select(nodeId);\r\n }\r\n\r\n showDetail(nodeId: string, event: Event) {\r\n event.stopPropagation();\r\n this.select(nodeId);\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Dettaglio\r\n\r\n select(nodeId: string, delayed: boolean = false) {\r\n clearTimeout(this.detailTimer);\r\n if (nodeId == this.selectedId && (this.detailLoading || this.detail?.nodeId == nodeId))\r\n return;\r\n this.selectedId = nodeId;\r\n if (delayed)\r\n this.detailTimer = setTimeout(() => this.loadDetail(nodeId), DETAIL_DELAY_MS);\r\n else\r\n this.loadDetail(nodeId);\r\n }\r\n\r\n async loadDetail(nodeId: string) {\r\n // Se l'utente seleziona un altro nodo prima della risposta, quella vecchia si scarta (R18)\r\n let generation = ++this.detailGeneration;\r\n let req = this.baseRequest(new ProfilerV2NodeRequest());\r\n req.nodeId = nodeId;\r\n\r\n this.detailLoading = true;\r\n this.detailError = null;\r\n this.detailMissing = false;\r\n try {\r\n let res = await this.adms.getProfilerNodeV2(this.be, req);\r\n if (generation != this.detailGeneration)\r\n return;\r\n this.detail = res;\r\n this.detailMissing = !res;\r\n this.typeParts = res ? this.buildTypeParts(res) : [];\r\n this.chart = res ? this.buildChart(res) : null;\r\n }\r\n catch (err) {\r\n if (generation == this.detailGeneration) {\r\n this.detail = null;\r\n this.detailError = `${this.lc.loc(\"Errore\")} ${err?.status ?? \"\"}. ${this.adms.errorText(err)}`;\r\n }\r\n }\r\n finally {\r\n if (generation == this.detailGeneration)\r\n this.detailLoading = false;\r\n }\r\n }\r\n\r\n // Mentre arriva il dettaglio di un altro nodo quello di prima resta visibile, attenuato, così il pannello non salta\r\n get detailStale(): boolean {\r\n return !!this.detail && this.detail.nodeId != this.selectedId;\r\n }\r\n\r\n async copyId(element: HTMLElement) {\r\n try {\r\n await navigator.clipboard.writeText(this.detail.nodeId);\r\n this.copied = true;\r\n setTimeout(() => this.copied = false, 1500);\r\n }\r\n catch {\r\n // Senza appunti (pagina non sicura o permesso negato) il testo dell'id resta selezionato, pronto per Ctrl+C\r\n let range = document.createRange();\r\n range.selectNodeContents(element);\r\n let selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n\r\n // Ripartizione del tempo proprio di nodo e discendenti: solo i tipi maggiori di zero, in ordine decrescente\r\n private buildTypeParts(stats: ProfilerV2NodeStats): ProfilerV2TypePart[] {\r\n let parts: [string, number][] = [\r\n [\"Cpu\", stats.cpuPerc], [\"Database\", stats.dbPerc], [\"Wait\", stats.waitPerc], [\"Script\", stats.scriptPerc], [\"Network\", stats.networkPerc],\r\n [\"IO\", stats.ioPerc], [\"Sleep\", stats.sleepPerc], [\"Throttle\", stats.throttlePerc], [\"Idle\", stats.idlePerc]\r\n ];\r\n return parts.filter(t => t[1] > 0).sort((a, b) => b[1] - a[1]).map(t => ({ type: t[0], label: TYPE_LABELS[t[0]], color: TYPE_COLORS[t[0]], percentage: t[1] }));\r\n }\r\n\r\n // activeSessions ha un punto al secondo: si raggruppano in circa 160 punti con la media (R27)\r\n private buildChart(stats: ProfilerV2NodeStats): ProfilerV2Chart {\r\n let points: ProfilerV2ActiveSession[] = stats.activeSessions ?? [];\r\n if (points.length == 0)\r\n return null;\r\n\r\n let times = points.map(t => this.parseUtc(t.timestamp).getTime());\r\n let values = points.map(t => t.activity ?? 0);\r\n let interval = points.length > 1 ? Math.max(1, Math.round((times[times.length - 1] - times[0]) / (points.length - 1) / 1000)) : 1;\r\n let size = Math.max(1, Math.ceil(points.length / CHART_POINTS));\r\n\r\n let grouped: { t: number, v: number }[] = [];\r\n for (let i = 0; i < points.length; i += size) {\r\n let slice = values.slice(i, i + size);\r\n grouped.push({ t: times[i], v: slice.reduce((a, b) => a + b, 0) / slice.length });\r\n }\r\n\r\n let max = this.niceMax(Math.max(...grouped.map(t => t.v)));\r\n let n = grouped.length;\r\n let x = (i: number) => n > 1 ? i / (n - 1) * 100 : 50;\r\n let y = (v: number) => 100 - v / max * 100;\r\n let line = grouped.map((t, i) => `${i ? \"L\" : \"M\"}${x(i).toFixed(2)},${y(t.v).toFixed(2)}`).join(\" \");\r\n\r\n return {\r\n line: line,\r\n area: `${line} L${x(n - 1).toFixed(2)},100 L${x(0).toFixed(2)},100 Z`,\r\n color: this.typeColor(stats.eventTypeName, stats.waitClassName),\r\n max: max,\r\n lastX: x(n - 1),\r\n lastY: y(grouped[n - 1].v),\r\n start: this.hhmm(new Date(times[0])),\r\n middle: this.hhmm(new Date(times[Math.floor(times.length / 2)])),\r\n end: this.hhmm(new Date(times[times.length - 1])),\r\n average: values.reduce((a, b) => a + b, 0) / values.length,\r\n peak: Math.max(...values),\r\n points: points.length,\r\n interval: interval,\r\n group: size * interval\r\n };\r\n }\r\n\r\n // Massimo dell'asse arrotondato a un valore tondo: 1, 2, 2,5 o 5 per una potenza di 10\r\n private niceMax(value: number): number {\r\n if (!(value > 0))\r\n return 1;\r\n let power = Math.pow(10, Math.floor(Math.log10(value)));\r\n let fraction = value / power;\r\n return [1, 2, 2.5, 5, 10].find(t => fraction <= t + 1e-9) * power;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Presentazione\r\n\r\n typeColor(type: string, waitClass: string): string {\r\n return TYPE_COLORS[this.isIdle(type, waitClass) ? \"Idle\" : type] ?? TYPE_COLORS.Idle;\r\n }\r\n\r\n typeLabel(type: string, waitClass: string): string {\r\n let label = TYPE_LABELS[type] ?? type;\r\n return waitClass && waitClass != \"None\" ? `${label} · ${waitClass}` : label;\r\n }\r\n\r\n axisValue(value: number): string {\r\n return formatNumber(value, \"it\", \"1.0-3\");\r\n }\r\n\r\n duration(seconds: number): string {\r\n return formatDuration(seconds);\r\n }\r\n\r\n // Le date delle risposte sono UTC \"dd/MM/yyyy HH:mm:ss\" senza fuso: si leggono come UTC e si mostrano in ora locale\r\n parseUtc(value: string): Date {\r\n let m = /^(\\d{2})\\/(\\d{2})\\/(\\d{4}) (\\d{2}):(\\d{2}):(\\d{2})$/.exec(value ?? \"\");\r\n return m ? new Date(Date.UTC(+m[3], +m[2] - 1, +m[1], +m[4], +m[5], +m[6])) : value ? new Date(value) : null;\r\n }\r\n\r\n hhmm(value: Date | string): string {\r\n let date = typeof value == \"string\" ? this.parseUtc(value) : value;\r\n return date ? dayjs(date).format(\"HH:mm\") : \"—\";\r\n }\r\n\r\n ddmmhhmm(value: string): string {\r\n let date = this.parseUtc(value);\r\n return date ? dayjs(date).format(\"DD/MM HH:mm\") : \"—\";\r\n }\r\n\r\n minutesAgo(value: string): number {\r\n let date = this.parseUtc(value);\r\n return date ? Math.max(0, Math.floor((Date.now() - date.getTime()) / 60000)) : 0;\r\n }\r\n\r\n // \"{x} s fa\", \"{x} min fa\", \"{x} h {y} min fa\"; \"mai\" se nessuno è ancora uscito\r\n relative(value: string): string {\r\n let date = this.parseUtc(value);\r\n if (!date)\r\n return this.lc.loc(\"mai\");\r\n let seconds = Math.max(0, Math.round((Date.now() - date.getTime()) / 1000));\r\n if (seconds < 60)\r\n return `${seconds} ${this.lc.loc(\"s fa\")}`;\r\n let minutes = Math.floor(seconds / 60);\r\n if (minutes < 60)\r\n return `${minutes} ${this.lc.loc(\"min fa\")}`;\r\n return `${Math.floor(minutes / 60)} h ${minutes % 60} ${this.lc.loc(\"min fa\")}`;\r\n }\r\n\r\n private errorMessage(err: any): string {\r\n return `${this.lc.loc(\"Errore\")} ${err?.status ?? \"\"}: ${this.adms.errorText(err)}`;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Supporto\r\n\r\n private buildSources() {\r\n let orders: [ProfilerOrderBy, string][] = [\r\n [ProfilerOrderBy.Time, \"Tempo\"], [ProfilerOrderBy.TimeLessChildren, \"Tempo proprio\"], [ProfilerOrderBy.Calls, \"Chiamate\"],\r\n [ProfilerOrderBy.AvgTime, \"Tempo medio\"], [ProfilerOrderBy.PeakTime, \"Picco\"], [ProfilerOrderBy.SnapDeltaTime, \"Δ Tempo\"],\r\n [ProfilerOrderBy.SnapDeltaTimeLessChildren, \"Δ Tempo proprio\"], [ProfilerOrderBy.SnapDeltaCalls, \"Δ Chiamate\"], [ProfilerOrderBy.ActiveThreads, \"Thread attivi\"]\r\n ];\r\n this.TreeOrders = orders.map(t => new KeyValue(String(t[0]), this.lc.loc(t[1])));\r\n // La vista per nome parte dal tempo proprio e non ha il Δ del tempo totale\r\n this.FlatOrders = [1, 0, 2, 3, 4, 6, 7, 8].map(t => this.TreeOrders.find(k => k.id == String(t)));\r\n this.ChildrenOptions = [\"10\", \"25\", \"50\", \"100\"].map(t => new KeyValue(t, t)).concat([new KeyValue(\"0\", this.lc.loc(\"Tutti\"))]);\r\n this.ThresholdOptions = [new KeyValue(\"0\", this.lc.loc(\"Nessuna\")), new KeyValue(\"0.1\", \"≥ 0,1%\"), new KeyValue(\"1\", \"≥ 1%\"), new KeyValue(\"5\", \"≥ 5%\")];\r\n this.FlatTypes = [new KeyValue(\"*\", this.lc.loc(\"Tutti\"))].concat(EVENT_TYPES.map(t => new KeyValue(t, t)));\r\n this.FlatRows = [new KeyValue(\"100\", \"100\"), new KeyValue(\"500\", \"500\"), new KeyValue(\"1000\", \"1.000\")];\r\n this.updateOrderOptions();\r\n this.buildInstances();\r\n }\r\n\r\n // Le chiavi dei delta e i thread attivi si propongono solo in live (R10)\r\n private updateOrderOptions() {\r\n this.TreeOrderOptions = this.live ? this.TreeOrders : this.TreeOrders.slice(0, 5);\r\n this.FlatOrderOptions = this.live ? this.FlatOrders : this.FlatOrders.slice(0, 5);\r\n }\r\n\r\n // Indipendenti: l'istanza che risponde è facoltativa, l'elenco usa la gestione errori standard\r\n private loadInstances() {\r\n this.adms.getInstanceId(this.be).then(t => {\r\n this.instanceId = t;\r\n this.buildInstances();\r\n });\r\n this.adms.getInstances(this.be).then(t => {\r\n this.instanceIds = (t ?? []).map(k => k.id);\r\n this.buildInstances();\r\n });\r\n }\r\n\r\n private buildInstances() {\r\n this.Instances = [\r\n new KeyValue(INSTANCE_THIS, this.instanceId ? `${this.lc.loc(\"Questa istanza\")} (${this.instanceId})` : this.lc.loc(\"Questa istanza\")),\r\n new KeyValue(INSTANCE_ALL, this.instanceIds.length ? `${this.lc.loc(\"Tutto il cluster\")} (${this.instanceIds.length} ${this.instanceIds.length == 1 ? this.lc.loc(\"istanza\") : this.lc.loc(\"istanze\")})` : this.lc.loc(\"Tutto il cluster\")),\r\n ...this.instanceIds.map(t => new KeyValue(t, `${this.lc.loc(\"Solo\")} ${t}`))\r\n ];\r\n }\r\n\r\n private updateUrl() {\r\n let [path, query] = this.location.path().split(\"?\");\r\n let params = new URLSearchParams(query ?? \"\");\r\n if (this.rootId)\r\n params.set(\"root\", this.rootId);\r\n else\r\n params.delete(\"root\");\r\n this.location.replaceState(path, params.toString());\r\n }\r\n\r\n private applySettings(saved: ProfilerV2Settings) {\r\n this.orderBy = saved.orderBy ?? this.orderBy;\r\n this.maxChildren = saved.maxChildren ?? this.maxChildren;\r\n this.minPercentage = saved.minPercentage ?? this.minPercentage;\r\n this.snapValues = saved.snapValues ?? this.snapValues;\r\n this.flatOrderBy = saved.flatOrderBy ?? this.flatOrderBy;\r\n this.flatTop = saved.flatTop ?? this.flatTop;\r\n }\r\n\r\n private saveSettings() {\r\n let settings: ProfilerV2Settings = {\r\n orderBy: this.orderBy,\r\n maxChildren: this.maxChildren,\r\n minPercentage: this.minPercentage,\r\n snapValues: this.snapValues,\r\n flatOrderBy: this.flatOrderBy,\r\n flatTop: this.flatTop\r\n };\r\n this.localStorage.setItem(STORAGE_KEY, settings).subscribe();\r\n }\r\n\r\n private toDate(value: string): Date {\r\n return value ? this.dateExts.getDateConvertion(value).toDate() : null;\r\n }\r\n\r\n private fmt(date: Date): string {\r\n return dayjs(date).format(this.lc.token(\"getFullDateDisplayFormat\"));\r\n }\r\n\r\n private floorHour(date: Date): Date {\r\n let ret = new Date(date);\r\n ret.setMinutes(0, 0, 0);\r\n return ret;\r\n }\r\n\r\n // #endregion\r\n}\r\n","<div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"card app-overflow-visible\" widget>\r\n <div class=\"card-header\">\r\n <span class=\"text-uppercase\">{{'Profiler del Server' | localize: lc}}</span>\r\n </div>\r\n <div class=\"card-body widget-body pv2-body\">\r\n <!-- Barra dei comandi: quali dati caricare. Ogni cambio ricarica la vista e il dettaglio aperto -->\r\n <div class=\"pv2-toolbar\">\r\n <div class=\"pv2-cluster\">\r\n <div class=\"pv2-group\">\r\n <span class=\"pv2-group-label\">{{'Sorgente' | localize: lc}}</span>\r\n <div class=\"pv2-seg\">\r\n <button type=\"button\" [class.pv2-on]=\"live\" (click)=\"setLive(true)\"><span class=\"pv2-live-dot\"></span>Live</button>\r\n <button type=\"button\" [class.pv2-on]=\"!live\" (click)=\"setLive(false)\">{{'Storico' | localize: lc}}</button>\r\n </div>\r\n </div>\r\n <div class=\"pv2-field pv2-field-wide pv2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"instance\" (ngModelChange)=\"setInstance($event)\" name=\"instance\" [Source]=\"Instances\" [Placeholder]=\"'Istanze' | localize: lc\"></form-select>\r\n </div>\r\n </div>\r\n\r\n @if (!live) {\r\n <div class=\"pv2-cluster\">\r\n <div class=\"pv2-field\">\r\n <form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"filterfrom\" (ngModelChange)=\"filterfrom = $event; datesChanged()\" name=\"filterfrom\" [Placeholder]=\"'Dal' | localize: lc\"></form-datetime>\r\n </div>\r\n <div class=\"pv2-field\">\r\n <form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"filterto\" (ngModelChange)=\"filterto = $event; datesChanged()\" name=\"filterto\" [Placeholder]=\"'Al' | localize: lc\"></form-datetime>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"pv2-group\">\r\n <span class=\"pv2-group-label\">{{'Valori' | localize: lc}}</span>\r\n <div class=\"pv2-seg\">\r\n <button type=\"button\" [class.pv2-on]=\"!snapValues\" (click)=\"setSnapValues(false)\">{{\"Dall'avvio\" | localize: lc}}</button>\r\n <button type=\"button\" [class.pv2-on]=\"snapValues\" (click)=\"setSnapValues(true)\">{{\"Dall'ultimo snapshot\" | localize: lc}}</button>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"pv2-cluster pv2-cluster-end\">\r\n <button type=\"button\" class=\"btn app-btn-search\" [disabled]=\"loading\" (click)=\"reloadAll()\" [title]=\"'Aggiorna' | localize: lc\">\r\n <i class=\"fa fa-refresh\" [class.fa-spin]=\"loading\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn app-btn-search\" (click)=\"downloadWorkloadReport()\" [title]=\"(workloadV2 ? 'Workload report' : 'Scarica il workload report') | localize: lc\">\r\n <i class=\"fa\" [class.fa-download]=\"!workloadV2\" [class.fa-file-text]=\"workloadV2\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Riga della finestra: sempre visibile sopra la vista -->\r\n <div class=\"pv2-window\">\r\n <span><strong>{{live ? 'Live' : ('Storico' | localize: lc)}}</strong> · {{instanceLabel}}</span>\r\n @if (current?.snapFrom; as snapFrom) {\r\n @if (live) {\r\n <span>{{\"Delta dall'ultimo snapshot delle\" | localize: lc}} {{hhmm(snapFrom)}} ({{minutesAgo(snapFrom)}} {{'min fa' | localize: lc}})</span>\r\n } @else {\r\n <span>{{'Snapshot dalle' | localize: lc}} {{ddmmhhmm(snapFrom)}} {{'alle' | localize: lc}} {{ddmmhhmm(current?.snapTo)}}</span>\r\n }\r\n } @else if (current && !live) {\r\n <span class=\"pv2-warn-text\">{{'Nessuno snapshot termina nella finestra scelta' | localize: lc}}</span>\r\n }\r\n @if (view == 'tree' && tree?.idleNode) {\r\n <span>{{tree.numNodes | pv2fmt: 'int'}} {{\"nodi nell'albero\" | localize: lc}} · {{tree.numReturnedNodes | pv2fmt: 'int'}} {{'nella risposta' | localize: lc}}</span>\r\n }\r\n @if (view == 'flat' && flat) {\r\n <span>{{flat.numItems | pv2fmt: 'int'}} {{'eventi distinti' | localize: lc}}</span>\r\n }\r\n @if (loading) {\r\n <span class=\"pv2-muted\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento…' | localize: lc}}</span>\r\n }\r\n </div>\r\n\r\n <div class=\"pv2-main\">\r\n <!-- Vista: albero o eventi per nome -->\r\n <div class=\"pv2-panel pv2-view\">\r\n <div class=\"pv2-view-bar\">\r\n <div class=\"pv2-seg\">\r\n <button type=\"button\" [class.pv2-on]=\"view == 'tree'\" (click)=\"setView('tree')\"><i class=\"fa fa-sitemap\"></i> {{'Albero' | localize: lc}}</button>\r\n <button type=\"button\" [class.pv2-on]=\"view == 'flat'\" (click)=\"setView('flat')\"><i class=\"fa fa-list\"></i> {{'Per nome' | localize: lc}}</button>\r\n </div>\r\n\r\n @if (view == 'tree') {\r\n <div class=\"pv2-field pv2-field-search\" [title]=\"'Per esempio MRD_METERREADINGS, ENQUEUE, ProfilesMgr' | localize: lc\">\r\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"searchText\" (ngModelChange)=\"searchText = $event; searchChanged()\" name=\"search\" [Placeholder]=\"'Cerca nei nomi o per id' | localize: lc\"></form-input>\r\n </div>\r\n <div class=\"pv2-field pv2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"orderBy\" (ngModelChange)=\"setOrderBy($event)\" name=\"orderBy\" [Source]=\"TreeOrderOptions\" [Placeholder]=\"'Ordina per' | localize: lc\"></form-select>\r\n </div>\r\n <div class=\"pv2-group\" [class.pv2-disabled]=\"!!activeSearch\">\r\n <span class=\"pv2-group-label\">{{'Figli per nodo' | localize: lc}}</span>\r\n <div class=\"pv2-seg\">\r\n @for (o of ChildrenOptions; track o.id) {\r\n <button type=\"button\" [disabled]=\"!!activeSearch\" [class.pv2-on]=\"maxChildren == o.id\" (click)=\"setMaxChildren(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"pv2-group\" [class.pv2-disabled]=\"!!activeSearch\">\r\n <span class=\"pv2-group-label\">{{'Soglia' | localize: lc}}</span>\r\n <div class=\"pv2-seg\">\r\n @for (o of ThresholdOptions; track o.id) {\r\n <button type=\"button\" [disabled]=\"!!activeSearch\" [class.pv2-on]=\"minPercentage == o.id\" (click)=\"setMinPercentage(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"pv2-field pv2-field-search\">\r\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"flatSearch\" (ngModelChange)=\"flatSearch = $event; flatSearchChanged()\" name=\"flatSearch\" [Placeholder]=\"'Cerca nei nomi' | localize: lc\"></form-input>\r\n </div>\r\n <div class=\"pv2-field pv2-field-narrow pv2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"flatType\" (ngModelChange)=\"flatType = $event; flatChanged()\" name=\"flatType\" [Source]=\"FlatTypes\" [Placeholder]=\"'Tipo' | localize: lc\"></form-select>\r\n </div>\r\n <div class=\"pv2-field pv2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"flatOrderBy\" (ngModelChange)=\"flatOrderBy = $event; flatChanged()\" name=\"flatOrderBy\" [Source]=\"FlatOrderOptions\" [Placeholder]=\"'Ordina per' | localize: lc\"></form-select>\r\n </div>\r\n <div class=\"pv2-group\">\r\n <span class=\"pv2-group-label\">{{'Righe' | localize: lc}}</span>\r\n <div class=\"pv2-seg\">\r\n @for (o of FlatRows; track o.id) {\r\n <button type=\"button\" [class.pv2-on]=\"flatTop == o.id\" (click)=\"setFlatTop(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"pv2-toggle\">\r\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [ngModel]=\"flatIncludeIdle\" (ngModelChange)=\"flatIncludeIdle = $event; flatChanged()\" name=\"flatIncludeIdle\"></form-checkbox>\r\n <span class=\"pv2-pointer\" (click)=\"flatIncludeIdle = !flatIncludeIdle; flatChanged()\">{{'Anche gli eventi idle' | localize: lc}}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (view == 'tree') {\r\n <!-- Percorso della radice: ogni antenato riporta l'albero a quel nodo -->\r\n @if (tree?.idleNode && tree?.rootPath?.length) {\r\n <nav class=\"pv2-crumbs\">\r\n @for (item of tree.rootPath; track item.nodeId) {\r\n <button type=\"button\" class=\"pv2-crumb\" [title]=\"item.nodeName\" (click)=\"setRoot(item.nodeId)\">{{item.nodeName}}</button>\r\n <span class=\"pv2-crumb-sep\">›</span>\r\n }\r\n <span class=\"pv2-crumb pv2-crumb-current\" [title]=\"tree.idleNode.nodeName\">{{tree.idleNode.nodeName}}</span>\r\n </nav>\r\n }\r\n\r\n @if (treeNotice) {\r\n <div class=\"pv2-alert pv2-alert-warn\">\r\n {{treeNotice}}\r\n <button type=\"button\" class=\"pv2-alert-close\" [title]=\"'Chiudi' | localize: lc\" (click)=\"treeNotice = null\">×</button>\r\n </div>\r\n }\r\n @if (activeSearch && tree) {\r\n @if (matchCount > 0) {\r\n <div class=\"pv2-alert\" [class.pv2-alert-warn]=\"tree.truncated\">\r\n {{matchCount | pv2fmt: 'int'}} {{'nodi trovati, con i loro antenati.' | localize: lc}}\r\n @if (tree.truncated) {\r\n <strong>{{'I nodi trovati sono più di 1.000: sono mostrati i primi per l\\'ordinamento scelto.' | localize: lc}}</strong>\r\n }\r\n </div>\r\n } @else if (!treeLoading) {\r\n <div class=\"pv2-alert\">{{'Nessun nodo contiene' | localize: lc}} «{{activeSearch}}».</div>\r\n }\r\n }\r\n @if (treeError) {\r\n <div class=\"pv2-alert pv2-alert-error\">{{treeError}}</div>\r\n }\r\n\r\n <div class=\"pv2-table-wrap\" tabindex=\"0\" (keydown)=\"treeKeydown($event)\">\r\n <table class=\"pv2-table\">\r\n <thead>\r\n <tr>\r\n <th class=\"pv2-col-node\">{{'Nodo' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Chiamate' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Tempo' | localize: lc}}</th>\r\n <th>{{snapMode ? 'Δ ' : ''}}{{'% del padre' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{(snapMode ? 'Δ Proprio' : 'Tempo proprio') | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Medio' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Picco' | localize: lc}}</th>\r\n @if (live) {\r\n <th class=\"pv2-num\">{{'Thread ora' | localize: lc}}</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of rows; track row.key) {\r\n @if (row.kind == 'node') {\r\n <tr [id]=\"'pv2-row-' + row.node.nodeId\" class=\"pv2-row\"\r\n [class.pv2-selected]=\"row.node.nodeId == selectedId\"\r\n [class.pv2-idle]=\"isIdle(row.node.eventTypeName, row.node.waitClassName)\"\r\n (click)=\"rowClicked(row.node)\" (dblclick)=\"toggle(row.node)\">\r\n <td class=\"pv2-col-node\">\r\n <div class=\"pv2-node\" [style.padding-left.px]=\"row.depth * 16\">\r\n @if (hasChildren(row.node)) {\r\n <button type=\"button\" class=\"pv2-caret\" tabindex=\"-1\" [attr.aria-expanded]=\"isExpanded(row.node)\" (click)=\"toggle(row.node, $event)\">\r\n <i class=\"fa\" [class.fa-caret-down]=\"isExpanded(row.node)\" [class.fa-caret-right]=\"!isExpanded(row.node)\"></i>\r\n </button>\r\n } @else {\r\n <span class=\"pv2-caret\"></span>\r\n }\r\n <span class=\"pv2-type\"><span class=\"pv2-dot\" [style.background]=\"typeColor(row.node.eventTypeName, row.node.waitClassName)\"></span>{{typeLabel(row.node.eventTypeName, row.node.waitClassName)}}</span>\r\n <span class=\"pv2-name\" [title]=\"row.node.nodeName\">@if (row.node.searchMatch && activeSearch) {@for (part of nameParts(row.node.nodeName, activeSearch); track $index) {@if (part.hit) {<mark>{{part.text}}</mark>} @else {<span>{{part.text}}</span>}}} @else {<span>{{row.node.nodeName}}</span>}</span>\r\n </div>\r\n </td>\r\n <td class=\"pv2-num\">{{calls(row.node) | pv2fmt: 'int'}}</td>\r\n <td class=\"pv2-num\">{{time(row.node) | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-perc\" [title]=\"(parentPerc(row.node) | pv2fmt: 'pct') + ' ' + ('del padre' | localize: lc) + ' · ' + (firstLevelPerc(row.node) | pv2fmt: 'pct') + ' ' + ('del nodo di primo livello' | localize: lc)\">\r\n <div class=\"pv2-perc-cell\">\r\n <div class=\"pv2-bar\"><div [style.width.%]=\"parentPerc(row.node)\" [style.background]=\"typeColor(row.node.eventTypeName, row.node.waitClassName)\"></div></div>\r\n <span>{{parentPerc(row.node) | pv2fmt: 'pct'}}</span>\r\n </div>\r\n </td>\r\n <td class=\"pv2-num\">{{self(row.node) | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-num\">{{avg(row.node) | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-num\">{{peak(row.node) | pv2fmt: 'dur'}}</td>\r\n @if (live) {\r\n <td class=\"pv2-num pv2-threads\">\r\n @if (isLongRunning(row.node.eventTypeName, row.node.waitClassName, row.node.activeMaxTime)) {\r\n <span class=\"pv2-long\" [title]=\"('Esecuzione in corso da' | localize: lc) + ' ' + duration(row.node.activeMaxTime) + ': ' + ('forse bloccata' | localize: lc)\"><i class=\"fa fa-clock\"></i> {{duration(row.node.activeMaxTime)}}</span>\r\n }\r\n @if (row.node.activeThreads > 0) {\r\n <span class=\"pv2-active\"><span class=\"pv2-active-dot\"></span>{{row.node.activeThreads}}</span>\r\n } @else {\r\n <span class=\"pv2-muted\">{{row.node.activeThreads ?? '—'}}</span>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n } @else if (row.kind == 'loading') {\r\n <tr class=\"pv2-service\">\r\n <td [attr.colspan]=\"live ? 8 : 7\">\r\n <div [style.padding-left.px]=\"row.depth * 16 + 24\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento dei figli…' | localize: lc}}</div>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr class=\"pv2-service\">\r\n <td [attr.colspan]=\"live ? 8 : 7\">\r\n <div [style.padding-left.px]=\"row.depth * 16 + 24\">\r\n {{row.node.omittedChildren | pv2fmt: 'int'}} {{'figli non mostrati' | localize: lc}} · {{omittedTime(row.node) | pv2fmt: 'dur'}}\r\n @if (!snapMode) {\r\n · {{row.node.omittedCalls | pv2fmt: 'int'}} {{'chiamate' | localize: lc}}\r\n }\r\n <button type=\"button\" class=\"pv2-link\" (click)=\"showAll(row.node, $event)\">{{'Mostra tutti' | localize: lc}}</button>\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n @if (rows.length == 0 && !treeError) {\r\n <div class=\"pv2-empty\">\r\n @if (!tree) {\r\n {{'Caricamento…' | localize: lc}}\r\n } @else if (!tree.snapFrom && !live) {\r\n {{'Nessuno snapshot termina nella finestra scelta: allargala o spostala indietro.' | localize: lc}}\r\n } @else {\r\n {{\"Il nodo non c'è nelle istanze scelte.\" | localize: lc}}\r\n }\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n @if (flatError) {\r\n <div class=\"pv2-alert pv2-alert-error\">{{flatError}}</div>\r\n }\r\n <div class=\"pv2-table-wrap\">\r\n <table class=\"pv2-table\">\r\n <thead>\r\n <tr>\r\n <th class=\"pv2-col-node\">{{'Evento' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{'Percorsi' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Chiamate' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{(snapMode ? 'Δ Proprio' : 'Tempo proprio') | localize: lc}}</th>\r\n <th>{{snapMode ? 'Δ ' : ''}}{{'% proprio' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Tempo' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Medio' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{(snapMode ? \"Picco dall'avvio\" : 'Picco') | localize: lc}}</th>\r\n @if (live) {\r\n <th class=\"pv2-num\">{{'Thread' | localize: lc}}</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (item of flat?.items ?? []; track flatKey(item)) {\r\n <tr class=\"pv2-row\" [class.pv2-idle]=\"isIdle(item.eventTypeName, item.waitClassName)\" [class.pv2-selected]=\"openFlat.has(flatKey(item))\" (click)=\"toggleFlat(item)\">\r\n <td class=\"pv2-col-node\">\r\n <div class=\"pv2-node\">\r\n <span class=\"pv2-caret\"><i class=\"fa\" [class.fa-caret-down]=\"openFlat.has(flatKey(item))\" [class.fa-caret-right]=\"!openFlat.has(flatKey(item))\"></i></span>\r\n <span class=\"pv2-type\"><span class=\"pv2-dot\" [style.background]=\"typeColor(item.eventTypeName, item.waitClassName)\"></span>{{typeLabel(item.eventTypeName, item.waitClassName)}}</span>\r\n <span class=\"pv2-name\" [title]=\"item.nodeName\">@for (part of nameParts(item.nodeName, (flatSearch ?? '').trim()); track $index) {@if (part.hit) {<mark>{{part.text}}</mark>} @else {<span>{{part.text}}</span>}}</span>\r\n </div>\r\n </td>\r\n <td class=\"pv2-num\">{{item.numPaths | pv2fmt: 'int'}}</td>\r\n <td class=\"pv2-num\">{{flatCalls(item) | pv2fmt: 'int'}}</td>\r\n <td class=\"pv2-num\">{{flatSelf(item) | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-perc\">\r\n <div class=\"pv2-perc-cell\">\r\n <div class=\"pv2-bar\"><div [style.width.%]=\"flatPerc(item)\" [style.background]=\"typeColor(item.eventTypeName, item.waitClassName)\"></div></div>\r\n <span>{{flatPerc(item) | pv2fmt: 'pct'}}</span>\r\n </div>\r\n </td>\r\n <td class=\"pv2-num\">{{flatTime(item) | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-num\">{{flatAvg(item) | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-num\">{{item.peakTime | pv2fmt: 'dur'}}</td>\r\n @if (live) {\r\n <td class=\"pv2-num pv2-threads\">\r\n @if (item.activeThreads > 0) {\r\n <span class=\"pv2-active\"><span class=\"pv2-active-dot\"></span>{{item.activeThreads}}</span>\r\n } @else {\r\n <span class=\"pv2-muted\">{{item.activeThreads ?? '—'}}</span>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n @if (openFlat.has(flatKey(item))) {\r\n <tr class=\"pv2-sub\">\r\n <td [attr.colspan]=\"live ? 9 : 8\">\r\n <div class=\"pv2-sub-title\">{{'Nodi con più tempo' | localize: lc}}</div>\r\n @for (id of item.nodeIds ?? []; track id) {\r\n <div class=\"pv2-sub-item\">\r\n <code>{{id}}</code>\r\n <button type=\"button\" class=\"pv2-link\" (click)=\"showDetail(id, $event)\">{{'Dettaglio' | localize: lc}}</button>\r\n <button type=\"button\" class=\"pv2-link\" (click)=\"openInTree(id, $event)\">{{\"Apri nell'albero\" | localize: lc}}</button>\r\n </div>\r\n }\r\n @if (item.numPaths > (item.nodeIds?.length ?? 0)) {\r\n <div class=\"pv2-muted\">+{{item.numPaths - (item.nodeIds?.length ?? 0) | pv2fmt: 'int'}} {{'altri' | localize: lc}}</div>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n @if (!flatError && (!flat || !flat.items?.length)) {\r\n <div class=\"pv2-empty\">{{(flat ? 'Nessun evento con questi filtri.' : 'Caricamento…') | localize: lc}}</div>\r\n }\r\n </div>\r\n @if (flat?.items?.length) {\r\n <div class=\"pv2-footer\">\r\n {{flat.numItems | pv2fmt: 'int'}} {{'eventi distinti' | localize: lc}}@if (flat.numItems > flat.items.length) {, {{'mostrati i primi' | localize: lc}} {{flat.items.length | pv2fmt: 'int'}}}.\r\n {{'La percentuale è sul tempo proprio di tutti gli eventi non idle.' | localize: lc}}\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n <!-- Dettaglio del nodo selezionato, lo stesso per le due viste -->\r\n <aside class=\"pv2-panel pv2-detail\" [class.pv2-stale]=\"detailStale\">\r\n @if (!selectedId) {\r\n <div class=\"pv2-placeholder\">{{'Seleziona un nodo per vederne il dettaglio.' | localize: lc}}</div>\r\n } @else if (detailMissing && !detailLoading) {\r\n <div class=\"pv2-placeholder\">{{\"Il nodo non c'è nelle istanze o nella finestra scelte.\" | localize: lc}}</div>\r\n } @else if (detailError && !detailLoading) {\r\n <div class=\"pv2-placeholder pv2-error-text\">{{detailError}}</div>\r\n } @else if (!detail) {\r\n <div class=\"pv2-placeholder\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento…' | localize: lc}}</div>\r\n } @else {\r\n <div class=\"pv2-d-head\">\r\n <span class=\"pv2-type\"><span class=\"pv2-dot\" [style.background]=\"typeColor(detail.eventTypeName, detail.waitClassName)\"></span>{{typeLabel(detail.eventTypeName, detail.waitClassName)}}</span>\r\n @if (detailLoading) {\r\n <i class=\"fa fa-spinner fa-spin pv2-muted\"></i>\r\n }\r\n </div>\r\n <div class=\"pv2-fullname\">{{detail.nodeName}}</div>\r\n <div class=\"pv2-id\">\r\n Id <code #idText>{{detail.nodeId}}</code>\r\n <button type=\"button\" class=\"pv2-link\" (click)=\"copyId(idText)\">{{(copied ? 'Copiato' : 'Copia') | localize: lc}}</button>\r\n </div>\r\n\r\n <div class=\"pv2-d-title\">{{'Percorso' | localize: lc}}</div>\r\n <div class=\"pv2-path\">\r\n @for (item of detail.fullWaitStack ?? []; track item.nodeId; let i = $index) {\r\n <button type=\"button\" class=\"pv2-path-item\" [style.padding-left.px]=\"i * 10\" [title]=\"item.nodeName\" (click)=\"select(item.nodeId)\">\r\n <span class=\"pv2-dot\" [style.background]=\"typeColor(item.eventTypeName, item.waitClassName)\"></span>{{item.nodeName}}\r\n </button>\r\n }\r\n <div class=\"pv2-path-item pv2-path-current\" [style.padding-left.px]=\"(detail.fullWaitStack?.length ?? 0) * 10\" [title]=\"detail.nodeName\">\r\n <span class=\"pv2-dot\" [style.background]=\"typeColor(detail.eventTypeName, detail.waitClassName)\"></span>{{detail.nodeName}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"pv2-d-title\">{{(live ? \"Dall'avvio\" : 'Nella finestra') | localize: lc}}</div>\r\n <dl class=\"pv2-kv\">\r\n <dt>{{'Esecuzioni' | localize: lc}}</dt><dd>{{detail.executions | pv2fmt: 'int'}}</dd>\r\n <dt>{{'Tempo totale' | localize: lc}}</dt><dd>{{detail.elapsedTime | pv2fmt: 'dur'}}</dd>\r\n <dt>{{'Tempo proprio' | localize: lc}}</dt><dd>{{detail.elapsedTimeLessChildren | pv2fmt: 'dur'}}</dd>\r\n <dt>{{'Medio' | localize: lc}}</dt><dd>{{detail.avgTime | pv2fmt: 'dur'}}</dd>\r\n <dt>{{'Picco' | localize: lc}}</dt><dd>{{detail.peakTime | pv2fmt: 'dur'}}</dd>\r\n <dt>{{'Minimo' | localize: lc}}</dt><dd>{{detail.minTime ? (detail.minTime | pv2fmt: 'dur') : '—'}}</dd>\r\n </dl>\r\n\r\n @if (live) {\r\n <div class=\"pv2-d-title\">{{\"Dall'ultimo snapshot\" | localize: lc}}, {{hhmm(detail.snapFrom)}}</div>\r\n <dl class=\"pv2-kv\">\r\n <dt>{{'Esecuzioni' | localize: lc}}</dt><dd>{{detail.snapDeltaExecutions | pv2fmt: 'int'}}</dd>\r\n <dt>{{'Tempo totale' | localize: lc}}</dt><dd>{{detail.snapDeltaElapsedTime | pv2fmt: 'dur'}}</dd>\r\n <dt>{{'Tempo proprio' | localize: lc}}</dt><dd>{{detail.snapDeltaElapsedTimeLessChildren | pv2fmt: 'dur'}}</dd>\r\n </dl>\r\n\r\n <div class=\"pv2-d-title\">{{'Adesso' | localize: lc}}</div>\r\n <dl class=\"pv2-kv\">\r\n <dt>{{'Thread dentro' | localize: lc}}</dt>\r\n <dd>\r\n @if (detail.activeThreads > 0) {\r\n <span class=\"pv2-active\"><span class=\"pv2-active-dot\"></span>{{detail.activeThreads}}</span>\r\n } @else {\r\n {{detail.activeThreads ?? '—'}}\r\n }\r\n </dd>\r\n <dt>{{'Esecuzione più lunga' | localize: lc}}</dt>\r\n <dd>\r\n @if (detail.activeThreads > 0) {\r\n {{detail.activeMaxTime | pv2fmt: 'dur'}}\r\n @if (isLongRunning(detail.eventTypeName, detail.waitClassName, detail.activeMaxTime)) {\r\n <span class=\"pv2-long\"><i class=\"fa fa-clock\"></i> {{'forse bloccata' | localize: lc}}</span>\r\n }\r\n } @else {\r\n —\r\n }\r\n </dd>\r\n <dt>{{'Ultima uscita' | localize: lc}}</dt><dd>{{relative(detail.lastExitTime)}}</dd>\r\n </dl>\r\n }\r\n\r\n @if (typeParts.length > 0) {\r\n <div class=\"pv2-d-title\">{{'Tempo proprio del sottoalbero per tipo' | localize: lc}}</div>\r\n <div class=\"pv2-stack\">\r\n @for (part of typeParts; track part.type) {\r\n <div [style.width.%]=\"part.percentage\" [style.background]=\"part.color\" [title]=\"part.label + ' ' + (part.percentage | pv2fmt: 'pct')\"></div>\r\n }\r\n </div>\r\n <div class=\"pv2-legend\">\r\n @for (part of typeParts; track part.type) {\r\n <span class=\"pv2-legend-item\"><span class=\"pv2-swatch\" [style.background]=\"part.color\"></span>{{part.label}} <strong>{{part.percentage | pv2fmt: 'pct'}}</strong></span>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"pv2-d-title\">{{'Sessioni attive sul nodo e sui discendenti' | localize: lc}}</div>\r\n @if (chart) {\r\n <div class=\"pv2-chart\">\r\n <div class=\"pv2-chart-y\">\r\n <span>{{axisValue(chart.max)}}</span>\r\n <span>{{axisValue(chart.max / 2)}}</span>\r\n <span>0</span>\r\n </div>\r\n <div class=\"pv2-chart-plot\">\r\n <svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\r\n <line x1=\"0\" y1=\"50\" x2=\"100\" y2=\"50\" class=\"pv2-chart-grid\" vector-effect=\"non-scaling-stroke\" />\r\n <path [attr.d]=\"chart.area\" [attr.fill]=\"chart.color\" fill-opacity=\"0.25\" />\r\n <path [attr.d]=\"chart.line\" [attr.stroke]=\"chart.color\" fill=\"none\" stroke-width=\"1.5\" vector-effect=\"non-scaling-stroke\" />\r\n </svg>\r\n <span class=\"pv2-chart-last\" [style.left.%]=\"chart.lastX\" [style.top.%]=\"chart.lastY\" [style.background]=\"chart.color\"></span>\r\n </div>\r\n <span></span>\r\n <div class=\"pv2-chart-x\">\r\n <span>{{chart.start}}</span>\r\n <span>{{chart.middle}}</span>\r\n <span>{{chart.end}}</span>\r\n </div>\r\n </div>\r\n <div class=\"pv2-caption\">\r\n {{'Media' | localize: lc}} {{axisValue(chart.average)}} · {{'picco' | localize: lc}} {{axisValue(chart.peak)}} {{'sessioni' | localize: lc}}.\r\n {{chart.points | pv2fmt: 'int'}} {{\"punti dell'API\" | localize: lc}},\r\n @if (chart.interval == 1) {\r\n {{'uno al secondo' | localize: lc}},\r\n } @else {\r\n {{'uno ogni' | localize: lc}} {{chart.interval}} s,\r\n }\r\n {{'raggruppati a' | localize: lc}} {{chart.group}} s\r\n </div>\r\n } @else {\r\n <div class=\"pv2-muted pv2-small\">{{'Nessun campione in memoria per questa finestra: il grafico copre solo le ultime due ore circa.' | localize: lc}}</div>\r\n }\r\n\r\n @if (detail.instances?.length) {\r\n <div class=\"pv2-d-title\">{{'Per istanza' | localize: lc}}</div>\r\n <table class=\"pv2-mini\">\r\n <thead>\r\n <tr>\r\n <th>{{'Istanza' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{'Esecuzioni' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{'Tempo' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{'Proprio' | localize: lc}}</th>\r\n @if (live) {\r\n <th class=\"pv2-num\">{{'Thread' | localize: lc}}</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (inst of detail.instances; track inst.instanceId) {\r\n <tr>\r\n <td><span class=\"pv2-ellipsis\" [title]=\"inst.instanceId\">{{inst.instanceId}}</span></td>\r\n <td class=\"pv2-num\">{{inst.executions | pv2fmt: 'int'}}</td>\r\n <td class=\"pv2-num\">{{inst.elapsedTime | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-num\">{{inst.elapsedTimeLessChildren | pv2fmt: 'dur'}}</td>\r\n @if (live) {\r\n <td class=\"pv2-num\">{{inst.activeThreads ?? '—'}}</td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <div class=\"pv2-d-foot\">\r\n <span class=\"pv2-muted\">{{detail.numChildren | pv2fmt: 'int'}} {{'figli diretti' | localize: lc}} · {{detail.numDescendants | pv2fmt: 'int'}} {{'discendenti' | localize: lc}}</span>\r\n <button type=\"button\" class=\"pv2-btn\" (click)=\"setRoot(detail.nodeId)\"><i class=\"fa fa-sitemap\"></i> {{'Apri come radice' | localize: lc}}</button>\r\n </div>\r\n }\r\n </aside>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","// Workload report v2 (specifica \"Workload report\"): richieste e risposte come le vuole e le manda il backend (camelCase).\r\n// Le date delle risposte sono UTC \"dd/MM/yyyy HH:mm:ss\" senza fuso\r\n\r\n// Senza snapshot il report è live; senza istanze e con global è dell'intero cluster\r\nexport class WorkloadReportV2Request {\r\n snapFrom?: number;\r\n snapTo?: number;\r\n instanceIds?: string[];\r\n global?: boolean;\r\n}\r\n\r\n// Snapshot che terminano fra from e to (ISO UTC)\r\nexport class WorkloadSnapshotsRequest {\r\n from?: string;\r\n to?: string;\r\n instanceIds?: string[];\r\n}\r\n\r\nexport class WorkloadSnapshotInstance {\r\n snapId: number;\r\n instanceId: string;\r\n // Avvio del processo che ha scritto lo snapshot\r\n startupTime: string;\r\n beginIntervalTime: string;\r\n endIntervalTime: string;\r\n // Tempo di scrittura dello snapshot, ms\r\n flushElapsed: number;\r\n manual: boolean;\r\n}\r\n\r\nexport class WorkloadSnapshot {\r\n // Lo stesso su tutte le istanze: è il valore di snapFrom e snapTo\r\n snapId: number;\r\n // L'inizio più vecchio e la fine più recente fra le istanze\r\n beginIntervalTime: string;\r\n endIntervalTime: string;\r\n manual: boolean;\r\n // Un'istanza è ripartita rispetto al suo snapshot precedente: counter e meter non attendibili in un report che lo comprende\r\n restart: boolean;\r\n instances: WorkloadSnapshotInstance[];\r\n}\r\n\r\nexport class WorkloadSnapshotList {\r\n // False se lo storico non è attivo: si può produrre solo il report live\r\n historyAvailable: boolean;\r\n // Dal più recente\r\n snapshots: WorkloadSnapshot[];\r\n}\r\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmWorkloadV2Loc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Workload report\", [\"Workload report\"]);\r\n super.set(\"it->en\", \"Errore\", [\"Error\"]);\r\n\r\n // Barra dei comandi e avvisi\r\n super.set(\"it->en\", \"Tipo\", [\"Type\"]);\r\n super.set(\"it->en\", \"Fra snapshot\", [\"Snapshot range\"]);\r\n super.set(\"it->en\", \"Istanze\", [\"Instances\"]);\r\n super.set(\"it->en\", \"Tutto il cluster\", [\"Whole cluster\"]);\r\n super.set(\"it->en\", \"tutto il cluster\", [\"whole cluster\"]);\r\n super.set(\"it->en\", \"istanze\", [\"instances\"]);\r\n super.set(\"it->en\", \"istanza\", [\"instance\"]);\r\n super.set(\"it->en\", \"Genera report\", [\"Generate report\"]);\r\n super.set(\"it->en\", \"Annulla\", [\"Cancel\"]);\r\n super.set(\"it->en\", \"Scegli il primo e l'ultimo snapshot\", [\"Choose the first and last snapshot\"]);\r\n super.set(\"it->en\", \"Lo storico non è attivo su questo ambiente: il report si può produrre solo live.\", [\"History is not active on this environment: only a live report can be produced.\"]);\r\n super.set(\"it->en\", \"Lo snapshot {id} segue un riavvio di {istanza}: counter e meter della finestra non sono attendibili.\", [\"Snapshot {id} follows a restart of {istanza}: counters and meters in the window are not reliable.\"]);\r\n super.set(\"it->en\", \"La finestra supera 24 ore: l'attività campionata ne copre solo le ultime 24.\", [\"The window is longer than 24 hours: sampled activity only covers the last 24.\"]);\r\n\r\n // Snapshot\r\n super.set(\"it->en\", \"Snapshot\", [\"Snapshot\"]);\r\n super.set(\"it->en\", \"Ultime 24 ore\", [\"Last 24 hours\"]);\r\n super.set(\"it->en\", \"Ultimi 7 giorni\", [\"Last 7 days\"]);\r\n super.set(\"it->en\", \"Tutto\", [\"All\"]);\r\n super.set(\"it->en\", \"Caricamento…\", [\"Loading…\"]);\r\n super.set(\"it->en\", \"Dalle\", [\"From\"]);\r\n super.set(\"it->en\", \"alle\", [\"to\"]);\r\n super.set(\"it->en\", \"dalle\", [\"from\"]);\r\n super.set(\"it->en\", \"scegli l'ultimo snapshot\", [\"choose the last snapshot\"]);\r\n super.set(\"it->en\", \"Azzera\", [\"Clear\"]);\r\n super.set(\"it->en\", \"Un clic sceglie il primo snapshot, un secondo clic l'ultimo.\", [\"One click chooses the first snapshot, a second click the last.\"]);\r\n super.set(\"it->en\", \"Inizio\", [\"Start\"]);\r\n super.set(\"it->en\", \"Fine\", [\"End\"]);\r\n super.set(\"it->en\", \"Durata\", [\"Duration\"]);\r\n super.set(\"it->en\", \"Manuale\", [\"Manual\"]);\r\n super.set(\"it->en\", \"Riavvio\", [\"Restart\"]);\r\n super.set(\"it->en\", \"Un'istanza è ripartita: counter e meter non sono attendibili\", [\"An instance restarted: counters and meters are not reliable\"]);\r\n super.set(\"it->en\", \"Nessuno snapshot nel periodo scelto: prova con un periodo più lungo.\", [\"No snapshots in the chosen period: try a longer one.\"]);\r\n super.set(\"it->en\", \"Orari in ora locale\", [\"Times in local time\"]);\r\n super.set(\"it->en\", \"g\", [\"d\"]);\r\n\r\n // Report\r\n super.set(\"it->en\", \"Generazione del report…\", [\"Generating the report…\"]);\r\n super.set(\"it->en\", \"Il report non si può produrre\", [\"The report cannot be produced\"]);\r\n super.set(\"it->en\", \"generato alle\", [\"generated at\"]);\r\n super.set(\"it->en\", \"Vai a…\", [\"Go to…\"]);\r\n super.set(\"it->en\", \"Scarica\", [\"Download\"]);\r\n super.set(\"it->en\", \"Apri in una scheda\", [\"Open in a tab\"]);\r\n super.set(\"it->en\", \"Gli orari del report sono in UTC.\", [\"Report times are in UTC.\"]);\r\n super.set(\"it->en\", \"Scegli tipo e istanze, poi genera il report.\", [\"Choose type and instances, then generate the report.\"]);\r\n }\r\n}\r\n","// Angular\r\nimport { Component, ElementRef, ViewChild } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { DomSanitizer, SafeHtml } from \"@angular/platform-browser\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { firstValueFrom, Subscription } from \"rxjs\";\r\n\r\n// Modelli\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { WorkloadReportV2Request, WorkloadSnapshot, WorkloadSnapshotsRequest } from \"../../models/components/WorkloadReportV2\";\r\n\r\n// Applicazione\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\n\r\n// Localizzazione\r\nimport { AdmWorkloadV2Loc } from \"./workload_v2.component.loc\";\r\n\r\ndeclare var dayjs;\r\n\r\nconst STORAGE_KEY = \"HotSearchWorkloadV2\";\r\nconst HOUR_MS = 3600 * 1000;\r\n\r\n// Sezioni principali del report con le ancore stabili della specifica: nel salto compaiono solo quelle presenti nel documento.\r\n// I titoli sono in inglese come nel report\r\nconst SECTIONS: [string, string][] = [\r\n [\"summary\", \"Report Summary\"], [\"loadprofile\", \"Load profile\"], [\"efficiency\", \"Instance efficiency\"], [\"topevents\", \"Top 10 events by time\"],\r\n [\"waitclasses\", \"Wait classes\"], [\"actsumtype\", \"Activity summary by event type\"], [\"actsumclass\", \"Activity summary by wait class\"],\r\n [\"aas\", \"Average active sessions\"], [\"topsess\", \"Top sessions\"], [\"topnodes\", \"Top profiler nodes\"], [\"topapis\", \"Top APIs\"], [\"topjobs\", \"Top jobs\"],\r\n [\"toptenants\", \"Top tenants\"], [\"protime\", \"Profiler nodes by time\"], [\"protimelc\", \"Profiler nodes by self time\"], [\"procalls\", \"Profiler nodes by calls\"],\r\n [\"wprotime\", \"Profiler waits\"], [\"iprotime\", \"Profiler idle\"], [\"sqltime\", \"SQL by elapsed time\"], [\"sqlexec\", \"SQL by executions\"], [\"sqlpeak\", \"SQL by peak\"],\r\n [\"sqltext\", \"Complete list of SQL text\"], [\"netstat\", \"Network\"], [\"iostat\", \"IO\"], [\"contwaits\", \"Waits on latches and locks\"], [\"latch\", \"Latch activity\"],\r\n [\"mgauges\", \"Metrics: gauges\"], [\"mcounters\", \"Metrics: counters\"], [\"mmeters\", \"Metrics: meters\"], [\"mhistograms\", \"Metrics: histograms\"],\r\n [\"mtimers\", \"Metrics: timers\"], [\"parameters\", \"Modified parameters\"]\r\n];\r\n\r\n// Ricordati fra una visita e l'altra (W12)\r\nclass WorkloadV2Settings {\r\n live: boolean;\r\n instances: string[];\r\n period: string;\r\n}\r\n\r\n// Il report mostrato, con i parametri con cui è stato chiesto: resta quello anche se poi si cambiano i comandi\r\nexport class WorkloadV2Report {\r\n html: string;\r\n doc: SafeHtml;\r\n live: boolean;\r\n instances: string[];\r\n snapFrom: number;\r\n snapTo: number;\r\n windowFrom: Date;\r\n windowTo: Date;\r\n generatedAt: Date;\r\n size: number;\r\n sections: KeyValue[];\r\n}\r\n\r\n@Component({\r\n selector: \"workload_v2\",\r\n providers: [{ provide: LocalizationService, useClass: AdmWorkloadV2Loc }],\r\n templateUrl: \"./workload_v2.component.html\",\r\n styleUrls: [\"./workload_v2.component.scss\"],\r\n standalone: false\r\n})\r\nexport class AdmWorkloadV2Component {\r\n @ViewChild(\"reportFrame\") reportFrame: ElementRef<HTMLIFrameElement>;\r\n\r\n // Comandi\r\n public live: boolean = true;\r\n // Vuoto = tutto il cluster\r\n public instances: string[] = [];\r\n // Giorni dell'elenco degli snapshot; \"0\" = tutto\r\n public period: string = \"7\";\r\n\r\n // Elenco degli snapshot\r\n public snapshots: WorkloadSnapshot[] = [];\r\n public historyAvailable: boolean = true;\r\n public snapshotsLoading: boolean = false;\r\n public snapshotsLoaded: boolean = false;\r\n public snapshotsError: string;\r\n // Primo e ultimo snapshot scelti, compresi (selTo null dopo il primo clic)\r\n public selFrom: number = null;\r\n public selTo: number = null;\r\n public warnings: string[] = [];\r\n\r\n // Report\r\n public generating: boolean = false;\r\n public reportError: string;\r\n public report: WorkloadV2Report;\r\n public section: string = \"\";\r\n\r\n public Instances: KeyValue[] = [];\r\n public Periods: KeyValue[] = [];\r\n\r\n private be: string;\r\n private reportSub: Subscription;\r\n private snapshotsGeneration: number = 0;\r\n\r\n constructor(\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private sanitizer: DomSanitizer,\r\n private adms: AdminModuleBaseService) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.Periods = [\r\n new KeyValue(\"1\", this.lc.loc(\"Ultime 24 ore\")),\r\n new KeyValue(\"7\", this.lc.loc(\"Ultimi 7 giorni\")),\r\n new KeyValue(\"0\", this.lc.loc(\"Tutto\"))\r\n ];\r\n\r\n let saved = this.route.snapshot.queryParams[\"ignoreStorage\"] ? null : await firstValueFrom(this.localStorage.getItem<WorkloadV2Settings>(STORAGE_KEY), { defaultValue: null });\r\n if (saved) {\r\n this.live = saved.live ?? this.live;\r\n this.instances = saved.instances ?? this.instances;\r\n this.period = saved.period ?? this.period;\r\n }\r\n\r\n this.adms.getInstances(this.be).then(t => this.Instances = t ?? []);\r\n this.loadSnapshots();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.reportSub?.unsubscribe();\r\n }\r\n\r\n // #region Comandi\r\n\r\n get clusterLabel(): string {\r\n return this.Instances.length ? `${this.lc.loc(\"Tutto il cluster\")} (${this.Instances.length} ${this.Instances.length == 1 ? this.lc.loc(\"istanza\") : this.lc.loc(\"istanze\")})` : this.lc.loc(\"Tutto il cluster\");\r\n }\r\n\r\n setLive(live: boolean) {\r\n if (!live && !this.historyAvailable)\r\n return;\r\n this.live = live;\r\n this.updateWarnings();\r\n this.saveSettings();\r\n }\r\n\r\n // W6: cambiando istanze l'elenco degli snapshot si ricarica\r\n instancesChanged(ids: string[]) {\r\n this.instances = ids ?? [];\r\n this.saveSettings();\r\n this.loadSnapshots();\r\n }\r\n\r\n setPeriod(id: string) {\r\n this.period = id;\r\n this.saveSettings();\r\n this.loadSnapshots();\r\n }\r\n\r\n // In \"Fra snapshot\" servono il primo e l'ultimo\r\n get canGenerate(): boolean {\r\n return this.live || (this.selFrom != null && this.selTo != null);\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Snapshot\r\n\r\n async loadSnapshots() {\r\n let generation = ++this.snapshotsGeneration;\r\n let req = new WorkloadSnapshotsRequest();\r\n if (+this.period > 0)\r\n req.from = new Date(Date.now() - +this.period * 24 * HOUR_MS).toISOString();\r\n if (this.instances.length)\r\n req.instanceIds = this.instances;\r\n\r\n this.snapshotsLoading = true;\r\n this.snapshotsError = null;\r\n try {\r\n let res = await this.adms.getWorkloadSnapshots(this.be, req);\r\n if (generation != this.snapshotsGeneration)\r\n return;\r\n\r\n // Senza risposta (per esempio DefaultOnFail) vale come storico spento\r\n this.historyAvailable = res?.historyAvailable ?? false;\r\n this.snapshots = res?.snapshots ?? [];\r\n this.snapshotsLoaded = true;\r\n if (!this.historyAvailable)\r\n this.live = true;\r\n\r\n // Se gli snapshot scelti non ci sono più, la scelta si azzera (W6)\r\n let ids = new Set(this.snapshots.map(t => t.snapId));\r\n if ((this.selFrom != null && !ids.has(this.selFrom)) || (this.selTo != null && !ids.has(this.selTo)))\r\n this.clearSelection();\r\n this.updateWarnings();\r\n }\r\n catch (err) {\r\n if (generation == this.snapshotsGeneration)\r\n this.snapshotsError = `${this.lc.loc(\"Errore\")} ${err?.status ?? \"\"}: ${this.adms.errorText(err)}`;\r\n }\r\n finally {\r\n if (generation == this.snapshotsGeneration)\r\n this.snapshotsLoading = false;\r\n }\r\n }\r\n\r\n // Un clic fissa il primo snapshot, un secondo l'ultimo (in qualsiasi ordine); un terzo ricomincia\r\n pick(snapshot: WorkloadSnapshot) {\r\n if (this.selFrom == null || this.selTo != null) {\r\n this.selFrom = snapshot.snapId;\r\n this.selTo = null;\r\n }\r\n else {\r\n let first = this.selFrom;\r\n this.selFrom = Math.min(first, snapshot.snapId);\r\n this.selTo = Math.max(first, snapshot.snapId);\r\n }\r\n this.updateWarnings();\r\n }\r\n\r\n clearSelection() {\r\n this.selFrom = null;\r\n this.selTo = null;\r\n this.updateWarnings();\r\n }\r\n\r\n inRange(snapshot: WorkloadSnapshot): boolean {\r\n if (this.selFrom == null)\r\n return false;\r\n return this.selTo == null ? snapshot.snapId == this.selFrom : snapshot.snapId >= this.selFrom && snapshot.snapId <= this.selTo;\r\n }\r\n\r\n isEdge(snapshot: WorkloadSnapshot): boolean {\r\n return snapshot.snapId == this.selFrom || snapshot.snapId == this.selTo;\r\n }\r\n\r\n // Finestra scelta: dall'inizio del primo snapshot alla fine dell'ultimo (ognuno copre l'intervallo dal precedente)\r\n get selectionWindow(): { from: Date, to: Date } {\r\n let first = this.snapshots.find(t => t.snapId == this.selFrom);\r\n let last = this.snapshots.find(t => t.snapId == (this.selTo ?? this.selFrom));\r\n return first && last ? { from: this.parseUtc(first.beginIntervalTime), to: this.parseUtc(last.endIntervalTime) } : null;\r\n }\r\n\r\n instancesTitle(snapshot: WorkloadSnapshot): string {\r\n return (snapshot.instances ?? []).map(t => t.instanceId).join(\"\\n\");\r\n }\r\n\r\n // W4: avvisi sulla finestra prima di generare, non bloccanti\r\n private updateWarnings() {\r\n let warnings: string[] = [];\r\n if (!this.live && this.selFrom != null && this.selTo != null) {\r\n this.snapshots.forEach((s, i) => {\r\n if (s.restart && s.snapId >= this.selFrom && s.snapId <= this.selTo)\r\n for (let instance of this.restartedInstances(i))\r\n warnings.push(this.lc.loc(\"Lo snapshot {id} segue un riavvio di {istanza}: counter e meter della finestra non sono attendibili.\").replace(\"{id}\", String(s.snapId)).replace(\"{istanza}\", instance));\r\n });\r\n let window = this.selectionWindow;\r\n if (window && window.to.getTime() - window.from.getTime() > 24 * HOUR_MS)\r\n warnings.push(this.lc.loc(\"La finestra supera 24 ore: l'attività campionata ne copre solo le ultime 24.\"));\r\n }\r\n this.warnings = warnings;\r\n }\r\n\r\n // L'istanza ripartita è quella con un avvio diverso dallo snapshot precedente (il successivo nell'elenco, che va dal più recente)\r\n private restartedInstances(index: number): string[] {\r\n let snapshot = this.snapshots[index];\r\n let previous = this.snapshots[index + 1];\r\n let ids = (snapshot.instances ?? []).filter(t => {\r\n let before = previous?.instances?.find(k => k.instanceId == t.instanceId);\r\n return before ? before.startupTime != t.startupTime : this.parseUtc(t.startupTime) > this.parseUtc(snapshot.beginIntervalTime);\r\n }).map(t => t.instanceId);\r\n return ids.length ? ids : (snapshot.instances ?? []).map(t => t.instanceId);\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Report\r\n\r\n // Il report si chiede solo su comando (W7); durante la richiesta lo stesso comando la annulla\r\n generateOrCancel() {\r\n if (this.generating)\r\n this.cancel();\r\n else\r\n this.generate();\r\n }\r\n\r\n private generate() {\r\n if (!this.canGenerate)\r\n return;\r\n\r\n let req = new WorkloadReportV2Request();\r\n // Mai global=false senza istanze: dietro un bilanciatore darebbe il report dell'istanza che risponde (W2)\r\n if (this.instances.length)\r\n req.instanceIds = [...this.instances];\r\n else\r\n req.global = true;\r\n let window = this.live ? null : this.selectionWindow;\r\n if (!this.live) {\r\n req.snapFrom = this.selFrom;\r\n req.snapTo = this.selTo;\r\n }\r\n\r\n this.generating = true;\r\n this.reportError = null;\r\n this.reportSub?.unsubscribe();\r\n this.reportSub = this.adms.getWorkloadReportV2(this.be, req).subscribe({\r\n next: html => {\r\n this.generating = false;\r\n this.showReport(html ?? \"\", req, window);\r\n },\r\n error: err => {\r\n this.generating = false;\r\n // La sessione scaduta la gestisce il servizio\r\n if (err?.status != 401)\r\n this.reportError = this.adms.errorText(err) || `${this.lc.loc(\"Errore\")} ${err?.status ?? \"\"}`;\r\n }\r\n });\r\n }\r\n\r\n cancel() {\r\n this.reportSub?.unsubscribe();\r\n this.reportSub = null;\r\n this.generating = false;\r\n }\r\n\r\n private showReport(html: string, req: WorkloadReportV2Request, window: { from: Date, to: Date }) {\r\n // Le sezioni del salto sono quelle che il documento ha davvero\r\n let parsed = new DOMParser().parseFromString(html, \"text/html\");\r\n let sections = SECTIONS.filter(t => parsed.getElementById(t[0])).map(t => new KeyValue(t[0], t[1]));\r\n\r\n this.report = {\r\n html: html,\r\n // Il report va in un iframe con sandbox senza script: lo stile e le ancore restano dentro il riquadro.\r\n // Il sanificatore di Angular toglierebbe gli stili inline del documento, per questo lo si marca come sicuro\r\n doc: this.sanitizer.bypassSecurityTrustHtml(html),\r\n live: req.snapFrom == null,\r\n instances: req.instanceIds ?? [],\r\n snapFrom: req.snapFrom,\r\n snapTo: req.snapTo,\r\n windowFrom: window?.from,\r\n windowTo: window?.to,\r\n generatedAt: new Date(),\r\n size: new Blob([html]).size,\r\n sections: sections\r\n };\r\n this.section = \"\";\r\n }\r\n\r\n // W11: porta il riquadro all'ancora scelta, senza far scorrere la pagina\r\n goToSection(anchor: string) {\r\n this.section = anchor;\r\n let doc = this.reportFrame?.nativeElement?.contentDocument;\r\n let target = doc?.getElementById(anchor);\r\n if (target)\r\n doc.defaultView.scrollTo({ top: target.getBoundingClientRect().top + doc.defaultView.scrollY - 8, behavior: \"smooth\" });\r\n }\r\n\r\n // W10: l'HTML in un file UTF-8 con un nome che dice cosa contiene\r\n download() {\r\n let url = URL.createObjectURL(this.reportBlob());\r\n let link = document.createElement(\"a\");\r\n link.href = url;\r\n link.download = this.fileName();\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n setTimeout(() => URL.revokeObjectURL(url), 1000);\r\n }\r\n\r\n openInTab() {\r\n let url = URL.createObjectURL(this.reportBlob());\r\n window.open(url, \"_blank\");\r\n // La scheda nuova ha già caricato il documento quando l'URL viene revocato\r\n setTimeout(() => URL.revokeObjectURL(url), 60000);\r\n }\r\n\r\n private reportBlob(): Blob {\r\n return new Blob([this.report.html], { type: \"text/html;charset=utf-8\" });\r\n }\r\n\r\n // workload-report_{live|snap-1201-1206}_{cluster|istanze}_{yyyyMMdd-HHmm}Z.html\r\n private fileName(): string {\r\n let r = this.report;\r\n let kind = r.live ? \"live\" : `snap-${r.snapFrom}-${r.snapTo}`;\r\n let scope = r.instances.length ? r.instances.map(t => t.replace(/[^\\w.-]+/g, \"-\")).join(\"+\") : \"cluster\";\r\n return `workload-report_${kind}_${scope}_${this.utcStamp(r.generatedAt)}Z.html`;\r\n }\r\n\r\n // yyyyMMdd-HHmm in UTC (il plugin utc di dayjs non è detto che ci sia)\r\n private utcStamp(date: Date): string {\r\n let pad = (n: number) => String(n).padStart(2, \"0\");\r\n return `${date.getUTCFullYear()}${pad(date.getUTCMonth() + 1)}${pad(date.getUTCDate())}-${pad(date.getUTCHours())}${pad(date.getUTCMinutes())}`;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Presentazione\r\n\r\n // Le date delle risposte sono UTC \"dd/MM/yyyy HH:mm:ss\" senza fuso: si leggono come UTC e si mostrano in ora locale (W16)\r\n parseUtc(value: string): Date {\r\n let m = /^(\\d{2})\\/(\\d{2})\\/(\\d{4}) (\\d{2}):(\\d{2}):(\\d{2})$/.exec(value ?? \"\");\r\n return m ? new Date(Date.UTC(+m[3], +m[2] - 1, +m[1], +m[4], +m[5], +m[6])) : value ? new Date(value) : null;\r\n }\r\n\r\n local(value: Date | string): string {\r\n let date = typeof value == \"string\" ? this.parseUtc(value) : value;\r\n return date ? dayjs(date).format(\"DD/MM HH:mm\") : \"—\";\r\n }\r\n\r\n hhmm(date: Date): string {\r\n return date ? dayjs(date).format(\"HH:mm\") : \"—\";\r\n }\r\n\r\n // Fuso dell'ora locale, per dire in che ora sono gli orari della pagina\r\n get zone(): string {\r\n return `UTC${dayjs().format(\"Z\")}`;\r\n }\r\n\r\n span(from: Date | string, to: Date | string): string {\r\n let a = typeof from == \"string\" ? this.parseUtc(from) : from;\r\n let b = typeof to == \"string\" ? this.parseUtc(to) : to;\r\n if (!a || !b)\r\n return \"—\";\r\n let minutes = Math.max(0, Math.round((b.getTime() - a.getTime()) / 60000));\r\n if (minutes < 60)\r\n return `${minutes} min`;\r\n let hours = Math.floor(minutes / 60);\r\n if (hours < 48)\r\n return minutes % 60 ? `${hours} h ${minutes % 60} min` : `${hours} h`;\r\n let days = Math.floor(hours / 24);\r\n return hours % 24 ? `${days} ${this.lc.loc(\"g\")} ${hours % 24} h` : `${days} ${this.lc.loc(\"g\")}`;\r\n }\r\n\r\n kilobytes(size: number): string {\r\n return `${Math.max(1, Math.round(size / 1024))} kB`;\r\n }\r\n\r\n scopeLabel(instances: string[]): string {\r\n return instances?.length ? instances.join(\", \") : this.lc.loc(\"tutto il cluster\");\r\n }\r\n\r\n private saveSettings() {\r\n let settings: WorkloadV2Settings = { live: this.live, instances: this.instances, period: this.period };\r\n this.localStorage.setItem(STORAGE_KEY, settings).subscribe();\r\n }\r\n\r\n // #endregion\r\n}\r\n","<div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"card app-overflow-visible\" widget>\r\n <div class=\"card-header\">\r\n <span class=\"text-uppercase\">{{'Workload report' | localize: lc}}</span>\r\n </div>\r\n <div class=\"card-body widget-body\">\r\n <!-- Barra dei comandi: tipo, istanze, genera. Il report si chiede solo con il comando -->\r\n <div class=\"wr-toolbar\">\r\n <div class=\"wr-group\">\r\n <span class=\"wr-group-label\">{{'Tipo' | localize: lc}}</span>\r\n <div class=\"wr-seg\">\r\n <button type=\"button\" [class.wr-on]=\"live\" (click)=\"setLive(true)\"><span class=\"wr-live-dot\"></span>Live</button>\r\n <button type=\"button\" [class.wr-on]=\"!live\" [disabled]=\"!historyAvailable\" (click)=\"setLive(false)\"\r\n [title]=\"historyAvailable ? '' : ('Lo storico non è attivo su questo ambiente: il report si può produrre solo live.' | localize: lc)\">\r\n {{'Fra snapshot' | localize: lc}}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"wr-group wr-field-wide\">\r\n <span class=\"wr-group-label\">{{'Istanze' | localize: lc}}</span>\r\n <form-multiselect class=\"wr-fill\" [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"instances\" (ngModelChange)=\"instancesChanged($event)\" name=\"instances\" [Source]=\"Instances\" [Placeholder]=\"clusterLabel\" [MaxShownElements]=\"2\"></form-multiselect>\r\n </div>\r\n <div class=\"wr-toolbar-end\">\r\n <button type=\"button\" class=\"wr-btn wr-btn-primary\" [disabled]=\"!generating && !canGenerate\" (click)=\"generateOrCancel()\"\r\n [title]=\"!generating && !canGenerate ? ('Scegli il primo e l\\'ultimo snapshot' | localize: lc) : ''\">\r\n @if (generating) {\r\n <i class=\"fa fa-times\"></i> {{'Annulla' | localize: lc}}\r\n } @else {\r\n <i class=\"fa fa-file-text\"></i> {{'Genera report' | localize: lc}}\r\n }\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Avvisi sulla finestra (W4): non bloccano la generazione -->\r\n @for (warning of warnings; track $index) {\r\n <div class=\"wr-alert wr-alert-warn\"><i class=\"fa fa-exclamation-triangle\"></i> {{warning}}</div>\r\n }\r\n @if (snapshotsLoaded && !historyAvailable) {\r\n <div class=\"wr-alert\"><i class=\"fa fa-info-circle\"></i> {{'Lo storico non è attivo su questo ambiente: il report si può produrre solo live.' | localize: lc}}</div>\r\n }\r\n\r\n <!-- Elenco degli snapshot, solo per il report fra snapshot -->\r\n @if (!live) {\r\n <div class=\"wr-panel\">\r\n <div class=\"wr-panel-header\">\r\n <span class=\"wr-title\">{{'Snapshot' | localize: lc}}</span>\r\n <div class=\"wr-seg wr-seg-small\">\r\n @for (p of Periods; track p.id) {\r\n <button type=\"button\" [class.wr-on]=\"period == p.id\" (click)=\"setPeriod(p.id)\">{{p.description}}</button>\r\n }\r\n </div>\r\n @if (snapshotsLoading) {\r\n <span class=\"wr-muted\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento…' | localize: lc}}</span>\r\n }\r\n <span class=\"wr-spacer\"></span>\r\n @if (selectionWindow; as w) {\r\n <span class=\"wr-window\">\r\n {{'Dalle' | localize: lc}} <strong>{{local(w.from)}}</strong> {{'alle' | localize: lc}} <strong>{{local(w.to)}}</strong>\r\n ({{span(w.from, w.to)}})\r\n @if (selTo == null) {\r\n <span class=\"wr-muted\">· {{\"scegli l'ultimo snapshot\" | localize: lc}}</span>\r\n }\r\n </span>\r\n <button type=\"button\" class=\"wr-link\" (click)=\"clearSelection()\">{{'Azzera' | localize: lc}}</button>\r\n } @else {\r\n <span class=\"wr-muted\">{{\"Un clic sceglie il primo snapshot, un secondo clic l'ultimo.\" | localize: lc}}</span>\r\n }\r\n </div>\r\n\r\n @if (snapshotsError) {\r\n <div class=\"wr-alert wr-alert-error\">{{snapshotsError}}</div>\r\n }\r\n\r\n <div class=\"wr-table-wrap\">\r\n <table class=\"wr-table\">\r\n <thead>\r\n <tr>\r\n <th class=\"wr-num\">{{'Snapshot' | localize: lc}}</th>\r\n <th>{{'Inizio' | localize: lc}}</th>\r\n <th>{{'Fine' | localize: lc}}</th>\r\n <th class=\"wr-num\">{{'Durata' | localize: lc}}</th>\r\n <th class=\"wr-num\">{{'Istanze' | localize: lc}}</th>\r\n <th>{{'Manuale' | localize: lc}}</th>\r\n <th>{{'Riavvio' | localize: lc}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of snapshots; track s.snapId) {\r\n <tr class=\"wr-row\" [class.wr-in-range]=\"inRange(s)\" [class.wr-edge]=\"isEdge(s)\" [class.wr-restart]=\"s.restart\" (click)=\"pick(s)\">\r\n <td class=\"wr-num\"><strong>{{s.snapId}}</strong></td>\r\n <td>{{local(s.beginIntervalTime)}}</td>\r\n <td>{{local(s.endIntervalTime)}}</td>\r\n <td class=\"wr-num\">{{span(s.beginIntervalTime, s.endIntervalTime)}}</td>\r\n <td class=\"wr-num\" [title]=\"instancesTitle(s)\">{{s.instances?.length ?? 0}}</td>\r\n <td>\r\n @if (s.manual) {\r\n <span class=\"wr-badge\"><i class=\"fa fa-hand-pointer\"></i> {{'Manuale' | localize: lc}}</span>\r\n }\r\n </td>\r\n <td>\r\n @if (s.restart) {\r\n <span class=\"wr-badge wr-badge-warn\" [title]=\"'Un\\'istanza è ripartita: counter e meter non sono attendibili' | localize: lc\"><i class=\"fa fa-power-off\"></i> {{'Riavvio' | localize: lc}}</span>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n @if (snapshotsLoaded && !snapshotsLoading && !snapshotsError && snapshots.length == 0 && historyAvailable) {\r\n <div class=\"wr-empty\">{{'Nessuno snapshot nel periodo scelto: prova con un periodo più lungo.' | localize: lc}}</div>\r\n }\r\n </div>\r\n <div class=\"wr-footnote\">{{'Orari in ora locale' | localize: lc}} ({{zone}})</div>\r\n </div>\r\n }\r\n\r\n <!-- Report -->\r\n <div class=\"wr-panel wr-report\">\r\n @if (generating) {\r\n <div class=\"wr-alert wr-alert-busy\">\r\n <i class=\"fa fa-spinner fa-spin\"></i> {{'Generazione del report…' | localize: lc}}\r\n <button type=\"button\" class=\"wr-link\" (click)=\"cancel()\">{{'Annulla' | localize: lc}}</button>\r\n </div>\r\n }\r\n @if (reportError) {\r\n <div class=\"wr-alert wr-alert-error\">{{'Il report non si può produrre' | localize: lc}}: {{reportError}}</div>\r\n }\r\n\r\n @if (report) {\r\n <div class=\"wr-report-bar\">\r\n <div class=\"wr-summary\">\r\n @if (report.live) {\r\n <strong>Live</strong>\r\n } @else {\r\n <strong>{{'Snapshot' | localize: lc}} {{report.snapFrom}}–{{report.snapTo}}</strong>\r\n }\r\n · {{scopeLabel(report.instances)}}\r\n @if (!report.live && report.windowFrom) {\r\n · {{'dalle' | localize: lc}} {{local(report.windowFrom)}} {{'alle' | localize: lc}} {{local(report.windowTo)}}\r\n }\r\n · {{'generato alle' | localize: lc}} {{hhmm(report.generatedAt)}} ({{kilobytes(report.size)}})\r\n </div>\r\n <div class=\"wr-actions\">\r\n @if (report.sections.length > 0) {\r\n <div class=\"wr-field wr-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"section\" (ngModelChange)=\"goToSection($event)\" name=\"section\" [Source]=\"report.sections\" [Placeholder]=\"'Vai a…' | localize: lc\"></form-select>\r\n </div>\r\n }\r\n <button type=\"button\" class=\"wr-btn\" (click)=\"download()\"><i class=\"fa fa-download\"></i> {{'Scarica' | localize: lc}}</button>\r\n <button type=\"button\" class=\"wr-btn\" (click)=\"openInTab()\"><i class=\"fa fa-external-link\"></i> {{'Apri in una scheda' | localize: lc}}</button>\r\n </div>\r\n </div>\r\n <div class=\"wr-footnote\"><i class=\"fa fa-clock\"></i> {{'Gli orari del report sono in UTC.' | localize: lc}}</div>\r\n <!-- Riquadro isolato e senza script: gli stili del report non toccano la pagina e le ancore dell'indice restano dentro (W8) -->\r\n <iframe #reportFrame class=\"wr-frame\" [class.wr-stale]=\"generating\" [srcdoc]=\"report.doc\" sandbox=\"allow-same-origin allow-popups\" title=\"Workload report\"></iframe>\r\n } @else if (!generating && !reportError) {\r\n <div class=\"wr-placeholder\">\r\n <i class=\"fa fa-file-text\"></i>\r\n {{'Scegli tipo e istanze, poi genera il report.' | localize: lc}}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","// Metriche v2 (specifica \"Metriche del Director\"): richieste e risposte come le vuole e le manda il backend (camelCase).\r\n// Le date delle risposte sono UTC \"dd/MM/yyyy HH:mm:ss\" senza fuso, al secondo\r\n\r\nexport enum MetricV2Type {\r\n Counter = 0,\r\n Gauge = 1,\r\n Histogram = 2,\r\n Timer = 3,\r\n Meter = 4\r\n}\r\n\r\n// Senza istanze e con global, tutto il cluster\r\nexport class MetricsV2CatalogRequest {\r\n global?: boolean;\r\n instanceIds?: string[];\r\n}\r\n\r\n// Live (realTime con snapFrom), storico per periodo (snapFrom/snapTo) o storico fra due snapshot (snapIdFrom/snapIdTo)\r\nexport class MetricsV2Request extends MetricsV2CatalogRequest {\r\n metricNames?: string[];\r\n realTime?: boolean;\r\n snapFrom?: string;\r\n snapTo?: string;\r\n snapIdFrom?: number;\r\n snapIdTo?: number;\r\n}\r\n\r\nexport class MetricsV2Info {\r\n // Le voci di un totale si chiamano \"{totale} - {elemento}\"\r\n name: string;\r\n metricType: MetricV2Type;\r\n unit: string;\r\n // Meter e timer: unità dei rate a 1, 5 e 15 minuti\r\n rateUnit: string;\r\n // Timer: unità delle durate\r\n durationUnit: string;\r\n instances: string[];\r\n}\r\n\r\n// Una metrica di un'istanza in un istante: i campi che non riguardano il tipo valgono 0 o null\r\nexport class MetricsV2Sample {\r\n instanceId: string;\r\n sampleTime: string;\r\n // Solo sullo storico\r\n snapId: number;\r\n name: string;\r\n metricType: MetricV2Type;\r\n unit: string;\r\n rateUnit: string;\r\n durationUnit: string;\r\n value: number;\r\n count: number;\r\n // Voci di un totale, solo live\r\n percent: number;\r\n meanRate: number;\r\n oneMinuteRate: number;\r\n fiveMinuteRate: number;\r\n fifteenMinuteRate: number;\r\n mean: number;\r\n stdDev: number;\r\n median: number;\r\n min: number;\r\n max: number;\r\n lastValue: number;\r\n percentile75: number;\r\n percentile95: number;\r\n percentile98: number;\r\n percentile99: number;\r\n percentile999: number;\r\n minUserValue: string;\r\n maxUserValue: string;\r\n lastUserValue: string;\r\n sampleSize: number;\r\n activeSessions: number;\r\n totalTime: number;\r\n // Differenze con il campione precedente della stessa istanza e metrica: null sul primo e sul primo dopo un riavvio\r\n intervalSeconds: number;\r\n deltaCount: number;\r\n ratePerSecond: number;\r\n deltaTotalTime: number;\r\n intervalMean: number;\r\n}\r\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmMetricsV2Loc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Metriche di Sistema\", [\"System Metrics\"]);\r\n super.set(\"it->en\", \"Errore\", [\"Error\"]);\r\n\r\n // Barra dei comandi\r\n super.set(\"it->en\", \"Sorgente\", [\"Source\"]);\r\n super.set(\"it->en\", \"Storico per periodo\", [\"History by period\"]);\r\n super.set(\"it->en\", \"Storico per snapshot\", [\"History by snapshot\"]);\r\n super.set(\"it->en\", \"Lo storico non è attivo su questo ambiente: ci sono solo i dati live.\", [\"History is not active on this environment: only live data is available.\"]);\r\n super.set(\"it->en\", \"Finestra\", [\"Window\"]);\r\n super.set(\"it->en\", \"1 ora\", [\"1 hour\"]);\r\n super.set(\"it->en\", \"Dal\", [\"From\"]);\r\n super.set(\"it->en\", \"Al\", [\"To\"]);\r\n super.set(\"it->en\", \"Dallo snapshot\", [\"From snapshot\"]);\r\n super.set(\"it->en\", \"Allo snapshot\", [\"To snapshot\"]);\r\n super.set(\"it->en\", \"Dalle\", [\"From\"]);\r\n super.set(\"it->en\", \"alle\", [\"at\"]);\r\n super.set(\"it->en\", \"Istanze\", [\"Instances\"]);\r\n super.set(\"it->en\", \"Tutto il cluster\", [\"Whole cluster\"]);\r\n super.set(\"it->en\", \"istanze\", [\"instances\"]);\r\n super.set(\"it->en\", \"istanza\", [\"instance\"]);\r\n super.set(\"it->en\", \"Aggiornato alle\", [\"Updated at\"]);\r\n super.set(\"it->en\", \"Pausa\", [\"Pause\"]);\r\n super.set(\"it->en\", \"Riprendi\", [\"Resume\"]);\r\n super.set(\"it->en\", \"Caricamento…\", [\"Loading…\"]);\r\n super.set(\"it->en\", \"Grafici\", [\"Charts\"]);\r\n super.set(\"it->en\", \"Tabella\", [\"Table\"]);\r\n super.set(\"it->en\", \"Lo snapshot {id} segue un riavvio di {istanza}: lì le serie si interrompono.\", [\"Snapshot {id} follows a restart of {istanza}: series break there.\"]);\r\n\r\n // Catalogo\r\n super.set(\"it->en\", \"Cerca una metrica…\", [\"Search a metric…\"]);\r\n super.set(\"it->en\", \"Processo\", [\"Process\"]);\r\n super.set(\"it->en\", \"API\", [\"API\"]);\r\n super.set(\"it->en\", \"Code asincrone\", [\"Async queues\"]);\r\n super.set(\"it->en\", \"Attività\", [\"Activity\"]);\r\n super.set(\"it->en\", \"di\", [\"of\"]);\r\n super.set(\"it->en\", \"metriche scelte\", [\"metrics chosen\"]);\r\n super.set(\"it->en\", \"Togli tutte\", [\"Remove all\"]);\r\n super.set(\"it->en\", \"Voci\", [\"Items\"]);\r\n super.set(\"it->en\", \"Aggiungi le {N} voci\", [\"Add the {N} items\"]);\r\n\r\n // Grafici e tessere\r\n super.set(\"it->en\", \"Scegli una o più metriche dal catalogo.\", [\"Choose one or more metrics from the catalog.\"]);\r\n super.set(\"it->en\", \"dall'avvio\", [\"since start\"]);\r\n super.set(\"it->en\", \"Orari in ora locale\", [\"Times in local time\"]);\r\n super.set(\"it->en\", \"trascina su un grafico per lo zoom\", [\"drag on a chart to zoom\"]);\r\n super.set(\"it->en\", \"Finestra intera\", [\"Whole window\"]);\r\n super.set(\"it->en\", \"Togli\", [\"Remove\"]);\r\n super.set(\"it->en\", \"Nessun campione di {metrica} nella finestra scelta\", [\"No samples of {metrica} in the chosen window\"]);\r\n super.set(\"it->en\", \"riavvio\", [\"restart\"]);\r\n super.set(\"it->en\", \"thread\", [\"threads\"]);\r\n super.set(\"it->en\", \"Livello\", [\"Level\"]);\r\n super.set(\"it->en\", \"Variazione\", [\"Change\"]);\r\n super.set(\"it->en\", \"Quote\", [\"Shares\"]);\r\n super.set(\"it->en\", \"Al secondo\", [\"Per second\"]);\r\n super.set(\"it->en\", \"Rate mobili\", [\"Moving rates\"]);\r\n super.set(\"it->en\", \"Percentili\", [\"Percentiles\"]);\r\n super.set(\"it->en\", \"Frequenza\", [\"Frequency\"]);\r\n super.set(\"it->en\", \"Chiamate e durata\", [\"Calls and duration\"]);\r\n super.set(\"it->en\", \"In corso\", [\"In progress\"]);\r\n super.set(\"it->en\", \"in corso\", [\"in progress\"]);\r\n super.set(\"it->en\", \"mediana\", [\"median\"]);\r\n super.set(\"it->en\", \"media nell'intervallo\", [\"interval mean\"]);\r\n\r\n // Tabella\r\n super.set(\"it->en\", \"Istanza\", [\"Instance\"]);\r\n super.set(\"it->en\", \"Istante\", [\"Time\"]);\r\n super.set(\"it->en\", \"Intervallo (s)\", [\"Interval (s)\"]);\r\n super.set(\"it->en\", \"Snapshot\", [\"Snapshot\"]);\r\n super.set(\"it->en\", \"Valore\", [\"Value\"]);\r\n super.set(\"it->en\", \"Conteggio\", [\"Count\"]);\r\n super.set(\"it->en\", \"Quota\", [\"Share\"]);\r\n super.set(\"it->en\", \"Mediana\", [\"Median\"]);\r\n super.set(\"it->en\", \"Massimo\", [\"Maximum\"]);\r\n super.set(\"it->en\", \"Chiamate\", [\"Calls\"]);\r\n super.set(\"it->en\", \"Durata media nell'intervallo\", [\"Mean duration in the interval\"]);\r\n super.set(\"it->en\", \"Esporta CSV\", [\"Export CSV\"]);\r\n super.set(\"it->en\", \"Mostrate le prime 300 righe di\", [\"Showing the first 300 rows of\"]);\r\n super.set(\"it->en\", \"l'esportazione le comprende tutte.\", [\"the export includes all of them.\"]);\r\n }\r\n}\r\n","// Angular\r\nimport { Component, ElementRef, EventEmitter, Input, NgZone, OnChanges, OnDestroy, OnInit, Output } from \"@angular/core\";\r\n\r\ndeclare var dayjs;\r\n\r\n// Un punto di una serie: gap = non unirlo al precedente (riavvio o buco nei campioni), v2 = estremo superiore di una fascia\r\nexport class Mv2Point {\r\n t: number;\r\n v: number;\r\n v2?: number;\r\n gap?: boolean;\r\n}\r\n\r\nexport class Mv2Series {\r\n key: string;\r\n label: string;\r\n color: string;\r\n kind: \"line\" | \"step\" | \"bars\" | \"dots\" | \"band\";\r\n points: Mv2Point[];\r\n dash?: string;\r\n opacity?: number;\r\n // false: la serie non compare nel riquadro dei valori del cursore (per esempio le fasce dei percentili)\r\n tooltip?: boolean;\r\n}\r\n\r\nexport class Mv2Mark {\r\n t: number;\r\n label: string;\r\n kind: \"restart\" | \"snapshot\";\r\n}\r\n\r\nclass Mv2Path { key: string; d: string; color: string; fill: boolean; dash: string; opacity: number; }\r\nclass Mv2Rect { key: string; x: number; y: number; w: number; h: number; color: string; }\r\nclass Mv2Dot { key: string; x: number; y: number; color: string; }\r\nclass Mv2Tick { key: string; pos: number; label: string; }\r\nclass Mv2MarkTick { key: string; pos: number; label: string; kind: string; }\r\nclass Mv2TipRow { color: string; label: string; value: string; }\r\n\r\nconst LEFT = 56;\r\nconst RIGHT = 10;\r\n// Spazio in alto per l'unità, che sta sopra la prima tacca\r\nconst TOP = 20;\r\nconst BOTTOM = 20;\r\nconst STEPS_MS = [60, 120, 300, 600, 900, 1800, 3600, 7200, 10800, 21600, 43200, 86400, 172800, 604800].map(t => t * 1000);\r\n\r\n// Grafico SVG delle metriche v2: lo stesso asse dei tempi per tutti i pannelli, cursore e zoom condivisi tramite la pagina.\r\n// Le serie arrivano già pronte (punti con le interruzioni segnate): qui solo geometria e interazione\r\n@Component({\r\n selector: \"mv2-chart\",\r\n template: `\r\n <div class=\"mv2c\" [style.height.px]=\"height\" (mousemove)=\"move($event)\" (mouseleave)=\"leave()\" (mousedown)=\"down($event)\" (mouseup)=\"up($event)\">\r\n <svg [attr.width]=\"width\" [attr.height]=\"height\" [attr.viewBox]=\"'0 0 ' + width + ' ' + height\">\r\n @for (tick of yTicks; track tick.key) {\r\n <line class=\"mv2c-grid\" [attr.x1]=\"left\" [attr.x2]=\"width - right\" [attr.y1]=\"tick.pos\" [attr.y2]=\"tick.pos\" />\r\n <text class=\"mv2c-ylabel\" [attr.x]=\"left - 6\" [attr.y]=\"tick.pos + 3\">{{tick.label}}</text>\r\n }\r\n @for (tick of xTicks; track tick.key) {\r\n <text class=\"mv2c-xlabel\" [attr.x]=\"tick.pos\" [attr.y]=\"height - 5\">{{tick.label}}</text>\r\n }\r\n @if (unit) {\r\n <text class=\"mv2c-unit\" [attr.x]=\"4\" [attr.y]=\"11\">{{unit}}</text>\r\n }\r\n @for (mark of markTicks; track mark.key) {\r\n <line class=\"mv2c-mark\" [class.mv2c-mark-restart]=\"mark.kind == 'restart'\" [class.mv2c-mark-snapshot]=\"mark.kind == 'snapshot'\" [attr.x1]=\"mark.pos\" [attr.x2]=\"mark.pos\" [attr.y1]=\"top\" [attr.y2]=\"height - bottom\" />\r\n <text class=\"mv2c-marklabel\" [attr.x]=\"mark.pos + 3\" [attr.y]=\"top + 9\">{{mark.label}}</text>\r\n }\r\n @for (p of paths; track p.key) {\r\n <path [attr.d]=\"p.d\" [attr.fill]=\"p.fill ? p.color : 'none'\" [attr.fill-opacity]=\"p.fill ? p.opacity : null\"\r\n [attr.stroke]=\"p.fill ? 'none' : p.color\" [attr.stroke-opacity]=\"p.fill ? null : p.opacity\" [attr.stroke-dasharray]=\"p.dash\" stroke-width=\"1.6\" stroke-linejoin=\"round\" />\r\n }\r\n @for (r of rects; track r.key) {\r\n <rect [attr.x]=\"r.x\" [attr.y]=\"r.y\" [attr.width]=\"r.w\" [attr.height]=\"r.h\" [attr.fill]=\"r.color\" fill-opacity=\"0.75\" />\r\n }\r\n @for (d of dots; track d.key) {\r\n <circle [attr.cx]=\"d.x\" [attr.cy]=\"d.y\" r=\"2\" [attr.fill]=\"d.color\" />\r\n }\r\n <line class=\"mv2c-axis\" [attr.x1]=\"left\" [attr.x2]=\"width - right\" [attr.y1]=\"height - bottom\" [attr.y2]=\"height - bottom\" />\r\n @if (cursorX != null) {\r\n <line class=\"mv2c-cursor\" [attr.x1]=\"cursorX\" [attr.x2]=\"cursorX\" [attr.y1]=\"top\" [attr.y2]=\"height - bottom\" />\r\n }\r\n @if (dragFrom != null && dragTo != null) {\r\n <rect class=\"mv2c-drag\" [attr.x]=\"min(dragFrom, dragTo)\" [attr.y]=\"top\" [attr.width]=\"abs(dragTo - dragFrom)\" [attr.height]=\"height - top - bottom\" />\r\n }\r\n </svg>\r\n @if (cursorX != null && tipRows.length > 0 && hovered) {\r\n <div class=\"mv2c-tip\" [style.left.px]=\"cursorX > width / 2 ? null : cursorX + 10\" [style.right.px]=\"cursorX > width / 2 ? width - cursorX + 10 : null\">\r\n <div class=\"mv2c-tip-time\">{{tipTime}}</div>\r\n @for (row of tipRows; track $index) {\r\n <div class=\"mv2c-tip-row\"><span class=\"mv2c-tip-dot\" [style.background]=\"row.color\"></span>{{row.label}} <strong>{{row.value}}</strong></div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n :host { display: block; position: relative; user-select: none; }\r\n .mv2c { position: relative; cursor: crosshair; }\r\n svg { display: block; overflow: visible; }\r\n .mv2c-grid { stroke: var(--p-content-border-color, #e2e8f0); stroke-dasharray: 2 3; }\r\n .mv2c-axis { stroke: var(--p-content-border-color, #cbd5e1); }\r\n .mv2c-ylabel { fill: var(--p-text-muted-color, #64748b); font-size: 10px; text-anchor: end; }\r\n .mv2c-xlabel { fill: var(--p-text-muted-color, #64748b); font-size: 10px; text-anchor: middle; }\r\n .mv2c-unit { fill: var(--p-text-muted-color, #64748b); font-size: 10px; }\r\n .mv2c-mark { stroke-width: 1; }\r\n .mv2c-mark-restart { stroke: #f59e0b; stroke-dasharray: 4 3; }\r\n .mv2c-mark-snapshot { stroke: var(--p-content-border-color, #e2e8f0); }\r\n .mv2c-marklabel { fill: var(--p-text-muted-color, #64748b); font-size: 9px; }\r\n .mv2c-cursor { stroke: var(--p-text-muted-color, #64748b); stroke-width: 1; }\r\n .mv2c-drag { fill: var(--p-primary-color, #6366f1); fill-opacity: .12; }\r\n .mv2c-tip { position: absolute; top: 4px; z-index: 3; min-width: 140px; max-width: 320px; padding: 6px 8px; border: 1px solid var(--p-content-border-color, #e2e8f0);\r\n border-radius: 6px; background: var(--p-content-background, #fff); box-shadow: 0 4px 14px rgba(15, 23, 42, .12); font-size: 11px; pointer-events: none; }\r\n .mv2c-tip-time { margin-bottom: 3px; color: var(--p-text-muted-color, #64748b); }\r\n .mv2c-tip-row { display: flex; align-items: center; gap: 5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\r\n .mv2c-tip-row strong { margin-left: auto; padding-left: 8px; }\r\n .mv2c-tip-dot { flex: none; width: 8px; height: 8px; border-radius: 50%; }\r\n `],\r\n standalone: false\r\n})\r\nexport class MetricsV2ChartComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() series: Mv2Series[] = [];\r\n @Input() from: number;\r\n @Input() to: number;\r\n @Input() height: number = 170;\r\n @Input() unit: string;\r\n @Input() marks: Mv2Mark[] = [];\r\n @Input() cursor: number = null;\r\n @Input() format: (value: number) => string = t => String(t);\r\n\r\n @Output() cursorChange = new EventEmitter<number>();\r\n @Output() zoom = new EventEmitter<{ from: number, to: number }>();\r\n\r\n public width: number = 600;\r\n public readonly left = LEFT;\r\n public readonly right = RIGHT;\r\n public readonly top = TOP;\r\n public readonly bottom = BOTTOM;\r\n\r\n public paths: Mv2Path[] = [];\r\n public rects: Mv2Rect[] = [];\r\n public dots: Mv2Dot[] = [];\r\n public yTicks: Mv2Tick[] = [];\r\n public xTicks: Mv2Tick[] = [];\r\n public markTicks: Mv2MarkTick[] = [];\r\n // Il riquadro dei valori compare solo sul grafico sotto il mouse, la linea del cursore su tutti\r\n public hovered: boolean = false;\r\n public cursorX: number = null;\r\n public tipTime: string = \"\";\r\n public tipRows: Mv2TipRow[] = [];\r\n public dragFrom: number = null;\r\n public dragTo: number = null;\r\n\r\n private yMin = 0;\r\n private yMax = 1;\r\n private observer: ResizeObserver;\r\n\r\n constructor(private host: ElementRef<HTMLElement>, private zone: NgZone) { }\r\n\r\n ngOnInit() {\r\n this.observer = new ResizeObserver(entries => {\r\n let width = Math.floor(entries[0]?.contentRect?.width ?? 0);\r\n if (width > 0 && width != this.width)\r\n this.zone.run(() => {\r\n this.width = width;\r\n this.layout();\r\n });\r\n });\r\n this.observer.observe(this.host.nativeElement);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.observer?.disconnect();\r\n }\r\n\r\n ngOnChanges(changes: any) {\r\n if (changes.series || changes.from || changes.to || changes.height || changes.marks)\r\n this.layout();\r\n else if (changes.cursor)\r\n this.updateCursor();\r\n }\r\n\r\n min(a: number, b: number) { return Math.min(a, b); }\r\n abs(a: number) { return Math.abs(a); }\r\n\r\n // #region Geometria\r\n\r\n private get plotWidth(): number {\r\n return Math.max(10, this.width - LEFT - RIGHT);\r\n }\r\n\r\n private x(t: number): number {\r\n return LEFT + (t - this.from) / Math.max(1, this.to - this.from) * this.plotWidth;\r\n }\r\n\r\n private y(v: number): number {\r\n return TOP + (1 - (v - this.yMin) / Math.max(1e-12, this.yMax - this.yMin)) * (this.height - TOP - BOTTOM);\r\n }\r\n\r\n private timeAt(x: number): number {\r\n return this.from + (x - LEFT) / this.plotWidth * (this.to - this.from);\r\n }\r\n\r\n private layout() {\r\n if (this.from == null || this.to == null)\r\n return;\r\n\r\n // Scala verticale sui punti visibili, con lo zero se i valori sono positivi\r\n let values: number[] = [];\r\n for (let s of this.series ?? [])\r\n for (let p of s.points)\r\n if (p.t >= this.from && p.t <= this.to) {\r\n values.push(p.v);\r\n if (p.v2 != null)\r\n values.push(p.v2);\r\n }\r\n let lo = values.length ? Math.min(0, ...values) : 0;\r\n let hi = values.length ? Math.max(...values) : 1;\r\n if (hi <= lo)\r\n hi = lo + 1;\r\n let step = this.niceStep((hi - lo) / 4);\r\n this.yMin = Math.floor(lo / step) * step;\r\n this.yMax = Math.ceil(hi / step) * step;\r\n this.yTicks = [];\r\n for (let v = this.yMin; v <= this.yMax + step / 2; v += step)\r\n this.yTicks.push({ key: String(v), pos: this.y(v), label: this.format(Math.abs(v) < step / 1e6 ? 0 : v) });\r\n\r\n // Asse dei tempi: tacche a passi tondi, al massimo una ogni 90 pixel circa\r\n let span = this.to - this.from;\r\n let stepMs = STEPS_MS.find(t => span / t <= this.plotWidth / 90) ?? STEPS_MS[STEPS_MS.length - 1];\r\n let longRange = span > 36 * 3600 * 1000;\r\n let offset = new Date().getTimezoneOffset() * 60000;\r\n this.xTicks = [];\r\n for (let t = Math.ceil((this.from - offset) / stepMs) * stepMs + offset; t <= this.to; t += stepMs)\r\n this.xTicks.push({ key: String(t), pos: this.x(t), label: dayjs(t).format(longRange || stepMs >= 86400000 ? \"DD/MM HH:mm\" : \"HH:mm\") });\r\n\r\n // Segni: riavvii sempre, id degli snapshot solo se c'è spazio (altrimenti uno ogni tanto)\r\n let visible = (this.marks ?? []).filter(t => t.t >= this.from && t.t <= this.to);\r\n let snaps = visible.filter(t => t.kind == \"snapshot\");\r\n let every = Math.max(1, Math.ceil(snaps.length / Math.max(1, this.plotWidth / 45)));\r\n this.markTicks = visible.filter(t => t.kind == \"restart\" || snaps.indexOf(t) % every == 0)\r\n .map((t, i) => ({ key: `${t.kind}${t.t}${i}`, pos: this.x(t.t), label: t.label, kind: t.kind }));\r\n\r\n let paths: Mv2Path[] = [];\r\n let rects: Mv2Rect[] = [];\r\n let dots: Mv2Dot[] = [];\r\n let bars = (this.series ?? []).filter(t => t.kind == \"bars\");\r\n for (let s of this.series ?? []) {\r\n let points = s.points.filter(p => p.t >= this.from && p.t <= this.to);\r\n if (points.length == 0)\r\n continue;\r\n switch (s.kind) {\r\n case \"line\":\r\n case \"step\":\r\n paths.push({ key: s.key, d: this.linePath(points, s.kind == \"step\"), color: s.color, fill: false, dash: s.dash ?? null, opacity: s.opacity ?? 1 });\r\n // Un punto senza vicini (per esempio la durata di un timer con poche chiamate) come linea non si vedrebbe: diventa un pallino\r\n if ((s.opacity ?? 1) > 0)\r\n points.forEach((p, i) => {\r\n if ((i == 0 || p.gap) && (i == points.length - 1 || points[i + 1].gap))\r\n dots.push({ key: `${s.key}~${i}`, x: this.x(p.t), y: this.y(p.v), color: s.color });\r\n });\r\n break;\r\n case \"band\":\r\n paths.push({ key: s.key, d: this.bandPath(points), color: s.color, fill: true, dash: null, opacity: s.opacity ?? 0.2 });\r\n break;\r\n case \"dots\":\r\n points.forEach((p, i) => dots.push({ key: `${s.key}${i}`, x: this.x(p.t), y: this.y(p.v), color: s.color }));\r\n break;\r\n case \"bars\":\r\n let slot = this.plotWidth / Math.max(1, points.length) * 0.8;\r\n let w = Math.max(1, slot / bars.length);\r\n let index = bars.indexOf(s);\r\n let zero = this.y(Math.max(this.yMin, 0));\r\n points.forEach((p, i) => {\r\n let y = this.y(p.v);\r\n rects.push({ key: `${s.key}${i}`, x: this.x(p.t) - slot / 2 + index * w, y: Math.min(y, zero), w: w, h: Math.max(1, Math.abs(zero - y)), color: s.color });\r\n });\r\n break;\r\n }\r\n }\r\n this.paths = paths;\r\n this.rects = rects;\r\n this.dots = dots;\r\n this.updateCursor();\r\n }\r\n\r\n // Le linee si spezzano dove il punto ha gap: niente linea fra due campioni separati da un riavvio o da un buco\r\n private linePath(points: Mv2Point[], step: boolean): string {\r\n let d = \"\";\r\n points.forEach((p, i) => {\r\n let x = this.x(p.t).toFixed(1);\r\n let y = this.y(p.v).toFixed(1);\r\n if (i == 0 || p.gap)\r\n d += `M${x},${y}`;\r\n else if (step)\r\n d += `H${x}V${y}`;\r\n else\r\n d += `L${x},${y}`;\r\n });\r\n return d;\r\n }\r\n\r\n // Fascia fra v e v2, un poligono per ogni tratto senza interruzioni\r\n private bandPath(points: Mv2Point[]): string {\r\n let segments: Mv2Point[][] = [];\r\n for (let p of points) {\r\n if (p.v2 == null)\r\n continue;\r\n if (segments.length == 0 || p.gap)\r\n segments.push([]);\r\n segments[segments.length - 1].push(p);\r\n }\r\n return segments.filter(t => t.length > 0).map(seg => {\r\n let upper = seg.map((p, i) => `${i ? \"L\" : \"M\"}${this.x(p.t).toFixed(1)},${this.y(p.v2).toFixed(1)}`).join(\"\");\r\n let lower = [...seg].reverse().map(p => `L${this.x(p.t).toFixed(1)},${this.y(p.v).toFixed(1)}`).join(\"\");\r\n return upper + lower + \"Z\";\r\n }).join(\"\");\r\n }\r\n\r\n private niceStep(raw: number): number {\r\n if (!(raw > 0))\r\n return 1;\r\n let power = Math.pow(10, Math.floor(Math.log10(raw)));\r\n return [1, 2, 2.5, 5, 10].find(t => raw / power <= t + 1e-9) * power;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Cursore e zoom\r\n\r\n private updateCursor() {\r\n if (this.cursor == null || this.cursor < this.from || this.cursor > this.to) {\r\n this.cursorX = null;\r\n this.tipRows = [];\r\n return;\r\n }\r\n this.cursorX = this.x(this.cursor);\r\n this.tipTime = dayjs(this.cursor).format(\"DD/MM HH:mm:ss\");\r\n let rows: Mv2TipRow[] = [];\r\n for (let s of this.series ?? []) {\r\n if (s.tooltip === false || s.points.length == 0)\r\n continue;\r\n let nearest = this.nearest(s.points, this.cursor);\r\n if (nearest)\r\n rows.push({ color: s.color, label: s.label, value: this.format(nearest.v) });\r\n }\r\n this.tipRows = rows;\r\n }\r\n\r\n // Il campione più vicino, se non è più lontano di un intervallo tipico della serie\r\n private nearest(points: Mv2Point[], t: number): Mv2Point {\r\n let best: Mv2Point = null;\r\n for (let p of points)\r\n if (!best || Math.abs(p.t - t) < Math.abs(best.t - t))\r\n best = p;\r\n let typical = points.length > 1 ? (points[points.length - 1].t - points[0].t) / (points.length - 1) : Infinity;\r\n return best && Math.abs(best.t - t) <= Math.max(typical, 1000) ? best : null;\r\n }\r\n\r\n private plotX(event: MouseEvent): number {\r\n let rect = this.host.nativeElement.getBoundingClientRect();\r\n return Math.min(this.width - RIGHT, Math.max(LEFT, event.clientX - rect.left));\r\n }\r\n\r\n move(event: MouseEvent) {\r\n let x = this.plotX(event);\r\n this.hovered = true;\r\n if (this.dragFrom != null)\r\n this.dragTo = x;\r\n this.cursorChange.emit(this.timeAt(x));\r\n }\r\n\r\n leave() {\r\n this.hovered = false;\r\n this.dragFrom = null;\r\n this.dragTo = null;\r\n this.cursorChange.emit(null);\r\n }\r\n\r\n // Trascinando sull'area si sceglie la finestra dello zoom, per tutti i pannelli\r\n down(event: MouseEvent) {\r\n if (event.button != 0)\r\n return;\r\n event.preventDefault();\r\n this.dragFrom = this.plotX(event);\r\n this.dragTo = null;\r\n }\r\n\r\n up(event: MouseEvent) {\r\n let from = this.dragFrom;\r\n let to = this.plotX(event);\r\n this.dragFrom = null;\r\n this.dragTo = null;\r\n if (from != null && Math.abs(to - from) > 6)\r\n this.zoom.emit({ from: this.timeAt(Math.min(from, to)), to: this.timeAt(Math.max(from, to)) });\r\n }\r\n\r\n // #endregion\r\n}\r\n","// Angular\r\nimport { formatNumber } from \"@angular/common\";\r\nimport { Component } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { DateService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { firstValueFrom } from \"rxjs\";\r\n\r\n// Modelli\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { MetricsV2Info, MetricsV2Request, MetricsV2Sample, MetricV2Type } from \"../../models/components/MetricsV2\";\r\nimport { WorkloadSnapshot, WorkloadSnapshotsRequest } from \"../../models/components/WorkloadReportV2\";\r\nimport { Mv2Mark, Mv2Point, Mv2Series } from \"./metrics_v2_chart.component\";\r\n\r\n// Applicazione\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\n\r\n// Localizzazione\r\nimport { AdmMetricsV2Loc } from \"./metrics_v2.component.loc\";\r\n\r\ndeclare var dayjs;\r\n\r\nconst STORAGE_KEY = \"HotSearchMetricsV2\";\r\nconst MAX_METRICS = 12;\r\n// Ogni istanza campiona ogni 15 secondi: più spesso i campioni non cambiano (M19)\r\nconst REFRESH_MS = 15000;\r\nconst SELECTION_DELAY_MS = 350;\r\nconst DATES_DELAY_MS = 600;\r\nconst TABLE_ROWS = 300;\r\nconst INSTANCE_COLORS = [\"#1e88e5\", \"#e53935\", \"#43a047\", \"#fb8c00\", \"#8e24aa\", \"#00897b\", \"#6d4c41\", \"#3949ab\", \"#c0ca33\", \"#d81b60\"];\r\nconst ITEM_COLORS = [\"#3949ab\", \"#00897b\", \"#f4511e\", \"#8e24aa\", \"#7cb342\", \"#fdd835\", \"#6d4c41\", \"#039be5\", \"#d81b60\", \"#546e7a\"];\r\n// \"Active threads time\" è un meter in microsecondi di thread attivi: il suo rate al secondo diviso un milione è il numero medio di thread attivi\r\nconst ACTIVE_THREADS_TIME = \"Active threads time\";\r\nconst CPU_USAGE = \"CPU Usage\";\r\n\r\ntype Source = \"live\" | \"period\" | \"snap\";\r\n\r\n// flatMap non c'è nel lib di compilazione della libreria\r\nconst flatten = <T, U>(list: T[], map: (t: T) => U[]): U[] => list.reduce((all, t) => all.concat(map(t)), [] as U[]);\r\n\r\nconst PRESETS: [string, string[]][] = [\r\n [\"Processo\", [\"CPU Usage\", \"Working set\", \"Private memory\", \"Thread Pool Queue Length\"]],\r\n [\"API\", [\"API Call\", \"Requests\", \"400 Errors\", \"500 Errors\"]],\r\n [\"Code asincrone\", null],\r\n [\"Attività\", [\"Active sessions\", \"Active threads\", ACTIVE_THREADS_TIME]]\r\n];\r\n\r\nexport class Mv2CatalogEntry {\r\n info: MetricsV2Info;\r\n // Voci del totale (\"{totale} - {elemento}\")\r\n items: MetricsV2Info[];\r\n open: boolean;\r\n}\r\n\r\nexport class Mv2CatalogGroup {\r\n type: MetricV2Type;\r\n label: string;\r\n entries: Mv2CatalogEntry[];\r\n count: number;\r\n}\r\n\r\nexport class Mv2Chart {\r\n key: string;\r\n series: Mv2Series[];\r\n unit: string;\r\n height: number;\r\n}\r\n\r\nexport class Mv2Panel {\r\n info: MetricsV2Info;\r\n alts: KeyValue[];\r\n alt: string;\r\n charts: Mv2Chart[];\r\n empty: boolean;\r\n}\r\n\r\nexport class Mv2TileRow {\r\n instance: string;\r\n color: string;\r\n value: string;\r\n extra: string;\r\n}\r\n\r\nexport class Mv2Tile {\r\n info: MetricsV2Info;\r\n rows: Mv2TileRow[];\r\n sparks: { d: string, color: string }[];\r\n time: string;\r\n}\r\n\r\nexport class Mv2Column {\r\n key: string;\r\n label: string;\r\n num: boolean;\r\n}\r\n\r\nexport class Mv2TableSection {\r\n info: MetricsV2Info;\r\n columns: Mv2Column[];\r\n rows: { [key: string]: any }[];\r\n total: number;\r\n sortKey: string;\r\n sortDesc: boolean;\r\n}\r\n\r\n// Ricordate fra una visita e l'altra (M11)\r\nclass MetricsV2Settings {\r\n selected: string[];\r\n source: Source;\r\n instances: string[];\r\n liveMinutes: string;\r\n view: string;\r\n}\r\n\r\n@Component({\r\n selector: \"metrics_v2\",\r\n providers: [{ provide: LocalizationService, useClass: AdmMetricsV2Loc }],\r\n templateUrl: \"./metrics_v2.component.html\",\r\n styleUrls: [\"./metrics_v2.component.scss\"],\r\n standalone: false\r\n})\r\nexport class AdmMetricsV2Component {\r\n public readonly Max = MAX_METRICS;\r\n public readonly Type = MetricV2Type;\r\n\r\n // Comandi\r\n public source: Source = \"live\";\r\n public liveMinutes: string = \"30\";\r\n public filterfrom: string = \"\";\r\n public filterto: string = \"\";\r\n public snapFromId: string = \"\";\r\n public snapToId: string = \"\";\r\n // Vuoto = tutto il cluster\r\n public instances: string[] = [];\r\n public view: string = \"charts\";\r\n public paused: boolean = false;\r\n public lastUpdate: Date;\r\n\r\n // Catalogo e selezione\r\n public catalog: MetricsV2Info[] = [];\r\n public groups: Mv2CatalogGroup[] = [];\r\n public search: string = \"\";\r\n public selected: string[] = [];\r\n public catalogLoading: boolean = false;\r\n public catalogError: string;\r\n\r\n // Snapshot\r\n public snapshots: WorkloadSnapshot[] = [];\r\n public historyAvailable: boolean = true;\r\n public snapshotsLoaded: boolean = false;\r\n public SnapshotOptions: KeyValue[] = [];\r\n public warnings: string[] = [];\r\n\r\n // Dati\r\n public dataLoading: boolean = false;\r\n public dataError: string;\r\n public panels: Mv2Panel[] = [];\r\n public tiles: Mv2Tile[] = [];\r\n public tables: Mv2TableSection[] = [];\r\n public marks: Mv2Mark[] = [];\r\n public legend: { instance: string, color: string, hidden: boolean }[] = [];\r\n public domainFrom: number;\r\n public domainTo: number;\r\n public viewFrom: number = null;\r\n public viewTo: number = null;\r\n public cursor: number = null;\r\n\r\n public Sources: KeyValue[] = [];\r\n public LiveWindows: KeyValue[] = [];\r\n public Views: KeyValue[] = [];\r\n public Instances: KeyValue[] = [];\r\n public readonly Presets = PRESETS.map(t => t[0]);\r\n\r\n private be: string;\r\n private data: Map<string, Map<string, MetricsV2Sample[]>> = new Map();\r\n private seen: Set<string> = new Set();\r\n private hidden: Set<string> = new Set();\r\n private alts: { [name: string]: string } = {};\r\n private dataGeneration: number = 0;\r\n private catalogGeneration: number = 0;\r\n private refreshTimer: any;\r\n private selectionTimer: any;\r\n private datesTimer: any;\r\n private readonly visibilityHandler = () => this.visibilityChanged();\r\n public readonly format = (value: number) => this.number(value);\r\n\r\n constructor(\r\n public dateExts: DateService,\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.Sources = [new KeyValue(\"live\", \"Live\"), new KeyValue(\"period\", this.lc.loc(\"Storico per periodo\")), new KeyValue(\"snap\", this.lc.loc(\"Storico per snapshot\"))];\r\n this.LiveWindows = [new KeyValue(\"15\", \"15 min\"), new KeyValue(\"30\", \"30 min\"), new KeyValue(\"60\", this.lc.loc(\"1 ora\"))];\r\n this.Views = [new KeyValue(\"charts\", this.lc.loc(\"Grafici\")), new KeyValue(\"table\", this.lc.loc(\"Tabella\"))];\r\n\r\n let saved = this.route.snapshot.queryParams[\"ignoreStorage\"] ? null : await firstValueFrom(this.localStorage.getItem<MetricsV2Settings>(STORAGE_KEY), { defaultValue: null });\r\n if (saved) {\r\n this.selected = (saved.selected ?? []).slice(0, MAX_METRICS);\r\n this.source = saved.source ?? this.source;\r\n this.instances = saved.instances ?? this.instances;\r\n this.liveMinutes = saved.liveMinutes ?? this.liveMinutes;\r\n this.view = saved.view ?? this.view;\r\n }\r\n this.setLastDay();\r\n\r\n this.adms.getInstances(this.be).then(t => {\r\n this.Instances = t ?? [];\r\n this.rebuild();\r\n });\r\n this.loadSnapshots();\r\n await this.loadCatalog();\r\n this.loadData();\r\n\r\n this.refreshTimer = setInterval(() => this.refresh(), REFRESH_MS);\r\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\r\n }\r\n\r\n ngOnDestroy() {\r\n clearInterval(this.refreshTimer);\r\n clearTimeout(this.selectionTimer);\r\n clearTimeout(this.datesTimer);\r\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\r\n }\r\n\r\n // #region Comandi\r\n\r\n get clusterLabel(): string {\r\n return this.Instances.length ? `${this.lc.loc(\"Tutto il cluster\")} (${this.Instances.length} ${this.Instances.length == 1 ? this.lc.loc(\"istanza\") : this.lc.loc(\"istanze\")})` : this.lc.loc(\"Tutto il cluster\");\r\n }\r\n\r\n get zone(): string {\r\n return `UTC${dayjs().format(\"Z\")}`;\r\n }\r\n\r\n setSource(id: string) {\r\n if (id != \"live\" && !this.historyAvailable)\r\n return;\r\n this.source = id as Source;\r\n if (this.source == \"snap\")\r\n this.defaultSnapshots();\r\n this.updateWarnings();\r\n this.saveSettings();\r\n this.loadData();\r\n }\r\n\r\n setLiveMinutes(id: string) {\r\n this.liveMinutes = id;\r\n this.saveSettings();\r\n this.loadData();\r\n }\r\n\r\n datesChanged() {\r\n clearTimeout(this.datesTimer);\r\n this.datesTimer = setTimeout(() => {\r\n if (this.toDate(this.filterfrom) && this.toDate(this.filterto))\r\n this.loadData();\r\n }, DATES_DELAY_MS);\r\n }\r\n\r\n snapshotsChanged() {\r\n this.updateWarnings();\r\n this.loadData();\r\n }\r\n\r\n // Cambiando istanze si ricaricano catalogo, snapshot e dati; le metriche che il catalogo non ha più si tolgono\r\n async instancesChanged(ids: string[]) {\r\n this.instances = ids ?? [];\r\n this.saveSettings();\r\n this.loadSnapshots();\r\n await this.loadCatalog();\r\n this.loadData();\r\n }\r\n\r\n setView(id: string) {\r\n this.view = id;\r\n this.saveSettings();\r\n }\r\n\r\n togglePause() {\r\n this.paused = !this.paused;\r\n if (!this.paused)\r\n this.refresh();\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Catalogo e selezione\r\n\r\n private async loadCatalog() {\r\n let generation = ++this.catalogGeneration;\r\n this.catalogLoading = true;\r\n this.catalogError = null;\r\n try {\r\n let req = this.instances.length ? { instanceIds: this.instances } : { global: true };\r\n let res = await this.adms.getMetricsCatalogV2(this.be, req);\r\n if (generation != this.catalogGeneration)\r\n return;\r\n this.catalog = res ?? [];\r\n let names = new Set(this.catalog.map(t => t.name));\r\n let kept = this.selected.filter(t => names.has(t));\r\n if (kept.length != this.selected.length) {\r\n this.selected = kept;\r\n this.saveSettings();\r\n }\r\n this.buildGroups();\r\n }\r\n catch (err) {\r\n if (generation == this.catalogGeneration)\r\n this.catalogError = this.errorMessage(err);\r\n }\r\n finally {\r\n if (generation == this.catalogGeneration)\r\n this.catalogLoading = false;\r\n }\r\n }\r\n\r\n // Gruppi per tipo; le voci di un totale stanno sotto il totale, chiuse (M10)\r\n buildGroups() {\r\n let text = (this.search ?? \"\").trim().toLowerCase();\r\n let matches = (info: MetricsV2Info) => !text || info.name.toLowerCase().includes(text);\r\n let parentOf = (info: MetricsV2Info) => this.catalog.filter(t => t != info && info.name.startsWith(t.name + \" - \")).sort((a, b) => b.name.length - a.name.length)[0];\r\n let opened = new Set(flatten(this.groups, g => g.entries.filter(e => e.open).map(e => e.info.name)));\r\n\r\n let types = [MetricV2Type.Gauge, MetricV2Type.Counter, MetricV2Type.Meter, MetricV2Type.Histogram, MetricV2Type.Timer];\r\n this.groups = types.map(type => {\r\n let infos = this.catalog.filter(t => t.metricType == type);\r\n let entries = infos.filter(t => !parentOf(t)).map(info => {\r\n let items = infos.filter(t => parentOf(t) == info);\r\n return { info: info, items: items.filter(t => matches(t) || matches(info)), open: opened.has(info.name) || (!!text && items.some(matches)) };\r\n }).filter(t => matches(t.info) || t.items.length > 0);\r\n return { type: type, label: MetricV2Type[type], entries: entries, count: infos.length };\r\n }).filter(t => t.entries.length > 0);\r\n }\r\n\r\n isSelected(name: string): boolean {\r\n return this.selected.includes(name);\r\n }\r\n\r\n canSelect(name: string): boolean {\r\n return this.isSelected(name) || this.selected.length < MAX_METRICS;\r\n }\r\n\r\n toggleMetric(name: string) {\r\n if (this.isSelected(name))\r\n this.selected = this.selected.filter(t => t != name);\r\n else if (this.selected.length < MAX_METRICS)\r\n this.selected = [...this.selected, name];\r\n this.selectionChanged();\r\n }\r\n\r\n addItems(entry: Mv2CatalogEntry) {\r\n let missing = [entry.info, ...entry.items].map(t => t.name).filter(t => !this.isSelected(t));\r\n this.selected = [...this.selected, ...missing].slice(0, MAX_METRICS);\r\n entry.open = true;\r\n this.selectionChanged();\r\n }\r\n\r\n clearSelection() {\r\n this.selected = [];\r\n this.selectionChanged();\r\n }\r\n\r\n // Insiemi pronti (M9): le metriche che il catalogo non ha si ignorano\r\n applyPreset(name: string) {\r\n let preset = PRESETS.find(t => t[0] == name);\r\n let names = preset[1] ?? this.catalog.filter(t => t.name.startsWith(\"AQ - \") && !this.catalog.some(k => k != t && t.name.startsWith(k.name + \" - \"))).map(t => t.name);\r\n let available = new Set(this.catalog.map(t => t.name));\r\n this.selected = names.filter(t => available.has(t)).slice(0, MAX_METRICS);\r\n this.selectionChanged();\r\n }\r\n\r\n removeMetric(name: string) {\r\n this.selected = this.selected.filter(t => t != name);\r\n this.selectionChanged();\r\n }\r\n\r\n // Più clic di seguito diventano una sola richiesta\r\n private selectionChanged() {\r\n this.saveSettings();\r\n clearTimeout(this.selectionTimer);\r\n this.selectionTimer = setTimeout(() => this.loadData(), SELECTION_DELAY_MS);\r\n }\r\n\r\n catalogUnit(info: MetricsV2Info): string {\r\n if (info.name == CPU_USAGE)\r\n return \"CPU\";\r\n let unit = info.unit || \"\";\r\n if (info.metricType == MetricV2Type.Timer && info.durationUnit)\r\n return [unit, this.durationLabel(info.durationUnit)].filter(t => t).join(\" · \");\r\n return unit;\r\n }\r\n\r\n addItemsLabel(entry: Mv2CatalogEntry): string {\r\n return this.lc.loc(\"Aggiungi le {N} voci\").replace(\"{N}\", String(entry.items.length));\r\n }\r\n\r\n emptyLabel(name: string): string {\r\n return this.lc.loc(\"Nessun campione di {metrica} nella finestra scelta\").replace(\"{metrica}\", name);\r\n }\r\n\r\n // \"2 di 3\" se la metrica non c'è su tutte le istanze\r\n instancesLabel(info: MetricsV2Info): string {\r\n let total = this.instances.length || this.Instances.length;\r\n return total && info.instances?.length < total ? `${info.instances.length} ${this.lc.loc(\"di\")} ${total}` : \"\";\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Snapshot\r\n\r\n private async loadSnapshots() {\r\n try {\r\n let req = new WorkloadSnapshotsRequest();\r\n req.from = new Date(Date.now() - 7 * 24 * 3600 * 1000).toISOString();\r\n if (this.instances.length)\r\n req.instanceIds = this.instances;\r\n let res = await this.adms.getWorkloadSnapshots(this.be, req);\r\n this.historyAvailable = res?.historyAvailable ?? false;\r\n this.snapshots = res?.snapshots ?? [];\r\n }\r\n catch {\r\n // Senza elenco degli snapshot resta il live: le sorgenti storiche restano disponibili per periodo\r\n this.snapshots = [];\r\n }\r\n this.snapshotsLoaded = true;\r\n this.SnapshotOptions = this.snapshots.map(t => new KeyValue(String(t.snapId), `${t.snapId} · ${this.local(t.endIntervalTime)}${t.restart ? \" ⟲\" : \"\"}${t.manual ? \" ✋\" : \"\"}`));\r\n if (!this.historyAvailable && this.source != \"live\") {\r\n this.source = \"live\";\r\n this.loadData();\r\n }\r\n let ids = new Set(this.snapshots.map(t => String(t.snapId)));\r\n if (!ids.has(this.snapFromId) || !ids.has(this.snapToId))\r\n this.defaultSnapshots();\r\n this.updateWarnings();\r\n }\r\n\r\n // Di default le ultime 12 ore di snapshot\r\n private defaultSnapshots() {\r\n if (this.snapshots.length == 0 || (this.snapFromId && this.snapToId && this.snapshots.some(t => String(t.snapId) == this.snapFromId)))\r\n return;\r\n this.snapToId = String(this.snapshots[0].snapId);\r\n this.snapFromId = String(this.snapshots[Math.min(11, this.snapshots.length - 1)].snapId);\r\n }\r\n\r\n get snapshotWindow(): { from: Date, to: Date } {\r\n let ids = [+this.snapFromId, +this.snapToId];\r\n let first = this.snapshots.find(t => t.snapId == Math.min(...ids));\r\n let last = this.snapshots.find(t => t.snapId == Math.max(...ids));\r\n return first && last ? { from: this.parseUtc(first.beginIntervalTime), to: this.parseUtc(last.endIntervalTime) } : null;\r\n }\r\n\r\n // M4: un riavvio fra i due snapshot interrompe le serie\r\n private updateWarnings() {\r\n let warnings: string[] = [];\r\n if (this.source == \"snap\" && this.snapFromId && this.snapToId) {\r\n let lo = Math.min(+this.snapFromId, +this.snapToId);\r\n let hi = Math.max(+this.snapFromId, +this.snapToId);\r\n this.snapshots.forEach((s, i) => {\r\n if (s.restart && s.snapId > lo && s.snapId <= hi) {\r\n let previous = this.snapshots[i + 1];\r\n let restarted = (s.instances ?? []).filter(t => {\r\n let before = previous?.instances?.find(k => k.instanceId == t.instanceId);\r\n return before ? before.startupTime != t.startupTime : true;\r\n }).map(t => t.instanceId);\r\n for (let instance of restarted)\r\n warnings.push(this.lc.loc(\"Lo snapshot {id} segue un riavvio di {istanza}: lì le serie si interrompono.\").replace(\"{id}\", String(s.snapId)).replace(\"{istanza}\", instance));\r\n }\r\n });\r\n }\r\n this.warnings = warnings;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Dati\r\n\r\n private request(): MetricsV2Request {\r\n let req = new MetricsV2Request();\r\n req.metricNames = [...this.selected];\r\n // Mai global=false senza istanze (M6)\r\n if (this.instances.length)\r\n req.instanceIds = [...this.instances];\r\n else\r\n req.global = true;\r\n\r\n if (this.source == \"live\") {\r\n req.realTime = true;\r\n req.snapFrom = new Date(Date.now() - +this.liveMinutes * 60000).toISOString();\r\n }\r\n else if (this.source == \"period\") {\r\n req.realTime = false;\r\n req.snapFrom = this.toDate(this.filterfrom)?.toISOString();\r\n req.snapTo = this.toDate(this.filterto)?.toISOString();\r\n }\r\n else {\r\n req.realTime = false;\r\n req.snapIdFrom = Math.min(+this.snapFromId, +this.snapToId);\r\n req.snapIdTo = Math.max(+this.snapFromId, +this.snapToId);\r\n }\r\n return req;\r\n }\r\n\r\n // Caricamento completo della finestra scelta; senza metriche scelte non parte nessuna chiamata (M8)\r\n async loadData() {\r\n let generation = ++this.dataGeneration;\r\n clearTimeout(this.selectionTimer);\r\n this.viewFrom = null;\r\n this.viewTo = null;\r\n this.dataError = null;\r\n\r\n if (this.selected.length == 0 || (this.source == \"snap\" && (!this.snapFromId || !this.snapToId))) {\r\n this.data = new Map();\r\n this.seen = new Set();\r\n this.rebuild();\r\n return;\r\n }\r\n\r\n let req = this.request();\r\n this.setDomain(req);\r\n this.dataLoading = true;\r\n try {\r\n let res = await this.adms.getMetricsV2(this.be, req);\r\n if (generation != this.dataGeneration)\r\n return;\r\n this.data = new Map();\r\n this.seen = new Set();\r\n this.merge(res ?? []);\r\n this.lastUpdate = new Date();\r\n this.rebuild();\r\n }\r\n catch (err) {\r\n if (generation == this.dataGeneration) {\r\n this.dataError = this.errorMessage(err);\r\n this.data = new Map();\r\n this.rebuild();\r\n }\r\n }\r\n finally {\r\n if (generation == this.dataGeneration)\r\n this.dataLoading = false;\r\n }\r\n }\r\n\r\n // M19: solo i campioni nuovi, da quello più vecchio fra gli ultimi delle istanze in pagina; sullo storico niente aggiornamento\r\n private async refresh() {\r\n if (this.source != \"live\" || this.paused || document.hidden || this.dataLoading || this.selected.length == 0)\r\n return;\r\n\r\n let lastByInstance = new Map<string, number>();\r\n this.data.forEach(byInstance => byInstance.forEach((list, instance) => {\r\n let last = list.length ? this.time(list[list.length - 1]) : null;\r\n if (last != null)\r\n lastByInstance.set(instance, Math.max(lastByInstance.get(instance) ?? 0, last));\r\n }));\r\n if (lastByInstance.size == 0)\r\n return this.loadData();\r\n\r\n let generation = this.dataGeneration;\r\n let req = this.request();\r\n req.snapFrom = new Date(Math.min(...lastByInstance.values())).toISOString();\r\n try {\r\n let res = await this.adms.getMetricsV2(this.be, req);\r\n if (generation != this.dataGeneration)\r\n return;\r\n this.merge(res ?? []);\r\n this.setDomain(this.request());\r\n // Fuori dalla finestra live si scartano\r\n this.data.forEach(byInstance => byInstance.forEach((list, instance) => byInstance.set(instance, list.filter(t => this.time(t) >= this.domainFrom))));\r\n this.lastUpdate = new Date();\r\n this.rebuild();\r\n }\r\n catch {\r\n // Un aggiornamento mancato si recupera al giro dopo\r\n }\r\n }\r\n\r\n // Nella fusione si tiene la versione già in pagina dei campioni ripetuti, che ha le differenze (chiave istanza, metrica, istante)\r\n private merge(samples: MetricsV2Sample[]) {\r\n for (let s of samples) {\r\n let key = `${s.instanceId}|${s.name}|${s.sampleTime}`;\r\n if (this.seen.has(key))\r\n continue;\r\n this.seen.add(key);\r\n if (!this.data.has(s.name))\r\n this.data.set(s.name, new Map());\r\n let byInstance = this.data.get(s.name);\r\n let instance = s.instanceId ?? \"\";\r\n if (!byInstance.has(instance))\r\n byInstance.set(instance, []);\r\n byInstance.get(instance).push(s);\r\n }\r\n this.data.forEach(byInstance => byInstance.forEach(list => list.sort((a, b) => this.time(a) - this.time(b))));\r\n }\r\n\r\n private setDomain(req: MetricsV2Request) {\r\n if (this.source == \"live\") {\r\n this.domainTo = Date.now();\r\n this.domainFrom = this.domainTo - +this.liveMinutes * 60000;\r\n }\r\n else if (this.source == \"period\") {\r\n this.domainFrom = new Date(req.snapFrom ?? Date.now() - 24 * 3600 * 1000).getTime();\r\n this.domainTo = new Date(req.snapTo ?? Date.now()).getTime();\r\n }\r\n else {\r\n let window = this.snapshotWindow;\r\n this.domainFrom = window?.from?.getTime() ?? Date.now() - 12 * 3600 * 1000;\r\n // I campioni sono alla fine degli snapshot (ogni istanza con i suoi secondi)\r\n this.domainTo = (window?.to?.getTime() ?? Date.now()) + 60000;\r\n }\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Grafici, tessere e tabella\r\n\r\n get chartFrom(): number { return this.viewFrom ?? this.domainFrom; }\r\n get chartTo(): number { return this.viewTo ?? this.domainTo; }\r\n\r\n zoomTo(range: { from: number, to: number }) {\r\n this.viewFrom = range.from;\r\n this.viewTo = range.to;\r\n }\r\n\r\n resetZoom() {\r\n this.viewFrom = null;\r\n this.viewTo = null;\r\n }\r\n\r\n toggleInstance(instance: string) {\r\n if (this.hidden.has(instance))\r\n this.hidden.delete(instance);\r\n else\r\n this.hidden.add(instance);\r\n this.rebuild();\r\n }\r\n\r\n setAlt(panel: Mv2Panel, alt: string) {\r\n this.alts[panel.info.name] = alt;\r\n this.rebuild();\r\n }\r\n\r\n info(name: string): MetricsV2Info {\r\n return this.catalog.find(t => t.name == name) ?? { name: name, metricType: MetricV2Type.Gauge, unit: \"\", rateUnit: null, durationUnit: null, instances: [] };\r\n }\r\n\r\n // Colore fisso per istanza, lo stesso in tutti i pannelli\r\n color(instance: string): string {\r\n let all = [...new Set([...this.Instances.map(t => t.id), ...flatten(this.catalog, t => t.instances ?? [])])].sort();\r\n let index = all.indexOf(instance);\r\n return INSTANCE_COLORS[(index >= 0 ? index : all.length) % INSTANCE_COLORS.length];\r\n }\r\n\r\n private rebuild() {\r\n let instances = new Set<string>();\r\n this.data.forEach(byInstance => byInstance.forEach((_, instance) => instances.add(instance)));\r\n this.legend = [...instances].sort().map(t => ({ instance: t, color: this.color(t), hidden: this.hidden.has(t) }));\r\n this.marks = this.buildMarks();\r\n this.panels = this.selected.map(name => this.buildPanel(this.info(name)));\r\n this.tiles = this.selected.map(name => this.buildTile(this.info(name)));\r\n this.tables = this.selected.map(name => this.buildTable(this.info(name), this.tables.find(t => t.info.name == name)));\r\n }\r\n\r\n private visibleSeries(name: string): [string, MetricsV2Sample[]][] {\r\n let byInstance = this.data.get(name);\r\n return byInstance ? [...byInstance.entries()].filter(t => !this.hidden.has(t[0]) && t[1].length > 0).sort((a, b) => a[0].localeCompare(b[0])) : [];\r\n }\r\n\r\n // M14: riavvii (un campione senza intervallo che non è il primo della serie) e, sullo storico per snapshot, gli id degli snapshot\r\n private buildMarks(): Mv2Mark[] {\r\n let marks: Mv2Mark[] = [];\r\n let seen = new Set<string>();\r\n this.data.forEach(byInstance => byInstance.forEach((list, instance) => list.forEach((s, i) => {\r\n if (i > 0 && s.intervalSeconds == null) {\r\n let t = this.time(s);\r\n let key = `${instance}|${Math.round(t / 60000)}`;\r\n if (!seen.has(key)) {\r\n seen.add(key);\r\n marks.push({ t: t, label: this.lc.loc(\"riavvio\"), kind: \"restart\" });\r\n }\r\n }\r\n })));\r\n if (this.source == \"snap\") {\r\n let bySnap = new Map<number, number>();\r\n this.data.forEach(byInstance => byInstance.forEach(list => list.forEach(s => {\r\n if (s.snapId != null && !bySnap.has(s.snapId))\r\n bySnap.set(s.snapId, this.time(s));\r\n })));\r\n [...bySnap.entries()].sort((a, b) => a[1] - b[1]).forEach(([id, t]) => marks.push({ t: t, label: String(id), kind: \"snapshot\" }));\r\n }\r\n return marks;\r\n }\r\n\r\n // Punti di una serie: si salta dove il valore manca e si interrompe la linea a un riavvio o se fra due campioni passa più del doppio dell'intervallo tipico\r\n private points(list: MetricsV2Sample[], value: (s: MetricsV2Sample) => number, upper?: (s: MetricsV2Sample) => number): Mv2Point[] {\r\n let times = list.map(t => this.time(t));\r\n let gaps = times.slice(1).map((t, i) => t - times[i]).sort((a, b) => a - b);\r\n let typical = gaps.length ? gaps[Math.floor(gaps.length / 2)] : 0;\r\n let out: Mv2Point[] = [];\r\n let pendingGap = false;\r\n list.forEach((s, i) => {\r\n let v = value(s);\r\n let gap = i > 0 && (s.intervalSeconds == null || (typical > 0 && times[i] - times[i - 1] > 2 * typical));\r\n if (v == null || isNaN(v)) {\r\n pendingGap = true;\r\n return;\r\n }\r\n out.push({ t: times[i], v: v, v2: upper ? upper(s) : undefined, gap: gap || pendingGap });\r\n pendingGap = false;\r\n });\r\n return out;\r\n }\r\n\r\n // Valore principale per tipo (tessere e grafico di default)\r\n private main(info: MetricsV2Info, s: MetricsV2Sample): number {\r\n switch (info.metricType) {\r\n case MetricV2Type.Gauge: return s.value;\r\n case MetricV2Type.Counter: return s.count;\r\n case MetricV2Type.Meter: return info.name == ACTIVE_THREADS_TIME ? (s.ratePerSecond == null ? null : s.ratePerSecond / 1000000) : s.ratePerSecond;\r\n case MetricV2Type.Histogram: return s.median;\r\n case MetricV2Type.Timer: return s.intervalMean;\r\n }\r\n return s.value;\r\n }\r\n\r\n mainUnit(info: MetricsV2Info): string {\r\n switch (info.metricType) {\r\n case MetricV2Type.Gauge: return info.name == CPU_USAGE ? \"CPU\" : info.unit || \"\";\r\n case MetricV2Type.Counter: return info.unit || \"\";\r\n case MetricV2Type.Meter: return info.name == ACTIVE_THREADS_TIME ? this.lc.loc(\"thread\") : `${info.unit || \"\"}/s`;\r\n case MetricV2Type.Histogram: return info.unit || \"\";\r\n case MetricV2Type.Timer: return this.durationLabel(info.durationUnit);\r\n }\r\n return info.unit || \"\";\r\n }\r\n\r\n private buildPanel(info: MetricsV2Info): Mv2Panel {\r\n let series = this.visibleSeries(info.name);\r\n let items = this.itemsOf(info);\r\n let alts: KeyValue[] = [];\r\n switch (info.metricType) {\r\n case MetricV2Type.Counter:\r\n alts = [new KeyValue(\"level\", this.lc.loc(\"Livello\")), new KeyValue(\"delta\", this.lc.loc(\"Variazione\"))];\r\n if (items.length) {\r\n alts.push(new KeyValue(\"items\", this.lc.loc(\"Voci\")));\r\n if (this.source == \"live\")\r\n alts.push(new KeyValue(\"share\", this.lc.loc(\"Quote\")));\r\n }\r\n break;\r\n case MetricV2Type.Meter:\r\n alts = [new KeyValue(\"rate\", this.lc.loc(\"Al secondo\")), new KeyValue(\"moving\", this.lc.loc(\"Rate mobili\"))];\r\n if (items.length)\r\n alts.push(new KeyValue(\"items\", this.lc.loc(\"Voci\")));\r\n break;\r\n case MetricV2Type.Histogram:\r\n alts = [new KeyValue(\"percentiles\", this.lc.loc(\"Percentili\")), new KeyValue(\"rate\", this.lc.loc(\"Frequenza\"))];\r\n break;\r\n case MetricV2Type.Timer:\r\n alts = [new KeyValue(\"duration\", this.lc.loc(\"Chiamate e durata\")), new KeyValue(\"active\", this.lc.loc(\"In corso\"))];\r\n break;\r\n }\r\n let alt = alts.find(t => t.id == this.alts[info.name])?.id ?? alts[0]?.id ?? \"\";\r\n return { info: info, alts: alts, alt: alt, charts: series.length ? this.buildCharts(info, alt, series, items) : [], empty: series.length == 0 };\r\n }\r\n\r\n // Le voci scelte di un totale, per l'area impilata e le quote\r\n private itemsOf(info: MetricsV2Info): MetricsV2Info[] {\r\n if (info.metricType != MetricV2Type.Counter && info.metricType != MetricV2Type.Meter)\r\n return [];\r\n return this.selected.filter(t => t.startsWith(info.name + \" - \") && !this.selected.some(k => k != info.name && t.startsWith(k + \" - \") && k.startsWith(info.name + \" - \"))).map(t => this.info(t));\r\n }\r\n\r\n private buildCharts(info: MetricsV2Info, alt: string, series: [string, MetricsV2Sample[]][], items: MetricsV2Info[]): Mv2Chart[] {\r\n let line = (key: string, instance: string, points: Mv2Point[], extra: Partial<Mv2Series> = {}): Mv2Series =>\r\n ({ key: `${key}|${instance}`, label: instance, color: this.color(instance), kind: \"line\", points: points, ...extra });\r\n let unit = info.unit || \"\";\r\n let rateUnit = `${unit}${this.rateLabel(info.rateUnit)}`;\r\n\r\n switch (info.metricType) {\r\n case MetricV2Type.Gauge:\r\n return [{ key: \"value\", unit: this.mainUnit(info), height: 170, series: series.map(([i, l]) => line(\"value\", i, this.points(l, s => s.value))) }];\r\n\r\n case MetricV2Type.Counter:\r\n if (alt == \"delta\")\r\n return [{ key: \"delta\", unit: unit, height: 170, series: series.map(([i, l]) => line(\"delta\", i, this.points(l, s => s.deltaCount), { kind: \"bars\" })) }];\r\n if (alt == \"items\")\r\n return [{ key: \"items\", unit: unit, height: 190, series: this.stacked(items, s => s.count) }];\r\n if (alt == \"share\")\r\n return [{ key: \"share\", unit: \"%\", height: 170, series: this.itemLines(items, s => s.percent) }];\r\n return [{ key: \"level\", unit: unit, height: 170, series: series.map(([i, l]) => line(\"level\", i, this.points(l, s => s.count))) }];\r\n\r\n case MetricV2Type.Meter:\r\n if (alt == \"moving\")\r\n return [{\r\n key: \"moving\", unit: rateUnit, height: 170,\r\n series: flatten(series, ([i, l]) => [\r\n line(\"m1\", i, this.points(l, s => s.oneMinuteRate), { label: `${i} · 1 min` }),\r\n line(\"m5\", i, this.points(l, s => s.fiveMinuteRate), { label: `${i} · 5 min`, dash: \"5 3\" }),\r\n line(\"m15\", i, this.points(l, s => s.fifteenMinuteRate), { label: `${i} · 15 min`, dash: \"1 3\" })\r\n ])\r\n }];\r\n if (alt == \"items\")\r\n return [{ key: \"items\", unit: `${unit}/s`, height: 190, series: this.stacked(items, s => s.ratePerSecond) }];\r\n return [{ key: \"rate\", unit: this.mainUnit(info), height: 170, series: series.map(([i, l]) => line(\"rate\", i, this.points(l, s => this.main(info, s)))) }];\r\n\r\n case MetricV2Type.Histogram:\r\n if (alt == \"rate\")\r\n return [{ key: \"rate\", unit: `${unit}/s`, height: 170, series: series.map(([i, l]) => line(\"rate\", i, this.points(l, s => s.ratePerSecond))) }];\r\n return [{ key: \"percentiles\", unit: unit, height: 190, series: flatten(series, ([i, l]) => this.percentileBand(i, l, s => s.median, `${i} · ${this.lc.loc(\"mediana\")}`)) }];\r\n\r\n case MetricV2Type.Timer:\r\n if (alt == \"active\")\r\n return [{ key: \"active\", unit: this.lc.loc(\"in corso\"), height: 170, series: series.map(([i, l]) => line(\"active\", i, this.points(l, s => s.activeSessions), { kind: \"step\" })) }];\r\n return [\r\n { key: \"calls\", unit: `${unit}/s`, height: 120, series: series.map(([i, l]) => line(\"calls\", i, this.points(l, s => s.ratePerSecond))) },\r\n { key: \"duration\", unit: this.durationLabel(info.durationUnit), height: 170, series: flatten(series, ([i, l]) => this.percentileBand(i, l, s => s.intervalMean, `${i} · ${this.lc.loc(\"media nell'intervallo\")}`, true)) }\r\n ];\r\n }\r\n return [];\r\n }\r\n\r\n // Fascia dei percentili del reservoir per istanza: per l'histogram mediana con max a punti, per il timer la durata media dell'intervallo\r\n private percentileBand(instance: string, list: MetricsV2Sample[], center: (s: MetricsV2Sample) => number, label: string, timer: boolean = false): Mv2Series[] {\r\n let color = this.color(instance);\r\n let ret: Mv2Series[] = [];\r\n if (!timer)\r\n ret.push({ key: `b1|${instance}`, label: instance, color: color, kind: \"band\", points: this.points(list, s => s.median, s => s.percentile75), opacity: 0.26, tooltip: false });\r\n ret.push({ key: `b2|${instance}`, label: instance, color: color, kind: \"band\", points: this.points(list, s => timer ? s.median : s.percentile75, s => s.percentile95), opacity: 0.15, tooltip: false });\r\n ret.push({ key: `b3|${instance}`, label: instance, color: color, kind: \"band\", points: this.points(list, s => s.percentile95, s => s.percentile99), opacity: 0.07, tooltip: false });\r\n ret.push({ key: `c|${instance}`, label: label, color: color, kind: \"line\", points: this.points(list, center) });\r\n if (!timer)\r\n ret.push({ key: `max|${instance}`, label: `${instance} · max`, color: color, kind: \"dots\", points: this.points(list, s => s.max) });\r\n return ret;\r\n }\r\n\r\n // Le voci di un totale sommate sulle istanze visibili, campione per campione (live: a 15 secondi; storico: per snapshot)\r\n private bucketed(item: MetricsV2Info, value: (s: MetricsV2Sample) => number, average: boolean): Map<number, { t: number, v: number }> {\r\n let buckets = new Map<number, { t: number, v: number, n: number }>();\r\n for (let [, list] of this.visibleSeries(item.name))\r\n for (let s of list) {\r\n let v = value(s);\r\n if (v == null)\r\n continue;\r\n let key = s.snapId ?? Math.round(this.time(s) / REFRESH_MS);\r\n let b = buckets.get(key) ?? { t: this.time(s), v: 0, n: 0 };\r\n b.v += v;\r\n b.n++;\r\n buckets.set(key, b);\r\n }\r\n return new Map([...buckets.entries()].map(([k, b]) => [k, { t: b.t, v: average ? b.v / b.n : b.v }]));\r\n }\r\n\r\n private stacked(items: MetricsV2Info[], value: (s: MetricsV2Sample) => number): Mv2Series[] {\r\n let perItem = items.map(t => this.bucketed(t, value, false));\r\n let keys = [...new Set(flatten(perItem, t => [...t.keys()]))].sort((a, b) => a - b);\r\n let base = new Map<number, number>(keys.map(k => [k, 0]));\r\n let bands: Mv2Series[] = items.map((item, i) => {\r\n let points: Mv2Point[] = keys.filter(k => perItem[i].has(k)).map(k => {\r\n let b = perItem[i].get(k);\r\n let lo = base.get(k);\r\n base.set(k, lo + b.v);\r\n return { t: b.t, v: lo, v2: lo + b.v };\r\n });\r\n let label = item.name.substring(item.name.lastIndexOf(\" - \") + 3);\r\n return { key: `stack|${item.name}`, label: label, color: ITEM_COLORS[i % ITEM_COLORS.length], kind: \"band\", points: points, opacity: 0.55, tooltip: false };\r\n });\r\n // Linee invisibili solo per il riquadro dei valori: il valore della voce, non la somma impilata\r\n let tips: Mv2Series[] = items.map((item, i) => ({\r\n key: `stacktip|${item.name}`, label: item.name.substring(item.name.lastIndexOf(\" - \") + 3), color: ITEM_COLORS[i % ITEM_COLORS.length], kind: \"line\",\r\n points: [...perItem[i].values()].sort((a, b) => a.t - b.t).map(b => ({ t: b.t, v: b.v })), opacity: 0\r\n }));\r\n return bands.reverse().concat(tips);\r\n }\r\n\r\n private itemLines(items: MetricsV2Info[], value: (s: MetricsV2Sample) => number): Mv2Series[] {\r\n return items.map((item, i) => ({\r\n key: `share|${item.name}`, label: item.name.substring(item.name.lastIndexOf(\" - \") + 3), color: ITEM_COLORS[i % ITEM_COLORS.length], kind: \"line\" as const,\r\n points: [...this.bucketed(item, value, true).values()].sort((a, b) => a.t - b.t).map(b => ({ t: b.t, v: b.v }))\r\n }));\r\n }\r\n\r\n // M17: valore principale dell'ultimo campione di ogni istanza, mini grafico, istante del campione\r\n private buildTile(info: MetricsV2Info): Mv2Tile {\r\n let rows: Mv2TileRow[] = [];\r\n let sparks: { d: string, color: string }[] = [];\r\n let latest = 0;\r\n for (let [instance, list] of this.visibleSeries(info.name)) {\r\n let last = [...list].reverse().find(t => this.main(info, t) != null);\r\n if (!last)\r\n continue;\r\n latest = Math.max(latest, this.time(last));\r\n rows.push({\r\n instance: instance, color: this.color(instance), value: `${this.number(this.main(info, last))} ${this.mainUnit(info)}`.trim(),\r\n extra: info.metricType == MetricV2Type.Meter ? `${this.number(last.count)} ${this.lc.loc(\"dall'avvio\")}` : \"\"\r\n });\r\n let points = this.points(list.slice(-80), s => this.main(info, s));\r\n if (points.length > 1) {\r\n let lo = Math.min(...points.map(t => t.v));\r\n let hi = Math.max(...points.map(t => t.v));\r\n let t0 = points[0].t;\r\n let t1 = points[points.length - 1].t;\r\n let d = points.map((p, i) => `${i == 0 || p.gap ? \"M\" : \"L\"}${((p.t - t0) / Math.max(1, t1 - t0) * 120).toFixed(1)},${(26 - (hi > lo ? (p.v - lo) / (hi - lo) : 0.5) * 24).toFixed(1)}`).join(\"\");\r\n sparks.push({ d: d, color: this.color(instance) });\r\n }\r\n }\r\n return { info: info, rows: rows, sparks: sparks, time: latest ? dayjs(latest).format(\"HH:mm:ss\") : \"\" };\r\n }\r\n\r\n // M18: colonne comuni e del tipo; ordinabile; esportabile\r\n private buildTable(info: MetricsV2Info, previous: Mv2TableSection): Mv2TableSection {\r\n let unit = info.unit ? ` (${info.unit})` : \"\";\r\n let dur = info.durationUnit ? ` (${this.durationLabel(info.durationUnit)})` : \"\";\r\n let columns: Mv2Column[] = [\r\n { key: \"instance\", label: this.lc.loc(\"Istanza\"), num: false },\r\n { key: \"time\", label: `${this.lc.loc(\"Istante\")} (${this.zone})`, num: false },\r\n { key: \"interval\", label: this.lc.loc(\"Intervallo (s)\"), num: true }\r\n ];\r\n if (this.source != \"live\")\r\n columns.push({ key: \"snapId\", label: this.lc.loc(\"Snapshot\"), num: true });\r\n let typed: [string, string, (s: MetricsV2Sample) => any][] = [];\r\n switch (info.metricType) {\r\n case MetricV2Type.Gauge:\r\n typed = [[\"value\", `${this.lc.loc(\"Valore\")}${info.name == CPU_USAGE ? \" (CPU)\" : unit}`, s => s.value]];\r\n break;\r\n case MetricV2Type.Counter:\r\n typed = [[\"count\", `${this.lc.loc(\"Conteggio\")}${unit}`, s => s.count], [\"delta\", `${this.lc.loc(\"Variazione\")}${unit}`, s => s.deltaCount], [\"percent\", `${this.lc.loc(\"Quota\")} (%)`, s => s.percent]];\r\n break;\r\n case MetricV2Type.Meter:\r\n typed = [[\"count\", `${this.lc.loc(\"Conteggio\")}${unit}`, s => s.count], [\"rate\", `${this.lc.loc(\"Al secondo\")} (${this.mainUnit(info)})`, s => this.main(info, s)],\r\n [\"m1\", `Rate 1 min (${info.unit || \"\"}${this.rateLabel(info.rateUnit)})`, s => s.oneMinuteRate], [\"m5\", \"Rate 5 min\", s => s.fiveMinuteRate], [\"m15\", \"Rate 15 min\", s => s.fifteenMinuteRate]];\r\n break;\r\n case MetricV2Type.Histogram:\r\n typed = [[\"count\", this.lc.loc(\"Conteggio\"), s => s.count], [\"median\", `${this.lc.loc(\"Mediana\")}${unit}`, s => s.median], [\"p95\", \"p95\", s => s.percentile95], [\"p99\", \"p99\", s => s.percentile99], [\"max\", this.lc.loc(\"Massimo\"), s => s.max]];\r\n break;\r\n case MetricV2Type.Timer:\r\n typed = [[\"count\", this.lc.loc(\"Chiamate\"), s => s.count], [\"rate\", `${this.lc.loc(\"Al secondo\")} (/s)`, s => s.ratePerSecond], [\"intervalMean\", `${this.lc.loc(\"Durata media nell'intervallo\")}${dur}`, s => s.intervalMean],\r\n [\"median\", `${this.lc.loc(\"Mediana\")}${dur}`, s => s.median], [\"p95\", \"p95\", s => s.percentile95], [\"p99\", \"p99\", s => s.percentile99], [\"active\", this.lc.loc(\"In corso\"), s => s.activeSessions]];\r\n break;\r\n }\r\n columns.push(...typed.map(([key, label]) => ({ key: key, label: label, num: true })));\r\n\r\n let rows = flatten(this.visibleSeries(info.name), ([instance, list]) => list.map(s => {\r\n let row: { [key: string]: any } = { instance: instance, time: this.time(s), utc: s.sampleTime, interval: s.intervalSeconds, snapId: s.snapId };\r\n typed.forEach(([key, , value]) => row[key] = value(s));\r\n return row;\r\n }));\r\n let section: Mv2TableSection = { info: info, columns: columns, rows: [], total: rows.length, sortKey: previous?.sortKey ?? \"time\", sortDesc: previous?.sortDesc ?? true };\r\n section.rows = this.sortRows(rows, section);\r\n return section;\r\n }\r\n\r\n sortBy(section: Mv2TableSection, column: Mv2Column) {\r\n section.sortDesc = section.sortKey == column.key ? !section.sortDesc : column.num || column.key == \"time\";\r\n section.sortKey = column.key;\r\n let rebuilt = this.buildTable(section.info, section);\r\n section.rows = rebuilt.rows;\r\n }\r\n\r\n private sortRows(rows: { [key: string]: any }[], section: Mv2TableSection): { [key: string]: any }[] {\r\n let key = section.sortKey;\r\n let sign = section.sortDesc ? -1 : 1;\r\n return rows.sort((a, b) => {\r\n let x = a[key];\r\n let y = b[key];\r\n if (x == null && y == null)\r\n return 0;\r\n if (x == null)\r\n return 1;\r\n if (y == null)\r\n return -1;\r\n return (typeof x == \"string\" ? x.localeCompare(y) : x - y) * sign;\r\n });\r\n }\r\n\r\n shownRows(section: Mv2TableSection) {\r\n return section.rows.slice(0, TABLE_ROWS);\r\n }\r\n\r\n cell(row: { [key: string]: any }, column: Mv2Column): string {\r\n let v = row[column.key];\r\n if (column.key == \"time\")\r\n return dayjs(v).format(\"DD/MM HH:mm:ss\");\r\n if (column.key == \"instance\" || column.key == \"snapId\")\r\n return v ?? \"—\";\r\n return this.number(v);\r\n }\r\n\r\n // CSV delle righe della metrica, con gli orari in UTC e le unità nelle intestazioni\r\n exportCsv(section: Mv2TableSection) {\r\n let quote = (v: any) => {\r\n let s = v == null ? \"\" : String(v);\r\n return /[\",\\n]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\r\n };\r\n let columns = section.columns.map(t => t.key == \"time\" ? { ...t, label: `${this.lc.loc(\"Istante\")} (UTC)` } : t);\r\n let lines = [columns.map(t => quote(t.label)).join(\",\")];\r\n for (let row of section.rows)\r\n lines.push(columns.map(t => quote(t.key == \"time\" ? this.isoUtc(row[\"utc\"]) : row[t.key])).join(\",\"));\r\n let blob = new Blob([\"\" + lines.join(\"\\r\\n\")], { type: \"text/csv;charset=utf-8\" });\r\n let url = URL.createObjectURL(blob);\r\n let link = document.createElement(\"a\");\r\n link.href = url;\r\n link.download = `metriche_${section.info.name.replace(/[^\\w.-]+/g, \"-\")}.csv`;\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n setTimeout(() => URL.revokeObjectURL(url), 1000);\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Supporto\r\n\r\n private visibilityChanged() {\r\n // Tornando sulla pagina si recupera subito invece di aspettare il giro dopo\r\n if (!document.hidden)\r\n this.refresh();\r\n }\r\n\r\n private errorMessage(err: any): string {\r\n return err?.status == 542 ? this.adms.errorText(err) : `${this.lc.loc(\"Errore\")} ${err?.status ?? \"\"}: ${this.adms.errorText(err)}`;\r\n }\r\n\r\n number(value: number): string {\r\n if (value == null || isNaN(value))\r\n return \"—\";\r\n let abs = Math.abs(value);\r\n let digits = abs >= 1000 ? \"1.0-0\" : abs >= 100 ? \"1.0-1\" : abs >= 1 ? \"1.0-2\" : \"1.0-3\";\r\n return formatNumber(value, \"it\", digits);\r\n }\r\n\r\n durationLabel(unit: string): string {\r\n switch (unit) {\r\n case \"Nanoseconds\": return \"ns\";\r\n case \"Microseconds\": return \"µs\";\r\n case \"Milliseconds\": return \"ms\";\r\n case \"Seconds\": return \"s\";\r\n case \"Minutes\": return \"min\";\r\n case \"Hours\": return \"h\";\r\n }\r\n return unit ?? \"\";\r\n }\r\n\r\n rateLabel(unit: string): string {\r\n switch (unit) {\r\n case \"Seconds\": return \"/s\";\r\n case \"Minutes\": return \"/min\";\r\n case \"Hours\": return \"/h\";\r\n case \"Days\": return \"/g\";\r\n }\r\n return unit ? `/${unit}` : \"\";\r\n }\r\n\r\n // Le date delle risposte sono UTC \"dd/MM/yyyy HH:mm:ss\" senza fuso: si leggono come UTC e si mostrano in ora locale (M24)\r\n parseUtc(value: string): Date {\r\n let m = /^(\\d{2})\\/(\\d{2})\\/(\\d{4}) (\\d{2}):(\\d{2}):(\\d{2})$/.exec(value ?? \"\");\r\n return m ? new Date(Date.UTC(+m[3], +m[2] - 1, +m[1], +m[4], +m[5], +m[6])) : value ? new Date(value) : null;\r\n }\r\n\r\n private time(s: MetricsV2Sample): number {\r\n return this.parseUtc(s.sampleTime)?.getTime() ?? 0;\r\n }\r\n\r\n private isoUtc(value: string): string {\r\n return this.parseUtc(value)?.toISOString().replace(\".000Z\", \"Z\") ?? \"\";\r\n }\r\n\r\n local(value: Date | string): string {\r\n let date = typeof value == \"string\" ? this.parseUtc(value) : value;\r\n return date ? dayjs(date).format(\"DD/MM HH:mm\") : \"—\";\r\n }\r\n\r\n hhmmss(date: Date): string {\r\n return date ? dayjs(date).format(\"HH:mm:ss\") : \"\";\r\n }\r\n\r\n private setLastDay() {\r\n let now = new Date();\r\n this.filterto = this.fmt(now);\r\n this.filterfrom = this.fmt(new Date(now.getTime() - 24 * 3600 * 1000));\r\n }\r\n\r\n private toDate(value: string): Date {\r\n return value ? this.dateExts.getDateConvertion(value).toDate() : null;\r\n }\r\n\r\n private fmt(date: Date): string {\r\n return dayjs(date).format(this.lc.token(\"getFullDateDisplayFormat\"));\r\n }\r\n\r\n private saveSettings() {\r\n let settings: MetricsV2Settings = { selected: this.selected, source: this.source, instances: this.instances, liveMinutes: this.liveMinutes, view: this.view };\r\n this.localStorage.setItem(STORAGE_KEY, settings).subscribe();\r\n }\r\n\r\n // #endregion\r\n}\r\n","<div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"card app-overflow-visible\" widget>\r\n <div class=\"card-header\">\r\n <span class=\"text-uppercase\">{{'Metriche di Sistema' | localize: lc}}</span>\r\n </div>\r\n <div class=\"card-body widget-body mv2-body\">\r\n <!-- Barra dei comandi: sorgente, finestra, istanze, vista, aggiornamento -->\r\n <div class=\"mv2-toolbar\">\r\n <div class=\"mv2-group\">\r\n <span class=\"mv2-group-label\">{{'Sorgente' | localize: lc}}</span>\r\n <div class=\"mv2-seg\">\r\n @for (o of Sources; track o.id) {\r\n <button type=\"button\" [class.mv2-on]=\"source == o.id\" [disabled]=\"o.id != 'live' && !historyAvailable\" (click)=\"setSource(o.id)\"\r\n [title]=\"o.id != 'live' && !historyAvailable ? ('Lo storico non è attivo su questo ambiente: ci sono solo i dati live.' | localize: lc) : ''\">\r\n @if (o.id == 'live') {\r\n <span class=\"mv2-live-dot\" [class.mv2-live-paused]=\"paused\"></span>\r\n }\r\n {{o.description}}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (source == 'live') {\r\n <div class=\"mv2-group\">\r\n <span class=\"mv2-group-label\">{{'Finestra' | localize: lc}}</span>\r\n <div class=\"mv2-seg\">\r\n @for (o of LiveWindows; track o.id) {\r\n <button type=\"button\" [class.mv2-on]=\"liveMinutes == o.id\" (click)=\"setLiveMinutes(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n } @else if (source == 'period') {\r\n <div class=\"mv2-cluster\">\r\n <div class=\"mv2-field\">\r\n <form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"filterfrom\" (ngModelChange)=\"filterfrom = $event; datesChanged()\" name=\"filterfrom\" [Placeholder]=\"'Dal' | localize: lc\"></form-datetime>\r\n </div>\r\n <div class=\"mv2-field\">\r\n <form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"filterto\" (ngModelChange)=\"filterto = $event; datesChanged()\" name=\"filterto\" [Placeholder]=\"'Al' | localize: lc\"></form-datetime>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"mv2-cluster\">\r\n <div class=\"mv2-field mv2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"snapFromId\" (ngModelChange)=\"snapFromId = $event; snapshotsChanged()\" name=\"snapFrom\" [Source]=\"SnapshotOptions\" [Placeholder]=\"'Dallo snapshot' | localize: lc\"></form-select>\r\n </div>\r\n <div class=\"mv2-field mv2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"snapToId\" (ngModelChange)=\"snapToId = $event; snapshotsChanged()\" name=\"snapTo\" [Source]=\"SnapshotOptions\" [Placeholder]=\"'Allo snapshot' | localize: lc\"></form-select>\r\n </div>\r\n @if (snapshotWindow; as w) {\r\n <span class=\"mv2-muted\">{{'Dalle' | localize: lc}} {{local(w.from)}} {{'alle' | localize: lc}} {{local(w.to)}}</span>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"mv2-group mv2-field-wide\">\r\n <span class=\"mv2-group-label\">{{'Istanze' | localize: lc}}</span>\r\n <form-multiselect class=\"mv2-fill\" [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"instances\" (ngModelChange)=\"instancesChanged($event)\" name=\"instances\" [Source]=\"Instances\" [Placeholder]=\"clusterLabel\" [MaxShownElements]=\"2\"></form-multiselect>\r\n </div>\r\n\r\n <div class=\"mv2-cluster mv2-cluster-end\">\r\n @if (source == 'live') {\r\n <span class=\"mv2-muted\">\r\n @if (dataLoading) {\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n }\r\n @if (lastUpdate) {\r\n {{'Aggiornato alle' | localize: lc}} {{hhmmss(lastUpdate)}}\r\n }\r\n </span>\r\n <button type=\"button\" class=\"mv2-btn\" (click)=\"togglePause()\">\r\n <i class=\"fa\" [class.fa-pause]=\"!paused\" [class.fa-play]=\"paused\"></i> {{(paused ? 'Riprendi' : 'Pausa') | localize: lc}}\r\n </button>\r\n } @else if (dataLoading) {\r\n <span class=\"mv2-muted\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento…' | localize: lc}}</span>\r\n }\r\n <div class=\"mv2-seg\">\r\n @for (o of Views; track o.id) {\r\n <button type=\"button\" [class.mv2-on]=\"view == o.id\" (click)=\"setView(o.id)\">\r\n <i class=\"fa\" [class.fa-line-chart]=\"o.id == 'charts'\" [class.fa-table]=\"o.id == 'table'\"></i> {{o.description}}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Avvisi -->\r\n @for (warning of warnings; track $index) {\r\n <div class=\"mv2-alert mv2-alert-warn\"><i class=\"fa fa-exclamation-triangle\"></i> {{warning}}</div>\r\n }\r\n @if (snapshotsLoaded && !historyAvailable) {\r\n <div class=\"mv2-alert\"><i class=\"fa fa-info-circle\"></i> {{'Lo storico non è attivo su questo ambiente: ci sono solo i dati live.' | localize: lc}}</div>\r\n }\r\n @if (dataError) {\r\n <div class=\"mv2-alert mv2-alert-error\">{{dataError}}</div>\r\n }\r\n\r\n <div class=\"mv2-main\">\r\n <!-- Catalogo -->\r\n <aside class=\"mv2-panel mv2-catalog\">\r\n <div class=\"mv2-field-full\">\r\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"search\" (ngModelChange)=\"search = $event; buildGroups()\" name=\"search\" [Placeholder]=\"'Cerca una metrica…' | localize: lc\"></form-input>\r\n </div>\r\n <div class=\"mv2-presets\">\r\n @for (p of Presets; track p) {\r\n <button type=\"button\" class=\"mv2-chip\" (click)=\"applyPreset(p)\">{{p | localize: lc}}</button>\r\n }\r\n </div>\r\n <div class=\"mv2-counter\">\r\n <span>{{selected.length}} {{'di' | localize: lc}} {{Max}} {{'metriche scelte' | localize: lc}}</span>\r\n @if (selected.length > 0) {\r\n <button type=\"button\" class=\"mv2-link\" (click)=\"clearSelection()\">{{'Togli tutte' | localize: lc}}</button>\r\n }\r\n </div>\r\n\r\n @if (catalogLoading) {\r\n <div class=\"mv2-muted mv2-pad\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento…' | localize: lc}}</div>\r\n }\r\n @if (catalogError) {\r\n <div class=\"mv2-alert mv2-alert-error\">{{catalogError}}</div>\r\n }\r\n @for (group of groups; track group.type) {\r\n <div class=\"mv2-cat-group\">\r\n <div class=\"mv2-cat-title\">{{group.label}} <span class=\"mv2-muted\">{{group.count}}</span></div>\r\n @for (entry of group.entries; track entry.info.name) {\r\n <div class=\"mv2-cat-item\" [class.mv2-cat-disabled]=\"!canSelect(entry.info.name)\">\r\n <label class=\"mv2-check\">\r\n <input type=\"checkbox\" [checked]=\"isSelected(entry.info.name)\" [disabled]=\"!canSelect(entry.info.name)\" (change)=\"toggleMetric(entry.info.name)\" />\r\n <span class=\"mv2-cat-name\" [title]=\"entry.info.name\">{{entry.info.name}}</span>\r\n </label>\r\n <span class=\"mv2-cat-meta\">\r\n {{catalogUnit(entry.info)}}\r\n @if (instancesLabel(entry.info)) {\r\n <span class=\"mv2-cat-inst\" [title]=\"entry.info.instances.join('\\n')\">{{instancesLabel(entry.info)}}</span>\r\n }\r\n </span>\r\n @if (entry.items.length > 0) {\r\n <button type=\"button\" class=\"mv2-caret\" (click)=\"entry.open = !entry.open\" [title]=\"'Voci' | localize: lc\">\r\n <i class=\"fa\" [class.fa-caret-down]=\"entry.open\" [class.fa-caret-right]=\"!entry.open\"></i> {{entry.items.length}}\r\n </button>\r\n }\r\n </div>\r\n @if (entry.open && entry.items.length > 0) {\r\n <div class=\"mv2-cat-items\">\r\n <button type=\"button\" class=\"mv2-link\" (click)=\"addItems(entry)\">{{addItemsLabel(entry)}}</button>\r\n @for (item of entry.items; track item.name) {\r\n <div class=\"mv2-cat-item mv2-cat-sub\" [class.mv2-cat-disabled]=\"!canSelect(item.name)\">\r\n <label class=\"mv2-check\">\r\n <input type=\"checkbox\" [checked]=\"isSelected(item.name)\" [disabled]=\"!canSelect(item.name)\" (change)=\"toggleMetric(item.name)\" />\r\n <span class=\"mv2-cat-name\" [title]=\"item.name\">{{item.name.substring(entry.info.name.length + 3)}}</span>\r\n </label>\r\n @if (instancesLabel(item)) {\r\n <span class=\"mv2-cat-inst\" [title]=\"item.instances.join('\\n')\">{{instancesLabel(item)}}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n </aside>\r\n\r\n <!-- Grafici, tessere e tabella -->\r\n <section class=\"mv2-area\">\r\n @if (selected.length == 0) {\r\n <div class=\"mv2-panel mv2-placeholder\">\r\n <i class=\"fa fa-line-chart\"></i>\r\n {{'Scegli una o più metriche dal catalogo.' | localize: lc}}\r\n </div>\r\n } @else {\r\n <!-- Tessere dei valori correnti -->\r\n <div class=\"mv2-tiles\">\r\n @for (tile of tiles; track tile.info.name) {\r\n <div class=\"mv2-tile\">\r\n <div class=\"mv2-tile-name\" [title]=\"tile.info.name\">{{tile.info.name}}</div>\r\n @for (row of tile.rows; track row.instance) {\r\n <div class=\"mv2-tile-row\">\r\n <span class=\"mv2-dot\" [style.background]=\"row.color\" [title]=\"row.instance\"></span>\r\n <strong>{{row.value}}</strong>\r\n @if (row.extra) {\r\n <span class=\"mv2-muted\">{{row.extra}}</span>\r\n }\r\n </div>\r\n } @empty {\r\n <div class=\"mv2-muted\">—</div>\r\n }\r\n <svg class=\"mv2-spark\" viewBox=\"0 0 120 28\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\r\n @for (spark of tile.sparks; track $index) {\r\n <path [attr.d]=\"spark.d\" [attr.stroke]=\"spark.color\" fill=\"none\" stroke-width=\"1.3\" vector-effect=\"non-scaling-stroke\" />\r\n }\r\n </svg>\r\n @if (tile.time) {\r\n <div class=\"mv2-muted mv2-small\">{{'alle' | localize: lc}} {{tile.time}}</div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Legenda comune: un clic nasconde o mostra l'istanza ovunque -->\r\n <div class=\"mv2-legend-bar\">\r\n <div class=\"mv2-legend\">\r\n @for (item of legend; track item.instance) {\r\n <button type=\"button\" class=\"mv2-legend-item\" [class.mv2-legend-off]=\"item.hidden\" (click)=\"toggleInstance(item.instance)\">\r\n <span class=\"mv2-dot\" [style.background]=\"item.color\"></span>{{item.instance}}\r\n </button>\r\n }\r\n </div>\r\n <span class=\"mv2-muted mv2-small\">{{'Orari in ora locale' | localize: lc}} ({{zone}}) · {{'trascina su un grafico per lo zoom' | localize: lc}}</span>\r\n @if (viewFrom != null) {\r\n <button type=\"button\" class=\"mv2-btn\" (click)=\"resetZoom()\"><i class=\"fa fa-arrows-h\"></i> {{'Finestra intera' | localize: lc}}</button>\r\n }\r\n </div>\r\n\r\n @if (view == 'charts') {\r\n @for (panel of panels; track panel.info.name) {\r\n <div class=\"mv2-panel mv2-chart-panel\">\r\n <div class=\"mv2-panel-header\">\r\n <span class=\"mv2-panel-title\">{{panel.info.name}}</span>\r\n <span class=\"mv2-type\">{{Type[panel.info.metricType]}}</span>\r\n <span class=\"mv2-muted\">{{mainUnit(panel.info)}}</span>\r\n <span class=\"mv2-spacer\"></span>\r\n @if (panel.alts.length > 1) {\r\n <div class=\"mv2-seg mv2-seg-small\">\r\n @for (o of panel.alts; track o.id) {\r\n <button type=\"button\" [class.mv2-on]=\"panel.alt == o.id\" (click)=\"setAlt(panel, o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n }\r\n <button type=\"button\" class=\"mv2-icon-btn\" [title]=\"'Togli' | localize: lc\" (click)=\"removeMetric(panel.info.name)\">×</button>\r\n </div>\r\n @if (panel.empty) {\r\n <div class=\"mv2-empty\">\r\n @if (dataLoading) {\r\n <i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento…' | localize: lc}}\r\n } @else {\r\n {{emptyLabel(panel.info.name)}}\r\n }\r\n </div>\r\n } @else {\r\n @for (chart of panel.charts; track chart.key) {\r\n <mv2-chart [series]=\"chart.series\" [from]=\"chartFrom\" [to]=\"chartTo\" [height]=\"chart.height\" [unit]=\"chart.unit\" [marks]=\"marks\"\r\n [cursor]=\"cursor\" [format]=\"format\" (cursorChange)=\"cursor = $event\" (zoom)=\"zoomTo($event)\"></mv2-chart>\r\n }\r\n }\r\n </div>\r\n }\r\n } @else {\r\n @for (section of tables; track section.info.name) {\r\n <div class=\"mv2-panel\">\r\n <div class=\"mv2-panel-header\">\r\n <span class=\"mv2-panel-title\">{{section.info.name}}</span>\r\n <span class=\"mv2-type\">{{Type[section.info.metricType]}}</span>\r\n <span class=\"mv2-spacer\"></span>\r\n @if (section.total > 0) {\r\n <button type=\"button\" class=\"mv2-btn\" (click)=\"exportCsv(section)\"><i class=\"fa fa-download\"></i> {{'Esporta CSV' | localize: lc}}</button>\r\n }\r\n </div>\r\n @if (section.total == 0) {\r\n <div class=\"mv2-empty\">{{emptyLabel(section.info.name)}}</div>\r\n } @else {\r\n <div class=\"mv2-table-wrap\">\r\n <table class=\"mv2-table\">\r\n <thead>\r\n <tr>\r\n @for (column of section.columns; track column.key) {\r\n <th [class.mv2-num]=\"column.num\" (click)=\"sortBy(section, column)\">\r\n {{column.label}}\r\n @if (section.sortKey == column.key) {\r\n <i class=\"fa\" [class.fa-caret-down]=\"section.sortDesc\" [class.fa-caret-up]=\"!section.sortDesc\"></i>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of shownRows(section); track $index) {\r\n <tr>\r\n @for (column of section.columns; track column.key) {\r\n <td [class.mv2-num]=\"column.num\">\r\n @if (column.key == 'instance') {\r\n <span class=\"mv2-dot\" [style.background]=\"color(row['instance'])\"></span>\r\n }\r\n {{cell(row, column)}}\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n @if (section.total > section.rows.length || section.total > 300) {\r\n <div class=\"mv2-muted mv2-small mv2-pad\">{{'Mostrate le prime 300 righe di' | localize: lc}} {{section.total}}; {{\"l'esportazione le comprende tutte.\" | localize: lc}}</div>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n </section>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { AppSearch } from \"@esfaenza/es-table\";\r\nimport { TopActivity } from \"./TopActivity\";\r\n\r\nexport class TopActivitiesDataView extends AppSearch<TopActivity>{\r\n constructor() { super(); }\r\n\r\n filterfrom: string;\r\n filterto: string;\r\n filterrealtime: boolean;\r\n filterbe: string;\r\n filterglobal: boolean;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmTopActivitieLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Sessioni Attive\", [\"Active Sessions\"]);\r\n super.set(\"it->en\", \"Prime Istruzioni\", [\"Top Nodes\"]);\r\n super.set(\"it->en\", \"Prime Sessioni\", [\"Top Sessions\"]);\r\n super.set(\"it->en\", \"Carico i Dati\", [\"Loading Data\"]);\r\n super.set(\"it->en\", \"Attività Principali\", [\"Top Activities\"]);\r\n super.set(\"it->en\", \"Descrizione Nodo\", [\"Node Description\"]);\r\n super.set(\"it->en\", \"Nodo\", [\"Node\"]);\r\n super.set(\"it->en\", \"Attività\", [\"Activity\"]);\r\n super.set(\"it->en\", \"Limite\", [\"Limit\"]);\r\n super.set(\"it->en\", \"Tipo Nodo\", [\"Node Type\"]);\r\n super.set(\"it->en\", \"Utente\", [\"User\"]);\r\n super.set(\"it->en\", \"Tenant\", [\"Tenant\"]);\r\n super.set(\"it->en\", \"Processo\", [\"Process\"]);\r\n super.set(\"it->en\", \"Aggiorna ogni\", [\"Update every\"]);\r\n super.set(\"it->en\", \"secondo/i\", [\"second/s\"]);\r\n super.set(\"it->en\", \"Thread Massimi\", [\"Maximum Threads\"]);\r\n super.set(\"it->en\", \"CPU\", [\"CPUs\"]);\r\n super.set(\"it->en\", \"Classe Attesa\", [\"Wait Class Name\"]);\r\n\r\n super.set(\"it->en\", \"Seriale\", [\"Serial\"]);\r\n super.set(\"it->en\", \"Stato\", [\"Status\"]);\r\n super.set(\"it->en\", \"Tipo\", [\"Type\"]);\r\n super.set(\"it->en\", \"Utente\", [\"User\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { BaseChartComponent, BaseInterval, DateValue, Limit, LineChartData, LineSerie } from \"@esfaenza/es-charts\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { ItemsSelection } from \"@esfaenza/es-table\";\r\nimport { DateService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport * as am5xy from \"@amcharts/amcharts5/xy\";\r\nimport { ReplaySubject } from \"rxjs\";\r\nimport { Dayjs } from \"dayjs\";\r\n\r\n// Modelli\r\nimport { DirectorInfos } from \"../../models/components/DirectorInfos\";\r\nimport { TopActivitiesDataView } from \"../../models/components/TopActivitiesDataView\";\r\nimport { TopNode } from \"../../models/components/TopNode\";\r\nimport { TopSession } from \"../../models/components/TopSession\";\r\nimport { NodeStats } from \"../../models/components/NodeStats\";\r\n\r\nimport { SessionStats } from \"../../models/components/SessionStats\";\r\nimport { SessionThread } from \"../../models/components/SessionThread\";\r\n\r\n// Applicazione\r\nimport { ADM_MODULE_PATH } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmTopActivitieLoc } from \"./topact_search.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\n\r\ndeclare var dayjs;\r\n\r\n@Component({\r\n selector: \"topact_search\",\r\n providers: [{ provide: LocalizationService, useClass: AdmTopActivitieLoc }],\r\n templateUrl: \"./topact_search.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmTopActivitiesComponent {\r\n public searchView: TopActivitiesDataView = new TopActivitiesDataView();\r\n public storageSub: any;\r\n private LastDataPoint: any;\r\n\r\n public autoUpdate: boolean = false;\r\n public seconds: string = \"5\";\r\n\r\n private ChartInstance: BaseChartComponent<any>;\r\n public NodeDetails: NodeStats;\r\n\r\n private rtWindow: { from: Dayjs, to: Dayjs } = null;\r\n\r\n protected destroyed$: ReplaySubject<boolean> = new ReplaySubject(1);\r\n private be: string;\r\n\r\n constructor(\r\n public dateExts: DateService,\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private location: Location,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n ngOnInit() {\r\n\r\n // Ogni minuto calcolo qual è la finestra del realTime\r\n // interval(60 * 1000).pipe(takeUntil(this.destroyed$)).subscribe(_ => {\r\n // this.updateRealTimeWindow();\r\n // });\r\n\r\n this.storageSub = this.route.queryParams.subscribe(params => {\r\n this.Init(params[\"ignoreStorage\"]);\r\n });\r\n }\r\n\r\n async updateRealTimeWindow() {\r\n let data = new TopActivitiesDataView();\r\n data.filterbe = this.be;\r\n data = await this.adms.getTopActivities(this.be, data);\r\n let reference = data.items[0];\r\n for (let i = 0; i < reference.actsessions.length; i++) {\r\n let itemref = reference.actsessions[i];\r\n let theD = this.dateExts.getDateConvertion(itemref.sampletime);\r\n\r\n if (!this.rtWindow)\r\n this.rtWindow = { from: theD, to: theD };\r\n else {\r\n if (theD.isBefore(this.rtWindow.from))\r\n this.rtWindow.from = theD;\r\n if (theD.isAfter(this.rtWindow.to))\r\n this.rtWindow.to = theD;\r\n }\r\n }\r\n }\r\n\r\n Init(ignoreStore) {\r\n this.doInit(ignoreStore);\r\n }\r\n\r\n async doInit(ignoreStorage) {\r\n let item = await this.localStorage.getItem<TopActivitiesDataView>(\"HotSearchTopAct\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/topact`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotSearchTopAct\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: TopActivitiesDataView) {\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetItems(this.searchView, false);\r\n }\r\n else {\r\n this.searchView = new TopActivitiesDataView();\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroyed$.next(true);\r\n this.destroyed$.complete();\r\n\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n async sendSearch(resetPage: boolean = true, update: boolean = false, searchViewOverride: TopActivitiesDataView = null) {\r\n let sv = searchViewOverride ?? this.searchView;\r\n if ((sv.filterfrom || sv.filterto) && !this.rtWindow)\r\n await this.updateRealTimeWindow();\r\n\r\n let dateRequestOnRealtimeWindow: boolean =\r\n sv.filterfrom && this.dateExts.getDateConvertion(sv.filterfrom).isAfter(this.rtWindow.from) &&\r\n sv.filterto && this.dateExts.getDateConvertion(sv.filterto).isBefore(this.rtWindow.to);\r\n\r\n sv.filterrealtime = dateRequestOnRealtimeWindow;\r\n sv.searchinprogress = true;\r\n\r\n this.POSTGetItems(sv, update);\r\n }\r\n\r\n async POSTGetItems(data: TopActivitiesDataView, update: boolean) {\r\n data.filterbe = this.be;\r\n let res = await this.adms.getTopActivities(this.be, data);\r\n //Se sono in modalità di update non devo toccare la searchView attuale se non per il searchinprogress che viene messo dall'es table\r\n if (!update) {\r\n this.searchView = res;\r\n this.localStorage.setItem(\"HotSearchTopAct\", this.searchView).subscribe();\r\n }\r\n // DirectorInfos anche se per qualche motivo crasha di brutto è comunque non obbligatorio, evito di non caricare la pagina solo perché lui scoppia\r\n let dirinfos = await this.adms.getInfos(this.be);\r\n this.searchView.searchinprogress = false;\r\n this.reviewBindings(update, res, dirinfos);\r\n }\r\n\r\n loadNodeDetails(nodeId: string) {\r\n this.NodeDetails = null;\r\n requestAnimationFrame(async () => {\r\n this.NodeDetails = await this.adms.getNodeStats(this.be, nodeId, this.searchView.filterglobal);\r\n });\r\n }\r\n\r\n // **************************************************** Trasformazione da searchview con unico elemento con tutto ai 3 elementi:\r\n // **************************************************** Grafico, TopNodes e TopSessions\r\n TopActiveSessions: LineChartData;\r\n TopNodes: TopNode[];\r\n TopSessions: TopSession[];\r\n DirInfos: DirectorInfos;\r\n DirInfosGlobal: DirectorInfos;\r\n seriesPropertiesMapping: { [index: string]: LineSerie } = {};\r\n propertiesSeriesMapping: { [index: string]: string } = {\r\n [\"cputime\"]: \"CPU\",\r\n [\"waittime\"]: \"Wait\",\r\n [\"scripttime\"]: \"Scripting\",\r\n [\"dbtime\"]: \"DB\",\r\n [\"nettime\"]: \"Network\",\r\n [\"throttletime\"]: \"Throttling\",\r\n [\"sleeptime\"]: \"Sleep\",\r\n [\"iotime\"]: \"IO\"\r\n };\r\n\r\n reviewBindings(update: boolean, searchViewOverride?, dirInfos?: DirectorInfos) {\r\n let reference = (searchViewOverride ?? this.searchView).items[0];\r\n this.TopNodes = reference.topnodes;\r\n this.TopSessions = reference.topsessions;\r\n this.DirInfos = dirInfos?.cluster ? dirInfos : null;\r\n this.DirInfosGlobal = !dirInfos?.cluster ? dirInfos : null;\r\n\r\n if (!reference.actsessions || reference.actsessions.length == 0) {\r\n this.TopActiveSessions = null;\r\n return;\r\n }\r\n\r\n let series: LineSerie[] = []; \r\n let props = Object.keys(reference.actsessions[0]);\r\n for (let i = 0; i < props.length; i++) {\r\n if (props[i] != 'sampletime') {\r\n let s = new LineSerie(this.propertiesSeriesMapping[props[i]], [], null, null, \"sessions\");\r\n series.push(s);\r\n this.seriesPropertiesMapping[props[i]] = s;\r\n }\r\n }\r\n\r\n for (let i = 0; i < reference.actsessions.length; i++) {\r\n let itemref = reference.actsessions[i];\r\n let theD = new Date(itemref.sampletime);\r\n\r\n for (let i = 0; i < props.length; i++)\r\n if (props[i] != 'sampletime' && (!update || this.dateExts.getDateConvertion(theD).isAfter(this.LastDataPoint)))\r\n this.seriesPropertiesMapping[props[i]].values.push(new DateValue(theD, itemref[props[i]]));\r\n }\r\n\r\n if (update && this.ChartInstance) {\r\n let data = new LineChartData(series, new Limit(dirInfos?.threads, this.lc.loc(\"Thread Massimi\")));\r\n if (series.some(t => t.values.length > 0)) {\r\n this.ChartInstance.addData(data);\r\n this.LastDataPoint = series.map(t => dayjs.max(t.values.map(v => this.dateExts.getDateConvertion(v.d))))[0];\r\n }\r\n }\r\n else {\r\n this.TopActiveSessions = new LineChartData(series, new Limit(dirInfos?.threads, this.lc.loc(\"Thread Massimi\")));\r\n this.LastDataPoint = series.map(t => dayjs.max(t.values.map(v => this.dateExts.getDateConvertion(v.d))))[0];\r\n }\r\n }\r\n\r\n // #region Gestione update automatico\r\n updateTimer: any;\r\n autoUpdateChanged() {\r\n if (!/^[1-9]\\d*$/.test(this.seconds))\r\n this.seconds = '10';\r\n const secondsInMs = parseInt(this.seconds, null) * 1000;\r\n if (this.autoUpdate) {\r\n this.sendSearch(false, true);\r\n this.updateTimer = setInterval(() => { this.sendSearch(false, true); }, secondsInMs);\r\n }\r\n else\r\n clearInterval(this.updateTimer);\r\n }\r\n // #endregion\r\n\r\n private from: Date;\r\n private to: Date;\r\n\r\n dataSelectionChanged(event: { from: Date, to: Date, initial: boolean }) {\r\n this.from = event.initial ? (this.searchView.filterfrom ? this.dateExts.getDateConvertion(this.searchView.filterfrom).toDate() : \"\") : event.from;\r\n this.to = event.initial ? (this.searchView.filterto ? this.dateExts.getDateConvertion(this.searchView.filterto).toDate() : \"\") : event.to;\r\n\r\n var pseudoSearchView: TopActivitiesDataView = JSON.parse(JSON.stringify(this.searchView));\r\n pseudoSearchView.filterfrom = this.from ? dayjs(this.from).format(this.lc.token(\"getFullDateDisplayFormat\")) : \"\";\r\n pseudoSearchView.filterto = this.to ? dayjs(this.to).format(this.lc.token(\"getFullDateDisplayFormat\")) : \"\";\r\n this.sendSearch(true, true, pseudoSearchView);\r\n }\r\n\r\n onChartLoaded(chart: BaseChartComponent<any>, overwriteInstance: boolean = true) {\r\n if(overwriteInstance)\r\n this.ChartInstance = chart;\r\n\r\n let readyHandler = () => {\r\n (chart.Chart as am5xy.XYChart).xAxes.each(x => x.zoom(0, 1, 0));\r\n (chart.Chart as am5xy.XYChart).yAxes.each(y => y.zoom(0, 1, 0));\r\n\r\n chart.Chart!.root.events.off(\"frameended\", readyHandler);\r\n };\r\n\r\n chart.Chart!.root.events.onDebounced(\"frameended\", readyHandler, 500);\r\n }\r\n\r\n // **************************************************** Gestione dettaglio sessione\r\n\r\n SessionDetails: SessionStats;\r\n SelectedTopNodes: TopNode[];\r\n SelectedSessions: LineChartData;\r\n\r\n seriesPropertiesMapping2: { [index: string]: LineSerie } = {};\r\n\r\n loadSessionDetails(sessionId: number, serialNo: number, instanceid: string) {\r\n this.SessionDetails = null;\r\n requestAnimationFrame(async () => {\r\n this.SessionDetails = await this.adms.getSessionStats(this.be, sessionId?.toString(), serialNo?.toString(), instanceid);\r\n this.threadSelectionChanged(null);\r\n });\r\n }\r\n\r\n threadSelectionChanged(selection?: ItemsSelection<SessionThread>) {\r\n this.SelectedTopNodes = null;\r\n this.SelectedSessions = null;\r\n\r\n requestAnimationFrame(() => {\r\n let sessDet = (selection?.count || 0) == 0 ? this.SessionDetails : selection.items[0];\r\n\r\n this.SelectedTopNodes = sessDet.nodes;\r\n\r\n let series: LineSerie[] = []; \r\n let props = Object.keys(sessDet.sessions[0]);\r\n for (let i = 0; i < props.length; i++) {\r\n if (props[i] != 'sampletime') {\r\n let s = new LineSerie(this.propertiesSeriesMapping[props[i]], [], null , null, \"sessions\");\r\n series.push(s);\r\n this.seriesPropertiesMapping2[props[i]] = s;\r\n }\r\n }\r\n \r\n for (let i = 0; i < sessDet.sessions.length; i++) {\r\n let itemref = sessDet.sessions[i];\r\n let theD = new Date(itemref.sampletime);\r\n \r\n for (let i = 0; i < props.length; i++)\r\n if (props[i] != 'sampletime')\r\n this.seriesPropertiesMapping2[props[i]].values.push(new DateValue(theD, itemref[props[i]]));\r\n }\r\n\r\n this.SelectedSessions = new LineChartData(series);\r\n\r\n });\r\n }\r\n}","<div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"card app-overflow-visible\" widget>\r\n <div class=\"card-header\">\r\n <span class=\"text-uppercase\">\r\n {{'Attività Principali' | localize: lc}}\r\n <span *ngIf=\"DirInfos && !DirInfosGlobal\"> - \r\n {{'' + DirInfos.cpus + ' ' + ('CPU' | localize: lc) + (DirInfos.rssplan ? ' - ' + DirInfos.rssplan : '')}} \r\n Load average: {{ DirInfos.lavg1 | number : '1.1-2' : 'it'}} {{ DirInfos.lavg5 | number : '1.1-2' : 'it'}} {{ DirInfos.lavg15 | number : '1.1-2' : 'it'}}\r\n </span> \r\n <span *ngIf=\"DirInfosGlobal\"> | \r\n {{'' + DirInfosGlobal.cpus + ' ' + ('CPU (Global)' | localize: lc) + (DirInfosGlobal.rssplan ? ' - ' + DirInfosGlobal.rssplan : '')}} \r\n Load average: {{ DirInfosGlobal.lavg1 | number : '1.1-2' : 'it'}} {{ DirInfosGlobal.lavg5 | number : '1.1-2' : 'it'}} {{ DirInfosGlobal.lavg15 | number : '1.1-2' : 'it'}}\r\n <span *ngIf=\"(DirInfosGlobal?.perinstancedata?.length || 0) > 0\">\r\n \r\n <a class=\"app-link app-pointer app-inline\" (click)=\"dlgDirInfos.show();\">[{{'Info per Istanza' | localize: lc}}...]</a>\r\n </span>\r\n </span> \r\n </span>\r\n </div>\r\n <div class=\"card-body widget-body\">\r\n <div class=\"col-md-12 app-relative\">\r\n <form role=\"form\">\r\n <div class=\"row app-first-filter-line\">\r\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\r\n <form-datetime [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterfrom\" name=\"filterfrom\" [Placeholder]=\"'Da' | localize: lc\"></form-datetime>\r\n </div>\r\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\r\n <form-datetime [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterto\" name=\"filterto\" [Placeholder]=\"'A' | localize: lc\"></form-datetime>\r\n </div>\r\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\r\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterglobal\" name=\"filterglobal\"></form-checkbox> \r\n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterglobal = !searchView.filterglobal\">{{'Globale' | localize: lc}}</span>\r\n </div>\r\n <button [disabled]=\"searchView.searchinprogress || autoUpdate\" class=\"input-group-addon btn app-btn-search app-margin-top-20\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\r\n\r\n <div class=\"app-absolute app-right-25 app-top-40\">\r\n <div class=\"pull-right\">\r\n {{'Aggiorna ogni' | localize: lc}} <input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control app-updevery-input\" type=\"text\" [(ngModel)]=\"seconds\" name=\"seconds\" /> {{'secondo/i' | localize: lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2 app-margin-right-5\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" name=\"autoUpdate\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12 app-margin-top-5\">\r\n <p *ngIf=\"!searchView\"><em>{{'Carico i Dati' | localize: lc}}</em></p>\r\n <div *ngIf=\"searchView\" class=\"row\">\r\n <div class=\"col-md-12 app-no-padding\">\r\n <div style=\"width: 100%; height: 290px\">\r\n <es-line-chart *ngIf=\"TopActiveSessions\"\r\n [MinGridDistance]=\"65\"\r\n [Timeline]=\"false\"\r\n [FinalInstants]=\"false\"\r\n [Stacked]=\"true\"\r\n [LegendPadding]=\"{top: 0, bottom: 7, right: 0, left: 10}\"\r\n [Fill]=\"true\"\r\n [MergeDatasets]=\"true\"\r\n [Data]=\"TopActiveSessions\"\r\n [Legend]=\"true\" \r\n name=\"topactsession\"\r\n [DataGroupingThreshold]=\"99999999\"\r\n (onSelectionChanged)=\"dataSelectionChanged($event)\" (chartLoaded)=\"onChartLoaded($event)\"></es-line-chart>\r\n </div>\r\n </div>\r\n <div class=\"col-md-5\">\r\n <h5>{{'Prime Istruzioni' | localize: lc}}</h5>\r\n <es-table [(ngModel)]=\"TopNodes\" [HidePaging]=\"true\">\r\n <ng-template #header>\r\n <th class=\"app-col-min\">{{'Nodo' | localize: lc}}</th>\r\n <th>{{'Descrizione Nodo' | localize: lc}}</th>\r\n <th class=\"app-col-min\">{{'Attività' | localize: lc}}</th>\r\n <th class=\"app-col-min app-nowrap\">{{'Tipo Nodo' | localize: lc}}</th>\r\n <th class=\"app-col-min app-nowrap\">{{'Classe Attesa' | localize: lc}}</th>\r\n </ng-template>\r\n <ng-template #body let-node>\r\n <td class=\"app-col-min\"><span class=\"app-link\" (click)=\"loadNodeDetails(node.profnodeid); dlgNodeDetails.show();\">{{node.profnodeid}}</span></td>\r\n <td><span title=\"{{node.profnodedesc}}\">{{node.profnodedesc.length > 40 ? node.profnodedesc.substr(0,40) + \"...\" : node.profnodedesc}}</span></td>\r\n <td class=\"app-nowrap\">{{node.activity | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{node.nodetypename}}</td>\r\n <td>{{node.waitclassname}}</td>\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n <div class=\"col-md-7\">\r\n <h5>{{'Prime Sessioni' | localize: lc}}</h5>\r\n <es-table [(ngModel)]=\"TopSessions\" [HidePaging]=\"true\">\r\n <ng-template #header>\r\n <th class=\"app-col-min\">ID</th>\r\n <th>{{'Utente' | localize: lc}}</th>\r\n <th>{{'Tenant' | localize : lc}}</th>\r\n <th>{{'Processo' | localize: lc}}</th>\r\n <th>{{'Attività' | localize: lc}}</th>\r\n <th>Cpu</th>\r\n <th>Wait</th>\r\n <th>DB</th>\r\n <th>Script</th>\r\n <th>Throttle</th>\r\n <th>Sleep</th>\r\n <th>Networking</th>\r\n <th>IO</th>\r\n </ng-template>\r\n\r\n <ng-template #body let-session>\r\n <td class=\"app-col-min\"><span class=\"app-link\" title=\"{{session.instanceid? (' - ' + session.instanceid) : ''}}\" (click)=\"loadSessionDetails(session.sid, session.serial, session.instanceid); dlgSessionDetails.show();\">{{session.sid}}</span></td>\r\n <td>{{session.user}}</td>\r\n <td>{{session.tenant}}</td>\r\n <td>{{session.bgprocess}}</td>\r\n <td>{{session.activity | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.cpu | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.wait | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.db | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.script | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.throttle | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.sleep | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.net | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.io | number : '1.1-2' : 'it'}} %</td>\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div bsModal #dlgDirInfos=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-feminist\" emaDraggable>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title pull-left\">{{'Dettaglio per Istanza' | localize: lc}}</h4>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"dlgDirInfos.hide()\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\r\n </div>\r\n <div class=\"modal-body\" *ngIf=\"(DirInfosGlobal?.perinstancedata?.length || 0) > 0\">\r\n <div class=\"row\" *ngFor=\"let info of DirInfosGlobal.perinstancedata\">\r\n <div class=\"col-md-12\"> \r\n <strong>{{info.instance}}</strong>: \r\n {{'' + info.cpus + ' ' + ('CPU (Global)' | localize: lc) + (info.rssplan ? ' - ' + info.rssplan : '')}} \r\n Load average: {{ info.lavg1 | number : '1.1-2' : 'it'}} {{ info.lavg5 | number : '1.1-2' : 'it'}} {{ info.lavg15 | number : '1.1-2' : 'it'}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"dlgDirInfos.hide()\">{{'Chiudi' | localize: lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div bsModal #dlgNodeDetails=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <node-detail *ngIf=\"NodeDetails\" [NodeDetails]=\"NodeDetails\" (onClose)=\"dlgNodeDetails.hide()\"></node-detail>\r\n</div>\r\n\r\n<div bsModal #dlgSessionDetails=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-feminist\" emaDraggable>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title pull-left\">{{'Dettaglio Sessione' | localize: lc}}<span *ngIf=\"SessionDetails\"> {{SessionDetails.sid}}</span></h4>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"dlgSessionDetails.hide()\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\r\n </div>\r\n <div class=\"modal-body\" *ngIf=\"SessionDetails\">\r\n <div class=\"row\">\r\n <div *ngIf=\"SessionDetails.instanceid\" class=\"col-md-6\"><strong>{{'Istanza' | localize: lc}}</strong>: {{SessionDetails.instanceid}} </div>\r\n <div class=\"col-md-6\"><strong>{{'Seriale' | localize: lc}}</strong>: {{SessionDetails.serial}} </div>\r\n <div class=\"col-md-6\"><strong>{{'Stato' | localize: lc}}</strong>: {{SessionDetails.status}} </div>\r\n <div class=\"col-md-6\"><strong>{{'Tipo' | localize: lc}}</strong>: {{SessionDetails.type}}</div>\r\n <div class=\"col-md-6\"><strong>{{'Utente' | localize: lc}}</strong>: {{SessionDetails.user}} <span *ngIf=\"SessionDetails.tenant\">({{SessionDetails.tenant}})</span></div>\r\n </div>\r\n\r\n <div style=\"display: flex; width: 100%; margin-top: 15px;\">\r\n <div style=\"flex-grow: 0;display: flex;flex-direction: column\">\r\n <h5>Prime Istruzioni</h5>\r\n <div *ngIf=\"SelectedTopNodes\">\r\n <es-table [(ngModel)]=\"SelectedTopNodes\" [ArraymodeItemsPerPage]=\"10\">\r\n <ng-template #header>\r\n <th class=\"app-col-min\">{{'Nodo' | localize: lc}}</th>\r\n <th>{{'Descrizione Nodo' | localize: lc}}</th>\r\n <th class=\"app-col-min\">{{'Attività' | localize: lc}}</th>\r\n <th class=\"app-col-min app-nowrap\">{{'Tipo Nodo' | localize: lc}}</th>\r\n <th class=\"app-col-min app-nowrap\">{{'Classe Attesa' | localize: lc}}</th>\r\n </ng-template>\r\n \r\n <ng-template #body let-node>\r\n <td class=\"app-col-min\"><span class=\"app-link\"(click)=\"loadNodeDetails(node.profnodeid); dlgNodeDetails.show();\">{{node.profnodeid}}</span></td>\r\n <td><span title=\"{{node.profnodedesc}}\">{{node.profnodedesc.length > 40 ? node.profnodedesc.substr(0,40) + \"...\" : node.profnodedesc}}</span></td>\r\n <td class=\"app-nowrap\">{{(node.activity == \"NaN\" ? null : node.activity) | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{node.nodetypename}}</td>\r\n <td>{{node.waitclassname}}</td>\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n </div>\r\n <div style=\"width: 15px;\"></div>\r\n <div style=\"flex-grow: 2;display: flex;flex-direction: column\">\r\n <h5>Attività</h5>\r\n <div *ngIf=\"SelectedSessions\" style=\"width: 100%; height: 290px\">\r\n <es-line-chart [MinGridDistance]=\"65\"\r\n [Timeline]=\"false\"\r\n [FinalInstants]=\"false\"\r\n [Stacked]=\"true\"\r\n [LegendPadding]=\"{top: 0, bottom: 7, right: 0, left: 10}\"\r\n [Fill]=\"true\"\r\n [MergeDatasets]=\"true\"\r\n [Data]=\"SelectedSessions\"\r\n [Legend]=\"true\" \r\n name=\"session_details\"\r\n [DataGroupingThreshold]=\"99999999\"\r\n (chartLoaded)=\"onChartLoaded($event, true)\">\r\n </es-line-chart>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n <div style=\"display: flex; width: 100%;\">\r\n <div style=\"flex-grow: 1;\">\r\n <h5>Statistiche Thread</h5>\r\n <div>\r\n <es-table [(ngModel)]=\"SessionDetails.threads\" [ArraymodeItemsPerPage]=\"10\" [Selection]=\"true\" [SingleSelection]=\"true\" (onSelectionChanged)=\"threadSelectionChanged($event)\">\r\n <ng-template #header>\r\n <th>Thread</th>\r\n <th>Stato</th>\r\n <th>Tipo</th>\r\n <th>API</th>\r\n <th>Attesa corrente</th>\r\n <th>Nodo di attesa</th>\r\n <th>Attesa su</th>\r\n <th>Classe</th>\r\n <th>Par. 1</th>\r\n <th>Par. 2</th>\r\n <th>Par. 3</th>\r\n <th>Tempo Attesa</th>\r\n </ng-template>\r\n \r\n <ng-template #body let-thread>\r\n <td>{{thread.tid}}</td>\r\n <td>{{thread.status}}</td>\r\n <td>{{thread.type}}</td>\r\n <td>{{thread.api}}</td>\r\n <td>{{thread.wait}}</td>\r\n <td>{{thread.waitnode}}</td>\r\n <td>{{thread.waiteventtype}}</td>\r\n <td>{{thread.waitclassname}}</td>\r\n <td>{{thread.waitpar1}}</td>\r\n <td>{{thread.waitpar2}}</td>\r\n <td>{{thread.waitpar3}}</td>\r\n <td>{{(thread.waittime == \"NaN\" ? null : thread.waittime) | number : '1.1-2' : 'it'}}</td>\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"dlgSessionDetails.hide()\">{{'Chiudi' | localize: lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>","// Enum della Top Activity v2: i numeri sono quelli del backend (le risposte li riportano come numeri)\r\n\r\nexport enum TopActivityDimension {\r\n WaitClass = 0,\r\n EventType = 1,\r\n WaitEvent = 2,\r\n Instance = 3,\r\n UserSession = 4,\r\n UserName = 5,\r\n Tenant = 6,\r\n SessionType = 7,\r\n BackgroundSession = 8,\r\n JobName = 9,\r\n ConsumerGroup = 10,\r\n ThreadType = 11,\r\n Api = 12,\r\n Machine = 13\r\n}\r\n\r\nexport enum TopActivityDataSource {\r\n Memory = 0,\r\n MemoryAndStored = 1\r\n}\r\n\r\nexport enum TopActivityResolution {\r\n Low = 0,\r\n Medium = 1,\r\n High = 2,\r\n Maximum = 3\r\n}\r\n\r\nexport enum TopActivityMaximumThreads {\r\n None = 0,\r\n Cores = 1,\r\n Threads = 2\r\n}\r\n","import { TopActivityDataSource, TopActivityDimension, TopActivityMaximumThreads, TopActivityResolution } from \"./TopActivityV2Enums\";\r\n\r\nexport class TopActivityV2Filter {\r\n dimension: TopActivityDimension;\r\n // key di un componente o di una riga; \"\" seleziona l'attività senza valore\r\n value: string;\r\n}\r\n\r\n// Richiesta della Top Activity v2: date in ISO UTC (…Z), campi non valorizzati = default del backend.\r\n// Il backend-for-frontend legge i nomi senza badare a maiuscole e minuscole\r\nexport class TopActivityV2Request {\r\n from?: string;\r\n to?: string;\r\n global?: boolean;\r\n instanceId?: string;\r\n dataSource?: TopActivityDataSource;\r\n dimension?: TopActivityDimension;\r\n filters?: TopActivityV2Filter[];\r\n totalActivity?: boolean;\r\n maximumThreads?: TopActivityMaximumThreads;\r\n resolution?: TopActivityResolution;\r\n maxComponents?: number;\r\n tablesFrom?: string;\r\n tablesTo?: string;\r\n tables?: TopActivityDimension[];\r\n topCount?: number;\r\n}\r\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmTopActivityV2Loc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Attività Principali\", [\"Top Activities\"]);\r\n super.set(\"it->en\", \"CPU\", [\"CPUs\"]);\r\n super.set(\"it->en\", \"Da\", [\"From\"]);\r\n super.set(\"it->en\", \"A\", [\"To\"]);\r\n super.set(\"it->en\", \"Cerca\", [\"Search\"]);\r\n super.set(\"it->en\", \"Istanza\", [\"Instance\"]);\r\n super.set(\"it->en\", \"Istanza corrente\", [\"Current instance\"]);\r\n super.set(\"it->en\", \"Tutte le istanze\", [\"All instances\"]);\r\n super.set(\"it->en\", \"Ultime\", [\"Last\"]);\r\n super.set(\"it->en\", \"Origine dati\", [\"Data source\"]);\r\n super.set(\"it->en\", \"Memoria\", [\"Memory\"]);\r\n super.set(\"it->en\", \"Memoria + storico\", [\"Memory + history\"]);\r\n super.set(\"it->en\", \"Aggiornamento automatico\", [\"Auto refresh\"]);\r\n super.set(\"it->en\", \"Dividi per\", [\"Split by\"]);\r\n super.set(\"it->en\", \"Risoluzione\", [\"Resolution\"]);\r\n super.set(\"it->en\", \"Bassa\", [\"Low\"]);\r\n super.set(\"it->en\", \"Media\", [\"Medium\"]);\r\n super.set(\"it->en\", \"Alta\", [\"High\"]);\r\n super.set(\"it->en\", \"Massima\", [\"Maximum\"]);\r\n super.set(\"it->en\", \"Attività totale\", [\"Total activity\"]);\r\n super.set(\"it->en\", \"Limite\", [\"Limit\"]);\r\n super.set(\"it->en\", \"Nessuno\", [\"None\"]);\r\n super.set(\"it->en\", \"CPU Massime\", [\"Maximum CPUs\"]);\r\n super.set(\"it->en\", \"Thread Massimi\", [\"Maximum Threads\"]);\r\n super.set(\"it->en\", \"Sessioni attive medie per\", [\"Average active sessions by\"]);\r\n super.set(\"it->en\", \"Picco\", [\"Peak\"]);\r\n super.set(\"it->en\", \"un punto ogni\", [\"one point every\"]);\r\n super.set(\"it->en\", \"stima per campionamento\", [\"sampling estimate\"]);\r\n super.set(\"it->en\", \"Valori stimati contando i campioni, come in Oracle, invece che misurati\", [\"Values estimated by counting samples, as in Oracle, rather than measured\"]);\r\n super.set(\"it->en\", \"Stima contando i campioni: il totale può differire di poco da quello misurato delle sessioni\", [\"Estimated by counting samples: the total may differ slightly from the measured sessions total\"]);\r\n super.set(\"it->en\", \"Filtri\", [\"Filters\"]);\r\n super.set(\"it->en\", \"Rimuovi\", [\"Remove\"]);\r\n super.set(\"it->en\", \"Clic per filtrare\", [\"Click to filter\"]);\r\n super.set(\"it->en\", \"Prima di questo istante i dati vengono dallo storico (un campione ogni 10 secondi)\", [\"Before this instant data comes from history (one sample every 10 seconds)\"]);\r\n super.set(\"it->en\", \"sessioni\", [\"sessions\"]);\r\n super.set(\"it->en\", \"Carico i Dati\", [\"Loading Data\"]);\r\n super.set(\"it->en\", \"Nessun dato nella finestra\", [\"No data in the window\"]);\r\n super.set(\"it->en\", \"Finestra tabelle\", [\"Tables window\"]);\r\n super.set(\"it->en\", \"Ultimi 5 minuti\", [\"Last 5 minutes\"]);\r\n super.set(\"it->en\", \"Finestra fissa\", [\"Fixed window\"]);\r\n super.set(\"it->en\", \"Prime righe per\", [\"Top rows by\"]);\r\n super.set(\"it->en\", \"Attività\", [\"Activity\"]);\r\n super.set(\"it->en\", \"Altri\", [\"Others\"]);\r\n super.set(\"it->en\", \"(non attribuito)\", [\"(not attributed)\"]);\r\n super.set(\"it->en\", \"(nessuno)\", [\"(none)\"]);\r\n super.set(\"it->en\", \"Classe di attesa\", [\"Wait class\"]);\r\n super.set(\"it->en\", \"Tipo evento\", [\"Event type\"]);\r\n super.set(\"it->en\", \"Nodo\", [\"Node\"]);\r\n super.set(\"it->en\", \"Sessione\", [\"Session\"]);\r\n super.set(\"it->en\", \"Utente\", [\"User\"]);\r\n super.set(\"it->en\", \"Tenant\", [\"Tenant\"]);\r\n super.set(\"it->en\", \"Tipo sessione\", [\"Session type\"]);\r\n super.set(\"it->en\", \"Sessione di background\", [\"Background session\"]);\r\n super.set(\"it->en\", \"Job\", [\"Job\"]);\r\n super.set(\"it->en\", \"Gruppo di consumo\", [\"Consumer group\"]);\r\n super.set(\"it->en\", \"Tipo thread\", [\"Thread type\"]);\r\n super.set(\"it->en\", \"Macchina\", [\"Machine\"]);\r\n super.set(\"it->en\", \"Tipo\", [\"Type\"]);\r\n super.set(\"it->en\", \"Processo\", [\"Process\"]);\r\n super.set(\"it->en\", \"Errore\", [\"Error\"]);\r\n }\r\n}\r\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class SessionDetailLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Dettaglio Sessione\", [\"Session Detail\"]);\r\n super.set(\"it->en\", \"Istanza\", [\"Instance\"]);\r\n super.set(\"it->en\", \"Seriale\", [\"Serial\"]);\r\n super.set(\"it->en\", \"Stato\", [\"Status\"]);\r\n super.set(\"it->en\", \"Tipo\", [\"Type\"]);\r\n super.set(\"it->en\", \"Utente\", [\"User\"]);\r\n super.set(\"it->en\", \"Prime Istruzioni\", [\"Top Nodes\"]);\r\n super.set(\"it->en\", \"Nodo\", [\"Node\"]);\r\n super.set(\"it->en\", \"Descrizione Nodo\", [\"Node Description\"]);\r\n super.set(\"it->en\", \"Attività\", [\"Activity\"]);\r\n super.set(\"it->en\", \"Tipo Nodo\", [\"Node Type\"]);\r\n super.set(\"it->en\", \"Classe Attesa\", [\"Wait Class Name\"]);\r\n super.set(\"it->en\", \"Statistiche Thread\", [\"Thread Statistics\"]);\r\n super.set(\"it->en\", \"Attesa corrente\", [\"Current Wait\"]);\r\n super.set(\"it->en\", \"Nodo di attesa\", [\"Wait Node\"]);\r\n super.set(\"it->en\", \"Attesa su\", [\"Waiting On\"]);\r\n super.set(\"it->en\", \"Classe\", [\"Class\"]);\r\n super.set(\"it->en\", \"Tempo Attesa\", [\"Wait Time\"]);\r\n super.set(\"it->en\", \"Chiudi\", [\"Close\"]);\r\n }\r\n}\r\n","// Angular\r\nimport { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { BaseChartComponent, DateValue, LineChartData, LineSerie } from \"@esfaenza/es-charts\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { ItemsSelection } from \"@esfaenza/es-table\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport * as am5xy from \"@amcharts/amcharts5/xy\";\r\n\r\n// Applicazione\r\nimport { SessionStats } from \"../../models/components/SessionStats\";\r\nimport { SessionThread } from \"../../models/components/SessionThread\";\r\nimport { TopNode } from \"../../models/components/TopNode\";\r\n\r\n// Localizzazione\r\nimport { SessionDetailLoc } from \"./session_detail.component.loc\";\r\n\r\n// Dettaglio sessione condiviso (stesso contenuto del dialog della pagina Top Activity di sempre): il dialog che lo ospita resta del chiamante,\r\n// il clic su un nodo viene rilanciato con onNodeSelected perché il dettaglio nodo è anch'esso un dialog del chiamante\r\n@Component({\r\n selector: \"session-detail\",\r\n viewProviders: [{ provide: LocalizationService, useClass: SessionDetailLoc }],\r\n templateUrl: \"./session_detail.component.html\",\r\n // Il componente sta fra il bsModal e il .modal-dialog: inline perderebbe la centratura del dialog\r\n styles: [\":host { display: block; }\"],\r\n standalone: false\r\n})\r\nexport class SessionDetailComponent {\r\n\r\n @Input() SessionDetails: SessionStats;\r\n\r\n @Output() onClose: EventEmitter<boolean> = new EventEmitter<boolean>();\r\n @Output() onNodeSelected: EventEmitter<string> = new EventEmitter<string>();\r\n\r\n SelectedTopNodes: TopNode[];\r\n SelectedSessions: LineChartData;\r\n\r\n private seriesPropertiesMapping: { [index: string]: LineSerie } = {};\r\n private propertiesSeriesMapping: { [index: string]: string } = {\r\n [\"cputime\"]: \"CPU\",\r\n [\"waittime\"]: \"Wait\",\r\n [\"scripttime\"]: \"Scripting\",\r\n [\"dbtime\"]: \"DB\",\r\n [\"nettime\"]: \"Network\",\r\n [\"throttletime\"]: \"Throttling\",\r\n [\"sleeptime\"]: \"Sleep\",\r\n [\"iotime\"]: \"IO\"\r\n };\r\n\r\n constructor(public lc: LocalizationService) { }\r\n\r\n ngOnInit() {\r\n this.threadSelectionChanged(null);\r\n }\r\n\r\n threadSelectionChanged(selection?: ItemsSelection<SessionThread>) {\r\n this.SelectedTopNodes = null;\r\n this.SelectedSessions = null;\r\n\r\n requestAnimationFrame(() => {\r\n let sessDet = (selection?.count || 0) == 0 ? this.SessionDetails : selection.items[0];\r\n\r\n this.SelectedTopNodes = sessDet.nodes;\r\n\r\n if (!sessDet.sessions || sessDet.sessions.length == 0)\r\n return;\r\n\r\n let series: LineSerie[] = [];\r\n let props = Object.keys(sessDet.sessions[0]);\r\n for (let i = 0; i < props.length; i++) {\r\n if (props[i] != 'sampletime') {\r\n let s = new LineSerie(this.propertiesSeriesMapping[props[i]], [], null, null, \"sessions\");\r\n series.push(s);\r\n this.seriesPropertiesMapping[props[i]] = s;\r\n }\r\n }\r\n\r\n for (let i = 0; i < sessDet.sessions.length; i++) {\r\n let itemref = sessDet.sessions[i];\r\n let theD = new Date(itemref.sampletime);\r\n\r\n for (let i = 0; i < props.length; i++)\r\n if (props[i] != 'sampletime')\r\n this.seriesPropertiesMapping[props[i]].values.push(new DateValue(theD, itemref[props[i]]));\r\n }\r\n\r\n this.SelectedSessions = new LineChartData(series);\r\n });\r\n }\r\n\r\n onChartLoaded(chart: BaseChartComponent<any>) {\r\n let readyHandler = () => {\r\n (chart.Chart as am5xy.XYChart).xAxes.each(x => x.zoom(0, 1, 0));\r\n (chart.Chart as am5xy.XYChart).yAxes.each(y => y.zoom(0, 1, 0));\r\n\r\n chart.Chart!.root.events.off(\"frameended\", readyHandler);\r\n };\r\n\r\n chart.Chart!.root.events.onDebounced(\"frameended\", readyHandler, 500);\r\n }\r\n\r\n closeDialog() {\r\n this.onClose.emit(true);\r\n }\r\n}\r\n","<div class=\"modal-dialog modal-xl\" emaDraggable>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title pull-left\">{{'Dettaglio Sessione' | localize: lc}}<span *ngIf=\"SessionDetails\"> {{SessionDetails.sid}}</span></h4>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"closeDialog()\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\r\n </div>\r\n <div class=\"modal-body\" *ngIf=\"SessionDetails\">\r\n <div class=\"row\">\r\n <div *ngIf=\"SessionDetails.instanceid\" class=\"col-md-6\"><strong>{{'Istanza' | localize: lc}}</strong>: {{SessionDetails.instanceid}} </div>\r\n <div class=\"col-md-6\"><strong>{{'Seriale' | localize: lc}}</strong>: {{SessionDetails.serial}} </div>\r\n <div class=\"col-md-6\"><strong>{{'Stato' | localize: lc}}</strong>: {{SessionDetails.status}} </div>\r\n <div class=\"col-md-6\"><strong>{{'Tipo' | localize: lc}}</strong>: {{SessionDetails.type}}</div>\r\n <div class=\"col-md-6\"><strong>{{'Utente' | localize: lc}}</strong>: {{SessionDetails.user}} <span *ngIf=\"SessionDetails.tenant\">({{SessionDetails.tenant}})</span></div>\r\n </div>\r\n\r\n <!-- Istruzioni e grafico affiancati finché c'è spazio, altrimenti il grafico va sotto -->\r\n <div style=\"display: flex; flex-wrap: wrap; gap: 15px; width: 100%; margin-top: 15px;\">\r\n <div style=\"flex: 1 1 520px; min-width: 0; display: flex; flex-direction: column\">\r\n <h5>{{'Prime Istruzioni' | localize: lc}}</h5>\r\n <div *ngIf=\"SelectedTopNodes\">\r\n <es-table [(ngModel)]=\"SelectedTopNodes\" [ArraymodeItemsPerPage]=\"10\">\r\n <ng-template #header>\r\n <th class=\"app-col-min\">{{'Nodo' | localize: lc}}</th>\r\n <th>{{'Descrizione Nodo' | localize: lc}}</th>\r\n <th class=\"app-col-min\">{{'Attività' | localize: lc}}</th>\r\n <th class=\"app-col-min app-nowrap\">{{'Tipo Nodo' | localize: lc}}</th>\r\n <th class=\"app-col-min app-nowrap\">{{'Classe Attesa' | localize: lc}}</th>\r\n </ng-template>\r\n\r\n <ng-template #body let-node>\r\n <td class=\"app-col-min\"><span class=\"app-link\" (click)=\"onNodeSelected.emit(node.profnodeid)\">{{node.profnodeid}}</span></td>\r\n <td><span title=\"{{node.profnodedesc}}\">{{node.profnodedesc?.length > 40 ? node.profnodedesc.substr(0,40) + \"...\" : node.profnodedesc}}</span></td>\r\n <td class=\"app-nowrap\">{{(node.activity == \"NaN\" ? null : node.activity) | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{node.nodetypename}}</td>\r\n <td>{{node.waitclassname}}</td>\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n </div>\r\n <div style=\"flex: 1 1 380px; min-width: 0; display: flex; flex-direction: column\">\r\n <h5>{{'Attività' | localize: lc}}</h5>\r\n <div *ngIf=\"SelectedSessions\" style=\"width: 100%; height: 290px\">\r\n <es-line-chart [MinGridDistance]=\"65\"\r\n [Timeline]=\"false\"\r\n [FinalInstants]=\"false\"\r\n [Stacked]=\"true\"\r\n [LegendPadding]=\"{top: 0, bottom: 7, right: 0, left: 10}\"\r\n [Fill]=\"true\"\r\n [MergeDatasets]=\"true\"\r\n [Data]=\"SelectedSessions\"\r\n [Legend]=\"true\"\r\n name=\"shared_session_details\"\r\n [DataGroupingThreshold]=\"99999999\"\r\n (chartLoaded)=\"onChartLoaded($event)\">\r\n </es-line-chart>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"display: flex; width: 100%;\">\r\n <div style=\"flex-grow: 1;\">\r\n <h5>{{'Statistiche Thread' | localize: lc}}</h5>\r\n <div>\r\n <es-table [(ngModel)]=\"SessionDetails.threads\" [ArraymodeItemsPerPage]=\"10\" [Selection]=\"true\" [SingleSelection]=\"true\" (onSelectionChanged)=\"threadSelectionChanged($event)\">\r\n <ng-template #header>\r\n <th>Thread</th>\r\n <th>{{'Stato' | localize: lc}}</th>\r\n <th>{{'Tipo' | localize: lc}}</th>\r\n <th>API</th>\r\n <th>{{'Attesa corrente' | localize: lc}}</th>\r\n <th>{{'Nodo di attesa' | localize: lc}}</th>\r\n <th>{{'Attesa su' | localize: lc}}</th>\r\n <th>{{'Classe' | localize: lc}}</th>\r\n <th>Par. 1</th>\r\n <th>Par. 2</th>\r\n <th>Par. 3</th>\r\n <th>{{'Tempo Attesa' | localize: lc}}</th>\r\n </ng-template>\r\n\r\n <ng-template #body let-thread>\r\n <td>{{thread.tid}}</td>\r\n <td>{{thread.status}}</td>\r\n <td>{{thread.type}}</td>\r\n <td>{{thread.api}}</td>\r\n <td>{{thread.wait}}</td>\r\n <td>{{thread.waitnode}}</td>\r\n <td>{{thread.waiteventtype}}</td>\r\n <td>{{thread.waitclassname}}</td>\r\n <td>{{thread.waitpar1}}</td>\r\n <td>{{thread.waitpar2}}</td>\r\n <td>{{thread.waitpar3}}</td>\r\n <td>{{(thread.waittime == \"NaN\" ? null : thread.waittime) | number : '1.1-2' : 'it'}}</td>\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"closeDialog()\">{{'Chiudi' | localize: lc}}</button>\r\n </div>\r\n </div>\r\n</div>\r\n","// Angular\r\nimport { Component, NgZone, ViewChild } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\n\r\n// Configurazioni\r\nimport { BaseChartComponent, DateValue, Limit, LineChartData, LineSerie } from \"@esfaenza/es-charts\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { DateService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport * as am5 from \"@amcharts/amcharts5\";\r\nimport { ModalDirective } from \"ngx-bootstrap/modal\";\r\nimport { firstValueFrom } from \"rxjs\";\r\n\r\n// Modelli\r\nimport { DirectorInfos } from \"../../models/components/DirectorInfos\";\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { NodeStats } from \"../../models/components/NodeStats\";\r\nimport { SessionStats } from \"../../models/components/SessionStats\";\r\nimport { TopActivityDataSource, TopActivityDimension, TopActivityMaximumThreads, TopActivityResolution } from \"../../models/components/TopActivityV2Enums\";\r\nimport { TopActivityV2Filter, TopActivityV2Request } from \"../../models/components/TopActivityV2Request\";\r\nimport { TopActivityV2Breakdown, TopActivityV2Response, TopActivityV2Session, TopActivityV2Table, TopActivityV2TableItem } from \"../../models/components/TopActivityV2Response\";\r\n\r\n// Applicazione\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\n\r\n// Localizzazione\r\nimport { AdmTopActivityV2Loc } from \"./topact_v2.component.loc\";\r\n\r\ndeclare var dayjs;\r\n\r\nconst STORAGE_KEY = \"HotSearchTopActV2\";\r\nconst TABLES_WINDOW_MS = 5 * 60 * 1000;\r\nconst INSTANCE_CURRENT = \"@current\";\r\nconst INSTANCE_ALL = \"@all\";\r\n\r\n// WaitClass ed EventType hanno valori fissi: colori fissi, così il grafico si legge sempre allo stesso modo\r\nconst FIXED_COLORS: { [key: string]: string } = {\r\n Cpu: \"#43a047\", Database: \"#1e88e5\", Script: \"#8e24aa\", Network: \"#8d6e63\", IO: \"#00acc1\", Sleep: \"#b0bec5\", Throttle: \"#fb8c00\", Wait: \"#fdd835\",\r\n Latch: \"#e53935\", Semaphore: \"#f06292\", Enqueue: \"#c62828\", ReadWriteLock: \"#ad1457\", Fence: \"#6d4c41\", ConditionVariable: \"#00897b\", Scheduler: \"#5e35b1\"\r\n};\r\nconst PALETTE = [\"#1e88e5\", \"#43a047\", \"#fb8c00\", \"#8e24aa\", \"#e53935\", \"#00897b\", \"#fdd835\", \"#6d4c41\", \"#3949ab\", \"#c0ca33\"];\r\nconst OTHER_COLOR = \"#9e9e9e\";\r\nconst TOTAL_COLOR = \"#263238\";\r\nconst LIMIT_COLOR = \"#e53935\";\r\n\r\nexport class TopActivityV2LegendItem {\r\n key: string;\r\n label: string;\r\n color: string;\r\n other: boolean;\r\n activity: number;\r\n percentage: number;\r\n}\r\n\r\nexport class TopActivityV2FilterChip {\r\n filter: TopActivityV2Filter;\r\n label: string;\r\n}\r\n\r\n// Impostazioni ricordate fra una visita e l'altra (finestra temporale e istanza ripartono sempre dai default)\r\nclass TopActivityV2Settings {\r\n dataSource: string;\r\n dimension: string;\r\n resolution: string;\r\n totalActivity: boolean;\r\n maxCpu: boolean;\r\n maxThreadsKind: string;\r\n tableDims: string[];\r\n filters: TopActivityV2FilterChip[];\r\n}\r\n\r\n@Component({\r\n selector: \"topact_v2\",\r\n providers: [{ provide: LocalizationService, useClass: AdmTopActivityV2Loc }],\r\n templateUrl: \"./topact_v2.component.html\",\r\n styleUrls: [\"./topact_v2.component.scss\"],\r\n standalone: false\r\n})\r\nexport class AdmTopActivityV2Component {\r\n @ViewChild(\"dlgNodeDetails\") dlgNodeDetails: ModalDirective;\r\n @ViewChild(\"dlgSessionDetails\") dlgSessionDetails: ModalDirective;\r\n\r\n public readonly Dim = TopActivityDimension;\r\n public readonly TotalColor = TOTAL_COLOR;\r\n public readonly LimitColor = LIMIT_COLOR;\r\n\r\n // Filtri\r\n public filterfrom: string = \"\";\r\n public filterto: string = \"\";\r\n // Di default tutte le istanze: è il quadro che serve aprendo la pagina, e non viene ricordato fra una visita e l'altra\r\n public instance: string = INSTANCE_ALL;\r\n public dataSource: string = String(TopActivityDataSource.MemoryAndStored);\r\n public dimension: string = String(TopActivityDimension.WaitClass);\r\n public resolution: string = String(TopActivityResolution.Medium);\r\n public totalActivity: boolean = false;\r\n public maxCpu: boolean = true;\r\n public maxThreadsKind: string = String(TopActivityMaximumThreads.Threads);\r\n public tableDims: string[] = [String(TopActivityDimension.UserSession), String(TopActivityDimension.WaitEvent)];\r\n public filters: TopActivityV2FilterChip[] = [];\r\n public refreshSeconds: string = \"0\";\r\n // Ore dell'intervallo rapido scelto (null se le date sono state scritte a mano)\r\n public activeRange: number = 1;\r\n\r\n // Sorgenti di select e pulsanti\r\n public Instances: KeyValue[] = [];\r\n public DataSources: KeyValue[] = [];\r\n public Dimensions: KeyValue[] = [];\r\n public Resolutions: KeyValue[] = [];\r\n public LimitOptions: KeyValue[] = [];\r\n public RefreshOptions: KeyValue[] = [];\r\n public readonly QuickRanges: number[] = [1, 6, 24];\r\n\r\n // Risultato\r\n public loading: boolean = false;\r\n public result: TopActivityV2Response;\r\n public chartData: LineChartData;\r\n public chartMax: number;\r\n public legend: TopActivityV2LegendItem[] = [];\r\n public tables: TopActivityV2Table[] = [];\r\n public memoryFrom: string;\r\n public limitLabel: string;\r\n\r\n // Time slider: fine della finestra di 5 minuti delle tabelle, in millisecondi\r\n public sliderMin: number = 0;\r\n public sliderMax: number = 0;\r\n public sliderStep: number = 1000;\r\n public sliderValue: number = 0;\r\n public sliderAnchored: boolean = true;\r\n public tablesWindowLabel: string = \"\";\r\n\r\n // Dettagli\r\n public DirInfos: DirectorInfos;\r\n public NodeDetails: NodeStats;\r\n public SessionDetails: SessionStats;\r\n\r\n private be: string;\r\n private chartFrom: number = 0;\r\n private chartTo: number = 0;\r\n private colors: { [key: string]: string } = {};\r\n private lastChartKey: string;\r\n private chart: BaseChartComponent<any>;\r\n private windowAxis: any;\r\n private windowRange: any;\r\n private refreshTimer: any;\r\n\r\n constructor(\r\n public dateExts: DateService,\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService,\r\n private zone: NgZone) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.buildSources();\r\n\r\n let saved = this.route.snapshot.queryParams[\"ignoreStorage\"] ? null : await firstValueFrom(this.localStorage.getItem<TopActivityV2Settings>(STORAGE_KEY), { defaultValue: null });\r\n if (saved)\r\n this.applySettings(saved);\r\n\r\n this.setLastHours(this.activeRange);\r\n this.loadInstances();\r\n this.refreshInfos();\r\n this.search();\r\n }\r\n\r\n ngOnDestroy() {\r\n clearInterval(this.refreshTimer);\r\n }\r\n\r\n // #region Ricerca\r\n\r\n searchClicked() {\r\n this.refreshInfos();\r\n this.search();\r\n }\r\n\r\n quickRange(hours: number) {\r\n this.activeRange = hours;\r\n this.setLastHours(hours);\r\n this.search();\r\n }\r\n\r\n datesEdited() {\r\n this.activeRange = null;\r\n }\r\n\r\n setDataSource(id: string) {\r\n this.dataSource = id;\r\n this.search();\r\n }\r\n\r\n setResolution(id: string) {\r\n this.resolution = id;\r\n this.search();\r\n }\r\n\r\n // Limite: \"0\" nessuno, altrimenti il tipo (thread o CPU)\r\n get limitValue(): string {\r\n return this.maxCpu ? this.maxThreadsKind : String(TopActivityMaximumThreads.None);\r\n }\r\n\r\n setLimit(id: string) {\r\n this.maxCpu = +id != TopActivityMaximumThreads.None;\r\n if (this.maxCpu)\r\n this.maxThreadsKind = id;\r\n this.search();\r\n }\r\n\r\n setRefresh(id: string) {\r\n this.refreshSeconds = id;\r\n this.refreshChanged();\r\n }\r\n\r\n async search() {\r\n let req = this.buildRequest();\r\n this.loading = true;\r\n try {\r\n let res = await this.adms.getTopActivitiesV2(this.be, req);\r\n this.applyResult(req, res);\r\n this.saveSettings();\r\n }\r\n catch (err) {\r\n // Finestra non valida e simili arrivano come 542 (avviso), il resto come errore. La sessione scaduta la gestisce il servizio\r\n if (err?.status != 401)\r\n this.showError(err);\r\n }\r\n finally {\r\n this.loading = false;\r\n }\r\n }\r\n\r\n private showError(err: any) {\r\n let text = this.adms.errorText(err);\r\n if (err?.status == 542)\r\n this.adms.msgExts.simpleWarning(text);\r\n else\r\n this.adms.msgExts.simpleError(`${this.lc.loc(\"Errore\")} ${err?.status ?? \"\"}: ${text}`);\r\n }\r\n\r\n private buildRequest(): TopActivityV2Request {\r\n let to = this.toDate(this.filterto) ?? new Date();\r\n let from = this.toDate(this.filterfrom) ?? new Date(to.getTime() - 3600 * 1000);\r\n\r\n let req = new TopActivityV2Request();\r\n req.from = from.toISOString();\r\n req.to = to.toISOString();\r\n req.global = this.instance != INSTANCE_CURRENT;\r\n if (this.instance != INSTANCE_CURRENT && this.instance != INSTANCE_ALL)\r\n req.instanceId = this.instance;\r\n req.dataSource = +this.dataSource;\r\n req.dimension = +this.dimension;\r\n if (this.filters.length > 0)\r\n req.filters = this.filters.map(t => t.filter);\r\n req.totalActivity = this.totalActivity;\r\n req.maximumThreads = this.maxCpu ? +this.maxThreadsKind : TopActivityMaximumThreads.None;\r\n req.resolution = +this.resolution;\r\n req.tables = this.tableDims.map(t => +t);\r\n req.topCount = 10;\r\n\r\n // Lo slider agganciato a destra segue la fine del grafico; spostato resta fermo finché cade dentro la finestra\r\n let outside = this.sliderValue <= from.getTime() || this.sliderValue > to.getTime();\r\n if (this.sliderAnchored || outside) {\r\n this.sliderAnchored = true;\r\n this.sliderValue = to.getTime();\r\n }\r\n req.tablesTo = new Date(this.sliderValue).toISOString();\r\n req.tablesFrom = new Date(Math.max(from.getTime(), this.sliderValue - TABLES_WINDOW_MS)).toISOString();\r\n return req;\r\n }\r\n\r\n private applyResult(req: TopActivityV2Request, res: TopActivityV2Response) {\r\n this.result = res;\r\n this.tables = res?.tables ?? [];\r\n this.chartFrom = new Date(req.from).getTime();\r\n this.chartTo = new Date(req.to).getTime();\r\n\r\n this.sliderStep = Math.max(1, res?.bucketSeconds || 1) * 1000;\r\n this.sliderMin = Math.min(this.chartTo, this.chartFrom + TABLES_WINDOW_MS);\r\n this.sliderMax = this.chartTo;\r\n this.sliderValue = new Date(req.tablesTo).getTime();\r\n this.updateTablesWindowLabel();\r\n\r\n if (!res) {\r\n this.chartData = null;\r\n this.legend = [];\r\n this.lastChartKey = null;\r\n return;\r\n }\r\n\r\n let memoryFrom = res.memoryFrom ? this.parseUtc(res.memoryFrom) : null;\r\n this.memoryFrom = memoryFrom && memoryFrom.getTime() > this.chartFrom ? this.fmt(memoryFrom) : null;\r\n this.limitLabel = this.lc.loc(+this.maxThreadsKind == TopActivityMaximumThreads.Cores ? \"CPU Massime\" : \"Thread Massimi\");\r\n\r\n // Se è cambiata solo la finestra delle tabelle il grafico resta quello di prima: ridisegnarlo lo farebbe lampeggiare\r\n let chartKey = JSON.stringify({ ...req, tablesFrom: null, tablesTo: null, tables: null, topCount: null });\r\n if (chartKey == this.lastChartKey && this.chartData) {\r\n this.drawTablesWindow();\r\n return;\r\n }\r\n this.lastChartKey = chartKey;\r\n\r\n let times = (res.times ?? []).map(t => this.parseUtc(t));\r\n let fixed = res.dimension == TopActivityDimension.WaitClass || res.dimension == TopActivityDimension.EventType;\r\n let uom = this.lc.loc(\"sessioni\");\r\n let series: LineSerie[] = [];\r\n\r\n this.colors = {};\r\n this.legend = (res.components ?? []).map((c, i) => {\r\n let color = c.other ? OTHER_COLOR : (fixed && FIXED_COLORS[c.key]) || PALETTE[i % PALETTE.length];\r\n if (c.key != null)\r\n this.colors[c.key] = color;\r\n let label = this.valueLabel(c.label, c.other, res.dimension);\r\n series.push(new LineSerie(label, times.map((t, j) => new DateValue(t, c.values?.[j] ?? 0)), null, color, uom));\r\n return { key: c.key, label: label, color: color, other: c.other, activity: c.activity, percentage: c.percentage };\r\n });\r\n\r\n // L'attività totale è una linea scura sopra le aree impilate, non impilata a sua volta\r\n if (res.totalActivity)\r\n series.push(new LineSerie(this.lc.loc(\"Attività totale\"), times.map((t, j) => new DateValue(t, res.totalActivity[j] ?? 0)), null, TOTAL_COLOR, uom, false, false));\r\n\r\n let limit: Limit = null;\r\n if (res.maximumThreads != null)\r\n limit = new Limit(res.maximumThreads, this.limitLabel, LIMIT_COLOR);\r\n\r\n // L'asse Y non si allarga da solo per le linee limite: lo allargo solo se l'attività arriva ad almeno un quarto del limite,\r\n // altrimenti con il sistema scarico il grafico diventerebbe una riga piatta sul fondo (il valore del limite resta in legenda)\r\n let peak = Math.max(res.peakActiveSessions ?? 0, ...(res.totalActivity ?? [0]));\r\n this.chartMax = limit && peak >= res.maximumThreads / 4 ? Math.max(peak, res.maximumThreads) * 1.1 : undefined;\r\n this.chartData = series.length > 0 ? new LineChartData(series, limit) : null;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Grafico, legenda e filtri\r\n\r\n onChartLoaded(chart: BaseChartComponent<any>) {\r\n // Il grafico viene ricreato a ogni cambio di dati: l'area della finestra delle tabelle va rifatta\r\n this.chart = chart;\r\n this.windowAxis = null;\r\n this.drawTablesWindow();\r\n }\r\n\r\n private drawTablesWindow() {\r\n let dateAxis = (this.chart?.ChartService as any)?.dateAxis;\r\n if (!dateAxis || !this.sliderMax)\r\n return;\r\n\r\n let end = this.sliderValue;\r\n let start = Math.max(this.chartFrom, end - TABLES_WINDOW_MS);\r\n\r\n this.zone.runOutsideAngular(() => {\r\n if (this.windowAxis !== dateAxis) {\r\n this.windowAxis = dateAxis;\r\n this.windowRange = dateAxis.makeDataItem({ value: start, endValue: end });\r\n dateAxis.createAxisRange(this.windowRange);\r\n this.windowRange.get(\"axisFill\")?.setAll({ fill: am5.color(0x6366f1), fillOpacity: 0.12, visible: true });\r\n this.windowRange.get(\"grid\")?.set(\"forceHidden\", true);\r\n this.windowRange.get(\"label\")?.set(\"forceHidden\", true);\r\n }\r\n else\r\n this.windowRange.setAll({ value: start, endValue: end });\r\n });\r\n }\r\n\r\n addFilter(item: TopActivityV2LegendItem) {\r\n // Il componente \"altri\" non è filtrabile, come in Oracle\r\n if (item.other || !this.result)\r\n return;\r\n\r\n let filter = new TopActivityV2Filter();\r\n filter.dimension = this.result.dimension;\r\n filter.value = item.key ?? \"\";\r\n if (this.filters.some(t => t.filter.dimension == filter.dimension && t.filter.value == filter.value))\r\n return;\r\n\r\n this.filters.push({ filter: filter, label: `${this.dimensionLabel(filter.dimension)} = ${item.label}` });\r\n this.totalActivity = true;\r\n this.search();\r\n }\r\n\r\n removeFilter(index: number) {\r\n this.filters.splice(index, 1);\r\n this.search();\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Time slider e tabelle\r\n\r\n sliderMoving() {\r\n this.updateTablesWindowLabel();\r\n this.drawTablesWindow();\r\n }\r\n\r\n sliderChanged() {\r\n // Il range input arrotonda al passo: \"agganciato\" se è a meno di un passo dalla fine\r\n this.sliderAnchored = this.sliderMax - this.sliderValue < this.sliderStep;\r\n this.search();\r\n }\r\n\r\n private updateTablesWindowLabel() {\r\n if (!this.sliderMax) {\r\n this.tablesWindowLabel = \"\";\r\n return;\r\n }\r\n let start = Math.max(this.chartFrom, this.sliderValue - TABLES_WINDOW_MS);\r\n this.tablesWindowLabel = `${this.fmt(new Date(start))} - ${this.fmt(new Date(this.sliderValue))}`;\r\n }\r\n\r\n isClickable(item: TopActivityV2TableItem): boolean {\r\n return !item.other && (!!item.session || !!item.event?.eventId);\r\n }\r\n\r\n openItem(item: TopActivityV2TableItem) {\r\n if (!this.isClickable(item))\r\n return;\r\n if (item.session)\r\n this.loadSessionDetails(item.session);\r\n else\r\n this.loadNodeDetails(item.event.eventId);\r\n }\r\n\r\n breakdownWidth(item: TopActivityV2TableItem, part: TopActivityV2Breakdown): number {\r\n return item.activity ? part.activity / item.activity * 100 : 0;\r\n }\r\n\r\n breakdownColor(part: TopActivityV2Breakdown): string {\r\n return part.other || part.key == null ? OTHER_COLOR : this.colors[part.key] ?? OTHER_COLOR;\r\n }\r\n\r\n itemLabel(item: TopActivityV2TableItem, table: TopActivityV2Table): string {\r\n return this.valueLabel(item.label, item.other, table.dimension);\r\n }\r\n\r\n loadNodeDetails(nodeId: string) {\r\n this.NodeDetails = null;\r\n this.dlgNodeDetails.show();\r\n requestAnimationFrame(async () => {\r\n this.NodeDetails = await this.adms.getNodeStats(this.be, nodeId, this.instance != INSTANCE_CURRENT);\r\n });\r\n }\r\n\r\n loadSessionDetails(session: TopActivityV2Session) {\r\n this.SessionDetails = null;\r\n this.dlgSessionDetails.show();\r\n requestAnimationFrame(async () => {\r\n this.SessionDetails = await this.adms.getSessionStats(this.be, session.sessionId?.toString(), session.serialNo?.toString(), session.instanceId);\r\n });\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Aggiornamento automatico\r\n\r\n refreshChanged() {\r\n clearInterval(this.refreshTimer);\r\n this.refreshTimer = null;\r\n\r\n let seconds = +this.refreshSeconds;\r\n if (seconds > 0)\r\n this.refreshTimer = setInterval(() => this.shiftWindow(), seconds * 1000);\r\n }\r\n\r\n // Sposta in avanti la finestra della stessa durata: lo slider agganciato la segue, quello spostato resta dov'è\r\n private shiftWindow() {\r\n if (this.loading)\r\n return;\r\n\r\n let to = this.toDate(this.filterto) ?? new Date();\r\n let from = this.toDate(this.filterfrom) ?? new Date(to.getTime() - 3600 * 1000);\r\n let now = new Date();\r\n this.filterfrom = this.fmt(new Date(now.getTime() - (to.getTime() - from.getTime())));\r\n this.filterto = this.fmt(now);\r\n this.search();\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Supporto\r\n\r\n private buildSources() {\r\n this.DataSources = [\r\n new KeyValue(String(TopActivityDataSource.Memory), this.lc.loc(\"Memoria\")),\r\n new KeyValue(String(TopActivityDataSource.MemoryAndStored), this.lc.loc(\"Memoria + storico\"))\r\n ];\r\n this.Dimensions = Object.keys(TopActivityDimension).filter(t => !isNaN(+t)).map(t => new KeyValue(t, this.dimensionLabel(+t)));\r\n this.Resolutions = [\r\n new KeyValue(String(TopActivityResolution.Low), this.lc.loc(\"Bassa\")),\r\n new KeyValue(String(TopActivityResolution.Medium), this.lc.loc(\"Media\")),\r\n new KeyValue(String(TopActivityResolution.High), this.lc.loc(\"Alta\")),\r\n new KeyValue(String(TopActivityResolution.Maximum), this.lc.loc(\"Massima\"))\r\n ];\r\n this.LimitOptions = [\r\n new KeyValue(String(TopActivityMaximumThreads.None), this.lc.loc(\"Nessuno\")),\r\n new KeyValue(String(TopActivityMaximumThreads.Threads), \"Thread\"),\r\n new KeyValue(String(TopActivityMaximumThreads.Cores), \"CPU\")\r\n ];\r\n this.RefreshOptions = [\r\n new KeyValue(\"0\", \"Off\"),\r\n new KeyValue(\"15\", \"15 s\"),\r\n new KeyValue(\"30\", \"30 s\"),\r\n new KeyValue(\"60\", \"60 s\")\r\n ];\r\n this.Instances = [\r\n new KeyValue(INSTANCE_ALL, this.lc.loc(\"Tutte le istanze\")),\r\n new KeyValue(INSTANCE_CURRENT, this.lc.loc(\"Istanza corrente\"))\r\n ];\r\n }\r\n\r\n private async loadInstances() {\r\n try {\r\n let instances = await this.adms.getInstances(this.be);\r\n this.Instances = [...this.Instances.slice(0, 2), ...(instances ?? []).map(t => new KeyValue(t.id, t.description))];\r\n }\r\n catch {\r\n // Senza elenco istanze restano \"corrente\" e \"tutte\"\r\n }\r\n }\r\n\r\n private async refreshInfos() {\r\n // DirectorInfos è facoltativo: se scoppia la pagina va avanti lo stesso\r\n this.DirInfos = await this.adms.getInfos(this.be);\r\n }\r\n\r\n dimensionLabel(dimension: TopActivityDimension): string {\r\n switch (dimension) {\r\n case TopActivityDimension.WaitClass: return this.lc.loc(\"Classe di attesa\");\r\n case TopActivityDimension.EventType: return this.lc.loc(\"Tipo evento\");\r\n case TopActivityDimension.WaitEvent: return this.lc.loc(\"Nodo\");\r\n case TopActivityDimension.Instance: return this.lc.loc(\"Istanza\");\r\n case TopActivityDimension.UserSession: return this.lc.loc(\"Sessione\");\r\n case TopActivityDimension.UserName: return this.lc.loc(\"Utente\");\r\n case TopActivityDimension.Tenant: return this.lc.loc(\"Tenant\");\r\n case TopActivityDimension.SessionType: return this.lc.loc(\"Tipo sessione\");\r\n case TopActivityDimension.BackgroundSession: return this.lc.loc(\"Sessione di background\");\r\n case TopActivityDimension.JobName: return this.lc.loc(\"Job\");\r\n case TopActivityDimension.ConsumerGroup: return this.lc.loc(\"Gruppo di consumo\");\r\n case TopActivityDimension.ThreadType: return this.lc.loc(\"Tipo thread\");\r\n case TopActivityDimension.Api: return \"API\";\r\n case TopActivityDimension.Machine: return this.lc.loc(\"Macchina\");\r\n }\r\n return String(dimension);\r\n }\r\n\r\n private valueLabel(label: string, other: boolean, dimension: TopActivityDimension): string {\r\n if (other)\r\n return this.lc.loc(\"Altri\");\r\n if (label == null || label === \"\")\r\n return this.lc.loc(dimension == TopActivityDimension.WaitEvent ? \"(non attribuito)\" : \"(nessuno)\");\r\n return label;\r\n }\r\n\r\n private applySettings(saved: TopActivityV2Settings) {\r\n this.dataSource = saved.dataSource ?? this.dataSource;\r\n this.dimension = saved.dimension ?? this.dimension;\r\n this.resolution = saved.resolution ?? this.resolution;\r\n this.totalActivity = saved.totalActivity ?? this.totalActivity;\r\n this.maxCpu = saved.maxCpu ?? this.maxCpu;\r\n this.maxThreadsKind = saved.maxThreadsKind ?? this.maxThreadsKind;\r\n this.tableDims = saved.tableDims?.length == 2 ? saved.tableDims : this.tableDims;\r\n // Filtri salvati con i nomi delle prime versioni (PascalCase) non sono più validi\r\n this.filters = (saved.filters ?? []).filter(t => t?.filter?.dimension != null);\r\n }\r\n\r\n private saveSettings() {\r\n let settings: TopActivityV2Settings = {\r\n dataSource: this.dataSource,\r\n dimension: this.dimension,\r\n resolution: this.resolution,\r\n totalActivity: this.totalActivity,\r\n maxCpu: this.maxCpu,\r\n maxThreadsKind: this.maxThreadsKind,\r\n tableDims: this.tableDims,\r\n filters: this.filters\r\n };\r\n this.localStorage.setItem(STORAGE_KEY, settings).subscribe();\r\n }\r\n\r\n private setLastHours(hours: number) {\r\n let now = new Date();\r\n this.filterfrom = this.fmt(new Date(now.getTime() - hours * 3600 * 1000));\r\n this.filterto = this.fmt(now);\r\n }\r\n\r\n private toDate(value: string): Date {\r\n return value ? this.dateExts.getDateConvertion(value).toDate() : null;\r\n }\r\n\r\n private fmt(date: Date): string {\r\n return dayjs(date).format(this.lc.token(\"getFullDateDisplayFormat\"));\r\n }\r\n\r\n // Le date della risposta sono UTC \"dd/MM/yyyy HH:mm:ss\" senza fuso\r\n private parseUtc(value: string): Date {\r\n let m = /^(\\d{2})\\/(\\d{2})\\/(\\d{4}) (\\d{2}):(\\d{2}):(\\d{2})$/.exec(value ?? \"\");\r\n return m ? new Date(Date.UTC(+m[3], +m[2] - 1, +m[1], +m[4], +m[5], +m[6])) : new Date(value);\r\n }\r\n\r\n // #endregion\r\n}\r\n","<div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"card app-overflow-visible\" widget>\r\n <div class=\"card-header\">\r\n <span class=\"text-uppercase\">\r\n {{'Attività Principali' | localize: lc}}\r\n @if (DirInfos) {\r\n <span> - \r\n {{'' + DirInfos.cpus + ' ' + ('CPU' | localize: lc) + (DirInfos.rssplan ? ' - ' + DirInfos.rssplan : '')}} \r\n Load average: {{ DirInfos.lavg1 | number : '1.1-2' : 'it'}} {{ DirInfos.lavg5 | number : '1.1-2' : 'it'}} {{ DirInfos.lavg15 | number : '1.1-2' : 'it'}}\r\n </span>\r\n }\r\n </span>\r\n </div>\r\n <div class=\"card-body widget-body\">\r\n <!-- Barra in alto: quali dati caricare (finestra, istanza, origine). Come disegnarli sta nell'intestazione del grafico -->\r\n <form role=\"form\">\r\n <!-- Tre gruppi che vanno a capo interi: periodo, sorgente (con la ricerca), aggiornamento automatico -->\r\n <div class=\"tav2-toolbar\">\r\n <div class=\"tav2-cluster\">\r\n <div class=\"tav2-field\">\r\n <form-datetime [readonly]=\"refreshSeconds != '0'\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterfrom\" name=\"filterfrom\" [Placeholder]=\"'Da' | localize: lc\" (inputChange)=\"datesEdited()\"></form-datetime>\r\n </div>\r\n <div class=\"tav2-field\">\r\n <form-datetime [readonly]=\"refreshSeconds != '0'\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterto\" name=\"filterto\" [Placeholder]=\"'A' | localize: lc\" (inputChange)=\"datesEdited()\"></form-datetime>\r\n </div>\r\n <div class=\"tav2-group\">\r\n <span class=\"tav2-group-label\">{{'Ultime' | localize: lc}}</span>\r\n <div class=\"tav2-seg\">\r\n @for (h of QuickRanges; track h) {\r\n <button type=\"button\" [class.tav2-on]=\"activeRange == h\" (click)=\"quickRange(h)\">{{h}} h</button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tav2-cluster\">\r\n <div class=\"tav2-field tav2-field-wide tav2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"instance\" name=\"instance\" [Source]=\"Instances\" [Placeholder]=\"'Istanza' | localize: lc\" (inputChange)=\"search()\"></form-select>\r\n </div>\r\n <div class=\"tav2-group\">\r\n <span class=\"tav2-group-label\">{{'Origine dati' | localize: lc}}</span>\r\n <div class=\"tav2-seg\">\r\n @for (o of DataSources; track o.id) {\r\n <button type=\"button\" [class.tav2-on]=\"dataSource == o.id\" (click)=\"setDataSource(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n <button [disabled]=\"loading || refreshSeconds != '0'\" class=\"btn app-btn-search\" (click)=\"searchClicked()\" type=\"submit\" [title]=\"'Cerca' | localize: lc\">\r\n <i class=\"fa\" [class.fa-search]=\"!loading\" [class.fa-spinner]=\"loading\" [class.fa-spin]=\"loading\"></i>\r\n </button>\r\n </div>\r\n\r\n <div class=\"tav2-cluster tav2-cluster-end\">\r\n <div class=\"tav2-group\">\r\n <span class=\"tav2-group-label\"><i class=\"fa fa-refresh\"></i> {{'Aggiornamento automatico' | localize: lc}}</span>\r\n <div class=\"tav2-seg\">\r\n @for (o of RefreshOptions; track o.id) {\r\n <button type=\"button\" [class.tav2-on]=\"refreshSeconds == o.id\" (click)=\"setRefresh(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!-- Grafico -->\r\n <div class=\"tav2-panel\">\r\n <div class=\"tav2-panel-header tav2-chart-header\">\r\n <div class=\"tav2-heading\">\r\n <span class=\"tav2-title\">{{'Sessioni attive medie per' | localize: lc}} {{dimensionLabel(result?.dimension ?? +dimension) | lowercase}}</span>\r\n @if (result) {\r\n <span class=\"tav2-muted\">\r\n {{'Media' | localize: lc}} <strong>{{result.estimated ? '≈ ' : ''}}{{result.averageActiveSessions | number : '1.2-3' : 'it'}}</strong>\r\n · {{'Picco' | localize: lc}} <strong>{{result.estimated ? '≈ ' : ''}}{{result.peakActiveSessions | number : '1.2-3' : 'it'}}</strong>\r\n · {{'un punto ogni' | localize: lc}} {{result.bucketSeconds}} s\r\n @if (result.estimated) {\r\n <span class=\"tav2-estimate\" [title]=\"'Valori stimati contando i campioni, come in Oracle, invece che misurati' | localize: lc\">{{'stima per campionamento' | localize: lc}}</span>\r\n }\r\n @if (loading) {\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n }\r\n </span>\r\n }\r\n </div>\r\n\r\n <!-- Come disegnare i dati -->\r\n <div class=\"tav2-view-controls\">\r\n <div class=\"tav2-field tav2-field-wide tav2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"dimension\" name=\"dimension\" [Source]=\"Dimensions\" [Placeholder]=\"'Dividi per' | localize: lc\" (inputChange)=\"search()\"></form-select>\r\n </div>\r\n <div class=\"tav2-group\">\r\n <span class=\"tav2-group-label\">{{'Risoluzione' | localize: lc}}</span>\r\n <div class=\"tav2-seg\">\r\n @for (o of Resolutions; track o.id) {\r\n <button type=\"button\" [class.tav2-on]=\"resolution == o.id\" (click)=\"setResolution(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"tav2-group\">\r\n <span class=\"tav2-group-label\">{{'Limite' | localize: lc}}</span>\r\n <div class=\"tav2-seg\">\r\n @for (o of LimitOptions; track o.id) {\r\n <button type=\"button\" [class.tav2-on]=\"limitValue == o.id\" (click)=\"setLimit(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"tav2-toggle\">\r\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"totalActivity\" (inputChange)=\"search()\"></form-checkbox>\r\n <span class=\"tav2-pointer\" (click)=\"totalActivity = !totalActivity; search()\">{{'Attività totale' | localize: lc}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (filters.length > 0) {\r\n <div class=\"tav2-chips\">\r\n <span class=\"tav2-muted\">{{'Filtri' | localize: lc}}</span>\r\n @for (chip of filters; track $index) {\r\n <span class=\"tav2-chip\">\r\n {{chip.label}}\r\n <button type=\"button\" [title]=\"'Rimuovi' | localize: lc\" (click)=\"removeFilter($index)\">×</button>\r\n </span>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"tav2-chart\">\r\n @if (chartData) {\r\n <es-line-chart [MinGridDistance]=\"65\"\r\n [Timeline]=\"false\"\r\n [FinalInstants]=\"false\"\r\n [Stacked]=\"true\"\r\n [Step]=\"true\"\r\n [Fill]=\"true\"\r\n [MergeDatasets]=\"true\"\r\n [Data]=\"chartData\"\r\n [Max]=\"chartMax\"\r\n [Legend]=\"false\"\r\n name=\"topactv2\"\r\n [DataGroupingThreshold]=\"99999999\"\r\n (chartLoaded)=\"onChartLoaded($event)\"></es-line-chart>\r\n } @else {\r\n <div class=\"tav2-empty\">{{(loading ? 'Carico i Dati' : 'Nessun dato nella finestra') | localize: lc}}</div>\r\n }\r\n </div>\r\n\r\n <!-- Legenda: un clic su una voce la aggiunge ai filtri (\"altri\" non è filtrabile) -->\r\n @if (legend.length > 0) {\r\n <div class=\"tav2-legend\">\r\n @for (item of legend; track $index) {\r\n <span class=\"tav2-legend-item\" [class.tav2-clickable]=\"!item.other\" [title]=\"item.other ? '' : ('Clic per filtrare' | localize: lc)\" (click)=\"addFilter(item)\">\r\n <span class=\"tav2-swatch\" [style.background]=\"item.color\"></span>\r\n {{item.label}}\r\n <span class=\"tav2-muted\">{{item.percentage | number : '1.0-1' : 'it'}}%</span>\r\n </span>\r\n }\r\n @if (result?.totalActivity) {\r\n <span class=\"tav2-legend-item\">\r\n <span class=\"tav2-line\" [style.border-color]=\"TotalColor\"></span>\r\n {{'Attività totale' | localize: lc}}\r\n </span>\r\n }\r\n @if (result?.maximumThreads != null) {\r\n <span class=\"tav2-legend-item\">\r\n <span class=\"tav2-line\" [style.border-color]=\"LimitColor\"></span>\r\n {{limitLabel}} <strong>{{result.maximumThreads}}</strong>\r\n </span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (memoryFrom) {\r\n <div class=\"tav2-note\">\r\n <i class=\"fa fa-info-circle\"></i>\r\n {{'Prima di questo istante i dati vengono dallo storico (un campione ogni 10 secondi)' | localize: lc}}: {{memoryFrom}}\r\n </div>\r\n }\r\n\r\n <!-- Time slider: finestra di 5 minuti per le tabelle -->\r\n @if (sliderMax > sliderMin) {\r\n <div class=\"tav2-slider\">\r\n <span class=\"tav2-slider-label\">\r\n <span class=\"tav2-muted\">{{'Finestra tabelle' | localize: lc}}</span>\r\n <strong>{{tablesWindowLabel}}</strong>\r\n </span>\r\n <input type=\"range\" [min]=\"sliderMin\" [max]=\"sliderMax\" [step]=\"sliderStep\" [ngModel]=\"sliderValue\" (ngModelChange)=\"sliderValue = $event; sliderMoving()\" (change)=\"sliderChanged()\" />\r\n <span class=\"tav2-badge\" [class.tav2-badge-off]=\"!sliderAnchored\">{{(sliderAnchored ? 'Ultimi 5 minuti' : 'Finestra fissa') | localize: lc}}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Tabelle -->\r\n <div class=\"tav2-tables\">\r\n @for (table of tables; track $index; let i = $index) {\r\n <div class=\"tav2-panel\">\r\n <div class=\"tav2-panel-header\">\r\n <span class=\"tav2-title\">{{'Prime righe per' | localize: lc}}</span>\r\n <div class=\"tav2-field tav2-field-wide tav2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"tableDims[i]\" name=\"tabledim{{i}}\" [Source]=\"Dimensions\" (inputChange)=\"search()\"></form-select>\r\n </div>\r\n <span class=\"tav2-muted\">{{'Attività' | localize: lc}} <strong>{{table.estimated ? '≈ ' : ''}}{{table.activity | number : '1.2-3' : 'it'}}</strong></span>\r\n @if (table.estimated) {\r\n <span class=\"tav2-estimate\" [title]=\"'Stima contando i campioni: il totale può differire di poco da quello misurato delle sessioni' | localize: lc\">{{'stima per campionamento' | localize: lc}}</span>\r\n }\r\n </div>\r\n <es-table [(ngModel)]=\"table.items\" [HidePaging]=\"true\">\r\n <ng-template #header>\r\n <th>{{dimensionLabel(table.dimension)}}</th>\r\n <th class=\"app-col-min\">{{'Attività' | localize: lc}}</th>\r\n <th class=\"app-col-min tav2-right\">%</th>\r\n @if (table.dimension == Dim.UserSession) {\r\n <th>{{'Utente' | localize: lc}}</th>\r\n <th>{{'Tipo' | localize: lc}}</th>\r\n <th>{{'Processo' | localize: lc}}</th>\r\n }\r\n @if (table.dimension == Dim.WaitEvent) {\r\n <th class=\"app-col-min app-nowrap\">{{'Tipo' | localize: lc}}</th>\r\n }\r\n </ng-template>\r\n <ng-template #body let-item>\r\n <td>\r\n @if (isClickable(item)) {\r\n <span class=\"app-link tav2-ellipsis\" [title]=\"item.label || item.key\" (click)=\"openItem(item)\">{{itemLabel(item, table)}}</span>\r\n } @else {\r\n <span class=\"tav2-ellipsis\" [class.tav2-muted]=\"item.other || !item.label\">{{itemLabel(item, table)}}</span>\r\n }\r\n </td>\r\n <td class=\"app-nowrap\">\r\n <div class=\"tav2-bar-cell\">\r\n <div class=\"tav2-bar\">\r\n @for (part of item.breakdown; track $index) {\r\n <div [style.width.%]=\"breakdownWidth(item, part)\" [style.background]=\"breakdownColor(part)\" [title]=\"part.key\"></div>\r\n }\r\n </div>\r\n <span>{{table.estimated ? '≈ ' : ''}}{{item.activity | number : '1.2-3' : 'it'}}</span>\r\n </div>\r\n </td>\r\n <td class=\"app-nowrap tav2-right\">{{item.percentage | number : '1.1-1' : 'it'}}</td>\r\n @if (table.dimension == Dim.UserSession) {\r\n <td class=\"app-nowrap\">\r\n {{item.session?.userName}}\r\n @if (item.session?.tenantId) {\r\n <span class=\"tav2-muted\">· {{item.session.tenantId}}</span>\r\n }\r\n </td>\r\n <td class=\"tav2-muted\">{{item.session?.sessionType | titlecase}}</td>\r\n <td><span class=\"tav2-ellipsis tav2-ellipsis-short\" [title]=\"item.session?.bgProcessName || item.session?.jobName || ''\">{{item.session?.bgProcessName || item.session?.jobName}}</span></td>\r\n }\r\n @if (table.dimension == Dim.WaitEvent) {\r\n <td class=\"app-nowrap\">\r\n {{item.event?.eventType}}\r\n @if (item.event?.waitClass && item.event.waitClass != 'None') {\r\n <span class=\"tav2-muted\">· {{item.event.waitClass}}</span>\r\n }\r\n </td>\r\n }\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div bsModal #dlgNodeDetails=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n @if (NodeDetails) {\r\n <node-detail [NodeDetails]=\"NodeDetails\" (onClose)=\"dlgNodeDetails.hide()\"></node-detail>\r\n }\r\n</div>\r\n\r\n<div bsModal #dlgSessionDetails=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n @if (SessionDetails) {\r\n <session-detail [SessionDetails]=\"SessionDetails\" (onClose)=\"dlgSessionDetails.hide()\" (onNodeSelected)=\"loadNodeDetails($event)\"></session-detail>\r\n }\r\n</div>\r\n","import { AppSearch, GenericItem } from \"@esfaenza/es-table\";\r\n\r\nexport class LocksView extends AppSearch<GenericItem>{\r\n constructor() { super(); }\r\n\r\n filtersid: string;\r\n filterlock: string;\r\n filterglobal: boolean;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmEnqLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Ricerca Lock Applicativi\", [\"Search Application Locks\"]);\r\n super.set(\"it->en\", \"Nome\", [\"Name\"]);\r\n super.set(\"it->en\", \"Carico i Lock Applicativi\", [\"Loading Application Locks\"]);\r\n super.set(\"it->en\", \"Globale\", [\"Global\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { ExportService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Applicazione\r\nimport { LocksView } from \"../../models/components/LocksView\";\r\nimport { ADM_MODULE_PATH } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmEnqLoc } from \"./adm_enq.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { GenericItem } from \"@esfaenza/core/domain\";\r\n\r\n@Component({\r\n selector: \"adm_enq\",\r\n viewProviders: [{ provide: LocalizationService, useClass: AdmEnqLoc }],\r\n templateUrl: \"./adm_enq.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmEnqComponent {\r\n public locksView: LocksView = new LocksView();\r\n public storageSub: any;\r\n private be: string;\r\n\r\n constructor(\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n public expExts: ExportService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private location: Location,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n ngOnInit() {\r\n this.storageSub = this.route.queryParams.subscribe(params => { this.Init(params[\"ignoreStorage\"]); });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n async Init(ignoreStorage) {\r\n let item = await this.localStorage.getItem<LocksView>(\"HotEnqueue\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/serverenqueues`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotEnqueue\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: LocksView) {\r\n if (HotPotato) {\r\n this.locksView = HotPotato;\r\n this.POSTGetProcesses(this.locksView);\r\n }\r\n else {\r\n this.locksView = new LocksView();\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n if (resetPage)\r\n this.locksView.page = 1;\r\n\r\n this.POSTGetProcesses(this.locksView);\r\n }\r\n\r\n async POSTGetProcesses(data: LocksView) {\r\n this.locksView = await this.adms.getServerLocks(this.be, data);\r\n this.locksView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotEnqueue\", this.locksView).subscribe();\r\n }\r\n\r\n async prepareExport(callback) {\r\n var view = JSON.parse(JSON.stringify(this.locksView));\r\n view.page = 1;\r\n view.itemsperpageoverride = 9999999;\r\n let tmp = await this.adms.getServerLocks(this.be, view);\r\n callback(tmp.items, GenericItem);\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Ricerca Lock Applicativi' | localize: lc}}</span>\n </div>\n <div class=\"card-body widget-body\">\n <form role=\"form\">\n <div class=\"col-md-12 row app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"locksView.filtersid\" name=\"filtersid\" [Placeholder]=\"'SID'\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"locksView.filterlock\" name=\"filterlock\" [Placeholder]=\"'Nome' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"locksView.filterglobal\" name=\"filterglobal\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"locksView.filterglobal = !locksView.filterglobal\">{{'Globale' | localize: lc}}</span>\n </div>\n <button class=\"input-group-addon btn app-btn-search app-margin-top-20\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n </form>\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!locksView) {\n <p><em>{{'Carico i Lock Applicativi' | localize: lc}}...</em></p>\n }\n @if (locksView) {\n <div>\n <es-table [(ngModel)]=\"locksView\" [AutoUpdate]=\"true\" [OrderByColumn]=\"true\" (onSearchRequest)=\"sendSearch($event);\"\n [ExportFileName]=\"'Application Locks.csv'\" [ExportFunction]=\"prepareExport.bind(this)\" [Export]=\"true\"></es-table>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>","import { AppSearch } from \"@esfaenza/es-table\";\r\nimport { Metric } from \"./Metric\";\r\n\r\nexport class MetricsView extends AppSearch<Metric> {\r\n constructor() { super(); }\r\n\r\n filterfrom: string;\r\n filterto: string;\r\n filtersid: string;\r\n filterserial: string;\r\n filtermetrics: string[];\r\n filterrealtime: boolean;\r\n fitlerinstance: string;\r\n filterglobal: boolean;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmMetricsLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Metriche di Sistema\", [\"System Metrics\"]);\r\n super.set(\"it->en\", \"Cod. Sessione\", [\"Session ID\"]);\r\n super.set(\"it->en\", \"Seriale Sessione\", [\"Session Serial\"]);\r\n super.set(\"it->en\", \"Filtra Metriche...\", [\"Filter Metrics...\"]);\r\n super.set(\"it->en\", \"Carico i Dati\", [\"Loading Data\"]);\r\n super.set(\"it->en\", \"Aggiorna ogni\", [\"Update every\"]);\r\n super.set(\"it->en\", \"secondo/i\", [\"second/s\"]);\r\n super.set(\"it->en\", \"Istanza Metriche\", [\"Metrics Instance\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { BaseChartComponent } from \"@esfaenza/es-charts\";\r\nimport { DateService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Applicazione\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { Metric } from \"../../models/components/Metric\";\r\nimport { MetricChart } from \"../../models/components/MetricChart\";\r\nimport { MetricsView } from \"../../models/components/MetricsView\";\r\nimport { ADM_MODULE_PATH } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmMetricsLoc } from \"./metrics_search.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\n\r\ndeclare var dayjs;\r\n\r\n@Component({\r\n selector: \"metrics_search\",\r\n providers: [{ provide: LocalizationService, useClass: AdmMetricsLoc }],\r\n templateUrl: \"./metrics_search.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmMetricsComponent {\r\n\r\n public Metrics: Metric[];\r\n private MetricsChartCache: { [name: string]: { chart: BaseChartComponent<any>, lastTs: Date } } = {};\r\n\r\n public searchView: MetricsView = new MetricsView();\r\n public storageSub: any;\r\n\r\n public autoUpdate: boolean = false;\r\n public seconds: string = \"5\";\r\n private be: string;\r\n\r\n constructor(\r\n public dateExts: DateService,\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private location: Location,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n ngOnInit() {\r\n this.storageSub = this.route.queryParams.subscribe(params => {\r\n this.Init(params[\"ignoreStorage\"]);\r\n });\r\n }\r\n\r\n Init(ignoreStore) {\r\n this.doInit(ignoreStore);\r\n }\r\n\r\n async dateChanged() {\r\n // Pulizia di tutti i parametri di ricerca dipendenti dalle date\r\n this.metricsToShow = [];\r\n this.Metrics = [];\r\n this.instanceRequired = false;\r\n this.Instances = [];\r\n this.selectedInstance = \"\";\r\n this.searchView.filtermetrics = [];\r\n\r\n this.Metrics = await this.adms.getMetricsList(this.be, this.searchView.filterfrom || \"\", this.searchView.filterto || \"\");\r\n }\r\n\r\n async doInit(ignoreStorage) {\r\n let item = await this.localStorage.getItem<MetricsView>(\"HotSearchMetrics\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/metrics`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotSearchMetrics\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: MetricsView) {\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetItems(this.searchView, false);\r\n }\r\n else {\r\n this.searchView = new MetricsView();\r\n this.sendSearch();\r\n }\r\n this.dateChanged();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n sendSearch(resetPage: boolean = true, update: boolean = false, searchViewOverride: MetricsView = null) {\r\n if (!update)\r\n this.MetricsChartCache = {};\r\n\r\n this.searchView.searchinprogress = true;\r\n // Questa ricerca prende i nomi distinct delle metriche quindi devo prendere tutto per forza\r\n this.searchView.itemsperpageoverride = 999999;\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n this.POSTGetItems(searchViewOverride ?? this.searchView, update);\r\n }\r\n\r\n public Instances: KeyValue[] = []\r\n public selectedInstance = \"\";\r\n public instanceRequired: boolean = false;\r\n public metricsToShow: Metric[] = [];\r\n\r\n async POSTGetItems(data: MetricsView, update: boolean) {\r\n data.filterrealtime = update ? data.filterrealtime : !(!!data.filterfrom || !!data.filterto);\r\n\r\n let res = await this.adms.getMetrics(this.be, data);\r\n //Se sono in modalità di update non devo toccare la searchView attuale se non per il searchinprogress che viene messo dall'es table\r\n if (!update) {\r\n this.selectedInstance = \"\";\r\n this.metricsToShow = [];\r\n this.searchView = res;\r\n this.searchView.items.forEach(m => {\r\n if (m.instance && !this.Instances.find(t => t.id == m.instance))\r\n this.Instances.push(new KeyValue(m.instance, m.instance));\r\n });\r\n this.instanceRequired = this.Instances.length > 1;\r\n if (this.Instances.length == 1) {\r\n this.selectedInstance = this.Instances[0].id;\r\n this.instanceSelected();\r\n }\r\n else\r\n this.instanceSelected(true);\r\n this.localStorage.setItem(\"HotSearchMetrics\", this.searchView).subscribe();\r\n }\r\n else {\r\n // Per ogni grafico di ogni metrica aggiungo tutti i valori che sono DOPO all'ultimo ts registrato per quel grafico\r\n res.items.forEach(m => {\r\n m.values.forEach(c => {\r\n let refm = this.MetricsChartCache[this.metricKey(m, c)];\r\n if (refm) {\r\n c.series.forEach(s => { s.values = s.values.filter(v => this.dateExts.getDateConvertion(v.d).isAfter(refm.lastTs)); });\r\n if (c.series.some(t => t.values.length > 0)) {\r\n refm.lastTs = c.series.map(t => dayjs.max(t.values.map(v => this.dateExts.getDateConvertion(v.d))))[0];\r\n refm.chart.addData(c);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n this.searchView.searchinprogress = false;\r\n }\r\n\r\n instanceSelected(allowNull: boolean = false) {\r\n if (!this.selectedInstance && !allowNull)\r\n return;\r\n\r\n this.metricsToShow = this.searchView.items.filter(t => !this.selectedInstance || (t.instance == this.selectedInstance));\r\n }\r\n\r\n linkChartToMetric(metric: Metric, metricChart: MetricChart, chartComp: BaseChartComponent<any>) {\r\n this.MetricsChartCache[this.metricKey(metric, metricChart)] = { chart: chartComp, lastTs: metricChart.series.map(t => dayjs.max(t.values.map(v => this.dateExts.getDateConvertion(v.d))))[0] };\r\n }\r\n\r\n private metricKey(metric: Metric, value: MetricChart): string {\r\n return metric.name + \" - \" + value.xtitle + (metric.instance ? \" - \" + metric.instance : \"\");\r\n }\r\n\r\n // #region Gestione update automatico\r\n updateTimer: any;\r\n autoUpdateChanged() {\r\n if (!/^[1-9]\\d*$/.test(this.seconds))\r\n this.seconds = '10';\r\n const secondsInMs = parseInt(this.seconds, null) * 1000;\r\n if (this.autoUpdate) {\r\n this.sendSearch(false, true);\r\n this.updateTimer = setInterval(() => { this.sendSearch(false, true); }, secondsInMs);\r\n }\r\n else\r\n clearInterval(this.updateTimer);\r\n }\r\n // #endregion\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">\n {{'Metriche di Sistema' | localize: lc}}\n </span>\n </div>\n <div class=\"card-body widget-body\">\n <div class=\"col-md-12\">\n <form role=\"form\">\n <div class=\"row\">\n <div class=\"col-md-11\">\n <div class=\"col-md-12 row app-no-padding app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-datetime [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterfrom\" name=\"filterfrom\" [Placeholder]=\"'Da' | localize: lc\" (inputChange)=\"dateChanged();\"></form-datetime>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-datetime [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterto\" name=\"filterto\" [Placeholder]=\"'A' | localize: lc\" (inputChange)=\"dateChanged();\"></form-datetime>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtersid\" name=\"filtersid\" [Placeholder]=\"'Cod. Sessione' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterserial\" name=\"filterserial\" [Placeholder]=\"'Seriale Sessione' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterglobal\" name=\"filterglobal\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterglobal = !searchView.filterglobal\">{{'Globale' | localize: lc}}</span>\n </div>\n </div>\n <div class=\"col-md-12 row app-no-padding\">\n <div class=\"col-12 app-filter-wrapper\">\n <form-multiselect [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtermetrics\" [IdField]=\"'name'\" [Display]=\"'{name}'\" name=\"filtermetrics\" [Placeholder]=\"'Filtra Metriche...' | localize: lc\" [Source]=\"Metrics\"></form-multiselect>\n </div>\n </div>\n <div class=\"clearfix\"></div>\n </div>\n <div class=\"col-md-1 app-no-padding\">\n <button [disabled]=\"searchView.searchinprogress || autoUpdate\" class=\"input-group-addon btn app-btn-search\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n <div class=\"clearfix\"></div>\n </div>\n </form>\n <div class=\"app-col-12 app-margin-top-15\">\n <div class=\"pull-right\">\n {{'Aggiorna ogni' | localize: lc}} <input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control app-updevery-input\" type=\"text\" [(ngModel)]=\"seconds\" name=\"seconds\" /> {{'secondo/i' | localize: lc}}\n </div>\n <div class=\"pull-right m-t-2 app-margin-right-5\">\n <label class=\"switch\">\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" name=\"autoUpdate\" (ngModelChange)=\"autoUpdateChanged();\" />\n <div class=\"slider round\"></div>\n </label>\n </div>\n <div class=\"clearfix\"></div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!searchView) {\n <p><em>{{'Carico i Dati' | localize: lc}}</em></p>\n }\n @if (searchView && instanceRequired) {\n <div>\n <form-select [Validation]=\"false\" [Label]=\"'Istanza Metriche' | localize: lc\" [(ngModel)]=\"selectedInstance\" name=\"instance\" [Source]=\"Instances\" (inputChange)=\"instanceSelected()\" required></form-select>\n </div>\n }\n @if (searchView && metricsToShow && metricsToShow.length > 0) {\n <div>\n <div class=\"col-md-12 app-padding-right-0 row app-margin-top-15\">\n @for (metric of metricsToShow; track metric; let i = $index) {\n @for (chart of metric.values; track chart; let z = $index) {\n <div class=\"col-md-4 app-no-padding app-simple-border\">\n <div style=\"width: 100%; height: 260px\">\n <es-line-chart [XTitle]=\"chart.xtitle\"\n [YTitle]=\"chart.ytitle\"\n [MinGridDistance]=\"65\"\n [Timeline]=\"false\"\n [LegendPadding]=\"{top: 0, bottom: 7, right: 0, left: 10}\"\n [MergeDatasets]=\"true\"\n [Data]=\"chart\"\n [Animations]=\"true\"\n [Legend]=\"chart.legend\"\n name=\"metric_{{i}}_chart_{{z}}\"\n (chartLoaded)=\"linkChartToMetric(metric, chart, $event);\"\n [DataGroupingThreshold]=\"99999999\">\n </es-line-chart>\n </div>\n </div>\n }\n }\n </div>\n <div class=\"clearfix\"></div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmLogsLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Log del Server\", [\"Server Logs\"]);\r\n }\r\n}","// Angular\r\nimport { Component } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Localizzazione\r\nimport { AdmLogsLoc } from \"./adm_logs.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\n\r\n@Component({\r\n selector: \"adm_logs\",\r\n viewProviders: [{ provide: LocalizationService, useClass: AdmLogsLoc }],\r\n templateUrl: \"./adm_logs.component.html\",\r\n styleUrls: [\"./adm_logs.component.scss\"],\r\n standalone: false\r\n})\r\nexport class AdmLogsComponent {\r\n public Log: string;\r\n\r\n public filterfrom: string = \"\";\r\n public filterto: string = \"\";\r\n public filterinstance: string = \"\";\r\n public filtertarget: string = \"\";\r\n\r\n public searchinprogress: boolean;\r\n private be: string;\r\n\r\n public AvailableInstances: KeyValue[];\r\n public AvailableTargets: KeyValue[];\r\n\r\n constructor(\r\n private intercom: InterComService,\r\n private lc: LocalizationService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.instanceChanged();\r\n this.AvailableInstances = await this.adms.getInstances(this.be);\r\n\r\n await this.sendSearch();\r\n }\r\n\r\n async instanceChanged(){\r\n this.AvailableTargets = await this.adms.getLogTargets(this.be, this.filterinstance);\r\n }\r\n\r\n async sendSearch(){\r\n this.searchinprogress = true;\r\n this.Log = await this.adms.getServerLogs(this.be, this.filterfrom, this.filterto, this.filterinstance, this.filtertarget);\r\n this.searchinprogress = false;\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12 bottom-15\">\n <form role=\"form\">\n <div class=\"row app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-date [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterfrom\" name=\"filterfrom\" [Placeholder]=\"'Da'\"></form-date>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-date [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterto\" name=\"filterto\" [Placeholder]=\"'A'\"></form-date>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterinstance\" name=\"filterinstance\" [Placeholder]=\"'Istanza'\" [Source]=\"AvailableInstances\" (inputChange)=\"instanceChanged();\"></form-select>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filtertarget\" name=\"filtertarget\" [Placeholder]=\"'Target'\" [Source]=\"AvailableTargets\"></form-select>\n </div>\n <button [disabled]=\"searchinprogress\" class=\"input-group-addon btn app-btn-search app-margin-top-20 app-margin-right-5\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n </form>\n </div>\n @if (Log) {\n <p class=\"app-whitespace-prewrap app-log-monospace\" [innerHTML]=\"Log\"></p>\n }\n\n</div>","import { AppSearch, GenericItem } from \"@esfaenza/es-table\";\r\n\r\nexport class DynamicViewsView extends AppSearch<GenericItem> {\r\n constructor() { super(); }\r\n\r\n filtername: string;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmDynamicViewsLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Ricerca Viste Dinamiche Applicative\", [\"Search Application Dynamic Views\"]);\r\n super.set(\"it->en\", \"Nome\", [\"Name\"]);\r\n super.set(\"it->en\", \"Carico le Viste Dinamiche Applicative\", [\"Loading Application Dynamic Views\"]);\r\n super.set(\"it->en\", \"Il nome della vista è obbligatorio per le operazioni di ricerca\", [\"View Name is mandatory for search operations\"]);\r\n super.set(\"it->en\", \"Nessun elemento trovato per la vista dinamica\", [\"No element found for Dynamic View\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\nimport { AppSearch } from \"@esfaenza/es-table\";\r\n\r\n// Applicazione\r\nimport { DynamicViewsView } from \"../../models/components/DynamicViewsView\";\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { ADM_MODULE_PATH } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmDynamicViewsLoc } from \"./adm_dynamic_views.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { GenericItem } from \"@esfaenza/core/domain\";\r\n\r\n@Component({\r\n selector: \"adm_dynamic_views\",\r\n viewProviders: [{ provide: LocalizationService, useClass: AdmDynamicViewsLoc }],\r\n templateUrl: \"./adm_dynamic_views.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmDynamicViewsComponent {\r\n\r\n public searchView: DynamicViewsView = new DynamicViewsView();\r\n public Names: KeyValue[] = [];\r\n public storageSub: any;\r\n public badSearch: boolean = false;\r\n\r\n public currentName: string = \"\";\r\n\r\n // Staccato dalla view perché deve essere distrutta e ricreata di continuo\r\n public filterName:string = \"\";\r\n\r\n private be: string;\r\n\r\n constructor(\r\n public lc: LocalizationService,\r\n private intercom: InterComService,\r\n private localStorage: PreferencesService,\r\n private route: ActivatedRoute,\r\n private location: Location,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.Names = await this.adms.getDynamicViews(this.be);\r\n this.storageSub = this.route.queryParams.subscribe(params => { this.Init(params[\"ignoreStorage\"]); });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n async Init(ignoreStorage) {\r\n let item = await this.localStorage.getItem<DynamicViewsView>(\"HotDinamitato\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/serverviews`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotDinamitato\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: DynamicViewsView) {\r\n //Se ho la HotPotato vuol dire che sono appena tornato dall'edit/nuovo. Rifaccio la ricerca in base ai filtri precedenti\r\n //Altirmenti genero il modello nuovo normalmente\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetItems();\r\n }\r\n else {\r\n this.searchView = new DynamicViewsView();\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n this.searchView.searchinprogress = true;\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n this.searchView.filtername = this.filterName;\r\n this.POSTGetItems();\r\n }\r\n\r\n async prepareExportDynamicView(callback) {\r\n var view = JSON.parse(JSON.stringify(this.searchView));\r\n view.page = 1;\r\n view.itemsperpageoverride = 9999999;\r\n let tmp = await this.adms.getDynamicViewData(this.be, view);\r\n callback(tmp.items, GenericItem);\r\n }\r\n\r\n async POSTGetItems() {\r\n if (!this.searchView.filtername) {\r\n this.badSearch = true;\r\n AppSearch.reset(this.searchView);\r\n return;\r\n }\r\n else\r\n this.badSearch = false;\r\n\r\n // Per force-resettare l'estable\r\n if (this.currentName != this.searchView.filtername) {\r\n this.currentName = this.searchView.filtername;\r\n\r\n this.searchView = new DynamicViewsView();\r\n this.searchView.page = 1;\r\n this.searchView.filtername = this.currentName;\r\n }\r\n \r\n this.searchView = await this.adms.getDynamicViewData(this.be, this.searchView);\r\n this.searchView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotDinamitato\", this.searchView).subscribe();\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Ricerca Viste Dinamiche Applicative' | localize: lc}}</span>\n </div>\n <div class=\"card-body widget-body\">\n <div class=\"col-md-12 bottom-15\">\n <form role=\"form\">\n <div class=\"row app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterName\" name=\"filtername\" [Source]=\"Names\" [Placeholder]=\"'Nome' | localize: lc\"></form-select>\n </div>\n <button class=\"input-group-addon btn app-btn-search app-margin-top-20\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n </form>\n </div>\n <div class=\"row\">\n <div class=\"col-md-12\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (badSearch) {\n <div class=\"card card-info app-white-text app-padding-10\">{{'Il nome della vista è obbligatorio per le operazioni di ricerca' | localize: lc}}</div>\n }\n @if (!badSearch) {\n @if (!searchView) {\n <p><em>{{'Carico le Viste Dinamiche Applicative' | localize: lc}}...</em></p>\n }\n @if (searchView && searchView.items.length > 0) {\n <div>\n <es-table [(ngModel)]=\"searchView\" [AutoUpdate]=\"true\" [ExportFunction]=\"prepareExportDynamicView.bind(this)\" [Export]=\"true\" [OrderByColumn]=\"true\" (onSearchRequest)=\"sendSearch($event);\"></es-table>\n </div>\n }\n @if (searchView && searchView.items.length == 0 && !searchView.searchinprogress) {\n <div class=\"card card-info app-white-text app-padding-10\">\n {{'Nessun elemento trovato per la vista dinamica' | localize: lc}} <strong>{{searchView.filtername}}</strong>\n </div>\n }\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>","import { AppSearch, GenericItem } from \"@esfaenza/es-table\";\r\n\r\nexport class QueryView extends AppSearch<GenericItem>{\r\n constructor() { super(); }\r\n\r\n filterquery: string;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class MtdQueryLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Esecuzione Query Metadati\", [\"Metadata Query Execution\"]);\r\n super.set(\"it->en\", \"Query\", [\"Query\"]);\r\n super.set(\"it->en\", \"Carico i Risultati\", [\"Loading Results\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { ExportService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Applicazione\r\nimport { QueryView } from \"../../models/components/QueryView\";\r\nimport { ADM_MODULE_PATH } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { MtdQueryLoc } from \"./mtd_query.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { GenericItem } from \"@esfaenza/core/domain\";\r\n\r\n@Component({\r\n selector: \"adm_mtd_query\",\r\n viewProviders: [{ provide: LocalizationService, useClass: MtdQueryLoc }],\r\n templateUrl: \"./mtd_query.component.html\",\r\n standalone: false\r\n})\r\nexport class MtdQueryComponent {\r\n public searchView: QueryView = new QueryView();\r\n public storageSub: any;\r\n\r\n public searching: boolean = false;\r\n private be: string;\r\n\r\n constructor(\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n public expExts: ExportService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private location: Location,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n ngOnInit() {\r\n this.storageSub = this.route.queryParams.subscribe(params => { this.Init(params[\"ignoreStorage\"]); });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n async Init(ignoreStorage) {\r\n let item = await this.localStorage.getItem<QueryView>(\"HotQuery\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/metadataquery`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotQuery\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: QueryView) {\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetSearch(this.searchView);\r\n }\r\n else {\r\n this.searchView = new QueryView();\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n this.searching = true;\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n if(!this.searchView.filterquery)\r\n return;\r\n\r\n this.POSTGetSearch(this.searchView);\r\n }\r\n\r\n async POSTGetSearch(data: QueryView) {\r\n this.searchView = await this.adms.getServerQuery(this.be, data);\r\n this.searchView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotEnqueue\", this.searchView).subscribe();\r\n this.searching = false;\r\n }\r\n\r\n async prepareExport(callback) {\r\n var view = JSON.parse(JSON.stringify(this.searchView));\r\n view.page = 1;\r\n view.itemsperpageoverride = 9999999;\r\n let tmp = await this.adms.getServerQuery(this.be, view);\r\n callback(tmp.items, GenericItem);\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Esecuzione Query Metadati' | localize: lc}}</span>\n </div>\n <div class=\"card-body widget-body\">\n <form role=\"form\">\n <div class=\"col-md-12 row app-first-filter-line\">\n <div class=\"col-xl-11 col-lg-11 col-md-11 app-filter-wrapper\">\n <form-textarea rows=\"3\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterquery\" name=\"filterquery\" [Placeholder]=\"'Query'\"></form-textarea>\n </div>\n <button class=\"input-group-addon btn app-btn-search app-margin-top-20\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n </form>\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!searchView) {\n <p><em>{{'Carico i Risultati' | localize: lc}}...</em></p>\n }\n @if (searchView && !searching) {\n <div>\n <es-table [(ngModel)]=\"searchView\" [AutoUpdate]=\"true\" [OrderByColumn]=\"true\" (onSearchRequest)=\"sendSearch($event);\" [Export]=\"true\" [ExportFileName]=\"'Results.csv'\" [ExportFunction]=\"prepareExport.bind(this)\"></es-table>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>","import { AppSearch } from \"@esfaenza/es-table\";\r\nimport { SystemParameters } from \"./SystemParameters\";\r\n\r\nexport class SystemParametersView extends AppSearch<SystemParameters>{\r\n constructor() { super(); }\r\n\r\n filterparameter: string;\r\n filterlevel: string;\r\n filterglobal: boolean;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmSystemParametersLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Parametri di sistema\", [\"System Parameters\"]);\r\n super.set(\"it->en\", \"Nome parametro\", [\"Parameter Name\"]);\r\n super.set(\"it->en\", \"Carico Parametri di sistema\", [\"Loading System Parameters\"]);\r\n super.set(\"it->en\", \"Valore\", [\"Value\"]);\r\n super.set(\"it->en\", \"Valore Default\", [\"Default value\"]); \r\n super.set(\"it->en\", \"Descrizione\", [\"Description\"]);\r\n super.set(\"it->en\", \"Default\", [\"Default\"]); super.set(\"it->en\", \"Modificabile\", [\"Modifiable\"]);\r\n super.set(\"it->en\", \"Modifica parametro\", [\"Edit Parameter\"]);\r\n\r\n super.set(\"it->en\", \"Parametro di Sistema modificato con successo \", [\"System Parameter succesfully edited\"]);\r\n super.set(\"it->en\", \"Errori nella modifica del Parametro di Sistema\", [\"Errors editing System Parameter\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject, ViewChild } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\nimport { NgForm } from \"@angular/forms\";\r\n\r\n// Configurazioni\r\nimport { InboundMessageTypes, InterComService, MessageService, UtilityService } from \"@esfaenza/extensions\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { KeyValue } from \"@esfaenza/core/domain\";\r\n\r\n// Classi\r\nimport { SystemParametersView } from \"../../models/components/SystemParametersView\";\r\nimport { SystemParameters } from \"../../models/components/SystemParameters\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { firstValueFrom } from \"rxjs\";\r\nimport { ADM_MODULE_PATH } from \"../../tokens\";\r\n\r\n// Loc\r\nimport { AdmSystemParametersLoc } from \"./adm_syspars.component.loc\";\r\n\r\n@Component({\r\n selector: \"adm_syspars\",\r\n viewProviders: [{ provide: LocalizationService, useClass: AdmSystemParametersLoc }],\r\n templateUrl: \"./adm_syspars.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmSystemParametersComponent {\r\n\r\n public searchView: SystemParametersView = new SystemParametersView();\r\n public storageSub: any;\r\n\r\n public LevelsSource: KeyValue[] = [];\r\n public lastSelectedLevel = \"\";\r\n\r\n private be: string;\r\n \r\n constructor(\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private location: Location,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService,\r\n private msgExts: MessageService,\r\n private utiExts: UtilityService,\r\n @Inject(ADM_MODULE_PATH) private mod: string) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.LevelsSource = [new KeyValue(\"SYS\", \"System\"), new KeyValue(\"SES\", \"Session\")];\r\n\r\n this.AvailableInstances = await this.adms.getInstances(this.be);\r\n\r\n this.storageSub = this.route.queryParams.subscribe(params => {\r\n this.Init(params[\"ignoreStorage\"]);\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n async Init(ignoreStorage) {\r\n let item = await firstValueFrom(this.localStorage.getItem<SystemParametersView>(\"HotSysParConfiggato\"));\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/syspars`);\r\n this.route.snapshot.queryParams = [];\r\n await firstValueFrom(this.localStorage.removeItem(\"HotSysParConfiggato\"));\r\n }\r\n }\r\n\r\n init(HotPotato: SystemParametersView) {\r\n //Se ho la HotPotato vuol dire che sono appena tornato dall'edit/nuovo. Rifaccio la ricerca in base ai filtri precedenti\r\n //Altirmenti genero il modello nuovo normalmente\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n\r\n this.POSTGetItems(this.searchView);\r\n }\r\n else {\r\n this.searchView = new SystemParametersView();\r\n this.searchView.filterlevel = \"SES\";\r\n \r\n this.sendSearch();\r\n }\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n if (!this.searchView.filterlevel) {\r\n this.msgExts.simpleError(\"È obbligatorio specificare il filtro 'livello' per procedere alla ricerca\");\r\n return;\r\n }\r\n\r\n if (this.searchView.filterlevel == \"SES\") {\r\n this.searchView.filterglobal = false;\r\n }\r\n\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n this.POSTGetItems(this.searchView);\r\n }\r\n\r\n async POSTGetItems(data: SystemParametersView) {\r\n this.lastSelectedLevel = this.searchView.filterlevel;\r\n \r\n this.searchView = await this.adms.getSystemParameters(this.be, data);\r\n this.searchView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotSysParConfiggato\", this.searchView).subscribe();\r\n }\r\n\r\n //*********************************************EDIT************************************\r\n\r\n ParOnEdit: SystemParameters = null;\r\n @ViewChild(\"editConfigForm\", { static: true }) editConfigForm: NgForm;\r\n\r\n AvailableInstances: KeyValue[] = [];\r\n\r\n setupEdit(item: SystemParameters) {\r\n this.utiExts.cleanForm(this.editConfigForm);\r\n setTimeout(() => {\r\n this.ParOnEdit = this.utiExts.deepClone(item);\r\n this.ParOnEdit.memory = true;\r\n });\r\n }\r\n\r\n submitForm() {\r\n this.adms.updateSystemParameter(this.be, this.ParOnEdit).then(t => {\r\n this.msgExts.manageStringResponse(t, this.lc.loc(\"Parametro di Sistema modificato con successo \"), this.lc.loc(\"Errori nella modifica del Parametro di Sistema\"), () => { this.sendSearch() });\r\n })\r\n return true;\r\n }\r\n\r\n //*********************************************RESET************************************\r\n\r\n setupReset(item: SystemParameters) {\r\n this.msgExts.simpleWarningWithChoice(\r\n this.lc.loc(\"Richiesta conferma\"),\r\n this.lc.loc(\"Si desidera procedere al reset del parametro??\"),\r\n async () => {\r\n let t = await this.adms.resetSystemParameter(this.be, item.parametername, this.lastSelectedLevel);\r\n this.msgExts.manageStringResponse(t, this.lc.loc(\"Parametro di Sistema resettato con successo \"), this.lc.loc(\"Errori nel reset del Parametro di Sistema\"), () => { this.sendSearch() });\r\n });\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Parametri di sistema' | localize : lc}}</span>\n </div>\n <div class=\"card-body widget-body\">\n <div class=\"col-md-12 bottom-15\">\n <form role=\"form\">\n <div class=\"row app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterparameter\" name=\"filterparameter\" [Placeholder]=\"'Nome parametro' | localize : lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterlevel\" name=\"filterlevel\" [Placeholder]=\"'Livello' | localize : lc\" [Source]=\"LevelsSource\"></form-select>\n </div>\n @if (searchView.filterlevel == 'SYS') {\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterglobal\" name=\"filterglobal\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterglobal = !searchView.filterglobal\">{{'Globale' | localize: lc}}</span>\n </div>\n }\n <button class=\"input-group-addon btn app-btn-search app-margin-top-20\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"far fa-search\"></i></button>\n </div>\n </form>\n </div>\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!searchView) {\n <p><em>{{'Carico Parametri di sistema' | localize : lc}}...</em></p>\n }\n @if (searchView) {\n <div>\n <es-table [(ngModel)]=\"searchView\" (onSearchRequest)=\"sendSearch($event);\">\n <ng-template #header>\n <th class=\"app-col-min\"></th>\n <th class=\"app-col-min\"></th>\n <th class=\"app-nowrap\">{{'Nome parametro' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Valore' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Default' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Descrizione' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Modificabile' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Valore Default' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Modificabile a livello di Sessione' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Modificabile a livello di Sistema' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Modificato' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Aggiustato' | localize : lc}}</th>\n </ng-template>\n <ng-template #body let-item>\n <td class=\"app-no-wrap app-right-0 app-padding-top-8\">\n @if (!item.isreadonly && ((lastSelectedLevel == 'SYS' && item.syseditable) || (lastSelectedLevel == 'SES' && item.seseditable))) {\n <a class=\"app-link far fa-edit\" (click)=\"setupEdit(item); dlgEdit.show();\"></a>\n }\n </td>\n <td class=\"app-no-wrap app-right-0 app-padding-top-8\">\n @if (!item.isreadonly && ((lastSelectedLevel == 'SYS' && item.syseditable) || (lastSelectedLevel == 'SES' && item.seseditable))) {\n <a class=\"app-link far fa-refresh\" (click)=\"setupReset(item);\"></a>\n }\n </td>\n <td class=\"app-nowrap\"><strong>{{item.parametername}}</strong></td>\n <td class=\"app-nowrap\">{{item.value}}</td>\n <td class=\"app-nowrap\" [class.text-success]=\"item.isdefault\" [class.text-danger]=\"!item.isdefault\">\n {{ item.isdefault ? ('Sì' | localize : lc) : ('No' | localize : lc) }}\n </td>\n <td class=\"app-nowrap\">{{item.parameterdescription}}</td>\n <td class=\"app-nowrap\" [class.text-success]=\"!item.isreadonly\" [class.text-danger]=\"item.isreadonly\">\n {{ !item.isreadonly ? ('Sì' | localize : lc) : ('No' | localize : lc) }}\n </td>\n <td class=\"app-nowrap\">{{item.defaultvalue}}</td>\n <td class=\"app-nowrap\" [class.text-success]=\"item.seseditable\" [class.text-danger]=\"!item.seseditable\">\n {{ item.seseditable ? ('Sì' | localize : lc) : ('No' | localize : lc) }}\n </td>\n <td class=\"app-nowrap\" [class.text-success]=\"item.syseditable\" [class.text-danger]=\"!item.syseditable\">\n {{ item.syseditable ? ('Sì' | localize : lc) : ('No' | localize : lc) }}\n </td>\n <td class=\"app-nowrap\">{{item.modified}}</td>\n <td class=\"app-nowrap\" [class.text-success]=\"item.adjusted\" [class.text-danger]=\"!item.adjusted\">\n {{ item.adjusted ? ('Sì' | localize : lc) : ('No' | localize : lc) }}\n </td>\n </ng-template>\n </es-table>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div esModal #dlgEdit=\"es-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-lg\" emaDraggable>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title pull-left\">{{ 'Modifica parametro' | localize : lc }}</h5>\n <button type=\"button\" class=\"close pull-right\" (click)=\"dlgEdit.hide()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <form novalidate #editConfigForm=\"ngForm\" (ngSubmit)=\"editConfigForm.valid && submitForm() && dlgEdit.hide()\">\n @if (ParOnEdit) {\n <div class=\"modal-body\">\n <form-input [LabelInputRatio]=\"'3 9'\" [Label]=\"'Nome parametro' | localize : lc\" [(ngModel)]=\"ParOnEdit.parametername\" [disabled]=\"true\" name=\"parametername\"></form-input>\n <form-input [LabelInputRatio]=\"'3 9'\" [Label]=\"'Valore' | localize : lc\" [(ngModel)]=\"ParOnEdit.value\" name=\"value\" [Last]=\"lastSelectedLevel == 'SES'\"></form-input>\n @if (lastSelectedLevel == 'SYS') {\n <form-checkbox [LabelInputRatio]=\"'3 9'\" [Label]=\"'File Configurazione' | localize : lc\" [(ngModel)]=\"ParOnEdit.configfile\" name=\"configfile\"></form-checkbox>\n <form-checkbox [LabelInputRatio]=\"'3 9'\" [Label]=\"'Memoria' | localize : lc\" [(ngModel)]=\"ParOnEdit.memory\" name=\"memory\"></form-checkbox>\n <form-multiselect [LabelInputRatio]=\"'3 9'\" [Label]=\"'Applica solo a' | localize : lc\" [Source]=\"AvailableInstances\" name=\"instanceids\" [(ngModel)]=\"ParOnEdit.instanceids\" [Last]=\"true\"> </form-multiselect>\n }\n </div>\n }\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary app-margin-right-10\" (click)=\"dlgEdit.hide()\">{{'Annulla' | localize : lc}}</button>\n <button type=\"submit\" contextAware class=\"btn btn-primary\">{{'Conferma' | localize : lc}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>","// Angular\r\nimport { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n@Pipe({ name: 'format_time' })\r\nexport class FormatTimePipe implements PipeTransform {\r\n\r\n constructor() { }\r\n\r\n transform(value: number | string) {\r\n return this.secondsToHms(value);\r\n }\r\n\r\n secondsToHms(d: number | string): string {\r\n d = Number(d);\r\n var h = Math.floor(d / 3600);\r\n var m = Math.floor(d % 3600 / 60);\r\n var s = Math.floor(d % 3600 % 60);\r\n \r\n var hDisplay = h > 0 ? h + \" h, \" : \"\";\r\n var mDisplay = m > 0 ? m + \" min, \" : \"\";\r\n var sDisplay = s > 0 ? s + \" sec\" : \"\";\r\n return hDisplay + mDisplay + sDisplay; \r\n }\r\n}","/** Chiave di questo modulo, da utilizzare per i messaggi */\r\nexport const MK_ADM = \"EsAdminModule\";\r\n\r\n/** Messaggi gestiti da questo modulo */\r\nexport enum AdmMessageTypes{\r\n Message\r\n}","// Angular\r\nimport { Injectable } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { InterComService, InterComMessage } from \"@esfaenza/extensions\";\r\n\r\n// Modelli\r\nimport { AdmMessageTypes, MK_ADM } from \"./admin-feature-messages\";\r\n\r\ndeclare var myconfig;\r\n\r\n@Injectable()\r\nexport class AdminModuleCommService {\r\n\r\n constructor(private intercom: InterComService) { }\r\n\r\n public register() {\r\n this.intercom.register(MK_ADM);\r\n this.intercom.outbounds[MK_ADM].subscribe((t: InterComMessage) => { this.handleOutbound(t.type, t.message); });\r\n }\r\n\r\n private handleOutbound(type: AdmMessageTypes, message: any) {\r\n switch (type) {\r\n case AdmMessageTypes.Message:\r\n if (myconfig.DEBUG_MODE)\r\n console.log(\"@admin-feature outbound message: \" + message);\r\n break;\r\n }\r\n }\r\n}","// Angular\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { NgModule, inject } from \"@angular/core\";\r\nimport { CanMatchFn, RouterModule } from \"@angular/router\";\r\n\r\n// Libs\r\nimport { ModalModule } from \"ngx-bootstrap/modal\";\r\nimport { BsDropdownModule } from \"ngx-bootstrap/dropdown\";\r\nimport { TooltipModule } from \"ngx-bootstrap/tooltip\";\r\n\r\n// Esfaenza\r\nimport { EsTableModule } from \"@esfaenza/es-table\";\r\nimport { FormsAndValidationsModule } from \"@esfaenza/forms-and-validations\";\r\nimport { EsChartsModule } from \"@esfaenza/es-charts\";\r\nimport { EsGertrudeModule } from \"@esfaenza/gertrude\";\r\nimport { ExtensionsModule } from \"@esfaenza/extensions\";\r\nimport { LocalizationModule } from \"@esfaenza/localizations\";\r\nimport { ContextMenuModule } from \"@esfaenza/ngx-contextmenu\";\r\n\r\n// Components\r\nimport { AdmAuditsComponent } from \"./components/audits/adm_audits.component\";\r\nimport { AdmWrkComponent } from \"./components/workers/adm_wrk.component\";\r\nimport { AdmProfilerComponent } from \"./components/profiler/adm_profiler.component\";\r\nimport { AdmProfilerV2Component } from \"./components/profiler_v2/profiler_v2.component\";\r\nimport { AdmWorkloadV2Component } from \"./components/workload_v2/workload_v2.component\";\r\nimport { AdmMetricsV2Component } from \"./components/metrics_v2/metrics_v2.component\";\r\nimport { MetricsV2ChartComponent } from \"./components/metrics_v2/metrics_v2_chart.component\";\r\nimport { AdmTopActivitiesComponent } from \"./components/topact/topact_search.component\";\r\nimport { AdmTopActivityV2Component } from \"./components/topact_v2/topact_v2.component\";\r\nimport { SessionDetailComponent } from \"./components/_shared/session_detail.component\";\r\nimport { AdmEnqComponent } from \"./components/enqueues/adm_enq.component\";\r\nimport { AdmMetricsComponent } from \"./components/metrics/metrics_search.component\";\r\nimport { AdmLogsComponent } from \"./components/logs/adm_logs.component\";\r\nimport { NodeDetailComponent } from \"./components/_shared/node_detail.component\";\r\nimport { AdmDynamicViewsComponent } from \"./components/dynamic_views/adm_dynamic_views.component\";\r\nimport { MtdQueryComponent } from \"./components/mtd_query/mtd_query.component\";\r\nimport { AdmSystemParametersComponent } from \"./components/syspars/adm_syspars.component\";\r\n\r\n// Pipes\r\nimport { FormatTimePipe } from \"./pipes/format_time.pipe\";\r\nimport { ProfilerFormatPipe } from \"./pipes/profiler_format.pipe\";\r\n\r\n// Communication Service\r\nimport { AdminModuleCommService } from \"./admin-feature.comms.service\";\r\n\r\n// Tokens\r\nimport { ADM_CONVERSATIONS, ADM_METRICS_V2, ADM_PROFILER_V2, ADM_TOPACT_V2, ADM_WORKLOAD_V2 } from \"./tokens\";\r\nimport { ComponentsModule } from \"@esfaenza/core/components\";\r\nimport { DirectivesModule } from \"@esfaenza/core/directives\";\r\n\r\ndeclare var myconfig;\r\n\r\n// La Top Activity v2 prende la rotta \"topact\" solo se DirectorFeature.TopActivityV2 è attivo nella configurazione del modulo,\r\n// altrimenti la guardia fallisce e la rotta successiva apre la pagina di sempre\r\nexport const topActivityV2Enabled: CanMatchFn = () => inject(ADM_TOPACT_V2, { optional: true }) ?? false;\r\n// Lo stesso per il profiler con DirectorFeature.ProfilerV2\r\nexport const profilerV2Enabled: CanMatchFn = () => inject(ADM_PROFILER_V2, { optional: true }) ?? false;\r\n// La pagina del workload report c'è solo con DirectorFeature.WorkloadReportV2: prima il report era solo un file da scaricare dal profiler\r\nexport const workloadReportV2Enabled: CanMatchFn = () => inject(ADM_WORKLOAD_V2, { optional: true }) ?? false;\r\n// Le metriche v2 prendono la rotta \"metrics\" solo con DirectorFeature.MetricsV2, come la Top Activity\r\nexport const metricsV2Enabled: CanMatchFn = () => inject(ADM_METRICS_V2, { optional: true }) ?? false;\r\n\r\nexport const routeConfig = [\r\n {\r\n path: \"\", children: [\r\n { path: \"serverworkers/:be\", component: AdmWrkComponent, data: { title: \"Ricerca Processi Applicativi\", internalNavigation: false } },\r\n { path: \"profiler/:be\", component: AdmProfilerV2Component, canMatch: [profilerV2Enabled], data: { title: \"Profiler del Server\", internalNavigation: false } },\r\n { path: \"profiler/:be\", component: AdmProfilerComponent, data: { title: \"Profiler del Server\", internalNavigation: false } },\r\n { path: \"workload/:be\", component: AdmWorkloadV2Component, canMatch: [workloadReportV2Enabled], data: { title: \"Workload report\", internalNavigation: false } },\r\n { path: \"topact/:be\", component: AdmTopActivityV2Component, canMatch: [topActivityV2Enabled], data: { title: \"Attività Principali\", internalNavigation: false } },\r\n { path: \"topact/:be\", component: AdmTopActivitiesComponent, data: { title: \"Attività Principali\", internalNavigation: false } },\r\n { path: \"metrics/:be\", component: AdmMetricsV2Component, canMatch: [metricsV2Enabled], data: { title: \"Metriche di Sistema\", internalNavigation: false } },\r\n { path: \"metrics/:be\", component: AdmMetricsComponent, data: { title: \"Metriche di Sistema\", internalNavigation: false } },\r\n { path: \"serverlogs/:be\", component: AdmLogsComponent, data: { title: \"Log del Server\", internalNavigation: false } },\r\n { path: \"serveraudits/:be\", component: AdmAuditsComponent, data: { title: \"Ricerca Audit Applicativi\", internalNavigation: false } },\r\n { path: \"serverenqueues/:be\", component: AdmEnqComponent, data: { title: \"Ricerca Lock Applicativi\", internalNavigation: false } },\r\n { path: \"serverviews/:be\", component: AdmDynamicViewsComponent, data: { title: \"Ricerca Viste Dinamiche Applicative\", internalNavigation: false } },\r\n { path: \"metadataquery/:be\", component: MtdQueryComponent, data: { title: \"Ricerca Viste Dinamiche Applicative\", internalNavigation: false } },\r\n { path: \"serverworkers\", component: AdmWrkComponent, data: { title: \"Ricerca Processi Applicativi\", internalNavigation: false } },\r\n { path: \"profiler\", component: AdmProfilerV2Component, canMatch: [profilerV2Enabled], data: { title: \"Profiler del Server\", internalNavigation: false } },\r\n { path: \"profiler\", component: AdmProfilerComponent, data: { title: \"Profiler del Server\", internalNavigation: false } },\r\n { path: \"workload\", component: AdmWorkloadV2Component, canMatch: [workloadReportV2Enabled], data: { title: \"Workload report\", internalNavigation: false } },\r\n { path: \"topact\", component: AdmTopActivityV2Component, canMatch: [topActivityV2Enabled], data: { title: \"Attività Principali\", internalNavigation: false } },\r\n { path: \"topact\", component: AdmTopActivitiesComponent, data: { title: \"Attività Principali\", internalNavigation: false } },\r\n { path: \"metrics\", component: AdmMetricsV2Component, canMatch: [metricsV2Enabled], data: { title: \"Metriche di Sistema\", internalNavigation: false } },\r\n { path: \"metrics\", component: AdmMetricsComponent, data: { title: \"Metriche di Sistema\", internalNavigation: false } },\r\n { path: \"serverlogs\", component: AdmLogsComponent, data: { title: \"Log del Server\", internalNavigation: false } },\r\n { path: \"serveraudits\", component: AdmAuditsComponent, data: { title: \"Ricerca Audit Applicativi\", internalNavigation: false } },\r\n { path: \"serverenqueues\", component: AdmEnqComponent, data: { title: \"Ricerca Lock Applicativi\", internalNavigation: false } },\r\n { path: \"serverviews\", component: AdmDynamicViewsComponent, data: { title: \"Ricerca Viste Dinamiche Applicative\", internalNavigation: false } },\r\n { path: \"metadataquery\", component: MtdQueryComponent, data: { title: \"Ricerca Viste Dinamiche Applicative\", internalNavigation: false } },\r\n { path: \"syspars\", component: AdmSystemParametersComponent, data: { title: \"Parametri di sistema\", internalNavigation: false } }]\r\n }\r\n];\r\n\r\nconst MODULES = [\r\n // Base\r\n CommonModule,\r\n FormsModule,\r\n\r\n // Bootstrap\r\n ModalModule,\r\n TooltipModule,\r\n BsDropdownModule,\r\n\r\n // Esfaenza e componenti visuali\r\n ContextMenuModule,\r\n LocalizationModule,\r\n ExtensionsModule,\r\n EsTableModule,\r\n FormsAndValidationsModule,\r\n EsGertrudeModule,\r\n EsChartsModule,\r\n ComponentsModule,\r\n DirectivesModule,\r\n\r\n RouterModule.forChild(routeConfig),\r\n];\r\n\r\nconst COMPONENTS = [\r\n AdmWrkComponent,\r\n AdmProfilerComponent,\r\n AdmProfilerV2Component,\r\n AdmWorkloadV2Component,\r\n AdmMetricsV2Component,\r\n MetricsV2ChartComponent,\r\n AdmTopActivitiesComponent,\r\n AdmTopActivityV2Component,\r\n SessionDetailComponent,\r\n AdmDynamicViewsComponent,\r\n AdmLogsComponent,\r\n AdmAuditsComponent,\r\n AdmEnqComponent,\r\n AdmMetricsComponent,\r\n NodeDetailComponent,\r\n MtdQueryComponent,\r\n AdmSystemParametersComponent\r\n];\r\n\r\nconst PIPES = [\r\n FormatTimePipe,\r\n ProfilerFormatPipe\r\n]\r\n\r\n@NgModule({\r\n imports: [...MODULES, ...PIPES],\r\n declarations: [...COMPONENTS],\r\n providers: [\r\n AdminModuleCommService,\r\n { provide: ADM_CONVERSATIONS, useFactory: () => !!myconfig.TransactionTimeoutSeconds },\r\n { provide: ADM_TOPACT_V2, useFactory: () => !!myconfig?.DirectorFeature?.TopActivityV2 },\r\n { provide: ADM_PROFILER_V2, useFactory: () => !!myconfig?.DirectorFeature?.ProfilerV2 },\r\n { provide: ADM_WORKLOAD_V2, useFactory: () => !!myconfig?.DirectorFeature?.WorkloadReportV2 },\r\n { provide: ADM_METRICS_V2, useFactory: () => !!myconfig?.DirectorFeature?.MetricsV2 }\r\n ]\r\n})\r\nexport class AdmModule {\r\n constructor(private commService: AdminModuleCommService) {\r\n console.log(\"@esfaenza/admin-feature: BOOTSTRAP\");\r\n this.commService.register();\r\n }\r\n}","/*\r\n * Public API Surface of admin-feature\r\n */\r\n\r\nexport * from './lib/admin-feature.module';\r\nexport * from './lib/tokens';\r\nexport * from \"./lib/admin-feature-messages\";","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i6.AdminModuleBaseService","i8","i9","i10","i11","i3","i4","i5","i12.NodeDetailComponent","STORAGE_KEY","INSTANCE_ALL","DATES_DELAY_MS","i1","i10.ProfilerFormatPipe","i5.AdminModuleBaseService","i6","i7","i9.MetricsV2ChartComponent","i12","i13.NodeDetailComponent","i12.SessionDetailComponent","i14","i4.AdminModuleBaseService","KeyValue","i1.AdminModuleCommService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"esfaenza-admin-module.mjs","sources":["../../../projects/admin-feature/src/lib/models/components/AuditsView.ts","../../../projects/admin-feature/src/lib/tokens.ts","../../../projects/admin-feature/src/lib/components/audits/adm_audits.component.loc.ts","../../../projects/admin-feature/src/lib/services/admin-feature.base.service.ts","../../../projects/admin-feature/src/lib/components/audits/adm_audits.component.ts","../../../projects/admin-feature/src/lib/components/audits/adm_audits.component.html","../../../projects/admin-feature/src/lib/models/shared/KeyValue.ts","../../../projects/admin-feature/src/lib/models/components/ProcessesView.ts","../../../projects/admin-feature/src/lib/components/workers/adm_wrk.component.loc.ts","../../../projects/admin-feature/src/lib/components/workers/adm_wrk.component.ts","../../../projects/admin-feature/src/lib/components/workers/adm_wrk.component.html","../../../projects/admin-feature/src/lib/models/components/ProfilerDataNode.loc.ts","../../../projects/admin-feature/src/lib/models/components/ProfilerDataNode.ts","../../../projects/admin-feature/src/lib/models/components/ProfilerDataNodesView.ts","../../../projects/admin-feature/src/lib/models/components/TopActivityV2Enums.ts","../../../projects/admin-feature/src/lib/components/_shared/activity_chart_v2.ts","../../../projects/admin-feature/src/lib/components/details_v2/details_v2.component.loc.ts","../../../projects/admin-feature/src/lib/components/_shared/activity_chart_v2.component.ts","../../../projects/admin-feature/src/lib/pipes/profiler_format.pipe.ts","../../../projects/admin-feature/src/lib/components/details_v2/details_v2.component.ts","../../../projects/admin-feature/src/lib/components/details_v2/details_v2.component.html","../../../projects/admin-feature/src/lib/components/profiler/adm_profiler.component.loc.ts","../../../projects/admin-feature/src/lib/components/_shared/node_detail.component.loc.ts","../../../projects/admin-feature/src/lib/components/_shared/node_detail.component.ts","../../../projects/admin-feature/src/lib/components/_shared/node_detail.component.html","../../../projects/admin-feature/src/lib/components/profiler/adm_profiler.component.ts","../../../projects/admin-feature/src/lib/components/profiler/adm_profiler.component.html","../../../projects/admin-feature/src/lib/models/components/ProfilerV2Request.ts","../../../projects/admin-feature/src/lib/components/profiler_v2/profiler_v2.component.loc.ts","../../../projects/admin-feature/src/lib/components/profiler_v2/profiler_v2.component.ts","../../../projects/admin-feature/src/lib/components/profiler_v2/profiler_v2.component.html","../../../projects/admin-feature/src/lib/models/components/WorkloadReportV2.ts","../../../projects/admin-feature/src/lib/components/workload_v2/workload_v2.component.loc.ts","../../../projects/admin-feature/src/lib/components/workload_v2/workload_v2.component.ts","../../../projects/admin-feature/src/lib/components/workload_v2/workload_v2.component.html","../../../projects/admin-feature/src/lib/models/components/MetricsV2.ts","../../../projects/admin-feature/src/lib/components/metrics_v2/metrics_v2.component.loc.ts","../../../projects/admin-feature/src/lib/components/metrics_v2/metrics_v2_chart.component.ts","../../../projects/admin-feature/src/lib/components/metrics_v2/metrics_v2.component.ts","../../../projects/admin-feature/src/lib/components/metrics_v2/metrics_v2.component.html","../../../projects/admin-feature/src/lib/models/components/TopActivitiesDataView.ts","../../../projects/admin-feature/src/lib/components/topact/topact_search.component.loc.ts","../../../projects/admin-feature/src/lib/components/topact/topact_search.component.ts","../../../projects/admin-feature/src/lib/components/topact/topact_search.component.html","../../../projects/admin-feature/src/lib/models/components/TopActivityV2Request.ts","../../../projects/admin-feature/src/lib/components/topact_v2/topact_v2.component.loc.ts","../../../projects/admin-feature/src/lib/components/_shared/session_detail.component.loc.ts","../../../projects/admin-feature/src/lib/components/_shared/session_detail.component.ts","../../../projects/admin-feature/src/lib/components/_shared/session_detail.component.html","../../../projects/admin-feature/src/lib/components/topact_v2/topact_v2.component.ts","../../../projects/admin-feature/src/lib/components/topact_v2/topact_v2.component.html","../../../projects/admin-feature/src/lib/models/components/LocksView.ts","../../../projects/admin-feature/src/lib/components/enqueues/adm_enq.component.loc.ts","../../../projects/admin-feature/src/lib/components/enqueues/adm_enq.component.ts","../../../projects/admin-feature/src/lib/components/enqueues/adm_enq.component.html","../../../projects/admin-feature/src/lib/models/components/MetricsView.ts","../../../projects/admin-feature/src/lib/components/metrics/metrics_search.component.loc.ts","../../../projects/admin-feature/src/lib/components/metrics/metrics_search.component.ts","../../../projects/admin-feature/src/lib/components/metrics/metrics_search.component.html","../../../projects/admin-feature/src/lib/components/logs/adm_logs.component.loc.ts","../../../projects/admin-feature/src/lib/components/logs/adm_logs.component.ts","../../../projects/admin-feature/src/lib/components/logs/adm_logs.component.html","../../../projects/admin-feature/src/lib/models/components/DynamicViewsView.ts","../../../projects/admin-feature/src/lib/components/dynamic_views/adm_dynamic_views.component.loc.ts","../../../projects/admin-feature/src/lib/components/dynamic_views/adm_dynamic_views.component.ts","../../../projects/admin-feature/src/lib/components/dynamic_views/adm_dynamic_views.component.html","../../../projects/admin-feature/src/lib/models/components/QueryView.ts","../../../projects/admin-feature/src/lib/components/mtd_query/mtd_query.component.loc.ts","../../../projects/admin-feature/src/lib/components/mtd_query/mtd_query.component.ts","../../../projects/admin-feature/src/lib/components/mtd_query/mtd_query.component.html","../../../projects/admin-feature/src/lib/models/components/SystemParametersView.ts","../../../projects/admin-feature/src/lib/components/syspars/adm_syspars.component.loc.ts","../../../projects/admin-feature/src/lib/components/syspars/adm_syspars.component.ts","../../../projects/admin-feature/src/lib/components/syspars/adm_syspars.component.html","../../../projects/admin-feature/src/lib/pipes/format_time.pipe.ts","../../../projects/admin-feature/src/lib/admin-feature-messages.ts","../../../projects/admin-feature/src/lib/admin-feature.comms.service.ts","../../../projects/admin-feature/src/lib/admin-feature.module.ts","../../../projects/admin-feature/src/public-api.ts","../../../projects/admin-feature/src/esfaenza-admin-module.ts"],"sourcesContent":["import { AppSearch } from \"@esfaenza/es-table\";\r\nimport { Audit } from \"./Audit\";\r\n\r\nexport class AuditsView extends AppSearch<Audit> {\r\n constructor() {\r\n super();\r\n this.filteraction = '';\r\n this.filterhttp = '';\r\n }\r\n\r\n filterda: string;\r\n filtera: string;\r\n filteruser: string;\r\n filterroute: string;\r\n filteraction: string;\r\n filteraddress: string;\r\n filterhttp: string;\r\n filterargs: string;\r\n filterobjid: string;\r\n filterobjtype: string;\r\n filterconversationid: string;\r\n filterhttpcode: string;\r\n}","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport const ADM_MODULE_PATH: InjectionToken<string> = new InjectionToken<string>('ADM_MODULE_PATH');\r\nexport const ADM_CONVERSATIONS: InjectionToken<boolean> = new InjectionToken<boolean>('ADM_CONVERSATIONS');\r\nexport const ADM_TOPACT_V2: InjectionToken<boolean> = new InjectionToken<boolean>('ADM_TOPACT_V2');\r\nexport const ADM_PROFILER_V2: InjectionToken<boolean> = new InjectionToken<boolean>('ADM_PROFILER_V2');\r\nexport const ADM_WORKLOAD_V2: InjectionToken<boolean> = new InjectionToken<boolean>('ADM_WORKLOAD_V2');\r\nexport const ADM_METRICS_V2: InjectionToken<boolean> = new InjectionToken<boolean>('ADM_METRICS_V2');\r\nexport const ADM_DETAILS_V2: InjectionToken<boolean> = new InjectionToken<boolean>('ADM_DETAILS_V2');\r\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmAuditLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Ricerca Audit Applicativi\", [\"Search Application Audits\"]);\r\n super.set(\"it->en\", \"Utente\", [\"User\"]);\r\n super.set(\"it->en\", \"Chiamata REST\", [\"REST Call\"]);\r\n super.set(\"it->en\", \"Aggiornamento\", [\"Update\"]);\r\n super.set(\"it->en\", \"Route\", [\"Route\"]);\r\n super.set(\"it->en\", \"Azione\", [\"Action\"]);\r\n super.set(\"it->en\", \"Metodo HTTP\", [\"HTTP Method\"]);\r\n super.set(\"it->en\", \"Argomenti\", [\"Arguments\"]);\r\n super.set(\"it->en\", \"ID Oggetto\", [\"Object ID\"]);\r\n super.set(\"it->en\", \"Tipo Oggetto\", [\"Object Type\"]);\r\n super.set(\"it->en\", \"Dati Oggetto\", [\"Object Data\"]);\r\n super.set(\"it->en\", \"Carico gli Audit dell'Applicazione\", [\"Loading Application Audits\"]);\r\n super.set(\"it->en\", \"Data\", [\"Date\"]);\r\n super.set(\"it->en\", \"Indirizzo\", [\"Address\"]);\r\n super.set(\"it->en\", \"Risposta HTTP\", [\"HTTP Response\"]);\r\n super.set(\"it->en\", \"Codice Errore Applicativo\", [\"Application Error Code\"]);\r\n super.set(\"it->en\", \"Cod. Conversation\", [\"Conversation ID\"]);\r\n }\r\n}","// Angular\r\nimport { Injectable, Injector } from \"@angular/core\";\r\nimport { HttpParams } from \"@angular/common/http\";\r\n\r\n// ES\r\nimport { CallResult, MessageService } from \"@esfaenza/extensions\";\r\nimport { HTTPService } from \"@esfaenza/httpservice\";\r\n\r\n// Configurazioni\r\nimport { ProcessesView } from \"../models/components/ProcessesView\";\r\nimport { firstValueFrom, catchError, of, Observable, throwError } from \"rxjs\";\r\nimport { KeyValue } from \"@esfaenza/core/domain\";\r\nimport { TopActivitiesDataView } from \"../models/components/TopActivitiesDataView\";\r\nimport { TopActivityV2Request } from \"../models/components/TopActivityV2Request\";\r\nimport { TopActivityV2Response } from \"../models/components/TopActivityV2Response\";\r\nimport { DirectorInfos } from \"../models/components/DirectorInfos\";\r\nimport { NodeStats } from \"../models/components/NodeStats\";\r\nimport { SessionStats } from \"../models/components/SessionStats\";\r\nimport { ProfilerDataNodesView } from \"../models/components/ProfilerDataNodesView\";\r\nimport { ProfilerV2FlatRequest, ProfilerV2NodeRequest, ProfilerV2TreeRequest } from \"../models/components/ProfilerV2Request\";\r\nimport { ProfilerV2Flat, ProfilerV2NodeStats, ProfilerV2Tree } from \"../models/components/ProfilerV2Response\";\r\nimport { WorkloadReportV2Request, WorkloadSnapshotList, WorkloadSnapshotsRequest } from \"../models/components/WorkloadReportV2\";\r\nimport { MetricsV2CatalogRequest, MetricsV2Info, MetricsV2Request, MetricsV2Sample } from \"../models/components/MetricsV2\";\r\nimport { NodeDetailV2, NodeDetailV2Request, SessionDetailV2, SessionDetailV2Request } from \"../models/components/DetailsV2\";\r\nimport { MetricsView } from \"../models/components/MetricsView\";\r\nimport { Metric } from \"../models/components/Metric\";\r\nimport { LocksView } from \"../models/components/LocksView\";\r\nimport { DynamicViewsView } from \"../models/components/DynamicViewsView\";\r\nimport { AuditsView } from \"../models/components/AuditsView\";\r\nimport { QueryView } from \"../models/components/QueryView\";\r\nimport { SystemParametersView } from \"../models/components/SystemParametersView\";\r\nimport { SystemParameters } from \"../models/components/SystemParameters\";\r\n\r\n// Chiamate ai Repository\r\nconst GET_Director_ChangeProcessConsumerGroup: string = \"/api/Director/ChangeProcessConsumerGroup\";\r\nconst GET_Director_GetConsumerGroups: string = \"/api/Director/GetConsumerGroups#cache\";\r\nconst GET_Director_GetInfos: string = \"/api/Director/GetInfos\";\r\nconst GET_Director_GetMetrics: string = \"/api/Director/GetMetrics\";\r\nconst POST_Director_GetMetrics: string = \"/api/Director/GetMetrics\";\r\nconst POST_Director_GetProfilerDataNodes: string = \"/api/Director/GetProfilerDataNodes\";\r\nconst POST_Director_GetProfilerNode: string = \"/api/Director/GetProfilerNode\";\r\nconst POST_Director_GetProfilerFlat: string = \"/api/Director/GetProfilerFlat\";\r\nconst GET_Director_GetInstanceId: string = \"/api/Director/GetInstanceId\";\r\nconst GET_Director_GetSnapshots: string = \"/api/Director/GetSnapshots\";\r\nconst GET_Director_GetWorkloadReport: string = \"/api/Director/GetWorkloadReport\";\r\nconst POST_Director_GetServerAudits: string = \"/api/Director/GetServerAudits\";\r\nconst POST_Director_GetDynamicViewData: string = \"/api/Director/GetDynamicViewData\";\r\nconst POST_Director_GetServerLocks: string = \"/api/Director/GetServerLocks\";\r\nconst POST_Director_GetServerQuery: string = \"/api/Director/GetServerQuery\";\r\nconst GET_Director_GetServerLogs: string = \"/api/Director/GetServerLogs\";\r\nconst GET_Director_GetDynamicViews: string = \"/api/Director/GetDynamicViews\";\r\nconst POST_Director_GetServerWorkers: string = \"/api/Director/GetServerWorkers\";\r\nconst POST_Director_GetTopActivities: string = \"/api/Director/GetTopActivities\";\r\nconst GET_Director_KillProcess: string = \"/api/Director/KillProcess\";\r\nconst GET_Director_SetProcessTracing: string = \"/api/Director/SetProcessTracing\";\r\nconst GET_Director_GetNodeStats: string = \"/api/Director/GetNodeStats\";\r\nconst GET_Director_GetSessionStats: string = \"/api/Director/GetSessionStats\";\r\nconst POST_Director_GetSystemParameters: string = \"/api/Director/GetSystemParameters\";\r\nconst POST_Director_UpdatSystemParameter: string = \"/api/Director/UpdatSystemParameter\";\r\nconst GET_Director_ResetSystemParameter: string = \"/api/Director/ResetSystemParameter\";\r\nconst GET_Director_GetInstances: string = \"/api/Director/GetInstances\";\r\nconst GET_Director_GetLogTargets: string = \"/api/Director/GetLogTargets\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class AdminModuleBaseService {\r\n public http: HTTPService;\r\n public msgExts: MessageService;\r\n\r\n constructor(private injector: Injector) {\r\n this.http = this.injector.get(HTTPService);\r\n this.msgExts = this.injector.get(MessageService);\r\n }\r\n\r\n public async getServerWorkers(be: string, sv: ProcessesView): Promise<ProcessesView> {\r\n var pars = new HttpParams().set(\"be\", be);\r\n\r\n let ret: ProcessesView = await firstValueFrom(this.http.post<ProcessesView>(POST_Director_GetServerWorkers, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async doSetProcessTracing(be: string, instanceid: string, sid: string, serial: string, enable: string): Promise<string> {\r\n var pars = new HttpParams()\r\n .set(\"instanceid\", instanceid ?? \"\")\r\n .set(\"sid\", sid ?? \"\")\r\n .set(\"serial\", serial ?? \"\")\r\n .set(\"enable\", enable ?? \"\")\r\n .set(\"be\", be ?? \"\");\r\n\r\n let ret: string = await firstValueFrom(this.http.get<string>(GET_Director_SetProcessTracing, pars));\r\n return ret;\r\n }\r\n\r\n public async doKillProcess(be: string, instanceid: string, sid: string, serial: string): Promise<string> {\r\n var pars = new HttpParams()\r\n .set(\"instanceid\", instanceid ?? \"\")\r\n .set(\"sid\", sid ?? \"\")\r\n .set(\"serial\", serial ?? \"\")\r\n .set(\"be\", be ?? \"\");\r\n\r\n let ret: string = await firstValueFrom(this.http.get<string>(GET_Director_KillProcess, pars));\r\n return ret;\r\n }\r\n\r\n public async doChangeProcessConsumerGroup(be: string, instanceid: string, sid: string, serial: string, consumerGroup: string): Promise<string> {\r\n var pars = new HttpParams()\r\n .set(\"instanceid\", instanceid ?? \"\")\r\n .set(\"sid\", sid ?? \"\")\r\n .set(\"serial\", serial ?? \"\")\r\n .set(\"consumer_group\", consumerGroup ?? \"\")\r\n .set(\"be\", be ?? \"\");\r\n\r\n let ret: string = await firstValueFrom(this.http.get<string>(GET_Director_ChangeProcessConsumerGroup, pars));\r\n return ret;\r\n }\r\n\r\n public async getConsumerGroups(be: string): Promise<KeyValue[]> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n\r\n let ret: KeyValue[] = await firstValueFrom(this.http.get<KeyValue[]>(GET_Director_GetConsumerGroups, pars));\r\n return ret;\r\n }\r\n\r\n public async getServerLogs(be: string, from: string, to: string, instance: string, target: string): Promise<string> {\r\n var pars = new HttpParams().set(\"from\", from ?? \"\").set(\"to\", to ?? \"\").set(\"instance\", instance ?? \"\").set(\"target\", target ?? \"\").set(\"be\", be ?? \"\");\r\n let ret: string = await firstValueFrom(this.http.get<string>(GET_Director_GetServerLogs, pars));\r\n return ret;\r\n }\r\n\r\n public async getTopActivities(be: string, sv: TopActivitiesDataView): Promise<TopActivitiesDataView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: TopActivitiesDataView = await firstValueFrom(this.http.post<TopActivitiesDataView>(POST_Director_GetTopActivities, sv, pars));\r\n return ret;\r\n }\r\n\r\n // Stesso URL di getTopActivities: con DirectorFeature.TopActivityV2 attivo il backend-for-frontend risponde con il contratto v2\r\n public async getTopActivitiesV2(be: string, req: TopActivityV2Request): Promise<TopActivityV2Response> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: TopActivityV2Response = await this.v2Call(this.http.post<TopActivityV2Response>(POST_Director_GetTopActivities, req, pars, \"\", false));\r\n return ret;\r\n }\r\n\r\n // Stesso URL di getProfilerDataNodes: con DirectorFeature.ProfilerV2 attivo il backend-for-frontend risponde con l'albero del profiler v2\r\n public async getProfilerTreeV2(be: string, req: ProfilerV2TreeRequest): Promise<ProfilerV2Tree> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: ProfilerV2Tree = await this.v2Call(this.http.post<ProfilerV2Tree>(POST_Director_GetProfilerDataNodes, req, pars, \"\", false));\r\n return ret;\r\n }\r\n\r\n // null se il nodo non c'è nelle istanze o nella finestra scelte\r\n public async getProfilerNodeV2(be: string, req: ProfilerV2NodeRequest): Promise<ProfilerV2NodeStats> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: ProfilerV2NodeStats = await this.v2Call(this.http.post<ProfilerV2NodeStats>(POST_Director_GetProfilerNode, req, pars, \"\", false));\r\n return ret;\r\n }\r\n\r\n public async getProfilerFlatV2(be: string, req: ProfilerV2FlatRequest): Promise<ProfilerV2Flat> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: ProfilerV2Flat = await this.v2Call(this.http.post<ProfilerV2Flat>(POST_Director_GetProfilerFlat, req, pars, \"\", false));\r\n return ret;\r\n }\r\n\r\n // Le chiamate delle pagine v2 non usano la gestione errori di HTTPService, che in caso di errore restituisce un Observable che non termina mai:\r\n // l'await resterebbe appeso e la pagina bloccata in caricamento. L'errore arriva al chiamante (vedi errorText), tranne la sessione scaduta:\r\n // per quella ripeto una chiamata qualsiasi con la gestione standard, così il redirect al login lo fa HTTPService come sulle altre pagine\r\n private v2<T>(call: Observable<T>): Observable<T> {\r\n return call.pipe(catchError(err => {\r\n if (err?.status == 401)\r\n this.http.get<KeyValue[]>(GET_Director_GetInstances, new HttpParams()).subscribe();\r\n return throwError(() => err);\r\n }));\r\n }\r\n\r\n private v2Call<T>(call: Observable<T>): Promise<T> {\r\n return firstValueFrom(this.v2(call));\r\n }\r\n\r\n // Istanza che risponde alla chiamata, facoltativa: se il backend non la dà la pagina va avanti senza\r\n public async getInstanceId(be: string): Promise<string> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: string = await firstValueFrom(this.http.get<string>(GET_Director_GetInstanceId, pars, null, false).pipe(catchError(_ => of(null as string))));\r\n return ret;\r\n }\r\n\r\n // Testo di un errore delle chiamate v2: il backend-for-frontend manda il messaggio come stringa JSON (542 per i 400 del backend).\r\n // Solo la prima riga, perché i 500 portano lo stack\r\n public errorText(err: any): string {\r\n // Il corpo può essere anche un oggetto: MdmErrorResponse (message) o il ProblemDetails di ASP.NET (title, detail)\r\n let body = err?.error;\r\n let message = typeof body === \"string\" ? body : body?.message ?? body?.Message ?? body?.detail ?? body?.title ?? err?.message ?? \"\";\r\n return String(message).split(/\\r?\\n/)[0];\r\n }\r\n\r\n public async getInfos(be: string): Promise<DirectorInfos> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: DirectorInfos = await firstValueFrom(this.http.get<DirectorInfos>(GET_Director_GetInfos, pars, null, false).pipe(catchError(_ => of(null as DirectorInfos))));\r\n return ret;\r\n }\r\n\r\n public async getNodeStats(be: string, nodeId: string, global: boolean = false): Promise<NodeStats> {\r\n let pars = new HttpParams().set(\"nodeId\", nodeId ?? \"\").set(\"be\", be ?? \"\").set(\"global\", global);\r\n let ret: NodeStats = await firstValueFrom(this.http.get<NodeStats>(GET_Director_GetNodeStats, pars));\r\n return ret;\r\n }\r\n\r\n public async getSessionStats(be: string, sid: string, serial: string, instance: string): Promise<SessionStats> {\r\n let pars = new HttpParams().set('sid', sid ?? \"\").set('serial', serial ?? \"\").set('instanceid', instance ?? \"\").set(\"be\", be ?? \"\");\r\n let ret: SessionStats = await firstValueFrom(this.http.get<SessionStats>(GET_Director_GetSessionStats, pars));\r\n return ret;\r\n }\r\n\r\n // Stesso URL di getNodeStats: con DirectorFeature.DetailsV2 attivo il backend-for-frontend risponde con il dettaglio v2. null se il nodo non c'è\r\n public async getNodeDetailV2(be: string, req: NodeDetailV2Request): Promise<NodeDetailV2> {\r\n let ret: NodeDetailV2 = await this.v2Call(this.http.get<NodeDetailV2>(GET_Director_GetNodeStats, this.queryParams(be, req), null, false));\r\n return ret;\r\n }\r\n\r\n // Stesso URL di getSessionStats, come sopra. null se la sessione non esiste più e nella finestra non era attiva\r\n public async getSessionDetailV2(be: string, req: SessionDetailV2Request): Promise<SessionDetailV2> {\r\n let ret: SessionDetailV2 = await this.v2Call(this.http.get<SessionDetailV2>(GET_Director_GetSessionStats, this.queryParams(be, req), null, false));\r\n return ret;\r\n }\r\n\r\n // Parametri in query string senza i null, così vale il default del backend\r\n private queryParams(be: string, req: object): HttpParams {\r\n let pars = new HttpParams().set(\"be\", be ?? \"\");\r\n Object.entries(req).filter(([_, v]) => v != null && v !== \"\").forEach(([k, v]) => pars = pars.set(k, String(v)));\r\n return pars;\r\n }\r\n\r\n public async getProfilerDataNodes(be: string, sv: ProfilerDataNodesView): Promise<ProfilerDataNodesView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: ProfilerDataNodesView = await firstValueFrom(this.http.post<ProfilerDataNodesView>(POST_Director_GetProfilerDataNodes, sv, pars));\r\n return ret;\r\n }\r\n\r\n public downloadWorkloadReport(be: string, from: string, to: string, global: boolean = false) {\r\n let pars = new HttpParams().set(\"from\", from ?? \"\").set(\"to\", to ?? \"\").set(\"be\", be ?? \"\").set(\"global\", global);\r\n this.http.getFileNative(GET_Director_GetWorkloadReport, pars);\r\n }\r\n\r\n // Stesso URL di downloadWorkloadReport: con DirectorFeature.WorkloadReportV2 attivo il backend-for-frontend non manda più un file\r\n // ma l'HTML del report come stringa JSON. Restituisce l'Observable perché la generazione dura qualche secondo e si può annullare\r\n public getWorkloadReportV2(be: string, req: WorkloadReportV2Request): Observable<string> {\r\n let pars = new HttpParams().set(\"be\", be ?? \"\");\r\n if (req.snapFrom != null)\r\n pars = pars.set(\"snapFrom\", req.snapFrom).set(\"snapTo\", req.snapTo);\r\n if (req.global != null)\r\n pars = pars.set(\"global\", req.global);\r\n for (let id of req.instanceIds ?? [])\r\n pars = pars.append(\"instanceIds\", id);\r\n return this.v2(this.http.get<string>(GET_Director_GetWorkloadReport, pars, null, false));\r\n }\r\n\r\n // Stesso URL di getMetricsList: con DirectorFeature.MetricsV2 attivo il backend-for-frontend risponde con il catalogo (nome, tipo, unità, istanze)\r\n public async getMetricsCatalogV2(be: string, req: MetricsV2CatalogRequest): Promise<MetricsV2Info[]> {\r\n let pars = new HttpParams().set(\"be\", be ?? \"\");\r\n if (req.global != null)\r\n pars = pars.set(\"global\", req.global);\r\n for (let id of req.instanceIds ?? [])\r\n pars = pars.append(\"instanceIds\", id);\r\n let ret: MetricsV2Info[] = await this.v2Call(this.http.get<MetricsV2Info[]>(GET_Director_GetMetrics, pars, null, false));\r\n return ret;\r\n }\r\n\r\n // Stesso URL di getMetrics: con DirectorFeature.MetricsV2 attivo il backend-for-frontend risponde con i campioni del backend così come sono\r\n public async getMetricsV2(be: string, req: MetricsV2Request): Promise<MetricsV2Sample[]> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: MetricsV2Sample[] = await this.v2Call(this.http.post<MetricsV2Sample[]>(POST_Director_GetMetrics, req, pars, \"\", false));\r\n return ret;\r\n }\r\n\r\n public async getWorkloadSnapshots(be: string, req: WorkloadSnapshotsRequest): Promise<WorkloadSnapshotList> {\r\n let pars = new HttpParams().set(\"be\", be ?? \"\");\r\n if (req.from)\r\n pars = pars.set(\"from\", req.from);\r\n if (req.to)\r\n pars = pars.set(\"to\", req.to);\r\n for (let id of req.instanceIds ?? [])\r\n pars = pars.append(\"instanceIds\", id);\r\n let ret: WorkloadSnapshotList = await this.v2Call(this.http.get<WorkloadSnapshotList>(GET_Director_GetSnapshots, pars, null, false));\r\n return ret;\r\n }\r\n\r\n public async getMetrics(be: string, sv: MetricsView): Promise<MetricsView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: MetricsView = await firstValueFrom(this.http.post<MetricsView>(POST_Director_GetMetrics, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async getMetricsList(be: string, from: string, to: string): Promise<Metric[]> {\r\n let pars = new HttpParams()\r\n .set(\"from\", from ?? \"\")\r\n .set(\"to\", to ?? \"\")\r\n .set(\"be\", be ?? \"\");\r\n\r\n let ret: Metric[] = await firstValueFrom(this.http.get<Metric[]>(GET_Director_GetMetrics, pars));\r\n return ret.sort((a, b) => a.name.localeCompare(b.name));\r\n }\r\n\r\n public async getServerLocks(be: string, sv: LocksView): Promise<LocksView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: LocksView = await firstValueFrom(this.http.post<LocksView>(POST_Director_GetServerLocks, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async getServerQuery(be: string, sv: QueryView): Promise<QueryView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: QueryView = await firstValueFrom(this.http.post<QueryView>(POST_Director_GetServerQuery, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async getDynamicViewData(be: string, sv: DynamicViewsView): Promise<DynamicViewsView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: DynamicViewsView = await firstValueFrom(this.http.post<DynamicViewsView>(POST_Director_GetDynamicViewData, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async getDynamicViews(be: string): Promise<KeyValue[]> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: KeyValue[] = await firstValueFrom(this.http.get<KeyValue[]>(GET_Director_GetDynamicViews, pars));\r\n return ret;\r\n }\r\n\r\n public async getServerAudits(be: string, sv: AuditsView): Promise<AuditsView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: AuditsView = await firstValueFrom(this.http.post<AuditsView>(POST_Director_GetServerAudits, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async getSystemParameters(be: string, sv: SystemParametersView): Promise<SystemParametersView> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: SystemParametersView = await firstValueFrom(this.http.post<SystemParametersView>(POST_Director_GetSystemParameters, sv, pars));\r\n return ret;\r\n }\r\n\r\n public async getInstances(be: string): Promise<KeyValue[]> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: KeyValue[] = await firstValueFrom(this.http.get<KeyValue[]>(GET_Director_GetInstances, pars));\r\n return ret;\r\n }\r\n\r\n \r\n public async getLogTargets(be: string, instance: string): Promise<KeyValue[]> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\").set(\"instance\", instance ?? \"\");\r\n let ret: KeyValue[] = await firstValueFrom(this.http.get<KeyValue[]>(GET_Director_GetLogTargets, pars));\r\n return ret;\r\n }\r\n\r\n public async updateSystemParameter(be: string, dto: SystemParameters): Promise<string> {\r\n var pars = new HttpParams().set(\"be\", be ?? \"\");\r\n let ret: string = await firstValueFrom(this.http.post<string>(POST_Director_UpdatSystemParameter, dto, pars));\r\n return ret;\r\n }\r\n\r\n public async resetSystemParameter(be: string, parId: string, level: string): Promise<string> {\r\n let pars = new HttpParams()\r\n .set(\"parId\", parId)\r\n .set(\"level\", level)\r\n .set(\"be\", be ?? \"\");\r\n\r\n let ret: string = await firstValueFrom(this.http.get<string>(GET_Director_ResetSystemParameter, pars));\r\n return ret;\r\n }\r\n}","// Angular\r\nimport { Component, Inject } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { InterComService, InboundMessageTypes, ClipboardService } from \"@esfaenza/extensions\";\r\n\r\n// Applicazione\r\nimport { AuditsView } from \"../../models/components/AuditsView\";\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { ADM_MODULE_PATH, ADM_CONVERSATIONS } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmAuditLoc } from \"./adm_audits.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\n\r\ndeclare var dayjs;\r\n\r\n@Component({\r\n selector: \"adm_audits\",\r\n viewProviders: [{ provide: LocalizationService, useClass: AdmAuditLoc }],\r\n templateUrl: \"./adm_audits.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmAuditsComponent {\r\n\r\n public searchView: AuditsView = new AuditsView();\r\n public Actions: KeyValue[] = [];\r\n public HttpMethods: KeyValue[] = [];\r\n public searchInProgress: boolean = false;\r\n public storageSub: any;\r\n\r\n private be: string;\r\n\r\n constructor(\r\n public lc: LocalizationService,\r\n private intercom: InterComService,\r\n private localStorage: PreferencesService,\r\n private route: ActivatedRoute,\r\n private location: Location,\r\n private adms: AdminModuleBaseService,\r\n public exts: ClipboardService,\r\n @Inject(ADM_MODULE_PATH) private mod: string,\r\n @Inject(ADM_CONVERSATIONS) public usesConversations: boolean) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n\r\n this.HttpMethods = [\r\n { id: \"GET\", description: \"GET\" },\r\n { id: \"POST\", description: \"POST\" },\r\n { id: \"PUT\", description: \"PUT\" },\r\n { id: \"PATCH\", description: \"PATCH\" },\r\n { id: \"DELETE\", description: \"DELETE\" }\r\n ];\r\n\r\n this.Actions = [\r\n { id: \"C\", description: this.lc.loc(\"Chiamata REST\") },\r\n { id: \"U\", description: this.lc.loc(\"Aggiornamento\") },\r\n { id: \"D\", description: this.lc.loc(\"Elimina\") }\r\n ];\r\n }\r\n\r\n ngOnInit() {\r\n this.storageSub = this.route.queryParams.subscribe(params => { this.Init(params[\"ignoreStorage\"]); });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n async Init(ignoreStorage) {\r\n let item = await this.localStorage.getItem<AuditsView>(\"HotAudittato\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/serveraudits`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotAudittato\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: AuditsView) {\r\n //Se ho la HotPotato vuol dire che sono appena tornato dall'edit/nuovo. Rifaccio la ricerca in base ai filtri precedenti\r\n //Altirmenti genero il modello nuovo normalmente\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetProcesses(this.searchView);\r\n }\r\n else {\r\n this.searchView = new AuditsView();\r\n this.searchView.filterda = dayjs().add(-1, \"month\").format(this.lc.token(\"getSmallDateFormat\"));\r\n this.searchView.filtera = dayjs().format(this.lc.token(\"getSmallDateFormat\"));\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n this.searchInProgress = true;\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n this.POSTGetProcesses(this.searchView);\r\n }\r\n\r\n async POSTGetProcesses(data: AuditsView) {\r\n this.searchView = await this.adms.getServerAudits(this.be, data);\r\n this.searchInProgress = false;\r\n this.localStorage.setItem(\"HotAudittato\", this.searchView).subscribe();\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Ricerca Audit Applicativi' | localize: lc}}</span>\n </div>\n <div class=\"card-body widget-body\">\n <div class=\"col-md-12 bottom-15\">\n <form role=\"form\">\n <div class=\"row\">\n <div class=\"col-md-11\">\n <div class=\"col-md-12 row app-no-padding app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-date [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterda\" name=\"filterda\" [Placeholder]=\"'Da' | localize: lc\"></form-date>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-date [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtera\" name=\"filtera\" [Placeholder]=\"'A' | localize: lc\"></form-date>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filteruser\" name=\"filteruser\" [Placeholder]=\"'Utente' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filteraddress\" name=\"filteraddress\" [Placeholder]=\"'Indirizzo' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterroute\" name=\"filterroute\" [Placeholder]=\"'Route' | localize : lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [Placeholder]=\"'Azione' | localize: lc\" [(ngModel)]=\"searchView.filteraction\" name=\"filteraction\" [Source]=\"Actions\"></form-select>\n </div>\n </div>\n <div class=\"col-md-12 row app-no-padding\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [Placeholder]=\"'Metodo HTTP' | localize: lc\" [(ngModel)]=\"searchView.filterhttp\" name=\"filterhttp\" [Source]=\"HttpMethods\"></form-select>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterargs\" name=\"filterargs\" [Placeholder]=\"'Argomenti' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterobjid\" name=\"filterobjid\" [Placeholder]=\"'ID Oggetto' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterobjtype\" name=\"filterobjtype\" [Placeholder]=\"'Tipo Oggetto' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterhttpcode\" name=\"filterhttpcode\" [Placeholder]=\"'Risposta HTTP' | localize: lc\"></form-input>\n </div>\n <!-- Per ora commentato -->\n <!-- <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" *ngIf=\"usesConversations\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterconversationid\" name=\"filterconversationid\" [Placeholder]=\"'Cod. Conversation' | localize: lc\"></form-input>\n </div> -->\n </div>\n </div>\n <div class=\"col-md-1 app-no-padding\">\n <button [disabled]=\"searchInProgress\" class=\"input-group-addon btn app-btn-search\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n </div>\n </form>\n </div>\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!searchView) {\n <p><em>{{'Carico gli Audit dell\\'Applicazione' | localize: lc}}...</em></p>\n }\n @if (searchView) {\n <div>\n <es-table [(ngModel)]=\"searchView\" [MultipleOrderingDirectives]=\"true\" (onSearchRequest)=\"sendSearch($event);\">\n <span *th=\"'Timestamp'\">{{'Data' | localize: lc}}</span>\n <span *th=\"'User'\">{{'Utente' | localize: lc}}</span>\n <span *th=\"'RemoteAddress'\">{{'Indirizzo' | localize: lc}}</span>\n <span *th=\"'Action'\">{{'Azione' | localize: lc}}</span>\n <span *th=\"'HttpMethod'\">{{'Metodo HTTP' | localize: lc}}</span>\n <span *th=\"'Route'\">{{'Route' | localize : lc}}</span>\n <span *th=\"'Args'\">{{'Argomenti' | localize: lc}}</span>\n <span *th=\"'HttpResponse'\">{{'Risposta HTTP' | localize: lc}}</span>\n <span *th=\"'NonStdErrorMessage'\">{{'Codice Errore Applicativo' | localize: lc}}</span>\n <span *th=\"'ConvId'; If: usesConversations\">{{'Cod. Conversation' | localize: lc}}</span>\n <span *th=\"'ObjectType'\">{{'Tipo Oggetto' | localize: lc}}</span>\n <span *th=\"'ObjectId'\">{{'ID Oggetto' | localize: lc}}</span>\n <span *th=\"'ObjectData'\">{{'Dati Oggetto' | localize: lc}}</span>\n <strong *td=\"'Timestamp'; let item\">{{item.timestamp | loc_date:'DD/MM/YYYY HH:mm:ss'}}</strong>\n <span *td=\"'User'; let item\">{{item.user}}</span>\n <span *td=\"'RemoteAddress'; let item\">{{item.address}}</span>\n <span *td=\"'Action'; let item\">{{item.action}}</span>\n <span *td=\"'HttpMethod'; let item\">{{item.httpmethod}}</span>\n <span *td=\"'Route'; let item\">{{item.route}}</span>\n <span *td=\"'Args'; let item\" class=\"app-pointer\" title=\"Click per copiarlo nella clipboard\" (click)=\"exts.copyTextToClipboard(item.args)\">{{item.args}}</span>\n <span *td=\"'HttpResponse'; let item\">{{item.httpresponse}}</span>\n <span *td=\"'NonStdErrorMessage'; let item\">{{item.mdmerrorcode}}</span>\n <span *td=\"'ConvId'; If: usesConversations; let item\">{{item.conversationid}}</span>\n <span *td=\"'ObjectType'; let item\">{{item.objecttype}}</span>\n <span *td=\"'ObjectId'; let item\">{{item.objectid}}</span>\n <span *td=\"'ObjectData'; let item\">{{item.objectdata}}</span>\n </es-table>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n</div>","export class KeyValue {\r\n constructor(public id: string, public description: string) { }\r\n}","import { AppSearch, GenericItem } from \"@esfaenza/es-table\";\r\n\r\nexport class ProcessesView extends AppSearch<GenericItem> {\r\n constructor() { super(); }\r\n\r\n filtertenant: string;\r\n filteruser: string;\r\n filterstate: string;\r\n filterglobal: boolean;\r\n filtertype: string;\r\n filterthreadtype: string;\r\n filterthreadstatus: string;\r\n filterinwait: boolean;\r\n filtersid: string;\r\n filtertid: string;\r\n filtermtid: string;\r\n filterdcid: boolean;\r\n\r\n filterbe: string;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmWrkLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Gruppo di Consumo modificato con successo\", [\"Consumer Group succesfully changed\"]);\r\n super.set(\"it->en\", \"Errori nella modifica del Gruppo di Consumo\", [\"Errors changing Consumer Group\"]);\r\n super.set(\"it->en\", \"Modifica Gruppo di Consumo\", [\"Change Consumer Group\"]);\r\n super.set(\"it->en\", \"Nuovo Gruppo di Consumo\", [\"New Consumer Group\"]);\r\n super.set(\"it->en\", \"Tipo Thread\", [\"Thread Type\"]);\r\n super.set(\"it->en\", \"Stato Thread\", [\"Thread Status\"]);\r\n super.set(\"it->en\", \"Tipo\", [\"Type\"]);\r\n super.set(\"it->en\", \"Stato\", [\"State\"]);\r\n super.set(\"it->en\", \"SID\", [\"SID\"]);\r\n super.set(\"it->en\", \"TID\", [\"TID\"]);\r\n super.set(\"it->en\", \"In Attesa\", [\"In Wait\"]);\r\n super.set(\"it->en\", \"Push dedicato connesso\", [\"Dedicated push connected\"]);\r\n super.set(\"it->en\", \"Ricerca globale\", [\"Global search\"]);\r\n super.set(\"it->en\", \"Ricerca Processi Applicativi\", [\"Search Application Processes\"]);\r\n super.set(\"it->en\", \"Tenant\", [\"Tenant\"]);\r\n super.set(\"it->en\", \"Errori nella modifica del Tracing del Processo\", [\"Errors toggling Process Tracing\"]);\r\n super.set(\"it->en\", \"Utente\", [\"User\"]);\r\n super.set(\"it->en\", \"Carico i Processi Applicativi\", [\"Loading Application Processes\"]);\r\n super.set(\"it->en\", \"Attiva Tracing Processo\", [\"Activate Process Tracing\"]);\r\n super.set(\"it->en\", \"Disattiva Tracing Progetto\", [\"Deactivate Process Tracing\"]);\r\n super.set(\"it->en\", \"Ammazza Processo\", [\"Kill Process\"]);\r\n super.set(\"it->en\", \"Errori durante la Kill del Processo\", [\"Errors killing the Process\"]);\r\n super.set(\"it->en\", \"Processo ucciso con successo\", [\"Process succesfully killed\"]);\r\n super.set(\"it->en\", \"Conferma Terminazione del Processo\", [\"Confirm Process Kill\"]);\r\n super.set(\"it->en\", \"Sei sicuro di voler Terminare il processo selezionato? L'utente relativo sara' disconnesso\", [\"Are you sure you wish to kill the selected process? The associated user will be disconnected\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject, ViewChild } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\nimport { NgForm } from \"@angular/forms\";\r\n\r\n// Configurazioni\r\nimport { InboundMessageTypes, InterComService, MessageService, UtilityService } from \"@esfaenza/extensions\";\r\nimport { EsTableOperationDefinition } from \"@esfaenza/es-table\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { ModalDirective } from \"ngx-bootstrap/modal\";\r\n\r\n// Applicazione\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { ProcessesView } from \"../../models/components/ProcessesView\";\r\nimport { ADM_MODULE_PATH } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmWrkLoc } from \"./adm_wrk.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { GenericItem } from \"@esfaenza/core/domain\";\r\n\r\n@Component({\r\n selector: \"adm_wrk\",\r\n viewProviders: [{ provide: LocalizationService, useClass: AdmWrkLoc }],\r\n templateUrl: \"./adm_wrk.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmWrkComponent {\r\n\r\n private globalFilterValue = null;\r\n\r\n public searchView: ProcessesView = new ProcessesView();\r\n public DynamicOps: EsTableOperationDefinition[] = [];\r\n public storageSub: any;\r\n public valueToShow: string = \"\";\r\n\r\n public Types: KeyValue[] = [];\r\n public States: KeyValue[] = [];\r\n public ThreadTypes: KeyValue[] = [];\r\n public ThreadStatuses: KeyValue[] = [];\r\n\r\n private be: string;\r\n constructor(\r\n private utiExts: UtilityService,\r\n private msgExts: MessageService,\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private location: Location,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string) {\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.DynamicOps = [\r\n new EsTableOperationDefinition(\"trace_on\", this.lc.loc(\"Attiva Tracing Processo\"), \"fa fa-circle text-danger\", \"\", \"trace_enabled\", \"N\"),\r\n new EsTableOperationDefinition(\"trace_off\", this.lc.loc(\"Disattiva Tracing Progetto\"), \"fa fa-circle text-success\", \"\", \"trace_enabled\", \"Y\"),\r\n new EsTableOperationDefinition(\"kill\", this.lc.loc(\"Ammazza Processo\"), \"fa fa-ban text-danger\"),\r\n new EsTableOperationDefinition(\"change_cg\", this.lc.loc(\"Modifica Gruppo di Consumo\"), \"fa fa-edit text-info\")\r\n ];\r\n }\r\n\r\n ngOnInit() {\r\n this.storageSub = this.route.queryParams.subscribe(params => {\r\n this.Init(params[\"ignoreStorage\"]);\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n Init(ignoreStorage) {\r\n this.Types = [new KeyValue(\"USER\", \"USER\"), new KeyValue(\"BACKGROUND\", \"BACKGROUND\"), new KeyValue(\"JOB\", \"JOB\")];\r\n this.States = [new KeyValue(\"ACTIVE\", \"ACTIVE\"), new KeyValue(\"INACTIVE\", \"INACTIVE\"), new KeyValue(\"KILLED\", \"KILLED\")];\r\n this.ThreadTypes = [\"APITHREAD\", \"APIPUSHTHREAD\", \"BACKGROUNDTHREAD\", \"JOBTHREAD\", \"PARALLELSLAVETHREAD\"].map(t => new KeyValue(t, t));\r\n this.ThreadStatuses = [\"ACTIVE\", \"IDLE\", \"THROTTLING\", \"KILLED\"].map(t => new KeyValue(t, t));\r\n this.doInit(ignoreStorage);\r\n }\r\n\r\n async doInit(ignoreStorage) {\r\n let item = await this.localStorage.getItem<ProcessesView>(\"HotProcessato\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/serverworkers`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotProcessato\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: ProcessesView) {\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetServerWorkers();\r\n }\r\n else {\r\n this.searchView = new ProcessesView();\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n this.searchView.searchinprogress = true;\r\n this.searchView.columns = [];\r\n this.searchView.column_ordering = [];\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n this.POSTGetServerWorkers();\r\n }\r\n\r\n async POSTGetServerWorkers() {\r\n // Switch cattivo per resettare la tabella quando cambia il global (dato che potrebbero cambiare le colonne)\r\n // La casistica è esplicitamente non supportata dall'estable quindi abbozzo un hard refresh da qui...\r\n if (this.globalFilterValue != null && this.globalFilterValue != this.searchView.filterglobal) {\r\n let prevSearchView = this.utiExts.deepClone(this.searchView);\r\n this.searchView = null;\r\n requestAnimationFrame(async () => {\r\n this.globalFilterValue = prevSearchView.filterglobal;\r\n this.searchView = await this.adms.getServerWorkers(this.be, prevSearchView);\r\n this.searchView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotProcessato\", this.searchView).subscribe();\r\n });\r\n }\r\n else {\r\n this.globalFilterValue = this.searchView.filterglobal || false;\r\n this.searchView = await this.adms.getServerWorkers(this.be, this.searchView);\r\n this.searchView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotProcessato\", this.searchView).subscribe();\r\n }\r\n }\r\n\r\n async prepareExport(callback) {\r\n var view = JSON.parse(JSON.stringify(this.searchView));\r\n view.page = 1;\r\n view.itemsperpageoverride = 9999999;\r\n let tmp = await this.adms.getServerWorkers(this.be, view);\r\n callback(tmp.items, GenericItem);\r\n }\r\n\r\n back() {\r\n this.location.back();\r\n }\r\n\r\n onOperation(event: { id: string, item: any }) {\r\n switch (event.id) {\r\n case \"trace_on\": this.toggleTracing(event.item, true); break;\r\n case \"trace_off\": this.toggleTracing(event.item, false); break;\r\n case \"kill\": this.killProcess(event.item); break;\r\n case \"change_cg\": this.changeProcessCg(event.item); break;\r\n }\r\n }\r\n\r\n async toggleTracing(process: any, tracing: boolean) {\r\n let res = await this.adms.doSetProcessTracing(this.be, (process.properties[\"inst_id\"] || process.properties[\"INST_ID\"] || \"\"), process.properties[\"sid\"] || process.properties[\"SID\"], process.properties[\"serial\"] || process.properties[\"SERIAL\"], tracing.toString());\r\n this.msgExts.manageStringResponse(res, \"\", this.lc.loc(\"Errori nella modifica del Tracing del Processo\"), () => this.sendSearch());\r\n }\r\n\r\n killProcess(process: any) {\r\n this.msgExts.simpleWarningWithChoice(\r\n this.lc.loc(\"Conferma Terminazione del Processo\"),\r\n this.lc.loc(\"Sei sicuro di voler Terminare il processo selezionato? L'utente relativo sara' disconnesso\"),\r\n async () => {\r\n let res = await this.adms.doKillProcess(this.be, (process.properties[\"inst_id\"] || process.properties[\"INST_ID\"] || \"\"), process.properties[\"sid\"] || process.properties[\"SID\"], process.properties[\"serial\"] || process.properties[\"SERIAL\"]);\r\n this.msgExts.manageStringResponse(res, this.lc.loc(\"Processo ucciso con successo\"), this.lc.loc(\"Errori durante la Kill del Processo\"), () => this.sendSearch());\r\n });\r\n }\r\n\r\n //********************************************** Gestione modifica Consumer Group ***************************************\r\n\r\n newCg: string = \"\";\r\n CGs: KeyValue[] = [];\r\n CgDictionariesLoaded: boolean = false;\r\n ProcessOnEdit: any;\r\n\r\n @ViewChild(\"cgFrom\") cgFrom: NgForm;\r\n @ViewChild(\"dlgChangeCg\") dlgChangeCg: ModalDirective;\r\n\r\n changeProcessCg(process: any) {\r\n this.ProcessOnEdit = process;\r\n if (!this.CgDictionariesLoaded) {\r\n this.loadCgDictionaries();\r\n this.CgDictionariesLoaded = true;\r\n }\r\n this.setupChangeCg();\r\n this.dlgChangeCg.show();\r\n }\r\n\r\n async loadCgDictionaries() {\r\n this.CGs = await this.adms.getConsumerGroups(this.be);\r\n }\r\n\r\n setupChangeCg() {\r\n this.utiExts.cleanForm(this.cgFrom)\r\n setTimeout(() => { this.newCg = \"\" });\r\n }\r\n\r\n async doChangeCg() {\r\n let res = await this.adms.doChangeProcessConsumerGroup(this.be, this.ProcessOnEdit.properties[\"inst_id\"] || this.ProcessOnEdit.properties[\"INST_ID\"], this.ProcessOnEdit.properties[\"sid\"] || this.ProcessOnEdit.properties[\"SID\"], this.ProcessOnEdit.properties[\"serial\"] || this.ProcessOnEdit.properties[\"SERIAL\"], this.newCg);\r\n this.msgExts.manageStringResponse(res, this.lc.loc(\"Gruppo di Consumo modificato con successo\"), this.lc.loc(\"Errori nella modifica del Gruppo di Consumo\"), () => this.sendSearch());\r\n return true;\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Ricerca Processi Applicativi' | localize: lc}}</span>\n </div>\n <div class=\"card-body widget-body\">\n @if (searchView) {\n <div class=\"col-md-12 bottom-15\">\n <form role=\"form\">\n <div class=\"row\">\n <div class=\"col-md-11\">\n <div class=\"col-md-12 row app-no-padding app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-1 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterglobal\" name=\"filterglobal\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterglobal = !searchView.filterglobal\">{{'Ricerca globale' | localize: lc}}</span>\n </div>\n <div class=\"col-xl-2 col-lg-1 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtersid\" name=\"filtersid\" [Placeholder]=\"'SID'| localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtertype\" name=\"filtertype\" [Placeholder]=\"'Tipo' | localize: lc\" [Source]=\"Types\"></form-select>\n </div>\n <div class=\"col-xl-2 col-lg-1 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtertenant\" name=\"filterTenant\" [Placeholder]=\"'Tenant' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filteruser\" name=\"filterUser\" [Placeholder]=\"'Utente' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterstate\" name=\"filterState\" [Placeholder]=\"'Stato' | localize: lc\" [Source]=\"States\"></form-select>\n </div>\n </div>\n <div class=\"col-md-12 row app-no-padding\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtertid\" name=\"filtertid\" [Placeholder]=\"'TID'| localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtermtid\" name=\"filtermtid\" [Placeholder]=\"'Thread gestito'| localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterthreadtype\" name=\"filterthreadtype\" [Placeholder]=\"'Tipo Thread' | localize: lc\" [Source]=\"ThreadTypes\"></form-select>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterthreadstatus\" name=\"filterthreadstatus\" [Placeholder]=\"'Stato Thread' | localize: lc\" [Source]=\"ThreadStatuses\"></form-select>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterinwait\" name=\"filterinwait\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterinwait = !searchView.filterinwait\">{{'In Attesa' | localize: lc}}</span>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterdcid\" name=\"filterdcid\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterdcid = !searchView.filterdcid\">{{'Push dedicato connesso' | localize: lc}}</span>\n </div>\n </div>\n </div>\n <div class=\"col-md-1 app-no-padding\">\n <button [disabled]=\"searchView.searchinprogress\" class=\"input-group-addon btn app-btn-search\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n </div>\n </form>\n </div>\n }\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!searchView) {\n <p><em>{{'Carico i Processi Applicativi' | localize: lc}}...</em></p>\n }\n @if (searchView) {\n <div>\n <es-table [(ngModel)]=\"searchView\" [DynamicOperations]=\"DynamicOps\" [Export]=\"true\" [ColumnsOrdering]=\"false\"\n [ExportFileName]=\"'Application Processes.csv'\" [ExportFunction]=\"prepareExport.bind(this)\" [AutoUpdate]=\"true\"\n [OrderByColumn]=\"true\" (onSearchRequest)=\"sendSearch($event);\" (onDynamicOperation)=\"onOperation($event)\">\n <span class=\"app-nowrap\" *td=\"'full_wait_stack'; let value\">\n <span class=\"fa fa-list app-pointer\" (click)=\"valueToShow = value; dlgValue.show();\"></span> \n {{value.length > 70 ? value.substr(0, 67) + '...' : value}}\n </span>\n </es-table>\n </div>\n }\n </div>\n </div>\n <div class=\"app-margin-top-15\">\n <button class=\"btn btn-secondary pull-left\" type=\"button\" (click)=\"back()\">{{'Indietro' | localize: lc}}</button>\n <div class=\"clearfix\"></div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div bsModal #dlgChangeCg=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-lg\" emaDraggable>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">{{'Modifica Gruppo di Consumo' | localize: lc}}</h4>\n <button type=\"button\" class=\"close pull-right\" (click)=\"dlgChangeCg.hide()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <form novalidate #cgFrom=\"ngForm\" (ngSubmit)=\"cgFrom.valid && doChangeCg() && dlgChangeCg.hide()\">\n <div class=\"modal-body\">\n <form-select [Label]=\"'Nuovo Gruppo di Consumo' | localize: lc\" [(ngModel)]=\"newCg\" name=\"newCg\" [Source]=\"CGs\" required [Last]=\"true\"></form-select>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary app-margin-right-5\" (click)=\"dlgChangeCg.hide()\">{{'Chiudi' | localize: lc}}</button>\n <button type=\"submit\" class=\"btn btn-primary\">{{'Conferma' | localize: lc}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>\n\n\n<div bsModal #dlgValue=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-xl\" app-draggable=\".modal-header\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title pull-left\">\n Full Wait Stack\n </h5>\n <button type=\"button\" class=\"close pull-right\" (click)=\"dlgValue.hide()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body app-padidng-bottom-20 app-padding-top-20\">\n <span class=\"app-wrap\">\n {{valueToShow}}\n </span>\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"dlgValue.hide()\">Chiudi</button>\n </div>\n </div>\n </div>\n</div>","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class ProfilerDataNodeLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"ID Padre\", [\"Parent ID\"]);\r\n super.set(\"it->en\", \"ID\", [\"ID\"]);\r\n super.set(\"it->en\", \"Descrizione\", [\"Description\"]);\r\n super.set(\"it->en\", \"Chiamate\", [\"Calls\"]);\r\n super.set(\"it->en\", \"Tempo\", [\"Time\"]);\r\n super.set(\"it->en\", \"Tempo Max\", [\"Peak Time\"]);\r\n super.set(\"it->en\", \"Tempo Min\", [\"Min. Time\"]);\r\n super.set(\"it->en\", \"Tempo Medio\", [\"Avg. Time\"]);\r\n super.set(\"it->en\", \"Tempo Specifico\", [\"Specific Time\"])\r\n super.set(\"it->en\", \"Percentuale\", [\"Percentage\"]);\r\n super.set(\"it->en\", \"Chiamate Periodo\", [\"Calls for Period\"]);\r\n super.set(\"it->en\", \"Tempo Periodo\", [\"Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Max Periodo\", [\"Peak Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Min Periodo\", [\"Min. Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Medio Periodo\", [\"Avg. Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Specifico Periodo\", [\"Specific Time for Period\"]);\r\n super.set(\"it->en\", \"Percentuale Periodo\", [\"Percentage for Period\"]);\r\n super.set(\"it->en\", \"Nome Tipologia Evento\", [\"Event Type Name\"])\r\n super.set(\"it->en\", \"Nome Classe Attesa\", [\"Wait Class Name\"]);\r\n }\r\n}","import { Export, ExportLocalization } from \"@esfaenza/extensions\";\r\n\r\nimport { ProfilerDataNodeLoc } from \"./ProfilerDataNode.loc\";\r\n\r\n@ExportLocalization(ProfilerDataNodeLoc)\r\nexport class ProfilerDataNode {\r\n @Export(10, \"ID Padre\")\r\n parentid: string;\r\n @Export(20, \"ID\")\r\n id: string;\r\n @Export(30, \"Descrizione\")\r\n description: string;\r\n @Export(40, \"Chiamate\")\r\n calls: number;\r\n @Export(50, \"Tempo\")\r\n time: number;\r\n @Export(60, \"Tempo Max\")\r\n peaktime: number;\r\n @Export(70, \"Tempo Min\")\r\n mintime: number;\r\n @Export(80, \"Tempo Medio\")\r\n avgtime: number;\r\n @Export(90, \"Tempo Specifico\")\r\n timewithoutchildren: number;\r\n @Export(100, \"Percentuale\")\r\n percentage: number;\r\n @Export(110, \"Chiamate Periodo\")\r\n snapdeltacalls: number;\r\n @Export(120, \"Tempo Periodo\")\r\n snapdeltatime: number;\r\n @Export(130, \"Tempo Max Periodo\")\r\n snappeaktime: number;\r\n @Export(140, \"Tempo Min Periodo\")\r\n snapmintime: number;\r\n @Export(150, \"Tempo Medio Periodo\")\r\n snapavgtime: number;\r\n @Export(160, \"Tempo Specifico Periodo\")\r\n snaptimewithoutchildren: number;\r\n @Export(170, \"Percentuale Periodo\")\r\n snappercentage: number;\r\n @Export(180, \"Nome Tipologia Evento\")\r\n eventtypename: string;\r\n @Export(190, \"Nome Classe Attesa\")\r\n waitclassname: string;\r\n}","import { AppSearch } from \"@esfaenza/es-table\";\r\nimport { ProfilerDataNode } from \"./ProfilerDataNode\";\r\n\r\nexport class ProfilerDataNodesView extends AppSearch<ProfilerDataNode>{\r\n constructor() { super(); }\r\n\r\n filterfrom: string;\r\n filterto: string;\r\n filterglobal: boolean;\r\n}","// Enum della Top Activity v2: i numeri sono quelli del backend (le risposte li riportano come numeri)\r\n\r\nexport enum TopActivityDimension {\r\n WaitClass = 0,\r\n EventType = 1,\r\n WaitEvent = 2,\r\n Instance = 3,\r\n UserSession = 4,\r\n UserName = 5,\r\n Tenant = 6,\r\n SessionType = 7,\r\n BackgroundSession = 8,\r\n JobName = 9,\r\n ConsumerGroup = 10,\r\n ThreadType = 11,\r\n Api = 12,\r\n Machine = 13,\r\n // Chiave TID@istanza, etichetta il TID (specifica \"Dettaglio nodo e sessione\")\r\n Thread = 14\r\n}\r\n\r\nexport enum TopActivityDataSource {\r\n Memory = 0,\r\n MemoryAndStored = 1\r\n}\r\n\r\nexport enum TopActivityResolution {\r\n Low = 0,\r\n Medium = 1,\r\n High = 2,\r\n Maximum = 3\r\n}\r\n\r\nexport enum TopActivityMaximumThreads {\r\n None = 0,\r\n Cores = 1,\r\n Threads = 2\r\n}\r\n","// Configurazioni\nimport { BaseInterval } from \"@esfaenza/es-charts\";\n\n// Colori e regole del grafico della Top Activity v2, condivisi con i dettagli di nodo e sessione: le stesse chiavi hanno gli stessi colori\n\n// WaitClass ed EventType hanno valori fissi: colori fissi, così il grafico si legge sempre allo stesso modo\nexport const FIXED_COLORS: { [key: string]: string } = {\n Cpu: \"#43a047\", Database: \"#1e88e5\", Script: \"#8e24aa\", Network: \"#8d6e63\", IO: \"#00acc1\", Sleep: \"#b0bec5\", Throttle: \"#fb8c00\", Wait: \"#fdd835\",\n Latch: \"#e53935\", Semaphore: \"#f06292\", Enqueue: \"#c62828\", ReadWriteLock: \"#ad1457\", Fence: \"#6d4c41\", ConditionVariable: \"#00897b\", Scheduler: \"#5e35b1\"\n};\nexport const PALETTE = [\"#1e88e5\", \"#43a047\", \"#fb8c00\", \"#8e24aa\", \"#e53935\", \"#00897b\", \"#fdd835\", \"#6d4c41\", \"#3949ab\", \"#c0ca33\"];\nexport const OTHER_COLOR = \"#9e9e9e\";\nexport const TOTAL_COLOR = \"#263238\";\nexport const LIMIT_COLOR = \"#e53935\";\n\n// Colore del componente i-esimo: fisso per le chiavi note (classi di attesa e tipi di evento), dalla tavolozza per le altre\nexport function componentColor(key: string, other: boolean, index: number, fixed: boolean): string {\n return other ? OTHER_COLOR : (fixed && FIXED_COLORS[key]) || PALETTE[index % PALETTE.length];\n}\n\n// es-charts ricava la griglia dell'asse dal passo fra i punti ma la arrotonda all'unità superiore: 30 s diventano 1 minuto, 5 minuti 1 ora.\n// amCharts mette allora più bucket nella stessa cella e i gradini si sovrappongono (aree, linea del totale e tooltip non tornano).\n// Il passo lo dà la risposta, e i bucket della specifica (1-30 s, 1-30 min, 1 h) dividono sempre il minuto o l'ora\nexport function bucketInterval(seconds: number): BaseInterval {\n if (!seconds)\n return null;\n if (seconds % 3600 == 0)\n return { timeunit: \"hour\", count: seconds / 3600 };\n if (seconds % 60 == 0)\n return { timeunit: \"minute\", count: seconds / 60 };\n return { timeunit: \"second\", count: seconds };\n}\n\n// Le date delle risposte del Director v2 sono UTC \"dd/MM/yyyy HH:mm:ss\" senza fuso\nexport function parseUtc(value: string): Date {\n let m = /^(\\d{2})\\/(\\d{2})\\/(\\d{4}) (\\d{2}):(\\d{2}):(\\d{2})$/.exec(value ?? \"\");\n return m ? new Date(Date.UTC(+m[3], +m[2] - 1, +m[1], +m[4], +m[5], +m[6])) : value ? new Date(value) : null;\n}\n","import { Injectable, Injector } from \"@angular/core\";\nimport { LocalizationService } from \"@esfaenza/localizations\";\n\n@Injectable()\nexport class AdmDetailsV2Loc extends LocalizationService {\n constructor(injector: Injector) {\n super(injector);\n super.set(\"it->en\", \"Indietro\", [\"Back\"]);\n super.set(\"it->en\", \"Dettaglio nodo\", [\"Node detail\"]);\n super.set(\"it->en\", \"Sessione\", [\"Session\"]);\n super.set(\"it->en\", \"Ultime\", [\"Last\"]);\n super.set(\"it->en\", \"Da\", [\"From\"]);\n super.set(\"it->en\", \"A\", [\"To\"]);\n super.set(\"it->en\", \"Applica\", [\"Apply\"]);\n super.set(\"it->en\", \"dalle\", [\"from\"]);\n super.set(\"it->en\", \"alle\", [\"to\"]);\n super.set(\"it->en\", \"Memoria\", [\"Memory\"]);\n super.set(\"it->en\", \"Memoria e storico\", [\"Memory and history\"]);\n super.set(\"it->en\", \"Dal vivo\", [\"Live\"]);\n super.set(\"it->en\", \"Storico\", [\"History\"]);\n super.set(\"it->en\", \"Aggiornato alle\", [\"Updated at\"]);\n super.set(\"it->en\", \"Pausa\", [\"Pause\"]);\n super.set(\"it->en\", \"Riprendi\", [\"Resume\"]);\n super.set(\"it->en\", \"La finestra è stata ridotta alle ultime 24 ore\", [\"The window was reduced to the last 24 hours\"]);\n super.set(\"it->en\", \"Errore\", [\"Error\"]);\n super.set(\"it->en\", \"Nodo non trovato\", [\"Node not found\"]);\n super.set(\"it->en\", \"Sessione non trovata: non esiste più e nella finestra non era attiva\", [\"Session not found: it no longer exists and was not active in the window\"]);\n super.set(\"it->en\", \"Carico i Dati\", [\"Loading data\"]);\n super.set(\"it->en\", \"Copia\", [\"Copy\"]);\n super.set(\"it->en\", \"Copiato\", [\"Copied\"]);\n super.set(\"it->en\", \"Apri nel profiler\", [\"Open in profiler\"]);\n super.set(\"it->en\", \"Sessioni su questo evento\", [\"Sessions on this event\"]);\n super.set(\"it->en\", \"Solo l'evento esatto: il lavoro dei discendenti non è compreso\", [\"Exact event only: the descendants' work is not included\"]);\n super.set(\"it->en\", \"Top Activity filtrata su questo evento\", [\"Top Activity filtered on this event\"]);\n super.set(\"it->en\", \"discendenti esclusi\", [\"descendants excluded\"]);\n super.set(\"it->en\", \"Statistiche\", [\"Statistics\"]);\n super.set(\"it->en\", \"Dall'avvio\", [\"Since startup\"]);\n super.set(\"it->en\", \"Dall'ultimo snapshot\", [\"Since the last snapshot\"]);\n super.set(\"it->en\", \"Nella finestra\", [\"In the window\"]);\n super.set(\"it->en\", \"Esecuzioni\", [\"Executions\"]);\n super.set(\"it->en\", \"Tempo totale\", [\"Total time\"]);\n super.set(\"it->en\", \"Tempo proprio\", [\"Self time\"]);\n super.set(\"it->en\", \"Medio\", [\"Average\"]);\n super.set(\"it->en\", \"Massimo\", [\"Peak\"]);\n super.set(\"it->en\", \"Minimo\", [\"Minimum\"]);\n super.set(\"it->en\", \"Thread dentro adesso\", [\"Threads inside now\"]);\n super.set(\"it->en\", \"In corso da\", [\"Running for\"]);\n super.set(\"it->en\", \"Ultima uscita\", [\"Last exit\"]);\n super.set(\"it->en\", \"Dove va il tempo\", [\"Where the time goes\"]);\n super.set(\"it->en\", \"tempo proprio del sottoalbero\", [\"self time of the subtree\"]);\n super.set(\"it->en\", \"Idle è tempo di attesa senza lavoro\", [\"Idle is waiting time with no work\"]);\n super.set(\"it->en\", \"Per istanza\", [\"By instance\"]);\n super.set(\"it->en\", \"Istanza\", [\"Instance\"]);\n super.set(\"it->en\", \"Tempo\", [\"Time\"]);\n super.set(\"it->en\", \"Thread attivi\", [\"Active threads\"]);\n super.set(\"it->en\", \"Attività nel tempo\", [\"Activity over time\"]);\n super.set(\"it->en\", \"sessioni attive medie\", [\"average active sessions\"]);\n super.set(\"it->en\", \"picco\", [\"peak\"]);\n super.set(\"it->en\", \"un punto ogni\", [\"one point every\"]);\n super.set(\"it->en\", \"stima per campionamento\", [\"sampling estimate\"]);\n super.set(\"it->en\", \"Valori stimati contando i campioni\", [\"Values estimated by counting samples\"]);\n super.set(\"it->en\", \"sessioni\", [\"sessions\"]);\n super.set(\"it->en\", \"Nessuna attività nella finestra\", [\"No activity in the window\"]);\n super.set(\"it->en\", \"Prima delle\", [\"Before\"]);\n super.set(\"it->en\", \"i dati vengono dallo storico, con meno risoluzione\", [\"data comes from history, with lower resolution\"]);\n super.set(\"it->en\", \"Comprende il lavoro dei discendenti\", [\"Includes the descendants' work\"]);\n super.set(\"it->en\", \"Discendenti principali\", [\"Top descendants\"]);\n super.set(\"it->en\", \"Figli\", [\"Children\"]);\n super.set(\"it->en\", \"Discendenti\", [\"Descendants\"]);\n super.set(\"it->en\", \"Nome\", [\"Name\"]);\n super.set(\"it->en\", \"Tipo\", [\"Type\"]);\n super.set(\"it->en\", \"Livello\", [\"Level\"]);\n super.set(\"it->en\", \"del nodo\", [\"of the node\"]);\n super.set(\"it->en\", \"Terminata\", [\"Terminated\"]);\n super.set(\"it->en\", \"Utente\", [\"User\"]);\n super.set(\"it->en\", \"Gruppo di consumo\", [\"Consumer group\"]);\n super.set(\"it->en\", \"Sessione di background\", [\"Background session\"]);\n super.set(\"it->en\", \"Inizio\", [\"Start\"]);\n super.set(\"it->en\", \"collegata da\", [\"connected for\"]);\n super.set(\"it->en\", \"Ultima attività\", [\"Last activity\"]);\n super.set(\"it->en\", \"La sessione non esiste più: i suoi dati vengono dall'ultimo campione, delle\", [\"The session no longer exists: its data comes from the last sample, taken at\"]);\n super.set(\"it->en\", \"Sessioni attive medie\", [\"Average active sessions\"]);\n super.set(\"it->en\", \"Media\", [\"Average\"]);\n super.set(\"it->en\", \"Picco\", [\"Peak\"]);\n super.set(\"it->en\", \"Dividi per\", [\"Split by\"]);\n super.set(\"it->en\", \"Classe di attesa\", [\"Wait class\"]);\n super.set(\"it->en\", \"Tipo di evento\", [\"Event type\"]);\n super.set(\"it->en\", \"Evento\", [\"Event\"]);\n super.set(\"it->en\", \"Bassa\", [\"Low\"]);\n super.set(\"it->en\", \"Alta\", [\"High\"]);\n super.set(\"it->en\", \"Massima\", [\"Maximum\"]);\n super.set(\"it->en\", \"Eventi\", [\"Events\"]);\n super.set(\"it->en\", \"Attività\", [\"Activity\"]);\n super.set(\"it->en\", \"Altri\", [\"Others\"]);\n super.set(\"it->en\", \"(nessuno)\", [\"(none)\"]);\n super.set(\"it->en\", \"(non attribuito)\", [\"(unattributed)\"]);\n super.set(\"it->en\", \"Thread adesso\", [\"Threads now\"]);\n super.set(\"it->en\", \"Stato\", [\"Status\"]);\n super.set(\"it->en\", \"Priorità\", [\"Priority\"]);\n super.set(\"it->en\", \"Macchina\", [\"Machine\"]);\n super.set(\"it->en\", \"Evento corrente\", [\"Current event\"]);\n super.set(\"it->en\", \"nessun evento in corso\", [\"no event in progress\"]);\n super.set(\"it->en\", \"Pila completa degli eventi\", [\"Full event stack\"]);\n super.set(\"it->en\", \"Nessun evento\", [\"No event\"]);\n super.set(\"it->en\", \"Operazioni lunghe\", [\"Long operations\"]);\n super.set(\"it->en\", \"di\", [\"of\"]);\n super.set(\"it->en\", \"Trascorso\", [\"Elapsed\"]);\n super.set(\"it->en\", \"Alla fine\", [\"Remaining\"]);\n super.set(\"it->en\", \"non stimabile\", [\"not estimable\"]);\n }\n}\n","// Angular\nimport { Component, Input, OnChanges } from \"@angular/core\";\n\n// Configurazioni\nimport { DateValue, LineChartData, LineSerie } from \"@esfaenza/es-charts\";\n\n// Applicazione\nimport { bucketInterval, componentColor, parseUtc } from \"./activity_chart_v2\";\n\nexport class ActivityChartV2Component_Item {\n key: string;\n label: string;\n other: boolean;\n activity: number;\n percentage: number;\n values: number[];\n}\n\nclass LegendItem {\n label: string;\n color: string;\n percentage: number;\n}\n\n/**\n * Grafico impilato delle sessioni attive medie, con le regole e i colori del grafico della Top Activity v2:\n * un gradino per bucket, una serie per componente (l'ultimo, \"altri\", in grigio) e la legenda sotto.\n * Lo usano i dettagli v2 di nodo (per classe di attesa) e di sessione (la sua Top Activity)\n */\n@Component({\n selector: \"activity-chart-v2\",\n template: `\n @if (chartData) {\n <div class=\"acv2-chart\">\n <es-line-chart [MinGridDistance]=\"65\" [Timeline]=\"false\" [FinalInstants]=\"false\" [Stacked]=\"true\" [Step]=\"true\" [Fill]=\"true\" [MergeDatasets]=\"true\"\n [AllowGaps]=\"false\" [Legend]=\"false\" [Data]=\"chartData\" [name]=\"name\" [DataGroupingThreshold]=\"99999999\"></es-line-chart>\n </div>\n <div class=\"acv2-legend\">\n @for (item of legend; track $index) {\n <span class=\"acv2-legend-item\"><span class=\"acv2-swatch\" [style.background]=\"item.color\"></span>{{item.label}} <span class=\"acv2-muted\">{{item.percentage | number : '1.0-1' : 'it'}}%</span></span>\n }\n </div>\n } @else {\n <div class=\"acv2-empty\">{{emptyText}}</div>\n }`,\n styles: [`\n :host { display: block; }\n .acv2-chart { height: 240px; }\n .acv2-legend { display: flex; flex-wrap: wrap; gap: 4px 14px; margin-top: 6px; font-size: 12px; }\n .acv2-legend-item { display: inline-flex; align-items: center; gap: 5px; }\n .acv2-swatch { width: 10px; height: 10px; border-radius: 2px; }\n .acv2-muted { color: var(--p-text-muted-color, #64748b); }\n .acv2-empty { padding: 40px 0; text-align: center; color: var(--p-text-muted-color, #64748b); }\n `],\n standalone: false\n})\nexport class ActivityChartV2Component implements OnChanges {\n // Inizio di ogni punto, UTC \"dd/MM/yyyy HH:mm:ss\"\n @Input() Times: string[];\n @Input() Components: ActivityChartV2Component_Item[];\n @Input() BucketSeconds: number;\n // Chiavi con colore fisso: classi di attesa e tipi di evento\n @Input() FixedColors: boolean = true;\n @Input() Uom: string;\n @Input() EmptyText: string;\n @Input() name: string = \"activitychartv2\";\n\n public chartData: LineChartData;\n public legend: LegendItem[] = [];\n\n get emptyText(): string {\n return this.EmptyText ?? \"\";\n }\n\n ngOnChanges() {\n let times = (this.Times ?? []).map(t => parseUtc(t));\n let components = this.Components ?? [];\n if (times.length == 0 || components.length == 0) {\n this.chartData = null;\n this.legend = [];\n return;\n }\n\n let interval = bucketInterval(this.BucketSeconds);\n let series: LineSerie[] = [];\n this.legend = components.map((c, i) => {\n let color = componentColor(c.key, c.other, i, this.FixedColors);\n series.push(new LineSerie(c.label, times.map((t, j) => new DateValue(t, c.values?.[j] ?? 0)), interval, color, this.Uom));\n return { label: c.label, color: color, percentage: c.percentage };\n });\n this.chartData = new LineChartData(series);\n }\n}\n","// Angular\r\nimport { formatNumber } from \"@angular/common\";\r\nimport { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n// Formati del profiler v2 (specifica \"Profiler gerarchico\"): durate nell'unità più leggibile, interi con il separatore\r\n// delle migliaia italiano, percentuali con un decimale sotto 10. Un dato mancante è \"—\"\r\n@Pipe({ name: \"pv2fmt\" })\r\nexport class ProfilerFormatPipe implements PipeTransform {\r\n\r\n transform(value: number, kind: \"dur\" | \"int\" | \"pct\"): string {\r\n if (value == null || isNaN(value))\r\n return \"—\";\r\n switch (kind) {\r\n case \"dur\": return formatDuration(value);\r\n case \"pct\": return formatPercentage(value);\r\n default: return formatNumber(value, \"it\", \"1.0-0\");\r\n }\r\n }\r\n}\r\n\r\n// Secondi: \"850 µs\", \"4,27 ms\", \"312,5 ms\", \"8,41 s\", \"4 min 12 s\", \"3 h 20 min\", \"76 h\"\r\nexport function formatDuration(seconds: number): string {\r\n if (seconds == null || isNaN(seconds))\r\n return \"—\";\r\n let abs = Math.abs(seconds);\r\n if (abs < 0.001)\r\n return `${formatNumber(seconds * 1000000, \"it\", \"1.0-0\")} µs`;\r\n if (abs < 1)\r\n return `${formatNumber(seconds * 1000, \"it\", abs < 0.01 ? \"1.2-2\" : \"1.1-1\")} ms`;\r\n if (abs < 60)\r\n return `${formatNumber(seconds, \"it\", abs < 10 ? \"1.2-2\" : \"1.1-1\")} s`;\r\n if (abs < 3600)\r\n return `${Math.floor(abs / 60)} min ${Math.floor(abs % 60)} s`;\r\n if (abs < 48 * 3600)\r\n return `${Math.floor(abs / 3600)} h ${Math.floor(abs % 3600 / 60)} min`;\r\n return `${formatNumber(Math.floor(abs / 3600), \"it\", \"1.0-0\")} h`;\r\n}\r\n\r\n// Da 0 a 100: \"4,2%\", \"34%\"\r\nexport function formatPercentage(value: number): string {\r\n if (value == null || isNaN(value))\r\n return \"—\";\r\n return `${formatNumber(value, \"it\", Math.abs(value) < 10 ? \"1.1-1\" : \"1.0-0\")}%`;\r\n}\r\n","// Angular\nimport { Component, EventEmitter, Input, OnDestroy, Output } from \"@angular/core\";\n\n// Configurazioni\nimport { LocalizationService } from \"@esfaenza/localizations\";\nimport { DateService } from \"@esfaenza/extensions\";\n\n// Modelli\nimport { NodeDetailV2, NodeDetailV2Request, SessionDetailV2, SessionDetailV2Request, SessionLongOpV2, SessionThreadV2 } from \"../../models/components/DetailsV2\";\nimport { TopActivityDimension, TopActivityResolution } from \"../../models/components/TopActivityV2Enums\";\nimport { TopActivityV2Breakdown, TopActivityV2Table, TopActivityV2TableItem } from \"../../models/components/TopActivityV2Response\";\nimport { KeyValue } from \"../../models/shared/KeyValue\";\n\n// Applicazione\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\nimport { ActivityChartV2Component_Item } from \"../_shared/activity_chart_v2.component\";\nimport { FIXED_COLORS, OTHER_COLOR, componentColor, parseUtc } from \"../_shared/activity_chart_v2\";\n\n// Localizzazione\nimport { AdmDetailsV2Loc } from \"./details_v2.component.loc\";\n\ndeclare var dayjs;\n\nconst HOUR_MS = 3600 * 1000;\nconst MAX_WINDOW_MS = 24 * HOUR_MS;\n// Una finestra che finisce entro questo margine da adesso è \"agganciata\": l'aggiornamento automatico la sposta in avanti\nconst ANCHOR_MARGIN_MS = 2 * 60 * 1000;\n\n// Una voce della pila di navigazione (D1): cosa mostrare, con quale finestra e sorgente\nexport class DetailsV2Entry {\n kind: \"node\" | \"session\";\n nodeId?: string;\n // Nodo: tutte le istanze; altrimenti instanceId (o l'istanza che risponde)\n global?: boolean;\n // Istanza della sessione, oppure il filtro del nodo\n instanceId?: string;\n sid?: number;\n serial?: number;\n dimension?: TopActivityDimension;\n resolution?: TopActivityResolution;\n // Finestra in millisecondi, al massimo 24 ore (D2)\n from: number;\n to: number;\n anchored: boolean;\n // Sessione: \"Memoria\" (true) o \"Memoria e storico\"; nodo: \"Dal vivo\" (true) o \"Storico\" (D3)\n realTime: boolean;\n}\n\n// Contesto della pagina da cui si apre un dettaglio\nexport class DetailsV2Options {\n from: Date;\n to: Date;\n // Nodo: tutte le istanze, oppure una sola (D4)\n global?: boolean;\n instanceId?: string;\n // Nodo: primo istante in memoria della pagina d'origine; con la finestra tutta prima si legge lo storico (D3)\n memoryFrom?: Date;\n // Sorgente scelta dalla pagina d'origine: per la sessione \"Memoria\" (true) o \"Memoria e storico\"; per il nodo dal vivo o storico,\n // e se manca la decide memoryFrom (D3)\n realTime?: boolean;\n // Aggiornamento automatico della pagina d'origine in secondi, 0 se spento (D5)\n refreshSeconds?: number;\n}\n\nexport class DetailsV2EventLink {\n nodeId: string;\n nodeName: string;\n from: Date;\n to: Date;\n}\n\nclass StatRow {\n label: string;\n total: number;\n snap: number;\n kind: \"int\" | \"dur\";\n}\n\nclass TypePart {\n label: string;\n color: string;\n percentage: number;\n idle: boolean;\n}\n\n/**\n * Dettaglio di un nodo del profiler e di una sessione (specifica \"Dettaglio nodo e sessione\"), in una finestra di dialogo con la pila\n * di navigazione: dalla sessione si apre il nodo di un evento, dal nodo i suoi antenati e discendenti, \"Indietro\" torna al precedente.\n * Le chiamate sono GetNodeStats e GetSessionStats con DirectorFeature.DetailsV2 attivo\n */\n@Component({\n selector: \"adm-details-v2\",\n providers: [{ provide: LocalizationService, useClass: AdmDetailsV2Loc }],\n templateUrl: \"./details_v2.component.html\",\n styleUrls: [\"./details_v2.component.scss\"],\n standalone: false\n})\nexport class AdmDetailsV2Component implements OnDestroy {\n @Input() Be: string = \"\";\n // \"Sessioni su questo evento\" ha senso solo con la Top Activity v2 (N8)\n @Input() CanShowSessions: boolean = false;\n // \"Apri nel profiler\" ha senso solo con il profiler v2, che sa usare un nodo come radice (N7)\n @Input() CanOpenProfiler: boolean = false;\n\n @Output() closed = new EventEmitter<void>();\n @Output() sessionsOnEvent = new EventEmitter<DetailsV2EventLink>();\n @Output() openProfiler = new EventEmitter<string>();\n\n public readonly Dim = TopActivityDimension;\n public readonly QuickRanges: number[] = [1, 6, 24];\n\n public stack: DetailsV2Entry[] = [];\n public node: NodeDetailV2;\n public session: SessionDetailV2;\n public loading: boolean = false;\n public notFound: boolean = false;\n public error: string;\n public updatedAt: Date;\n public paused: boolean = false;\n public refreshSeconds: number = 0;\n public filterfrom: string = \"\";\n public filterto: string = \"\";\n public windowClamped: boolean = false;\n\n // Viste derivate dalla risposta\n public nodeChartTimes: string[] = [];\n public nodeChart: ActivityChartV2Component_Item[] = [];\n public nodeStats: StatRow[] = [];\n public typeParts: TypePart[] = [];\n public sessionChart: ActivityChartV2Component_Item[] = [];\n public sessionTables: TopActivityV2Table[] = [];\n public expandedTid: number;\n public highlightedTid: number;\n public copied: boolean = false;\n\n public Dimensions: KeyValue[] = [];\n public Resolutions: KeyValue[] = [];\n\n // Il tempo in corso dei thread avanza fra un aggiornamento e l'altro (S4)\n public now: number = Date.now();\n private loadedAt: number = Date.now();\n private colors: { [key: string]: string } = {};\n private refreshTimer: any;\n private tickTimer: any;\n private visible: boolean = false;\n private requestId: number = 0;\n\n constructor(public lc: LocalizationService, private dateExts: DateService, private adms: AdminModuleBaseService) {\n this.Dimensions = [\n new KeyValue(String(TopActivityDimension.WaitClass), this.lc.loc(\"Classe di attesa\")),\n new KeyValue(String(TopActivityDimension.EventType), this.lc.loc(\"Tipo di evento\")),\n new KeyValue(String(TopActivityDimension.Thread), \"Thread\"),\n new KeyValue(String(TopActivityDimension.Api), \"API\"),\n new KeyValue(String(TopActivityDimension.WaitEvent), this.lc.loc(\"Evento\"))\n ];\n this.Resolutions = [\n new KeyValue(String(TopActivityResolution.Low), this.lc.loc(\"Bassa\")),\n new KeyValue(String(TopActivityResolution.Medium), this.lc.loc(\"Media\")),\n new KeyValue(String(TopActivityResolution.High), this.lc.loc(\"Alta\")),\n new KeyValue(String(TopActivityResolution.Maximum), this.lc.loc(\"Massima\"))\n ];\n }\n\n ngOnDestroy() {\n this.stopTimers();\n }\n\n get current(): DetailsV2Entry {\n return this.stack[this.stack.length - 1];\n }\n\n // #region Apertura e navigazione (D1)\n\n openNode(nodeId: string, o: DetailsV2Options) {\n // D3: dal vivo nel caso normale; lo storico solo se la finestra è tutta prima dei campioni in memoria\n let realTime = o.realTime ?? !(o.memoryFrom && o.to.getTime() <= o.memoryFrom.getTime());\n this.start({ kind: \"node\", nodeId: nodeId, global: o.instanceId ? null : (o.global ?? true), instanceId: o.instanceId || null, realTime: realTime, ...this.window(o) }, o);\n }\n\n openSession(instanceId: string, sid: number, serial: number, o: DetailsV2Options) {\n this.start({ kind: \"session\", instanceId: instanceId, sid: sid, serial: serial, dimension: TopActivityDimension.WaitClass, resolution: TopActivityResolution.Medium, realTime: o.realTime ?? false, ...this.window(o) }, o);\n }\n\n // Da una sessione l'istanza è quella della sessione e il nodo si legge dal vivo; da un nodo valgono gli stessi parametri\n pushNode(nodeId: string) {\n let cur = this.current;\n if (!nodeId || !cur)\n return;\n let entry: DetailsV2Entry = cur.kind == \"session\"\n ? { kind: \"node\", nodeId: nodeId, global: null, instanceId: cur.instanceId, realTime: true, from: cur.from, to: cur.to, anchored: cur.anchored }\n : { ...cur, nodeId: nodeId };\n this.stack.push(entry);\n this.load();\n }\n\n back() {\n if (this.stack.length < 2)\n return;\n this.stack.pop();\n this.load();\n }\n\n close() {\n this.stop();\n this.closed.emit();\n }\n\n // Da chiamare quando la finestra di dialogo si chiude: l'aggiornamento automatico si ferma (D5)\n stop() {\n this.visible = false;\n this.stopTimers();\n }\n\n private start(entry: DetailsV2Entry, o: DetailsV2Options) {\n this.refreshSeconds = o.refreshSeconds ?? 0;\n this.paused = false;\n this.stack = [entry];\n this.visible = true;\n this.load();\n this.startTimers();\n }\n\n private window(o: DetailsV2Options): { from: number, to: number, anchored: boolean } {\n let to = (o.to ?? new Date()).getTime();\n let from = (o.from ?? new Date(to - HOUR_MS)).getTime();\n return { from: Math.max(from, to - MAX_WINDOW_MS), to: to, anchored: Math.abs(Date.now() - to) < ANCHOR_MARGIN_MS };\n }\n\n // #endregion\n\n // #region Caricamento\n\n async load(refresh: boolean = false) {\n let entry = this.current;\n if (!entry)\n return;\n this.syncWindowFields();\n let id = ++this.requestId;\n this.loading = true;\n this.error = null;\n if (!refresh) {\n this.node = null;\n this.session = null;\n this.notFound = false;\n this.expandedTid = null;\n this.highlightedTid = null;\n }\n\n try {\n if (entry.kind == \"node\") {\n let res = await this.adms.getNodeDetailV2(this.Be, this.nodeRequest(entry));\n if (id != this.requestId)\n return;\n this.node = res;\n this.buildNodeView();\n }\n else {\n let res = await this.adms.getSessionDetailV2(this.Be, this.sessionRequest(entry));\n if (id != this.requestId)\n return;\n this.session = res;\n this.buildSessionView();\n }\n this.notFound = !this.node && !this.session;\n this.updatedAt = new Date();\n this.loadedAt = Date.now();\n this.now = this.loadedAt;\n }\n catch (err) {\n if (id != this.requestId || err?.status == 401)\n return;\n this.node = null;\n this.session = null;\n // 400 del backend (finestra non valida): arriva come 542 con il message (D6)\n this.error = err?.status == 542 ? this.adms.errorText(err) : `${this.lc.loc(\"Errore\")} ${err?.status ?? \"\"}: ${this.adms.errorText(err)}`;\n }\n finally {\n if (id == this.requestId)\n this.loading = false;\n }\n }\n\n private nodeRequest(e: DetailsV2Entry): NodeDetailV2Request {\n return {\n nodeId: e.nodeId,\n realTime: e.realTime,\n global: e.instanceId ? null : e.global,\n instanceId: e.instanceId,\n snapFrom: new Date(e.from).toISOString(),\n snapTo: new Date(e.to).toISOString()\n };\n }\n\n private sessionRequest(e: DetailsV2Entry): SessionDetailV2Request {\n return {\n instanceId: e.instanceId,\n sid: e.sid,\n serial: e.serial,\n realTime: e.realTime,\n snapFrom: new Date(e.from).toISOString(),\n snapTo: new Date(e.to).toISOString(),\n dimension: e.dimension,\n resolution: e.resolution\n };\n }\n\n // #endregion\n\n // #region Finestra, sorgente e aggiornamento (D2, D3, D5)\n\n quickRange(hours: number) {\n let e = this.current;\n e.to = Date.now();\n e.from = e.to - hours * HOUR_MS;\n e.anchored = true;\n this.load();\n }\n\n applyDates() {\n let e = this.current;\n let to = this.toDate(this.filterto)?.getTime() ?? Date.now();\n let from = this.toDate(this.filterfrom)?.getTime() ?? to - HOUR_MS;\n // Al massimo 24 ore; una finestra rovesciata la rifiuta il backend con il suo messaggio\n this.windowClamped = to - from > MAX_WINDOW_MS;\n e.from = this.windowClamped ? to - MAX_WINDOW_MS : from;\n e.to = to;\n e.anchored = Math.abs(Date.now() - to) < ANCHOR_MARGIN_MS;\n this.load();\n }\n\n setRealTime(realTime: boolean) {\n if (this.current.realTime == realTime)\n return;\n this.current.realTime = realTime;\n this.load();\n }\n\n setDimension(id: string) {\n this.current.dimension = +id;\n this.load(true);\n }\n\n setResolution(id: string) {\n this.current.resolution = +id;\n this.load(true);\n }\n\n togglePause() {\n this.paused = !this.paused;\n }\n\n get autoRefresh(): boolean {\n return this.refreshSeconds > 0 && !!this.current?.anchored;\n }\n\n get windowLabel(): string {\n let e = this.current;\n if (!e)\n return \"\";\n let sameDay = dayjs(e.from).isSame(dayjs(e.to), \"day\");\n let fmtFrom = dayjs(e.from).format(sameDay ? \"HH:mm\" : \"DD/MM HH:mm\");\n let fmtTo = dayjs(e.to).format(sameDay ? \"HH:mm\" : \"DD/MM HH:mm\");\n return `${this.lc.loc(\"dalle\")} ${fmtFrom} ${this.lc.loc(\"alle\")} ${fmtTo} (${this.timeZone()})`;\n }\n\n private startTimers() {\n this.stopTimers();\n this.tickTimer = setInterval(() => this.now = Date.now(), 1000);\n if (this.refreshSeconds > 0)\n this.refreshTimer = setInterval(() => this.autoRefreshTick(), this.refreshSeconds * 1000);\n }\n\n private stopTimers() {\n clearInterval(this.tickTimer);\n clearInterval(this.refreshTimer);\n this.tickTimer = null;\n this.refreshTimer = null;\n }\n\n // Sposta in avanti la finestra della stessa durata, solo se è agganciata ad adesso, non in pausa e il dettaglio si vede\n private autoRefreshTick() {\n let e = this.current;\n if (!e || !e.anchored || this.paused || this.loading || !this.visible || document.hidden)\n return;\n let length = e.to - e.from;\n e.to = Date.now();\n e.from = e.to - length;\n this.load(true);\n }\n\n private syncWindowFields() {\n let e = this.current;\n this.filterfrom = this.fmt(new Date(e.from));\n this.filterto = this.fmt(new Date(e.to));\n }\n\n // #endregion\n\n // #region Nodo (N1-N8)\n\n get nodeLive(): boolean {\n return !!this.node && this.current?.realTime && this.node.snapDeltaExecutions != null;\n }\n\n private buildNodeView() {\n let n = this.node;\n if (!n) {\n this.nodeChart = [];\n this.nodeChartTimes = [];\n this.nodeStats = [];\n this.typeParts = [];\n return;\n }\n\n this.nodeChartTimes = (n.activeSessions ?? []).map(t => t.timestamp);\n this.nodeChart = (n.activityByClass ?? []).map(c => ({ ...c, label: c.other ? this.lc.loc(\"Altri\") : c.label }));\n // minTime vale 0 senza esecuzioni concluse, snapDeltaMinTime null: in tutti e due i casi non c'è un minimo da mostrare\n this.nodeStats = [\n { label: this.lc.loc(\"Esecuzioni\"), total: n.executions, snap: n.snapDeltaExecutions, kind: \"int\" },\n { label: this.lc.loc(\"Tempo totale\"), total: n.elapsedTime, snap: n.snapDeltaElapsedTime, kind: \"dur\" },\n { label: this.lc.loc(\"Tempo proprio\"), total: n.elapsedTimeLessChildren, snap: n.snapDeltaElapsedTimeLessChildren, kind: \"dur\" },\n { label: this.lc.loc(\"Medio\"), total: n.executions ? n.avgTime : null, snap: n.snapDeltaExecutions ? n.snapDeltaAvgTime : null, kind: \"dur\" },\n { label: this.lc.loc(\"Massimo\"), total: n.executions ? n.peakTime : null, snap: n.snapDeltaExecutions ? n.snapDeltaPeakTime : null, kind: \"dur\" },\n { label: this.lc.loc(\"Minimo\"), total: n.executions ? n.minTime : null, snap: n.snapDeltaMinTime, kind: \"dur\" }\n ];\n this.typeParts = [\n { label: \"CPU\", color: FIXED_COLORS.Cpu, percentage: n.cpuPerc, idle: false },\n { label: \"Database\", color: FIXED_COLORS.Database, percentage: n.dbPerc, idle: false },\n { label: \"Wait\", color: FIXED_COLORS.Wait, percentage: n.waitPerc, idle: false },\n { label: \"Script\", color: FIXED_COLORS.Script, percentage: n.scriptPerc, idle: false },\n { label: \"IO\", color: FIXED_COLORS.IO, percentage: n.ioPerc, idle: false },\n { label: \"Network\", color: FIXED_COLORS.Network, percentage: n.networkPerc, idle: false },\n { label: \"Throttle\", color: FIXED_COLORS.Throttle, percentage: n.throttlePerc, idle: false },\n { label: \"Sleep\", color: FIXED_COLORS.Sleep, percentage: n.sleepPerc, idle: false },\n { label: \"Idle\", color: OTHER_COLOR, percentage: n.idlePerc, idle: true }\n ].filter(t => (t.percentage ?? 0) > 0);\n }\n\n // Con lo storico, la parte del grafico prima dei campioni in memoria ha meno risoluzione: la pagina la segnala\n get nodeHistoryBefore(): string {\n let n = this.node;\n if (!n || this.current?.realTime || !n.memoryFrom)\n return null;\n let memory = parseUtc(n.memoryFrom)?.getTime();\n let from = parseUtc(n.activityFrom)?.getTime();\n let to = parseUtc(n.activityTo)?.getTime();\n return memory > from && memory < to ? this.localTime(n.memoryFrom) : null;\n }\n\n copyName() {\n navigator.clipboard?.writeText(this.node?.nodeName ?? \"\").then(() => {\n this.copied = true;\n setTimeout(() => this.copied = false, 1500);\n });\n }\n\n showSessions() {\n let e = this.current;\n this.sessionsOnEvent.emit({ nodeId: this.node.nodeId, nodeName: this.node.nodeName, from: new Date(e.from), to: new Date(e.to) });\n }\n\n // #endregion\n\n // #region Sessione (S1-S6)\n\n private buildSessionView() {\n let ta = this.session?.topActivity;\n let fixed = ta?.dimension == TopActivityDimension.WaitClass || ta?.dimension == TopActivityDimension.EventType;\n this.colors = {};\n this.sessionChart = (ta?.components ?? []).map((c, i) => {\n if (c.key != null)\n this.colors[c.key] = componentColor(c.key, c.other, i, fixed);\n return { ...c, label: this.valueLabel(c.label, c.other, ta.dimension) };\n });\n // Nell'ordine della specifica: eventi, thread, API\n let order = [TopActivityDimension.WaitEvent, TopActivityDimension.Thread, TopActivityDimension.Api];\n this.sessionTables = order.map(d => ta?.tables?.find(t => t.dimension == d)).filter(t => !!t);\n }\n\n get sessionFixedColors(): boolean {\n let d = this.session?.topActivity?.dimension;\n return d == TopActivityDimension.WaitClass || d == TopActivityDimension.EventType;\n }\n\n tableTitle(table: TopActivityV2Table): string {\n switch (table.dimension) {\n case TopActivityDimension.WaitEvent: return this.lc.loc(\"Eventi\");\n case TopActivityDimension.Thread: return \"Thread\";\n case TopActivityDimension.Api: return \"API\";\n }\n return String(table.dimension);\n }\n\n itemLabel(item: TopActivityV2TableItem, table: TopActivityV2Table): string {\n return this.valueLabel(item.label, item.other, table.dimension);\n }\n\n isItemClickable(item: TopActivityV2TableItem, table: TopActivityV2Table): boolean {\n if (item.other)\n return false;\n if (table.dimension == TopActivityDimension.WaitEvent)\n return !!item.event?.eventId;\n return table.dimension == TopActivityDimension.Thread && this.isThreadAlive(this.tidOf(item.key));\n }\n\n // Una riga evento apre il nodo; una riga thread evidenzia il thread fra quelli di adesso\n itemClicked(item: TopActivityV2TableItem, table: TopActivityV2Table) {\n if (!this.isItemClickable(item, table))\n return;\n if (table.dimension == TopActivityDimension.WaitEvent)\n this.pushNode(item.event.eventId);\n else\n this.highlightedTid = this.tidOf(item.key);\n }\n\n breakdownWidth(item: TopActivityV2TableItem, part: TopActivityV2Breakdown): number {\n return item.activity ? part.activity / item.activity * 100 : 0;\n }\n\n breakdownColor(part: TopActivityV2Breakdown): string {\n return part.other || part.key == null ? OTHER_COLOR : this.colors[part.key] ?? FIXED_COLORS[part.key] ?? OTHER_COLOR;\n }\n\n toggleThread(thread: SessionThreadV2) {\n this.expandedTid = this.expandedTid == thread.tid ? null : thread.tid;\n }\n\n // Tempo nell'evento corrente: parte da waitTime e avanza fino al prossimo aggiornamento\n runningSeconds(thread: SessionThreadV2): number {\n return thread.inWait ? (thread.waitTime ?? 0) + Math.max(0, this.now - this.loadedAt) / 1000 : null;\n }\n\n progress(op: SessionLongOpV2): number {\n return op.totalWork ? Math.min(100, op.soFar / op.totalWork * 100) : 0;\n }\n\n connectedFor(): number {\n let start = parseUtc(this.session?.startTime);\n return start ? Math.max(0, (this.now - start.getTime()) / 1000) : null;\n }\n\n private tidOf(key: string): number {\n let tid = parseInt((key ?? \"\").split(\"@\")[0], 10);\n return isNaN(tid) ? null : tid;\n }\n\n private isThreadAlive(tid: number): boolean {\n return tid != null && !!this.session?.connected && (this.session.threads ?? []).some(t => t.tid == tid);\n }\n\n // #endregion\n\n // #region Supporto\n\n localTime(value: string): string {\n let date = parseUtc(value);\n return date ? dayjs(date).format(\"DD/MM/YYYY HH:mm:ss\") : \"\";\n }\n\n shortTime(value: string): string {\n let date = parseUtc(value);\n return date ? dayjs(date).format(\"HH:mm\") : \"\";\n }\n\n // Colore del tipo di evento, o della classe per i wait, come nel grafico della Top Activity\n typeColor(type: string, waitClass: string): string {\n return FIXED_COLORS[waitClass && waitClass != \"None\" ? waitClass : type] ?? OTHER_COLOR;\n }\n\n typeLabel(type: string, waitClass: string): string {\n return waitClass && waitClass != \"None\" ? `${type} · ${waitClass}` : type;\n }\n\n private valueLabel(label: string, other: boolean, dimension: TopActivityDimension): string {\n if (other)\n return this.lc.loc(\"Altri\");\n if (label == null || label === \"\")\n return this.lc.loc(dimension == TopActivityDimension.WaitEvent ? \"(non attribuito)\" : \"(nessuno)\");\n return label;\n }\n\n private timeZone(): string {\n let minutes = -new Date().getTimezoneOffset();\n let sign = minutes >= 0 ? \"+\" : \"-\";\n let abs = Math.abs(minutes);\n return `UTC${sign}${Math.floor(abs / 60)}${abs % 60 ? \":\" + String(abs % 60).padStart(2, \"0\") : \"\"}`;\n }\n\n private toDate(value: string): Date {\n return value ? this.dateExts.getDateConvertion(value).toDate() : null;\n }\n\n private fmt(date: Date): string {\n return dayjs(date).format(this.lc.token(\"getFullDateDisplayFormat\"));\n }\n\n // #endregion\n}\n","<div class=\"modal-dialog modal-xl\" emaDraggable>\n <div class=\"modal-content\">\n <!-- Navigazione: \"Indietro\" torna al dettaglio precedente con la sua finestra (D1) -->\n <div class=\"modal-header dv2-header\">\n <div class=\"dv2-heading\">\n @if (stack.length > 1) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"back()\"><i class=\"fa fa-arrow-left\"></i> {{'Indietro' | localize: lc}}</button>\n }\n <h4 class=\"modal-title\">\n @if (current?.kind == 'node') {\n {{'Dettaglio nodo' | localize: lc}}\n } @else if (current) {\n {{'Sessione' | localize: lc}} {{current.sid}},{{current.serial}}\n @if (current.instanceId) {\n <span class=\"dv2-muted\">· {{current.instanceId}}</span>\n }\n }\n </h4>\n </div>\n <button type=\"button\" class=\"close\" (click)=\"close()\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\n </div>\n\n <div class=\"modal-body\">\n @if (current) {\n <!-- Finestra, sorgente, aggiornamento (D2, D3, D5) -->\n <div class=\"dv2-toolbar\">\n <div class=\"dv2-group\">\n <span class=\"dv2-window\"><i class=\"fa fa-clock\"></i> {{windowLabel}}</span>\n <div class=\"dv2-seg\">\n @for (h of QuickRanges; track h) {\n <button type=\"button\" (click)=\"quickRange(h)\" [title]=\"'Ultime' | localize: lc\">{{h}} h</button>\n }\n </div>\n </div>\n <div class=\"dv2-group dv2-dates\">\n <div class=\"dv2-field\"><form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterfrom\" name=\"dv2from\" [Placeholder]=\"'Da' | localize: lc\"></form-datetime></div>\n <div class=\"dv2-field\"><form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterto\" name=\"dv2to\" [Placeholder]=\"'A' | localize: lc\"></form-datetime></div>\n <button type=\"button\" class=\"btn app-btn-search\" [disabled]=\"loading\" (click)=\"applyDates()\" [title]=\"'Applica' | localize: lc\"><i class=\"fa fa-search\"></i></button>\n </div>\n <div class=\"dv2-seg\">\n @if (current.kind == 'session') {\n <button type=\"button\" [class.dv2-on]=\"current.realTime\" (click)=\"setRealTime(true)\">{{'Memoria' | localize: lc}}</button>\n <button type=\"button\" [class.dv2-on]=\"!current.realTime\" (click)=\"setRealTime(false)\">{{'Memoria e storico' | localize: lc}}</button>\n } @else {\n <button type=\"button\" [class.dv2-on]=\"current.realTime\" (click)=\"setRealTime(true)\">{{'Dal vivo' | localize: lc}}</button>\n <button type=\"button\" [class.dv2-on]=\"!current.realTime\" (click)=\"setRealTime(false)\">{{'Storico' | localize: lc}}</button>\n }\n </div>\n <div class=\"dv2-group dv2-end\">\n @if (loading) {\n <i class=\"fa fa-spinner fa-spin\"></i>\n }\n @if (updatedAt) {\n <span class=\"dv2-muted\">{{'Aggiornato alle' | localize: lc}} {{updatedAt | date: 'HH:mm:ss'}}</span>\n }\n @if (autoRefresh) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-secondary\" (click)=\"togglePause()\">\n <i class=\"fa\" [class.fa-pause]=\"!paused\" [class.fa-play]=\"paused\"></i> {{(paused ? 'Riprendi' : 'Pausa') | localize: lc}}\n </button>\n }\n </div>\n </div>\n @if (windowClamped) {\n <div class=\"dv2-note\"><i class=\"fa fa-info-circle\"></i> {{'La finestra è stata ridotta alle ultime 24 ore' | localize: lc}}</div>\n }\n\n <!-- Stati (D6) -->\n @if (error) {\n <div class=\"alert alert-warning dv2-state\">{{error}}</div>\n } @else if (notFound && !loading) {\n <div class=\"alert alert-info dv2-state\">\n {{(current.kind == 'node' ? 'Nodo non trovato' : 'Sessione non trovata: non esiste più e nella finestra non era attiva') | localize: lc}}\n </div>\n } @else if (loading && !node && !session) {\n <div class=\"dv2-empty\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Carico i Dati' | localize: lc}}</div>\n }\n\n <!-- ==================== Nodo ==================== -->\n @if (node && current.kind == 'node') {\n <!-- N1 Intestazione -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-node-name\">{{node.nodeName}}</div>\n <div class=\"dv2-meta\">\n <span><span class=\"dv2-swatch\" [style.background]=\"typeColor(node.eventTypeName, node.waitClassName)\"></span>{{typeLabel(node.eventTypeName, node.waitClassName)}}</span>\n <span class=\"dv2-muted\">Id <code>{{node.nodeId}}</code></span>\n <button type=\"button\" class=\"btn btn-sm btn-link\" (click)=\"copyName()\"><i class=\"fa\" [class.fa-copy]=\"!copied\" [class.fa-check]=\"copied\"></i> {{(copied ? 'Copiato' : 'Copia') | localize: lc}}</button>\n </div>\n @if (node.fullWaitStack?.length) {\n <div class=\"dv2-path\">\n @for (item of node.fullWaitStack; track item.nodeId) {\n <span class=\"app-link dv2-path-item\" [title]=\"item.nodeName\" (click)=\"pushNode(item.nodeId)\">{{item.nodeName}}</span>\n <i class=\"fa fa-angle-right dv2-muted\"></i>\n }\n <span class=\"dv2-path-item dv2-path-current\" [title]=\"node.nodeName\">{{node.nodeName}}</span>\n </div>\n }\n <div class=\"dv2-actions\">\n @if (CanOpenProfiler) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openProfiler.emit(node.nodeId)\"><i class=\"fa fa-sitemap\"></i> {{'Apri nel profiler' | localize: lc}}</button>\n }\n @if (CanShowSessions) {\n <button type=\"button\" class=\"btn btn-sm btn-outline-primary\" (click)=\"showSessions()\" [title]=\"(node.numChildren > 0 ? 'Solo l\\'evento esatto: il lavoro dei discendenti non è compreso' : 'Top Activity filtrata su questo evento') | localize: lc\">\n <i class=\"fa fa-users\"></i> {{'Sessioni su questo evento' | localize: lc}}\n </button>\n @if (node.numChildren > 0) {\n <span class=\"dv2-muted\">{{'discendenti esclusi' | localize: lc}}</span>\n }\n }\n </div>\n </div>\n\n <div class=\"dv2-grid\">\n <!-- N2 Statistiche -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Statistiche' | localize: lc}}</div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th></th>\n @if (nodeLive) {\n <th class=\"dv2-right\">{{'Dall\\'avvio' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Dall\\'ultimo snapshot' | localize: lc}} <span class=\"dv2-muted\">({{'dalle' | localize: lc}} {{shortTime(node.snapFrom)}})</span></th>\n } @else {\n <th class=\"dv2-right\">{{'Nella finestra' | localize: lc}} <span class=\"dv2-muted\">({{shortTime(node.snapFrom)}} - {{shortTime(node.snapTo)}})</span></th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of nodeStats; track row.label) {\n <tr>\n <td>{{row.label}}</td>\n <td class=\"dv2-right\">{{row.total == null ? '—' : (row.total | pv2fmt: row.kind)}}</td>\n @if (nodeLive) {\n <td class=\"dv2-right\">{{row.snap == null ? '—' : (row.snap | pv2fmt: row.kind)}}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (nodeLive) {\n <div class=\"dv2-live\">\n <span>{{'Thread dentro adesso' | localize: lc}} <strong>{{node.activeThreads ?? 0}}</strong></span>\n <span>{{'In corso da' | localize: lc}} <strong>{{node.activeMaxTime ? (node.activeMaxTime | pv2fmt: 'dur') : '—'}}</strong></span>\n <span>{{'Ultima uscita' | localize: lc}} <strong>{{node.lastExitTime ? localTime(node.lastExitTime) : '—'}}</strong></span>\n </div>\n }\n </div>\n\n <!-- N4 Dove va il tempo -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Dove va il tempo' | localize: lc}} <span class=\"dv2-muted\">{{'tempo proprio del sottoalbero' | localize: lc}}</span></div>\n <div class=\"dv2-typebar\">\n @for (part of typeParts; track part.label) {\n <div [style.width.%]=\"part.percentage\" [style.background]=\"part.color\" [class.dv2-idle]=\"part.idle\" [title]=\"part.label + ' ' + (part.percentage | number : '1.1-1' : 'it') + '%'\"></div>\n }\n </div>\n <div class=\"dv2-legend\">\n @for (part of typeParts; track part.label) {\n <span><span class=\"dv2-swatch\" [class.dv2-idle]=\"part.idle\" [style.background]=\"part.color\"></span>{{part.label}} <span class=\"dv2-muted\">{{part.percentage | number : '1.1-1' : 'it'}}%</span></span>\n }\n </div>\n @if (typeParts.length && typeParts[typeParts.length - 1].idle) {\n <div class=\"dv2-muted dv2-small\">{{'Idle è tempo di attesa senza lavoro' | localize: lc}}</div>\n }\n\n <!-- N3 Per istanza -->\n @if ((node.instances?.length ?? 0) > 1) {\n <div class=\"dv2-title dv2-spaced\">{{'Per istanza' | localize: lc}}</div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th>{{'Istanza' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Esecuzioni' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo proprio' | localize: lc}}</th>\n @if (nodeLive) {\n <th class=\"dv2-right\">{{'Thread attivi' | localize: lc}}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (inst of node.instances; track inst.instanceId) {\n <tr>\n <td class=\"app-nowrap\">{{inst.instanceId}}</td>\n <td class=\"dv2-right\">{{inst.executions | pv2fmt: 'int'}}</td>\n <td class=\"dv2-right\">{{inst.elapsedTime | pv2fmt: 'dur'}}</td>\n <td class=\"dv2-right\">{{inst.elapsedTimeLessChildren | pv2fmt: 'dur'}}</td>\n @if (nodeLive) {\n <td class=\"dv2-right\">{{inst.activeThreads ?? 0}}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n </div>\n\n <!-- N6 Attività nel tempo -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">\n {{'Attività nel tempo' | localize: lc}}\n <span class=\"dv2-muted\">≈ <strong>{{node.averageActiveSessions | number : '1.2-3' : 'it'}}</strong> {{'sessioni attive medie' | localize: lc}} · {{'picco' | localize: lc}} <strong>{{node.peakActiveSessions | number : '1.2-3' : 'it'}}</strong> · {{'un punto ogni' | localize: lc}} {{node.bucketSeconds}} s</span>\n <span class=\"dv2-estimate\" [title]=\"'Valori stimati contando i campioni' | localize: lc\">{{'stima per campionamento' | localize: lc}}</span>\n </div>\n <activity-chart-v2 [Times]=\"nodeChartTimes\" [Components]=\"nodeChart\" [BucketSeconds]=\"node.bucketSeconds\" [Uom]=\"'sessioni' | localize: lc\"\n [EmptyText]=\"'Nessuna attività nella finestra' | localize: lc\" name=\"dv2nodechart\"></activity-chart-v2>\n @if (nodeHistoryBefore) {\n <div class=\"dv2-note\"><i class=\"fa fa-info-circle\"></i> {{'Prima delle' | localize: lc}} {{nodeHistoryBefore}} {{'i dati vengono dallo storico, con meno risoluzione' | localize: lc}}</div>\n }\n @if (node.numChildren > 0) {\n <div class=\"dv2-muted dv2-small\">{{'Comprende il lavoro dei discendenti' | localize: lc}}</div>\n }\n </div>\n\n <!-- N5 Discendenti principali -->\n @if (node.numChildren > 0) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Discendenti principali' | localize: lc}} <span class=\"dv2-muted\">{{'Figli' | localize: lc}}: {{node.numChildren}} · {{'Discendenti' | localize: lc}}: {{node.numDescendants}}</span></div>\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th>{{'Nome' | localize: lc}}</th>\n <th>{{'Tipo' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Livello' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Esecuzioni' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'Tempo proprio' | localize: lc}}</th>\n <th class=\"dv2-right\">% {{'del nodo' | localize: lc}}</th>\n </tr>\n </thead>\n <tbody>\n @for (d of node.topDescendants ?? []; track d.nodeId) {\n <tr>\n <td><span class=\"app-link dv2-ellipsis\" [title]=\"d.nodeName\" (click)=\"pushNode(d.nodeId)\">{{d.nodeName}}</span></td>\n <td class=\"app-nowrap\">{{typeLabel(d.eventTypeName, d.waitClassName)}}</td>\n <td class=\"dv2-right\">{{d.depth}}</td>\n <td class=\"dv2-right\">{{d.executions | pv2fmt: 'int'}}</td>\n <td class=\"dv2-right\">{{d.elapsedTimeLessChildren | pv2fmt: 'dur'}}</td>\n <td class=\"dv2-right\">{{d.percentage | number : '1.1-1' : 'it'}}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n\n <!-- ==================== Sessione ==================== -->\n @if (session && current.kind == 'session') {\n <!-- S1 Intestazione -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-meta dv2-session-head\">\n @if (session.connected) {\n <span class=\"dv2-badge\">{{session.currentStatus}}</span>\n } @else {\n <span class=\"dv2-badge dv2-badge-off\">{{'Terminata' | localize: lc}}</span>\n }\n <span>{{'Utente' | localize: lc}} <strong>{{session.user}}</strong>@if (session.tenant) {<span class=\"dv2-muted\"> · {{session.tenant}}</span>}</span>\n <span>{{'Tipo' | localize: lc}} <strong>{{session.type | titlecase}}</strong></span>\n @if (session.resourceConsumerGroup) {\n <span>{{'Gruppo di consumo' | localize: lc}} <strong>{{session.resourceConsumerGroup}}</strong></span>\n }\n @if (session.bgSessionName) {\n <span>{{'Sessione di background' | localize: lc}} <strong>{{session.bgSessionName}}</strong></span>\n }\n @if (session.jobName) {\n <span>Job <strong>{{session.jobName}}</strong></span>\n }\n </div>\n <div class=\"dv2-meta\">\n @if (session.startTime) {\n <span>{{'Inizio' | localize: lc}} <strong>{{localTime(session.startTime)}}</strong> <span class=\"dv2-muted\">({{'collegata da' | localize: lc}} {{connectedFor() | pv2fmt: 'dur'}})</span></span>\n }\n @if (session.numThreads != null) {\n <span>Thread <strong>{{session.numThreads}}</strong></span>\n }\n <span>{{'Ultima attività' | localize: lc}} <strong>{{session.lastSampleTime ? localTime(session.lastSampleTime) : '—'}}</strong></span>\n </div>\n </div>\n\n <!-- S6 Sessione terminata -->\n @if (!session.connected) {\n <div class=\"alert alert-warning dv2-state\">\n {{'La sessione non esiste più: i suoi dati vengono dall\\'ultimo campione, delle' | localize: lc}} {{localTime(session.lastSampleTime)}}\n </div>\n }\n\n <!-- S2 Grafico -->\n <div class=\"dv2-panel\">\n <div class=\"dv2-chart-head\">\n <span class=\"dv2-title\">\n {{'Sessioni attive medie' | localize: lc}}\n @if (session.topActivity) {\n <span class=\"dv2-muted\">\n {{'Media' | localize: lc}} <strong>{{session.topActivity.estimated ? '≈ ' : ''}}{{session.topActivity.averageActiveSessions | number : '1.2-3' : 'it'}}</strong>\n · {{'Picco' | localize: lc}} <strong>{{session.topActivity.estimated ? '≈ ' : ''}}{{session.topActivity.peakActiveSessions | number : '1.2-3' : 'it'}}</strong>\n · {{'un punto ogni' | localize: lc}} {{session.topActivity.bucketSeconds}} s\n </span>\n @if (session.topActivity.estimated) {\n <span class=\"dv2-estimate\">{{'stima per campionamento' | localize: lc}}</span>\n }\n }\n </span>\n <div class=\"dv2-group\">\n <div class=\"dv2-field dv2-field-wide dv2-noclear\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"'' + current.dimension\" (ngModelChange)=\"setDimension($event)\" name=\"dv2dim\" [Source]=\"Dimensions\" [Placeholder]=\"'Dividi per' | localize: lc\"></form-select>\n </div>\n <div class=\"dv2-seg\">\n @for (o of Resolutions; track o.id) {\n <button type=\"button\" [class.dv2-on]=\"'' + current.resolution == o.id\" (click)=\"setResolution(o.id)\">{{o.description}}</button>\n }\n </div>\n </div>\n </div>\n <activity-chart-v2 [Times]=\"session.topActivity?.times\" [Components]=\"sessionChart\" [BucketSeconds]=\"session.topActivity?.bucketSeconds\" [FixedColors]=\"sessionFixedColors\"\n [Uom]=\"'sessioni' | localize: lc\" [EmptyText]=\"'Nessuna attività nella finestra' | localize: lc\" name=\"dv2sessionchart\"></activity-chart-v2>\n </div>\n\n <!-- S3 Tabelle: eventi, thread, API -->\n <div class=\"dv2-tables\">\n @for (table of sessionTables; track table.dimension) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">\n {{tableTitle(table)}}@if (table.estimated) { ≈}\n <span class=\"dv2-muted\">{{'Attività' | localize: lc}} <strong>{{table.estimated ? '≈ ' : ''}}{{table.activity | number : '1.2-3' : 'it'}}</strong></span>\n </div>\n <table class=\"table table-sm dv2-table\">\n <tbody>\n @for (item of table.items; track $index) {\n <tr [class.dv2-highlight]=\"table.dimension == Dim.Thread && highlightedTid != null && item.key?.startsWith(highlightedTid + '@')\">\n <td>\n @if (isItemClickable(item, table)) {\n <span class=\"app-link dv2-ellipsis\" [title]=\"item.label || item.key\" (click)=\"itemClicked(item, table)\">{{itemLabel(item, table)}}</span>\n } @else {\n <span class=\"dv2-ellipsis\" [class.dv2-muted]=\"item.other || !item.label\" [title]=\"item.label || ''\">{{itemLabel(item, table)}}</span>\n }\n </td>\n <td class=\"app-nowrap\">\n <div class=\"dv2-bar-cell\">\n <div class=\"dv2-bar\">\n @for (part of item.breakdown; track $index) {\n <div [style.width.%]=\"breakdownWidth(item, part)\" [style.background]=\"breakdownColor(part)\" [title]=\"part.key\"></div>\n }\n </div>\n <span>{{table.estimated ? '≈ ' : ''}}{{item.activity | number : '1.2-3' : 'it'}}</span>\n </div>\n </td>\n <td class=\"dv2-right app-nowrap\">{{item.percentage | number : '1.1-1' : 'it'}}%</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n\n <!-- S4 Thread adesso -->\n @if (session.connected && session.threads?.length) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Thread adesso' | localize: lc}}</div>\n <div class=\"dv2-scroll\">\n <table class=\"table table-sm dv2-table\">\n <thead>\n <tr>\n <th></th>\n <th>TID</th>\n <th>{{'Nome' | localize: lc}}</th>\n <th>{{'Tipo' | localize: lc}}</th>\n <th>{{'Stato' | localize: lc}}</th>\n <th>{{'Priorità' | localize: lc}}</th>\n <th>API</th>\n <th>{{'Macchina' | localize: lc}}</th>\n <th>{{'Evento corrente' | localize: lc}}</th>\n <th class=\"dv2-right\">{{'In corso da' | localize: lc}}</th>\n <th>p1 - p3</th>\n </tr>\n </thead>\n <tbody>\n @for (thread of session.threads; track thread.tid) {\n <tr [class.dv2-highlight]=\"thread.tid == highlightedTid\">\n <td><button type=\"button\" class=\"btn btn-sm btn-link dv2-toggle\" (click)=\"toggleThread(thread)\" [title]=\"'Pila completa degli eventi' | localize: lc\"><i class=\"fa\" [class.fa-caret-right]=\"expandedTid != thread.tid\" [class.fa-caret-down]=\"expandedTid == thread.tid\"></i></button></td>\n <td>{{thread.tid}}</td>\n <td class=\"app-nowrap\">{{thread.name}}</td>\n <td class=\"app-nowrap\">{{thread.type}}</td>\n <td>{{thread.currentStatus}}</td>\n <td>{{thread.priority}}</td>\n <td><span class=\"dv2-ellipsis dv2-ellipsis-short\" [title]=\"thread.currentApi || ''\">{{thread.currentApi}}</span></td>\n <td>{{thread.machineName}}</td>\n <td>\n @if (thread.inWait && thread.currentWaitNodeId) {\n <span class=\"app-link dv2-ellipsis\" [title]=\"thread.currentWait\" (click)=\"pushNode(thread.currentWaitNodeId)\">{{thread.currentWait}}</span>\n <span class=\"dv2-muted\">{{typeLabel(thread.waitEventTypeName, thread.waitClassName)}}</span>\n } @else {\n <span class=\"dv2-muted\">{{'nessun evento in corso' | localize: lc}}</span>\n }\n </td>\n <td class=\"dv2-right app-nowrap\">{{thread.inWait ? (runningSeconds(thread) | pv2fmt: 'dur') : '—'}}</td>\n <td class=\"dv2-muted\"><span class=\"dv2-ellipsis dv2-ellipsis-short\" [title]=\"[thread.waitParam1, thread.waitParam2, thread.waitParam3].join(' · ')\">{{[thread.waitParam1, thread.waitParam2, thread.waitParam3].join(' · ')}}</span></td>\n </tr>\n @if (expandedTid == thread.tid) {\n <tr class=\"dv2-stack-row\">\n <td colspan=\"11\"><pre class=\"dv2-stack\">{{thread.fullWaitStack || ('Nessun evento' | localize: lc)}}</pre></td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n\n <!-- S5 Operazioni lunghe -->\n @if (session.connected && session.longOps?.length) {\n <div class=\"dv2-panel\">\n <div class=\"dv2-title\">{{'Operazioni lunghe' | localize: lc}}</div>\n @for (op of session.longOps; track $index) {\n <div class=\"dv2-longop\">\n <div class=\"dv2-meta\">\n <strong>{{op.opName}}</strong>\n <span>{{op.target}} @if (op.targetDesc) {<span class=\"dv2-muted\">({{op.targetDesc}})</span>}</span>\n <span class=\"dv2-muted\">Thread {{op.tid}}</span>\n </div>\n <div class=\"dv2-progress\"><div [style.width.%]=\"progress(op)\"></div></div>\n <div class=\"dv2-meta dv2-small\">\n <span>{{op.soFar | number : '1.0-0' : 'it'}} {{'di' | localize: lc}} {{op.totalWork | number : '1.0-0' : 'it'}} {{op.units}} ({{progress(op) | number : '1.0-1' : 'it'}}%)</span>\n <span>{{'Trascorso' | localize: lc}} {{op.elapsedSeconds | pv2fmt: 'dur'}}</span>\n <span>{{'Alla fine' | localize: lc}} {{op.timeRemaining == null ? ('non stimabile' | localize: lc) : (op.timeRemaining | pv2fmt: 'dur')}}</span>\n @if (op.message) {\n <span class=\"dv2-muted\">{{op.message}}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n }\n </div>\n </div>\n</div>\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmProfilerComponentLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Profiler del Server\", [\"Server Profiler\"]);\r\n super.set(\"it->en\", \"Carico i Dati\", [\"Loading Data\"]);\r\n super.set(\"it->en\", \"ID\", [\"ID\"]);\r\n super.set(\"it->en\", \"Descrizione\", [\"Description\"]);\r\n super.set(\"it->en\", \"Chiamate\", [\"Calls\"]);\r\n super.set(\"it->en\", \"Tempo\", [\"Time\"]);\r\n super.set(\"it->en\", \"Tempo Max\", [\"Peak Time\"]);\r\n super.set(\"it->en\", \"Tempo Min\", [\"Min. Time\"]);\r\n super.set(\"it->en\", \"Tempo Medio\", [\"Avg. Time\"]);\r\n super.set(\"it->en\", \"Tempo Specifico\", [\"Specific Time\"]);\r\n super.set(\"it->en\", \"Percentuale\", [\"Percentage\"]);\r\n super.set(\"it->en\", \"Chiamate Periodo\", [\"Calls for Period\"]);\r\n super.set(\"it->en\", \"Tempo Periodo\", [\"Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Max Periodo\", [\"Peak Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Min Periodo\", [\"Min. Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Medio Periodo\", [\"Avg. Time for Period\"]);\r\n super.set(\"it->en\", \"Tempo Specifico Periodo\", [\"Specific Time for Period\"]);\r\n super.set(\"it->en\", \"Percentuale Periodo\", [\"Percentage for Period\"]);\r\n super.set(\"it->en\", \"Nome Tipologia Evento\", [\"Event Type Name\"]);\r\n super.set(\"it->en\", \"Nome Classe Attesa\", [\"Wait Class Name\"]);\r\n }\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class NodeDetailLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Sessioni Attive\", [\"Active Sessions\"]);\r\n super.set(\"it->en\", \"Dettaglio Attività Nodo\", [\"Activity Node Details\"]);\r\n super.set(\"it->en\", \"Tipo Evento\", [\"Event Type\"]);\r\n super.set(\"it->en\", \"Tempo Trascorso (Con Figli)\", [\"Elapsed (With Children)\"]);\r\n super.set(\"it->en\", \"Classe Attesa\", [\"Wait Class\"]);\r\n super.set(\"it->en\", \"Tempo Trascorso\", [\"Elapsed (No Children)\"]);\r\n super.set(\"it->en\", \"Stack di Attesa\", [\"Wait Stack\"]);\r\n super.set(\"it->en\", \"Utilizzo Risorse\", [\"Resources Usage\"]);\r\n super.set(\"it->en\", \"Esecuzioni\", [\"Executions\"]);\r\n\t\tsuper.set(\"it->en\", \"Dettaglio evento\", [\"Event detail\"]);\r\n }\r\n}","// Angular\r\nimport { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\nimport { BaseInterval, KeyValueColor, LineChartData, LineSerie, PieChartData } from \"@esfaenza/es-charts\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n// Applicazione\r\nimport { NodeStats } from \"../../models/components/NodeStats\";\r\n\r\n// Localizzazione\r\nimport { NodeDetailLoc } from \"./node_detail.component.loc\";\r\n\r\n@Component({\r\n selector: \"node-detail\",\r\n viewProviders: [{ provide: LocalizationService, useClass: NodeDetailLoc }],\r\n templateUrl: \"./node_detail.component.html\",\r\n standalone: false\r\n})\r\nexport class NodeDetailComponent {\r\n\r\n @Input() NodeDetails: NodeStats;\r\n\r\n @Output() onClose: EventEmitter<boolean> = new EventEmitter<boolean>();\r\n\r\n constructor(public lc: LocalizationService) { }\r\n\r\n ngOnInit() {\r\n let serie = new LineSerie(this.lc.loc(\"Sessioni Attive\"), this.NodeDetails.activesessions, null);\r\n this.NodeDetails.sessionchart = new LineChartData([serie]);\r\n this.NodeDetails.loadchart = new PieChartData([\r\n new KeyValueColor(\"CPU\", this.NodeDetails.cpuperc),\r\n new KeyValueColor(\"Wait\", this.NodeDetails.waitperc),\r\n new KeyValueColor(\"DB\", this.NodeDetails.dbperc),\r\n new KeyValueColor(\"Script\", this.NodeDetails.scriptperc),\r\n new KeyValueColor(\"Throttle\", this.NodeDetails.throttleperc),\r\n new KeyValueColor(\"Sleep\", this.NodeDetails.sleepperc),\r\n new KeyValueColor(\"Networking\", this.NodeDetails.networkperc),\r\n new KeyValueColor(\"IO\", this.NodeDetails.ioperc)\r\n ]);\r\n }\r\n\r\n closeDialog() {\r\n this.onClose.emit(true);\r\n }\r\n}","<div class=\"modal-dialog modal-xl\" emaDraggable>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">\n {{'Dettaglio Attività Nodo' | localize: lc}}\n @if (NodeDetails) {\n <span> {{NodeDetails.nodeid}}</span>\n }\n </h4>\n <button type=\"button\" class=\"close pull-right\" (click)=\"closeDialog()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n @if (NodeDetails) {\n <div class=\"modal-body\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <strong>{{'Tipo Evento' | localize: lc}}</strong>: {{NodeDetails.eventtypedesc}} <strong>{{'Classe Attesa' | localize: lc}}</strong>: {{NodeDetails.waitclassname}}\n </div>\n <div class=\"col-md-6\">\n <strong>{{'Tempo Trascorso (Con Figli)' | localize: lc}}</strong>: {{NodeDetails.elapsed}} s\n </div>\n <div class=\"col-md-6\">\n <strong>{{'Esecuzioni' | localize: lc}}</strong>: {{NodeDetails.executions}}\n </div>\n <div class=\"col-md-6\">\n <strong>{{'Tempo Trascorso' | localize: lc}}</strong>: {{NodeDetails.elapsedlesschildren}} s\n </div>\n </div>\n <div>\n <h5 class=\"app-margin-top-10\"><strong>{{'Dettaglio evento' | localize: lc}}</strong></h5>\n {{NodeDetails.nodedescription}}\n </div>\n @if ((NodeDetails?.waitstack?.length || 0) > 0) {\n <div style=\"max-height: 200px; overflow: auto\">\n <h5 class=\"app-margin-top-10\"><strong>{{'Stack di Attesa' | localize: lc}}</strong></h5>\n @for (wait of NodeDetails.waitstack; track wait; let i = $index) {\n <div>\n @for (_ of [].constructor(i+1); track _) {\n -\n } {{wait.nodeid}} - {{wait.nodedescription}}: \n <strong>{{'Tipo Evento' | localize: lc}}</strong>: {{wait.eventtypedesc}} \n <strong>{{'Classe Attesa' | localize: lc}}</strong>: {{wait.waitclassname}}\n </div>\n }\n </div>\n }\n @if ((NodeDetails?.foundininstanceids?.length || 0) > 0) {\n <div style=\"max-height: 200px; overflow: auto\">\n <h5 class=\"app-margin-top-10\"><strong>{{'Presente nelle seguenti istanze' | localize: lc}}</strong></h5>\n @for (instid of NodeDetails.foundininstanceids; track instid; let i = $index) {\n <div style=\"margin-right: 15px;\">\n {{instid}}\n </div>\n }\n </div>\n }\n <div style=\"height: 200px;\">\n <h5 class=\"app-margin-top-10\"><strong>{{'Utilizzo Risorse' | localize: lc}}</strong></h5>\n @if (NodeDetails.sessionchart) {\n <es-line-chart\n [MinGridDistance]=\"65\"\n [Timeline]=\"false\"\n [FinalInstants]=\"false\"\n [LegendPadding]=\"{top: 0, bottom: 7, right: 0, left: 10}\"\n [Fill]=\"true\"\n [MergeDatasets]=\"true\"\n [Data]=\"NodeDetails.sessionchart\"\n [Legend]=\"true\"\n name=\"nodeDetailSessionChart\"\n [DataGroupingThreshold]=\"99999999\"></es-line-chart>\n }\n </div>\n <div style=\"height: 200px;\">\n @if (NodeDetails.loadchart) {\n <es-pie-chart [Legend]=\"true\" [Data]=\"NodeDetails.loadchart\" name=\"nodeDetailLoadChart\"></es-pie-chart>\n }\n </div>\n </div>\n }\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"closeDialog()\">{{'Chiudi' | localize: lc}}</button>\n </div>\n </div>\n </div>","// Angular\r\nimport { Component, Inject, Optional, ViewChild } from \"@angular/core\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { DateService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\nimport { HTTPService } from \"@esfaenza/httpservice\";\r\n\r\n// Applicazione\r\nimport { ProfilerDataNode } from \"../../models/components/ProfilerDataNode\";\r\nimport { ProfilerDataNodesView } from \"../../models/components/ProfilerDataNodesView\";\r\nimport { NodeStats } from \"../../models/components/NodeStats\";\r\n\r\nimport { ADM_DETAILS_V2, ADM_MODULE_PATH, ADM_TOPACT_V2, ADM_WORKLOAD_V2 } from \"../../tokens\";\r\nimport { AdmDetailsV2Component, DetailsV2EventLink } from \"../details_v2/details_v2.component\";\r\nimport { ModalDirective } from \"ngx-bootstrap/modal\";\r\n\r\n// Localizzazione\r\nimport { AdmProfilerComponentLoc } from \"./adm_profiler.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\n\r\n@Component({\r\n selector: \"adm_profiler\",\r\n providers: [{ provide: LocalizationService, useClass: AdmProfilerComponentLoc }],\r\n templateUrl: \"./adm_profiler.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmProfilerComponent {\r\n public searchView: ProfilerDataNodesView = new ProfilerDataNodesView();\r\n public storageSub: any;\r\n\r\n public NodeDetails: NodeStats;\r\n @ViewChild(\"dlgNodeDetails\") dlgNodeDetails: ModalDirective;\r\n @ViewChild(\"dlgDetailsV2\") dlgDetailsV2: ModalDirective;\r\n @ViewChild(AdmDetailsV2Component) detailsV2: AdmDetailsV2Component;\r\n\r\n public be: string;\r\n\r\n constructor(\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private location: Location,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService,\r\n private router: Router,\r\n @Inject(ADM_MODULE_PATH) private mod: string,\r\n @Optional() @Inject(ADM_WORKLOAD_V2) public workloadV2: boolean,\r\n // Con DirectorFeature.DetailsV2 GetNodeStats risponde solo con il contratto nuovo: il nodo si apre nel dettaglio v2\r\n private dateExts: DateService,\r\n @Optional() @Inject(ADM_DETAILS_V2) public detailsV2Enabled: boolean,\r\n @Optional() @Inject(ADM_TOPACT_V2) public topActV2Enabled: boolean) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n ngOnInit() {\r\n this.storageSub = this.route.queryParams.subscribe(params => {\r\n this.Init(params[\"ignoreStorage\"]);\r\n });\r\n }\r\n\r\n Init(ignoreStore) {\r\n this.doInit(ignoreStore);\r\n }\r\n\r\n async doInit(ignoreStorage) {\r\n let item = await this.localStorage.getItem<ProfilerDataNodesView>(\"HotSearchProfilato\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/profiler`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotSearchProfilato\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: ProfilerDataNodesView) {\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetItems(this.searchView);\r\n }\r\n else {\r\n this.searchView = new ProfilerDataNodesView();\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n this.searchView.searchinprogress = true;\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n this.POSTGetItems(this.searchView);\r\n }\r\n\r\n // Con DirectorFeature.WorkloadReportV2 lo stesso URL non dà più un file: il report ha la sua pagina\r\n downloadWorkloadReport() {\r\n if (this.workloadV2) {\r\n this.router.navigate([`/pages/${this.mod}/workload`, ...(this.be ? [this.be] : [])]);\r\n return;\r\n }\r\n this.adms.downloadWorkloadReport(this.be, this.searchView.filterfrom, this.searchView.filterto, this.searchView.filterglobal);\r\n }\r\n\r\n async POSTGetItems(data: ProfilerDataNodesView) {\r\n this.searchView = await this.adms.getProfilerDataNodes(this.be, data);\r\n this.searchView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotSearchProfilato\", this.searchView).subscribe();\r\n }\r\n\r\n async prepareExport(dataCallBack) {\r\n var view = JSON.parse(JSON.stringify(this.searchView));\r\n view.page = 1;\r\n view.itemsperpageoverride = 9999999;\r\n let res = await this.adms.getProfilerDataNodes(this.be, view);\r\n dataCallBack(res.items, ProfilerDataNode);\r\n }\r\n\r\n openNodeDetails(nodeId: string) {\r\n if (this.detailsV2Enabled) {\r\n // Senza date la pagina è dal vivo (l'ultima ora per il grafico), con le date legge lo storico\r\n let history = !!(this.searchView.filterfrom || this.searchView.filterto);\r\n let to = this.searchView.filterto ? this.dateExts.getDateConvertion(this.searchView.filterto).toDate() : new Date();\r\n let from = this.searchView.filterfrom ? this.dateExts.getDateConvertion(this.searchView.filterfrom).toDate() : new Date(to.getTime() - 3600 * 1000);\r\n this.detailsV2.openNode(nodeId, { from: from, to: to, realTime: !history, global: this.searchView.filterglobal });\r\n this.dlgDetailsV2.show();\r\n return;\r\n }\r\n this.loadNodeDetails(nodeId);\r\n this.dlgNodeDetails.show();\r\n }\r\n\r\n // N8: la Top Activity v2 filtrata sull'evento, nella finestra del dettaglio\r\n showEventSessions(link: DetailsV2EventLink) {\r\n this.dlgDetailsV2.hide();\r\n this.router.navigate([`/pages/${this.mod}/topact`, ...(this.be ? [this.be] : [])], { queryParams: { event: link.nodeId, eventName: link.nodeName, from: link.from.toISOString(), to: link.to.toISOString() } });\r\n }\r\n\r\n openInProfiler(nodeId: string) {\r\n this.dlgDetailsV2.hide();\r\n }\r\n\r\n loadNodeDetails(nodeId: string) {\r\n this.NodeDetails = null;\r\n requestAnimationFrame(async () => {\r\n this.NodeDetails = await this.adms.getNodeStats(this.be, nodeId);\r\n });\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Profiler del Server' | localize: lc}}</span> \n </div>\n <div class=\"card-body widget-body\">\n <div class=\"col-md-12 bottom-15\">\n <form role=\"form\">\n <div class=\"row app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-date [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterfrom\" name=\"filterfrom\" [Placeholder]=\"'Da' | localize: lc\"></form-date>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-date [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterto\" name=\"filterto\" [Placeholder]=\"'A' | localize: lc\"></form-date>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterglobal\" name=\"filterglobal\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterglobal = !searchView.filterglobal\">{{'Globale' | localize: lc}}</span>\n </div>\n\n <button [disabled]=\"searchView.searchinprogress\" class=\"input-group-addon btn app-btn-search app-margin-top-20 app-margin-right-5\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n <button class=\"input-group-addon btn app-btn-search app-margin-top-20\" (click)=\"downloadWorkloadReport()\" type=\"submit\" [title]=\"workloadV2 ? 'Workload report' : ''\"><i class=\"fa\" [class.fa-download]=\"!workloadV2\" [class.fa-file-text]=\"workloadV2\"></i></button>\n </div>\n </form>\n </div>\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!searchView) {\n <p><em>{{'Carico i Dati' | localize: lc}}</em></p>\n }\n @if (searchView) {\n <div>\n <es-table [(ngModel)]=\"searchView\" [Hierarchy]=\"true\" [OrderByColumn]=\"false\" [ParentKey]=\"'parentid'\"\n [OwnKey]=\"'id'\" [StartsExpanded]=\"false\" [ExportFunction]=\"prepareExport.bind(this)\" [Export]=\"true\"\n [ExportFileName]=\"'Profiler Export.csv'\" [HidePaging]=\"true\" (onSearchRequest)=\"sendSearch($event);\">\n <span *th=\"'1'\">{{'ID' | localize : lc}}</span>\n <span *th=\"'2'\">{{'Descrizione' | localize: lc}}</span>\n <span *th=\"'3'\">{{'Chiamate' | localize: lc}}</span>\n <span *th=\"'4'\">{{'Tempo' | localize: lc}}</span>\n <span *th=\"'5'\">{{'Tempo Max' | localize: lc}}</span>\n <span *th=\"'6'\">{{'Tempo Min' | localize: lc}}</span>\n <span *th=\"'7'\">{{'Tempo Medio' | localize: lc}}</span>\n <span *th=\"'8'\">{{'Tempo Specifico' | localize: lc}}</span>\n <span *th=\"'9'\">{{'Percentuale' | localize: lc}}</span>\n <span *th=\"'10'\">{{'Chiamate Periodo' | localize: lc}}</span>\n <span *th=\"'11'\">{{'Tempo Periodo' | localize: lc}}</span>\n <span *th=\"'12'\">{{'Tempo Max Periodo' | localize: lc}}</span>\n <span *th=\"'13'\">{{'Tempo Min Periodo' | localize: lc}}</span>\n <span *th=\"'14'\">{{'Tempo Medio Periodo' | localize: lc}}</span>\n <span *th=\"'15'\">{{'Tempo Specifico Periodo' | localize: lc}}</span>\n <span *th=\"'16'\">{{'Percentuale Periodo' | localize: lc}}</span>\n <span *th=\"'17'\">{{'Nome Tipologia Evento' | localize: lc}}</span>\n <span *th=\"'18'\">{{'Nome Classe Attesa' | localize: lc}}</span>\n <span *th=\"'19'\">{{'Numero Istanze' | localize: lc}}</span>\n <span *td=\"'1'; let item\"><span class=\"app-link app-inline\" (click)=\"openNodeDetails(item.id)\">{{item.id}}</span></span>\n <span *td=\"'2'; let item\" title=\"{{item.description}}\">{{item.description.length <= 50 ? item.description : item.description.substr(0,50) + \"[...]\" }}</span>\n <span *td=\"'3'; let item\">{{item.calls}}</span>\n <span *td=\"'4'; let item\">{{item.time}}</span>\n <span *td=\"'5'; let item\">{{item.peaktime}}</span>\n <span *td=\"'6'; let item\">{{item.mintime}}</span>\n <span *td=\"'7'; let item\">{{item.avgtime}}</span>\n <span *td=\"'8'; let item\">{{item.timewithoutchildren }}</span>\n <span *td=\"'9'; let item\">{{item.percentage}}</span>\n <span *td=\"'10' let item\">{{item.snapdeltacalls}}</span>\n <span *td=\"'11' let item\">{{item.snapdeltatime}}</span>\n <span *td=\"'12' let item\">{{item.snappeaktime}}</span>\n <span *td=\"'13' let item\">{{item.snapmintime}}</span>\n <span *td=\"'14' let item\">{{item.snapavgtime}}</span>\n <span *td=\"'15' let item\">{{item.snaptimewithoutchildren}}</span>\n <span *td=\"'16' let item\">{{item.snappercentage}}</span>\n <span *td=\"'17' let item\">{{item.eventtypename}}</span>\n <span *td=\"'18' let item\">{{item.waitclassname}}</span>\n <span *td=\"'19' let item\">{{item.numinstances}}</span>\n </es-table>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div bsModal #dlgNodeDetails=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\n @if (NodeDetails) {\n <node-detail [NodeDetails]=\"NodeDetails\" (onClose)=\"dlgNodeDetails.hide()\"></node-detail>\n }\n</div>\n\n<!-- Dettaglio v2 di nodo e sessione (DirectorFeature.DetailsV2) -->\n<div bsModal #dlgDetailsV2=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\" (onHidden)=\"detailsV2?.stop()\">\n @if (detailsV2Enabled) {\n <adm-details-v2 [Be]=\"be\" [CanShowSessions]=\"!!topActV2Enabled\" [CanOpenProfiler]=\"false\" (closed)=\"dlgDetailsV2.hide()\"\n (sessionsOnEvent)=\"showEventSessions($event)\" (openProfiler)=\"openInProfiler($event)\"></adm-details-v2>\n }\n</div>\n","// Ordinamento decrescente del profiler v2 (figli nell'albero, righe nella vista per nome). I numeri sono quelli del backend\r\nexport enum ProfilerOrderBy {\r\n Time = 0,\r\n TimeLessChildren = 1,\r\n Calls = 2,\r\n AvgTime = 3,\r\n PeakTime = 4,\r\n SnapDeltaTime = 5,\r\n SnapDeltaTimeLessChildren = 6,\r\n SnapDeltaCalls = 7,\r\n ActiveThreads = 8\r\n}\r\n\r\n// Parametri comuni del profiler v2 (specifica \"Profiler gerarchico\"): date in ISO UTC (…Z), campi non valorizzati = default del backend.\r\n// Il backend-for-frontend legge i nomi senza badare a maiuscole e minuscole e li inoltra in query string\r\nexport class ProfilerV2Request {\r\n realTime?: boolean;\r\n global?: boolean;\r\n instanceId?: string;\r\n snapFrom?: string;\r\n snapTo?: string;\r\n}\r\n\r\n// Albero: con search il backend ignora maxDepth, maxChildren e minPercentage\r\nexport class ProfilerV2TreeRequest extends ProfilerV2Request {\r\n rootNodeId?: string;\r\n maxDepth?: number;\r\n maxChildren?: number;\r\n minPercentage?: number;\r\n orderBy?: ProfilerOrderBy;\r\n search?: string;\r\n}\r\n\r\nexport class ProfilerV2NodeRequest extends ProfilerV2Request {\r\n nodeId: string;\r\n}\r\n\r\n// Eventi per nome: un evento per riga sommato su tutti i percorsi\r\nexport class ProfilerV2FlatRequest extends ProfilerV2Request {\r\n orderBy?: ProfilerOrderBy;\r\n top?: number;\r\n search?: string;\r\n eventType?: string;\r\n includeIdle?: boolean;\r\n}\r\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmProfilerV2Loc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Profiler del Server\", [\"Server Profiler\"]);\r\n super.set(\"it->en\", \"Errore\", [\"Error\"]);\r\n\r\n // Barra dei comandi e riga della finestra\r\n super.set(\"it->en\", \"Sorgente\", [\"Source\"]);\r\n super.set(\"it->en\", \"Storico\", [\"History\"]);\r\n super.set(\"it->en\", \"Istanze\", [\"Instances\"]);\r\n super.set(\"it->en\", \"Questa istanza\", [\"This instance\"]);\r\n super.set(\"it->en\", \"Tutto il cluster\", [\"Whole cluster\"]);\r\n super.set(\"it->en\", \"istanze\", [\"instances\"]);\r\n super.set(\"it->en\", \"istanza\", [\"instance\"]);\r\n super.set(\"it->en\", \"Solo\", [\"Only\"]);\r\n super.set(\"it->en\", \"Dal\", [\"From\"]);\r\n super.set(\"it->en\", \"Al\", [\"To\"]);\r\n super.set(\"it->en\", \"Valori\", [\"Values\"]);\r\n super.set(\"it->en\", \"Dall'avvio\", [\"Since start\"]);\r\n super.set(\"it->en\", \"Dall'ultimo snapshot\", [\"Since last snapshot\"]);\r\n super.set(\"it->en\", \"Aggiorna\", [\"Refresh\"]);\r\n super.set(\"it->en\", \"Scarica il workload report\", [\"Download the workload report\"]);\r\n super.set(\"it->en\", \"Workload report\", [\"Workload report\"]);\r\n super.set(\"it->en\", \"Delta dall'ultimo snapshot delle\", [\"Delta since the last snapshot at\"]);\r\n super.set(\"it->en\", \"min fa\", [\"min ago\"]);\r\n super.set(\"it->en\", \"s fa\", [\"s ago\"]);\r\n super.set(\"it->en\", \"mai\", [\"never\"]);\r\n super.set(\"it->en\", \"Snapshot dalle\", [\"Snapshots from\"]);\r\n super.set(\"it->en\", \"alle\", [\"to\"]);\r\n super.set(\"it->en\", \"Nessuno snapshot termina nella finestra scelta\", [\"No snapshot ends in the chosen window\"]);\r\n super.set(\"it->en\", \"nodi nell'albero\", [\"nodes in the tree\"]);\r\n super.set(\"it->en\", \"nella risposta\", [\"in the response\"]);\r\n super.set(\"it->en\", \"eventi distinti\", [\"distinct events\"]);\r\n super.set(\"it->en\", \"Caricamento…\", [\"Loading…\"]);\r\n\r\n // Vista e ordinamenti\r\n super.set(\"it->en\", \"Albero\", [\"Tree\"]);\r\n super.set(\"it->en\", \"Per nome\", [\"By name\"]);\r\n super.set(\"it->en\", \"Ordina per\", [\"Sort by\"]);\r\n super.set(\"it->en\", \"Tempo\", [\"Time\"]);\r\n super.set(\"it->en\", \"Tempo proprio\", [\"Self time\"]);\r\n super.set(\"it->en\", \"Chiamate\", [\"Calls\"]);\r\n super.set(\"it->en\", \"Tempo medio\", [\"Average time\"]);\r\n super.set(\"it->en\", \"Picco\", [\"Peak\"]);\r\n super.set(\"it->en\", \"Δ Tempo\", [\"Δ Time\"]);\r\n super.set(\"it->en\", \"Δ Tempo proprio\", [\"Δ Self time\"]);\r\n super.set(\"it->en\", \"Δ Chiamate\", [\"Δ Calls\"]);\r\n super.set(\"it->en\", \"Thread attivi\", [\"Active threads\"]);\r\n super.set(\"it->en\", \"Tutti\", [\"All\"]);\r\n super.set(\"it->en\", \"Nessuna\", [\"None\"]);\r\n\r\n // Albero\r\n super.set(\"it->en\", \"Cerca nei nomi o per id\", [\"Search names or by id\"]);\r\n super.set(\"it->en\", \"Per esempio MRD_METERREADINGS, ENQUEUE, ProfilesMgr\", [\"For example MRD_METERREADINGS, ENQUEUE, ProfilesMgr\"]);\r\n super.set(\"it->en\", \"Figli per nodo\", [\"Children per node\"]);\r\n super.set(\"it->en\", \"Soglia\", [\"Threshold\"]);\r\n super.set(\"it->en\", \"Chiudi\", [\"Close\"]);\r\n super.set(\"it->en\", \"Il nodo non c'è nelle istanze scelte: l'albero riparte da Idle.\", [\"The node is not in the chosen instances: the tree starts again from Idle.\"]);\r\n super.set(\"it->en\", \"nodi trovati, con i loro antenati.\", [\"nodes found, with their ancestors.\"]);\r\n super.set(\"it->en\", \"I nodi trovati sono più di 1.000: sono mostrati i primi per l'ordinamento scelto.\", [\"More than 1,000 nodes found: the first ones by the chosen sort order are shown.\"]);\r\n super.set(\"it->en\", \"Nessun nodo contiene\", [\"No node contains\"]);\r\n super.set(\"it->en\", \"Nodo\", [\"Node\"]);\r\n super.set(\"it->en\", \"% del padre\", [\"% of parent\"]);\r\n super.set(\"it->en\", \"Δ Proprio\", [\"Δ Self\"]);\r\n super.set(\"it->en\", \"Medio\", [\"Average\"]);\r\n super.set(\"it->en\", \"Thread ora\", [\"Threads now\"]);\r\n super.set(\"it->en\", \"del padre\", [\"of parent\"]);\r\n super.set(\"it->en\", \"del nodo di primo livello\", [\"of the first-level node\"]);\r\n super.set(\"it->en\", \"Esecuzione in corso da\", [\"Execution running for\"]);\r\n super.set(\"it->en\", \"forse bloccata\", [\"possibly stuck\"]);\r\n super.set(\"it->en\", \"Caricamento dei figli…\", [\"Loading children…\"]);\r\n super.set(\"it->en\", \"figli non mostrati\", [\"children not shown\"]);\r\n super.set(\"it->en\", \"chiamate\", [\"calls\"]);\r\n super.set(\"it->en\", \"Mostra tutti\", [\"Show all\"]);\r\n super.set(\"it->en\", \"Nessuno snapshot termina nella finestra scelta: allargala o spostala indietro.\", [\"No snapshot ends in the chosen window: widen it or move it back.\"]);\r\n super.set(\"it->en\", \"Il nodo non c'è nelle istanze scelte.\", [\"The node is not in the chosen instances.\"]);\r\n\r\n // Eventi per nome\r\n super.set(\"it->en\", \"Cerca nei nomi\", [\"Search names\"]);\r\n super.set(\"it->en\", \"Tipo\", [\"Type\"]);\r\n super.set(\"it->en\", \"Righe\", [\"Rows\"]);\r\n super.set(\"it->en\", \"Anche gli eventi idle\", [\"Include idle events\"]);\r\n super.set(\"it->en\", \"Evento\", [\"Event\"]);\r\n super.set(\"it->en\", \"Percorsi\", [\"Paths\"]);\r\n super.set(\"it->en\", \"% proprio\", [\"% self\"]);\r\n super.set(\"it->en\", \"Picco dall'avvio\", [\"Peak since start\"]);\r\n super.set(\"it->en\", \"Thread\", [\"Threads\"]);\r\n super.set(\"it->en\", \"Nodi con più tempo\", [\"Nodes with the most time\"]);\r\n super.set(\"it->en\", \"Dettaglio\", [\"Details\"]);\r\n super.set(\"it->en\", \"Apri nell'albero\", [\"Open in tree\"]);\r\n super.set(\"it->en\", \"altri\", [\"more\"]);\r\n super.set(\"it->en\", \"Nessun evento con questi filtri.\", [\"No events match these filters.\"]);\r\n super.set(\"it->en\", \"mostrati i primi\", [\"showing the first\"]);\r\n super.set(\"it->en\", \"La percentuale è sul tempo proprio di tutti gli eventi non idle.\", [\"The percentage is of the self time of all non-idle events.\"]);\r\n\r\n // Dettaglio\r\n super.set(\"it->en\", \"Seleziona un nodo per vederne il dettaglio.\", [\"Select a node to see its details.\"]);\r\n super.set(\"it->en\", \"Il nodo non c'è nelle istanze o nella finestra scelte.\", [\"The node is not in the chosen instances or window.\"]);\r\n super.set(\"it->en\", \"Copia\", [\"Copy\"]);\r\n super.set(\"it->en\", \"Copiato\", [\"Copied\"]);\r\n super.set(\"it->en\", \"Dettaglio completo\", [\"Full detail\"]);\r\n super.set(\"it->en\", \"Percorso\", [\"Path\"]);\r\n super.set(\"it->en\", \"Nella finestra\", [\"In window\"]);\r\n super.set(\"it->en\", \"Esecuzioni\", [\"Executions\"]);\r\n super.set(\"it->en\", \"Tempo totale\", [\"Total time\"]);\r\n super.set(\"it->en\", \"Minimo\", [\"Minimum\"]);\r\n super.set(\"it->en\", \"Adesso\", [\"Now\"]);\r\n super.set(\"it->en\", \"Thread dentro\", [\"Threads inside\"]);\r\n super.set(\"it->en\", \"Esecuzione più lunga\", [\"Longest execution\"]);\r\n super.set(\"it->en\", \"Ultima uscita\", [\"Last exit\"]);\r\n super.set(\"it->en\", \"Tempo proprio del sottoalbero per tipo\", [\"Subtree self time by type\"]);\r\n super.set(\"it->en\", \"Sessioni attive sul nodo e sui discendenti\", [\"Active sessions on node and descendants\"]);\r\n super.set(\"it->en\", \"Media\", [\"Average\"]);\r\n super.set(\"it->en\", \"picco\", [\"peak\"]);\r\n super.set(\"it->en\", \"sessioni\", [\"sessions\"]);\r\n super.set(\"it->en\", \"punti dell'API\", [\"API points\"]);\r\n super.set(\"it->en\", \"uno al secondo\", [\"one per second\"]);\r\n super.set(\"it->en\", \"uno ogni\", [\"one every\"]);\r\n super.set(\"it->en\", \"raggruppati a\", [\"grouped by\"]);\r\n super.set(\"it->en\", \"Nessun campione in memoria per questa finestra: il grafico copre solo le ultime due ore circa.\", [\"No in-memory samples for this window: the chart only covers about the last two hours.\"]);\r\n super.set(\"it->en\", \"Per istanza\", [\"By instance\"]);\r\n super.set(\"it->en\", \"Istanza\", [\"Instance\"]);\r\n super.set(\"it->en\", \"Proprio\", [\"Self\"]);\r\n super.set(\"it->en\", \"figli diretti\", [\"direct children\"]);\r\n super.set(\"it->en\", \"discendenti\", [\"descendants\"]);\r\n super.set(\"it->en\", \"Apri come radice\", [\"Open as root\"]);\r\n }\r\n}\r\n","// Angular\r\nimport { formatNumber, Location } from \"@angular/common\";\r\nimport { Component, Inject, Optional, ViewChild } from \"@angular/core\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { DateService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { firstValueFrom } from \"rxjs\";\r\n\r\n// Modelli\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { ProfilerOrderBy, ProfilerV2FlatRequest, ProfilerV2NodeRequest, ProfilerV2Request, ProfilerV2TreeRequest } from \"../../models/components/ProfilerV2Request\";\r\nimport { ProfilerV2ActiveSession, ProfilerV2Flat, ProfilerV2FlatItem, ProfilerV2Node, ProfilerV2NodeStats, ProfilerV2Tree } from \"../../models/components/ProfilerV2Response\";\r\nimport { formatDuration } from \"../../pipes/profiler_format.pipe\";\r\n\r\n// Applicazione\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { ADM_DETAILS_V2, ADM_MODULE_PATH, ADM_TOPACT_V2, ADM_WORKLOAD_V2 } from \"../../tokens\";\r\nimport { AdmDetailsV2Component, DetailsV2EventLink } from \"../details_v2/details_v2.component\";\r\nimport { ModalDirective } from \"ngx-bootstrap/modal\";\r\n\r\n// Localizzazione\r\nimport { AdmProfilerV2Loc } from \"./profiler_v2.component.loc\";\r\n\r\ndeclare var dayjs;\r\n\r\nconst STORAGE_KEY = \"HotSearchProfilerV2\";\r\nconst INSTANCE_THIS = \"@this\";\r\nconst INSTANCE_ALL = \"@all\";\r\n// All'apertura la radice con due livelli (R6), poi i figli si chiedono un livello alla volta\r\nconst TREE_DEPTH = 2;\r\nconst SEARCH_MIN_CHARS = 2;\r\nconst SEARCH_DELAY_MS = 400;\r\nconst DATES_DELAY_MS = 600;\r\n// Muovendosi con la tastiera il dettaglio si chiede dopo una breve pausa, non a ogni tasto\r\nconst DETAIL_DELAY_MS = 180;\r\n// Esecuzione in corso da più di così: forse bloccata (R15)\r\nconst LONG_RUNNING_SECONDS = 60;\r\nconst CHART_POINTS = 160;\r\n\r\n// Ogni tipo di evento ha un colore fisso, gli stessi della Top Activity v2. Wait e sleep di classe Idle usano quello di Idle\r\nconst TYPE_COLORS: { [type: string]: string } = {\r\n Idle: \"#bdbdbd\", Cpu: \"#43a047\", Database: \"#1e88e5\", Wait: \"#fdd835\", Script: \"#8e24aa\", Network: \"#8d6e63\", IO: \"#00acc1\", Sleep: \"#90a4ae\", Throttle: \"#fb8c00\"\r\n};\r\nconst TYPE_LABELS: { [type: string]: string } = {\r\n Idle: \"Idle\", Cpu: \"CPU\", Database: \"DB\", Wait: \"Wait\", Script: \"Script\", Network: \"Net\", IO: \"I/O\", Sleep: \"Sleep\", Throttle: \"Throttle\"\r\n};\r\nconst EVENT_TYPES = [\"Cpu\", \"Database\", \"Wait\", \"Script\", \"Network\", \"IO\", \"Sleep\", \"Throttle\"];\r\n\r\n// Passando ai valori dall'ultimo snapshot l'ordinamento passa alla chiave corrispondente, e viceversa (R4)\r\nconst TO_SNAP: { [order: number]: ProfilerOrderBy } = {\r\n [ProfilerOrderBy.Time]: ProfilerOrderBy.SnapDeltaTime,\r\n [ProfilerOrderBy.TimeLessChildren]: ProfilerOrderBy.SnapDeltaTimeLessChildren,\r\n [ProfilerOrderBy.Calls]: ProfilerOrderBy.SnapDeltaCalls\r\n};\r\nconst TO_BASE: { [order: number]: ProfilerOrderBy } = {\r\n [ProfilerOrderBy.SnapDeltaTime]: ProfilerOrderBy.Time,\r\n [ProfilerOrderBy.SnapDeltaTimeLessChildren]: ProfilerOrderBy.TimeLessChildren,\r\n [ProfilerOrderBy.SnapDeltaCalls]: ProfilerOrderBy.Calls\r\n};\r\n\r\nexport class ProfilerV2Row {\r\n kind: \"node\" | \"loading\" | \"omitted\";\r\n node: ProfilerV2Node;\r\n depth: number;\r\n key: string;\r\n}\r\n\r\nexport class ProfilerV2TypePart {\r\n type: string;\r\n label: string;\r\n color: string;\r\n percentage: number;\r\n}\r\n\r\nexport class ProfilerV2Chart {\r\n area: string;\r\n line: string;\r\n color: string;\r\n max: number;\r\n lastX: number;\r\n lastY: number;\r\n start: string;\r\n middle: string;\r\n end: string;\r\n average: number;\r\n peak: number;\r\n points: number;\r\n interval: number;\r\n group: number;\r\n}\r\n\r\n// Preferenze ricordate fra una visita e l'altra (sorgente, istanze, finestra e radice ripartono dai default)\r\nclass ProfilerV2Settings {\r\n orderBy: string;\r\n maxChildren: string;\r\n minPercentage: string;\r\n snapValues: boolean;\r\n flatOrderBy: string;\r\n flatTop: string;\r\n}\r\n\r\n@Component({\r\n selector: \"profiler_v2\",\r\n providers: [{ provide: LocalizationService, useClass: AdmProfilerV2Loc }],\r\n templateUrl: \"./profiler_v2.component.html\",\r\n styleUrls: [\"./profiler_v2.component.scss\"],\r\n standalone: false\r\n})\r\nexport class AdmProfilerV2Component {\r\n @ViewChild(\"dlgDetailsV2\") dlgDetailsV2: ModalDirective;\r\n @ViewChild(AdmDetailsV2Component) detailsV2: AdmDetailsV2Component;\r\n\r\n public readonly EventTypes = EVENT_TYPES;\r\n\r\n // Barra dei comandi\r\n public live: boolean = true;\r\n // Di default tutto il cluster, come nella Top Activity v2\r\n public instance: string = INSTANCE_ALL;\r\n public filterfrom: string = \"\";\r\n public filterto: string = \"\";\r\n // Valori dall'ultimo snapshot invece che dall'avvio (solo live)\r\n public snapValues: boolean = false;\r\n public view: \"tree\" | \"flat\" = \"tree\";\r\n\r\n // Albero\r\n public orderBy: string = String(ProfilerOrderBy.Time);\r\n // \"0\" = tutti, nessuna soglia\r\n public maxChildren: string = \"25\";\r\n public minPercentage: string = \"0\";\r\n public searchText: string = \"\";\r\n public activeSearch: string = \"\";\r\n public tree: ProfilerV2Tree;\r\n public rows: ProfilerV2Row[] = [];\r\n public treeLoading: boolean = false;\r\n public treeError: string;\r\n public treeNotice: string;\r\n public matchCount: number = 0;\r\n\r\n // Eventi per nome\r\n public flatSearch: string = \"\";\r\n // \"*\" = tutti i tipi (con un id vuoto la select mostrerebbe il segnaposto invece di \"Tutti\")\r\n public flatType: string = \"*\";\r\n public flatOrderBy: string = String(ProfilerOrderBy.TimeLessChildren);\r\n public flatTop: string = \"100\";\r\n public flatIncludeIdle: boolean = false;\r\n public flat: ProfilerV2Flat;\r\n public flatLoading: boolean = false;\r\n public flatError: string;\r\n public openFlat: Set<string> = new Set();\r\n\r\n // Dettaglio\r\n public selectedId: string;\r\n public detail: ProfilerV2NodeStats;\r\n public detailLoading: boolean = false;\r\n public detailMissing: boolean = false;\r\n public detailError: string;\r\n public typeParts: ProfilerV2TypePart[] = [];\r\n public chart: ProfilerV2Chart;\r\n public copied: boolean = false;\r\n\r\n // Sorgenti di select e pulsanti\r\n public Instances: KeyValue[] = [];\r\n public TreeOrders: KeyValue[] = [];\r\n public FlatOrders: KeyValue[] = [];\r\n public TreeOrderOptions: KeyValue[] = [];\r\n public FlatOrderOptions: KeyValue[] = [];\r\n public ChildrenOptions: KeyValue[] = [];\r\n public ThresholdOptions: KeyValue[] = [];\r\n public FlatTypes: KeyValue[] = [];\r\n public FlatRows: KeyValue[] = [];\r\n\r\n public be: string;\r\n private instanceId: string;\r\n private instanceIds: string[] = [];\r\n private rootId: string = null;\r\n private nodes: Map<string, ProfilerV2Node> = new Map();\r\n private parents: Map<string, ProfilerV2Node> = new Map();\r\n private expanded: Set<string> = new Set();\r\n private expandedBeforeSearch: Set<string>;\r\n // Nodi di cui children è completo per i parametri correnti, anche se vuoto (per esempio tutti sotto la soglia)\r\n private loaded: Set<string> = new Set();\r\n private loadingChildren: Set<string> = new Set();\r\n // Una risposta arrivata dopo un ricaricamento successivo si scarta\r\n private treeGeneration: number = 0;\r\n private flatGeneration: number = 0;\r\n private detailGeneration: number = 0;\r\n private searchTimer: any;\r\n private flatSearchTimer: any;\r\n private datesTimer: any;\r\n private detailTimer: any;\r\n\r\n constructor(\r\n public dateExts: DateService,\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private location: Location,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string,\r\n @Optional() @Inject(ADM_WORKLOAD_V2) public workloadV2: boolean,\r\n // Con DirectorFeature.DetailsV2 il pannello apre anche il dettaglio completo del nodo; \"Sessioni su questo evento\" vuole la Top Activity v2\r\n @Optional() @Inject(ADM_DETAILS_V2) public detailsV2Enabled: boolean,\r\n @Optional() @Inject(ADM_TOPACT_V2) public topActV2Enabled: boolean) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.buildSources();\r\n\r\n let saved = this.route.snapshot.queryParams[\"ignoreStorage\"] ? null : await firstValueFrom(this.localStorage.getItem<ProfilerV2Settings>(STORAGE_KEY), { defaultValue: null });\r\n if (saved)\r\n this.applySettings(saved);\r\n\r\n // Gli id sono stabili: la radice può stare nell'indirizzo della pagina\r\n this.rootId = this.route.snapshot.queryParams[\"root\"] || null;\r\n\r\n this.loadInstances();\r\n this.loadTree(false);\r\n }\r\n\r\n ngOnDestroy() {\r\n clearTimeout(this.searchTimer);\r\n clearTimeout(this.flatSearchTimer);\r\n clearTimeout(this.datesTimer);\r\n clearTimeout(this.detailTimer);\r\n }\r\n\r\n // #region Barra dei comandi\r\n\r\n setLive(live: boolean) {\r\n if (this.live == live)\r\n return;\r\n this.live = live;\r\n\r\n if (!live) {\r\n // Sullo storico non ci sono i valori dall'ultimo snapshot né i thread attivi (R30)\r\n this.snapValues = false;\r\n this.orderBy = String(+this.orderBy == ProfilerOrderBy.ActiveThreads ? ProfilerOrderBy.Time : TO_BASE[+this.orderBy] ?? +this.orderBy);\r\n this.flatOrderBy = String(+this.flatOrderBy == ProfilerOrderBy.ActiveThreads ? ProfilerOrderBy.TimeLessChildren : TO_BASE[+this.flatOrderBy] ?? +this.flatOrderBy);\r\n // Default: le quattro ore che finiscono all'ultimo snapshot\r\n if (!this.filterfrom || !this.filterto) {\r\n let lastSnapshot = this.parseUtc((this.view == \"tree\" ? this.tree?.snapFrom : this.flat?.snapFrom) ?? null) ?? this.floorHour(new Date());\r\n this.filterto = this.fmt(lastSnapshot);\r\n this.filterfrom = this.fmt(new Date(lastSnapshot.getTime() - 4 * 3600 * 1000));\r\n }\r\n }\r\n this.updateOrderOptions();\r\n this.reloadAll();\r\n }\r\n\r\n setInstance(id: string) {\r\n this.instance = id;\r\n this.reloadAll();\r\n }\r\n\r\n datesChanged() {\r\n clearTimeout(this.datesTimer);\r\n this.datesTimer = setTimeout(() => {\r\n if (this.toDate(this.filterfrom) && this.toDate(this.filterto))\r\n this.reloadAll();\r\n }, DATES_DELAY_MS);\r\n }\r\n\r\n // Cambia colonne e intestazioni; richiama il server solo se cambia anche l'ordinamento\r\n setSnapValues(on: boolean) {\r\n if (this.snapValues == on)\r\n return;\r\n this.snapValues = on;\r\n\r\n let map = on ? TO_SNAP : TO_BASE;\r\n let treeOrder = String(map[+this.orderBy] ?? +this.orderBy);\r\n // La vista per nome non propone Δ Tempo: lì Tempo resta Tempo\r\n let flatMapped = map[+this.flatOrderBy];\r\n let flatOrder = String(flatMapped != null && flatMapped != ProfilerOrderBy.SnapDeltaTime ? flatMapped : +this.flatOrderBy);\r\n let reload = this.view == \"tree\" ? treeOrder != this.orderBy : flatOrder != this.flatOrderBy;\r\n this.orderBy = treeOrder;\r\n this.flatOrderBy = flatOrder;\r\n this.saveSettings();\r\n if (reload)\r\n this.reloadView();\r\n }\r\n\r\n setView(view: \"tree\" | \"flat\") {\r\n if (this.view == view)\r\n return;\r\n this.view = view;\r\n this.reloadView();\r\n }\r\n\r\n // Aggiorna: la vista corrente e il dettaglio aperto (niente aggiornamento automatico, R5)\r\n reloadAll() {\r\n this.reloadView();\r\n if (this.selectedId)\r\n this.loadDetail(this.selectedId);\r\n }\r\n\r\n private reloadView() {\r\n if (this.view == \"tree\")\r\n this.loadTree(true);\r\n else\r\n this.loadFlat();\r\n }\r\n\r\n // Con DirectorFeature.WorkloadReportV2 il report non è più un file da scaricare: ha la sua pagina\r\n downloadWorkloadReport() {\r\n if (this.workloadV2) {\r\n this.router.navigate([`/pages/${this.mod}/workload`, ...(this.be ? [this.be] : [])]);\r\n return;\r\n }\r\n let from = this.live ? \"\" : this.filterfrom;\r\n let to = this.live ? \"\" : this.filterto;\r\n this.adms.downloadWorkloadReport(this.be, from, to, this.instance != INSTANCE_THIS);\r\n }\r\n\r\n get instanceLabel(): string {\r\n return this.Instances.find(t => t.id == this.instance)?.description ?? \"\";\r\n }\r\n\r\n get loading(): boolean {\r\n return this.view == \"tree\" ? this.treeLoading : this.flatLoading;\r\n }\r\n\r\n // Vista corrente, per la riga della finestra\r\n get current(): { snapFrom: string, snapTo: string } {\r\n return this.view == \"tree\" ? this.tree : this.flat;\r\n }\r\n\r\n private baseRequest<T extends ProfilerV2Request>(req: T): T {\r\n req.realTime = this.live;\r\n // Dietro un bilanciatore \"questa istanza\" cambia da una chiamata all'altra: si manda sempre l'istanza esplicita o global (R3)\r\n if (this.instance == INSTANCE_ALL)\r\n req.global = true;\r\n else if (this.instance != INSTANCE_THIS)\r\n req.instanceId = this.instance;\r\n else if (this.instanceId)\r\n req.instanceId = this.instanceId;\r\n\r\n if (!this.live) {\r\n req.snapFrom = this.toDate(this.filterfrom)?.toISOString();\r\n req.snapTo = this.toDate(this.filterto)?.toISOString();\r\n }\r\n return req;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Albero\r\n\r\n setOrderBy(id: string) {\r\n this.orderBy = id;\r\n this.saveSettings();\r\n this.loadTree(true);\r\n }\r\n\r\n setMaxChildren(id: string) {\r\n this.maxChildren = id;\r\n this.saveSettings();\r\n this.loadTree(true);\r\n }\r\n\r\n setMinPercentage(id: string) {\r\n this.minPercentage = id;\r\n this.saveSettings();\r\n this.loadTree(true);\r\n }\r\n\r\n searchChanged() {\r\n clearTimeout(this.searchTimer);\r\n this.searchTimer = setTimeout(() => {\r\n let text = (this.searchText ?? \"\").trim();\r\n let next = text.length >= SEARCH_MIN_CHARS ? text : \"\";\r\n if (next == this.activeSearch)\r\n return;\r\n\r\n // Svuotando la ricerca si torna all'albero di prima, con gli stessi nodi aperti\r\n if (!this.activeSearch)\r\n this.expandedBeforeSearch = new Set(this.expanded);\r\n else if (!next)\r\n this.expanded = this.expandedBeforeSearch ?? new Set();\r\n this.activeSearch = next;\r\n this.loadTree(!next);\r\n }, SEARCH_DELAY_MS);\r\n }\r\n\r\n clearSearch() {\r\n this.searchText = \"\";\r\n this.searchChanged();\r\n }\r\n\r\n // Nodo come radice (R13); Idle si chiede senza rootNodeId\r\n setRoot(id: string) {\r\n this.rootId = id && id != this.rootPathIdle ? id : null;\r\n this.searchText = \"\";\r\n this.activeSearch = \"\";\r\n this.expanded.clear();\r\n this.treeNotice = null;\r\n this.view = \"tree\";\r\n this.updateUrl();\r\n this.loadTree(false);\r\n }\r\n\r\n private get rootPathIdle(): string {\r\n let root = this.tree?.idleNode;\r\n return root?.level == 0 ? root.nodeId : this.tree?.rootPath?.[0]?.nodeId;\r\n }\r\n\r\n async loadTree(keepExpanded: boolean) {\r\n let generation = ++this.treeGeneration;\r\n let searching = !!this.activeSearch;\r\n let previous = keepExpanded ? [...this.expanded] : [];\r\n\r\n let req = this.baseRequest(new ProfilerV2TreeRequest());\r\n req.orderBy = +this.orderBy;\r\n if (this.rootId)\r\n req.rootNodeId = this.rootId;\r\n if (searching)\r\n req.search = this.activeSearch;\r\n else {\r\n req.maxDepth = TREE_DEPTH;\r\n if (+this.maxChildren > 0)\r\n req.maxChildren = +this.maxChildren;\r\n if (+this.minPercentage > 0)\r\n req.minPercentage = +this.minPercentage;\r\n }\r\n\r\n this.treeLoading = true;\r\n this.treeError = null;\r\n try {\r\n let res = await this.adms.getProfilerTreeV2(this.be, req);\r\n if (generation != this.treeGeneration)\r\n return;\r\n\r\n // Radice non trovata (R23): lo si dice e si torna a Idle\r\n if (res && !res.idleNode && res.snapFrom && this.rootId) {\r\n this.rootId = null;\r\n this.updateUrl();\r\n this.treeNotice = this.lc.loc(\"Il nodo non c'è nelle istanze scelte: l'albero riparte da Idle.\");\r\n this.loadTree(false);\r\n return;\r\n }\r\n\r\n this.tree = res;\r\n this.nodes.clear();\r\n this.parents.clear();\r\n this.loaded.clear();\r\n this.loadingChildren.clear();\r\n // I nodi che erano aperti restano aperti: quelli che non sono ancora arrivati si riaprono quando arrivano i figli del padre\r\n this.expanded = new Set(searching ? [] : previous);\r\n\r\n let root = res?.idleNode;\r\n if (root) {\r\n this.ingest(root, null, searching ? null : TREE_DEPTH, searching);\r\n this.expanded.add(root.nodeId);\r\n }\r\n\r\n if (searching) {\r\n // L'albero della ricerca contiene solo i percorsi dei nodi trovati e si mostra tutto aperto\r\n this.nodes.forEach(t => { if (t.children?.length) this.expanded.add(t.nodeId); });\r\n this.matchCount = [...this.nodes.values()].filter(t => t.searchMatch).length;\r\n }\r\n this.buildRows();\r\n this.nodes.forEach(t => this.reopen(t, generation));\r\n }\r\n catch (err) {\r\n if (generation == this.treeGeneration)\r\n this.treeError = this.errorMessage(err);\r\n }\r\n finally {\r\n if (generation == this.treeGeneration)\r\n this.treeLoading = false;\r\n }\r\n }\r\n\r\n private ingest(node: ProfilerV2Node, parent: ProfilerV2Node, depthLeft: number, partial: boolean) {\r\n this.nodes.set(node.nodeId, node);\r\n if (parent)\r\n this.parents.set(node.nodeId, parent);\r\n // Oltre il limite di profondità, o nella ricerca, i figli non sono tutti: si chiedono quando il nodo si apre\r\n if (!partial && (depthLeft == null || depthLeft > 0))\r\n this.loaded.add(node.nodeId);\r\n for (let child of node.children ?? [])\r\n this.ingest(child, node, depthLeft == null ? null : depthLeft - 1, partial);\r\n }\r\n\r\n // Un nodo aperto senza figli caricati (dopo un ricaricamento o \"Mostra tutti\" del padre) li chiede\r\n private reopen(node: ProfilerV2Node, generation: number) {\r\n if (this.expanded.has(node.nodeId) && this.needsChildren(node) && !this.loadingChildren.has(node.nodeId))\r\n this.loadChildren(node, false, generation);\r\n }\r\n\r\n hasChildren(node: ProfilerV2Node): boolean {\r\n return node.numChildren > 0;\r\n }\r\n\r\n isExpanded(node: ProfilerV2Node): boolean {\r\n return this.expanded.has(node.nodeId);\r\n }\r\n\r\n private needsChildren(node: ProfilerV2Node): boolean {\r\n return node.numChildren > 0 && !node.children?.length && !this.loaded.has(node.nodeId);\r\n }\r\n\r\n toggle(node: ProfilerV2Node, event?: Event) {\r\n event?.stopPropagation();\r\n if (!this.hasChildren(node))\r\n return;\r\n if (this.expanded.has(node.nodeId)) {\r\n this.expanded.delete(node.nodeId);\r\n this.buildRows();\r\n return;\r\n }\r\n this.expanded.add(node.nodeId);\r\n if (this.needsChildren(node))\r\n this.loadChildren(node, false);\r\n else\r\n this.buildRows();\r\n }\r\n\r\n // R9: la stessa chiamata dei figli senza maxChildren e minPercentage\r\n showAll(node: ProfilerV2Node, event: Event) {\r\n event.stopPropagation();\r\n this.loadChildren(node, true);\r\n }\r\n\r\n // R8: i figli di un nodo, che sostituiscono children e omitted* del nodo\r\n private async loadChildren(node: ProfilerV2Node, all: boolean, generation: number = this.treeGeneration) {\r\n let req = this.baseRequest(new ProfilerV2TreeRequest());\r\n req.rootNodeId = node.nodeId;\r\n req.maxDepth = 1;\r\n req.orderBy = +this.orderBy;\r\n if (!all && +this.maxChildren > 0)\r\n req.maxChildren = +this.maxChildren;\r\n if (!all && +this.minPercentage > 0)\r\n req.minPercentage = +this.minPercentage;\r\n\r\n this.loadingChildren.add(node.nodeId);\r\n this.buildRows();\r\n try {\r\n let res = await this.adms.getProfilerTreeV2(this.be, req);\r\n if (generation != this.treeGeneration)\r\n return;\r\n\r\n let fresh = res?.idleNode;\r\n node.children = fresh?.children ?? [];\r\n node.numChildren = fresh?.numChildren ?? node.children.length;\r\n node.omittedChildren = fresh?.omittedChildren ?? 0;\r\n node.omittedCalls = fresh?.omittedCalls ?? 0;\r\n node.omittedTime = fresh?.omittedTime ?? 0;\r\n node.omittedSnapDeltaTime = fresh?.omittedSnapDeltaTime ?? 0;\r\n for (let child of node.children)\r\n this.ingest(child, node, 0, false);\r\n this.loaded.add(node.nodeId);\r\n node.children.forEach(t => this.reopen(t, generation));\r\n }\r\n catch (err) {\r\n if (generation == this.treeGeneration) {\r\n this.expanded.delete(node.nodeId);\r\n this.treeError = this.errorMessage(err);\r\n }\r\n }\r\n finally {\r\n if (generation == this.treeGeneration) {\r\n this.loadingChildren.delete(node.nodeId);\r\n this.buildRows();\r\n }\r\n }\r\n }\r\n\r\n private buildRows() {\r\n let rows: ProfilerV2Row[] = [];\r\n if (this.tree?.idleNode)\r\n this.addRows(rows, this.tree.idleNode, 0);\r\n this.rows = rows;\r\n }\r\n\r\n private addRows(rows: ProfilerV2Row[], node: ProfilerV2Node, depth: number) {\r\n rows.push({ kind: \"node\", node: node, depth: depth, key: node.nodeId });\r\n if (!this.expanded.has(node.nodeId))\r\n return;\r\n\r\n let loading = this.loadingChildren.has(node.nodeId);\r\n if (loading)\r\n rows.push({ kind: \"loading\", node: node, depth: depth + 1, key: node.nodeId + \"#loading\" });\r\n for (let child of node.children ?? [])\r\n this.addRows(rows, child, depth + 1);\r\n if (!loading && node.omittedChildren > 0 && !this.needsChildren(node))\r\n rows.push({ kind: \"omitted\", node: node, depth: depth + 1, key: node.nodeId + \"#omitted\" });\r\n }\r\n\r\n // Clic: selezione e dettaglio. Doppio clic: apre o chiude\r\n rowClicked(node: ProfilerV2Node) {\r\n this.select(node.nodeId);\r\n }\r\n\r\n // Su e giù cambiano nodo, destra apre (o scende al primo figlio), sinistra chiude (o sale al padre)\r\n treeKeydown(event: KeyboardEvent) {\r\n let nodeRows = this.rows.filter(t => t.kind == \"node\");\r\n let index = nodeRows.findIndex(t => t.node.nodeId == this.selectedId);\r\n let current = index >= 0 ? nodeRows[index].node : null;\r\n let target: ProfilerV2Node = null;\r\n\r\n switch (event.key) {\r\n case \"ArrowDown\":\r\n target = nodeRows[Math.min(nodeRows.length - 1, index + 1)]?.node;\r\n break;\r\n case \"ArrowUp\":\r\n target = nodeRows[Math.max(0, index - 1)]?.node;\r\n break;\r\n case \"ArrowRight\":\r\n if (current && this.hasChildren(current) && !this.isExpanded(current))\r\n this.toggle(current);\r\n else if (current && this.isExpanded(current))\r\n target = current.children?.[0];\r\n break;\r\n case \"ArrowLeft\":\r\n if (current && this.isExpanded(current) && this.hasChildren(current))\r\n this.toggle(current);\r\n else if (current)\r\n target = this.parents.get(current.nodeId);\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n if (target) {\r\n this.select(target.nodeId, true);\r\n setTimeout(() => document.getElementById(\"pv2-row-\" + target.nodeId)?.scrollIntoView({ block: \"nearest\" }));\r\n }\r\n }\r\n\r\n isIdle(type: string, waitClass: string): boolean {\r\n return type == \"Idle\" || ((type == \"Wait\" || type == \"Sleep\") && waitClass == \"Idle\");\r\n }\r\n\r\n // Esecuzione in corso da più di un minuto su un nodo non idle (solo live)\r\n isLongRunning(type: string, waitClass: string, activeMaxTime: number): boolean {\r\n return this.live && !this.isIdle(type, waitClass) && (activeMaxTime ?? 0) >= LONG_RUNNING_SECONDS;\r\n }\r\n\r\n // Con la ricerca la parte del nome che corrisponde è evidenziata\r\n nameParts(name: string, search: string): { text: string, hit: boolean }[] {\r\n if (!search || !name)\r\n return [{ text: name ?? \"\", hit: false }];\r\n let parts: { text: string, hit: boolean }[] = [];\r\n let lower = name.toLowerCase();\r\n let needle = search.toLowerCase();\r\n let from = 0;\r\n let at = lower.indexOf(needle);\r\n while (at >= 0) {\r\n if (at > from)\r\n parts.push({ text: name.substring(from, at), hit: false });\r\n parts.push({ text: name.substring(at, at + needle.length), hit: true });\r\n from = at + needle.length;\r\n at = lower.indexOf(needle, from);\r\n }\r\n if (from < name.length)\r\n parts.push({ text: name.substring(from), hit: false });\r\n return parts;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Valori secondo la modalità (dall'avvio o dall'ultimo snapshot)\r\n\r\n get snapMode(): boolean {\r\n return this.live && this.snapValues;\r\n }\r\n\r\n calls(node: ProfilerV2Node): number { return this.snapMode ? node.snapDeltaCalls : node.calls; }\r\n time(node: ProfilerV2Node): number { return this.snapMode ? node.snapDeltaTime : node.time; }\r\n self(node: ProfilerV2Node): number { return this.snapMode ? node.snapDeltaTimeLessChildren : node.timeLessChildren; }\r\n avg(node: ProfilerV2Node): number { return this.snapMode ? node.snapDeltaAvgTime : node.avgTime; }\r\n peak(node: ProfilerV2Node): number { return this.snapMode ? node.snapPeakTime : node.peakTime; }\r\n parentPerc(node: ProfilerV2Node): number { return this.snapMode ? node.snapParentPercentage : node.parentPercentage; }\r\n firstLevelPerc(node: ProfilerV2Node): number { return this.snapMode ? node.snapPercentage : node.percentage; }\r\n omittedTime(node: ProfilerV2Node): number { return this.snapMode ? node.omittedSnapDeltaTime : node.omittedTime; }\r\n\r\n flatCalls(item: ProfilerV2FlatItem): number { return this.snapMode ? item.snapDeltaCalls : item.calls; }\r\n flatSelf(item: ProfilerV2FlatItem): number { return this.snapMode ? item.snapDeltaTimeLessChildren : item.timeLessChildren; }\r\n flatPerc(item: ProfilerV2FlatItem): number { return this.snapMode ? item.snapPercentage : item.percentage; }\r\n flatTime(item: ProfilerV2FlatItem): number { return this.snapMode ? item.snapDeltaTime : item.time; }\r\n // La vista per nome non ha il medio dei delta: si calcola\r\n flatAvg(item: ProfilerV2FlatItem): number { return this.snapMode ? (item.snapDeltaCalls > 0 ? item.snapDeltaTime / item.snapDeltaCalls : null) : item.avgTime; }\r\n\r\n // #endregion\r\n\r\n // #region Eventi per nome\r\n\r\n flatChanged() {\r\n this.saveSettings();\r\n this.loadFlat();\r\n }\r\n\r\n setFlatTop(id: string) {\r\n this.flatTop = id;\r\n this.flatChanged();\r\n }\r\n\r\n flatSearchChanged() {\r\n clearTimeout(this.flatSearchTimer);\r\n this.flatSearchTimer = setTimeout(() => this.loadFlat(), SEARCH_DELAY_MS);\r\n }\r\n\r\n async loadFlat() {\r\n let generation = ++this.flatGeneration;\r\n let req = this.baseRequest(new ProfilerV2FlatRequest());\r\n req.orderBy = +this.flatOrderBy;\r\n req.top = +this.flatTop;\r\n let search = (this.flatSearch ?? \"\").trim();\r\n if (search)\r\n req.search = search;\r\n if (this.flatType && this.flatType != \"*\")\r\n req.eventType = this.flatType;\r\n if (this.flatIncludeIdle)\r\n req.includeIdle = true;\r\n\r\n this.flatLoading = true;\r\n this.flatError = null;\r\n try {\r\n let res = await this.adms.getProfilerFlatV2(this.be, req);\r\n if (generation != this.flatGeneration)\r\n return;\r\n this.flat = res;\r\n this.openFlat.clear();\r\n }\r\n catch (err) {\r\n if (generation == this.flatGeneration)\r\n this.flatError = this.errorMessage(err);\r\n }\r\n finally {\r\n if (generation == this.flatGeneration)\r\n this.flatLoading = false;\r\n }\r\n }\r\n\r\n flatKey(item: ProfilerV2FlatItem): string {\r\n return `${item.eventTypeName}|${item.waitClassName}|${item.nodeName}`;\r\n }\r\n\r\n toggleFlat(item: ProfilerV2FlatItem) {\r\n let key = this.flatKey(item);\r\n if (this.openFlat.has(key))\r\n this.openFlat.delete(key);\r\n else\r\n this.openFlat.add(key);\r\n }\r\n\r\n // R20: dall'elenco dei nodi di un evento, apri nell'albero\r\n openInTree(nodeId: string, event: Event) {\r\n event.stopPropagation();\r\n this.setRoot(nodeId);\r\n this.select(nodeId);\r\n }\r\n\r\n // Dettaglio completo del nodo (specifica \"Dettaglio nodo e sessione\") con la sorgente, le istanze e la finestra della pagina:\r\n // dal vivo l'ultima ora, sullo storico la finestra scelta\r\n openFullDetail() {\r\n if (!this.detail)\r\n return;\r\n let req = this.baseRequest(new ProfilerV2NodeRequest());\r\n let to = req.snapTo ? new Date(req.snapTo) : new Date();\r\n let from = req.snapFrom ? new Date(req.snapFrom) : new Date(to.getTime() - 3600 * 1000);\r\n this.detailsV2.openNode(this.detail.nodeId, { from: from, to: to, realTime: this.live, global: req.global, instanceId: req.instanceId });\r\n this.dlgDetailsV2.show();\r\n }\r\n\r\n // N7 dal dettaglio completo: l'albero con il nodo come radice, in questa pagina\r\n rootFromDetails(nodeId: string) {\r\n this.dlgDetailsV2.hide();\r\n this.setRoot(nodeId);\r\n this.select(nodeId);\r\n }\r\n\r\n // N8: la Top Activity v2 filtrata sull'evento, nella finestra del dettaglio\r\n showEventSessions(link: DetailsV2EventLink) {\r\n this.dlgDetailsV2.hide();\r\n this.router.navigate([`/pages/${this.mod}/topact`, ...(this.be ? [this.be] : [])], { queryParams: { event: link.nodeId, eventName: link.nodeName, from: link.from.toISOString(), to: link.to.toISOString() } });\r\n }\r\n\r\n showDetail(nodeId: string, event: Event) {\r\n event.stopPropagation();\r\n this.select(nodeId);\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Dettaglio\r\n\r\n select(nodeId: string, delayed: boolean = false) {\r\n clearTimeout(this.detailTimer);\r\n if (nodeId == this.selectedId && (this.detailLoading || this.detail?.nodeId == nodeId))\r\n return;\r\n this.selectedId = nodeId;\r\n if (delayed)\r\n this.detailTimer = setTimeout(() => this.loadDetail(nodeId), DETAIL_DELAY_MS);\r\n else\r\n this.loadDetail(nodeId);\r\n }\r\n\r\n async loadDetail(nodeId: string) {\r\n // Se l'utente seleziona un altro nodo prima della risposta, quella vecchia si scarta (R18)\r\n let generation = ++this.detailGeneration;\r\n let req = this.baseRequest(new ProfilerV2NodeRequest());\r\n req.nodeId = nodeId;\r\n\r\n this.detailLoading = true;\r\n this.detailError = null;\r\n this.detailMissing = false;\r\n try {\r\n let res = await this.adms.getProfilerNodeV2(this.be, req);\r\n if (generation != this.detailGeneration)\r\n return;\r\n this.detail = res;\r\n this.detailMissing = !res;\r\n this.typeParts = res ? this.buildTypeParts(res) : [];\r\n this.chart = res ? this.buildChart(res) : null;\r\n }\r\n catch (err) {\r\n if (generation == this.detailGeneration) {\r\n this.detail = null;\r\n this.detailError = `${this.lc.loc(\"Errore\")} ${err?.status ?? \"\"}. ${this.adms.errorText(err)}`;\r\n }\r\n }\r\n finally {\r\n if (generation == this.detailGeneration)\r\n this.detailLoading = false;\r\n }\r\n }\r\n\r\n // Mentre arriva il dettaglio di un altro nodo quello di prima resta visibile, attenuato, così il pannello non salta\r\n get detailStale(): boolean {\r\n return !!this.detail && this.detail.nodeId != this.selectedId;\r\n }\r\n\r\n async copyId(element: HTMLElement) {\r\n try {\r\n await navigator.clipboard.writeText(this.detail.nodeId);\r\n this.copied = true;\r\n setTimeout(() => this.copied = false, 1500);\r\n }\r\n catch {\r\n // Senza appunti (pagina non sicura o permesso negato) il testo dell'id resta selezionato, pronto per Ctrl+C\r\n let range = document.createRange();\r\n range.selectNodeContents(element);\r\n let selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n\r\n // Ripartizione del tempo proprio di nodo e discendenti: solo i tipi maggiori di zero, in ordine decrescente\r\n private buildTypeParts(stats: ProfilerV2NodeStats): ProfilerV2TypePart[] {\r\n let parts: [string, number][] = [\r\n [\"Cpu\", stats.cpuPerc], [\"Database\", stats.dbPerc], [\"Wait\", stats.waitPerc], [\"Script\", stats.scriptPerc], [\"Network\", stats.networkPerc],\r\n [\"IO\", stats.ioPerc], [\"Sleep\", stats.sleepPerc], [\"Throttle\", stats.throttlePerc], [\"Idle\", stats.idlePerc]\r\n ];\r\n return parts.filter(t => t[1] > 0).sort((a, b) => b[1] - a[1]).map(t => ({ type: t[0], label: TYPE_LABELS[t[0]], color: TYPE_COLORS[t[0]], percentage: t[1] }));\r\n }\r\n\r\n // activeSessions ha un punto al secondo: si raggruppano in circa 160 punti con la media (R27)\r\n private buildChart(stats: ProfilerV2NodeStats): ProfilerV2Chart {\r\n let points: ProfilerV2ActiveSession[] = stats.activeSessions ?? [];\r\n if (points.length == 0)\r\n return null;\r\n\r\n let times = points.map(t => this.parseUtc(t.timestamp).getTime());\r\n let values = points.map(t => t.activity ?? 0);\r\n let interval = points.length > 1 ? Math.max(1, Math.round((times[times.length - 1] - times[0]) / (points.length - 1) / 1000)) : 1;\r\n let size = Math.max(1, Math.ceil(points.length / CHART_POINTS));\r\n\r\n let grouped: { t: number, v: number }[] = [];\r\n for (let i = 0; i < points.length; i += size) {\r\n let slice = values.slice(i, i + size);\r\n grouped.push({ t: times[i], v: slice.reduce((a, b) => a + b, 0) / slice.length });\r\n }\r\n\r\n let max = this.niceMax(Math.max(...grouped.map(t => t.v)));\r\n let n = grouped.length;\r\n let x = (i: number) => n > 1 ? i / (n - 1) * 100 : 50;\r\n let y = (v: number) => 100 - v / max * 100;\r\n let line = grouped.map((t, i) => `${i ? \"L\" : \"M\"}${x(i).toFixed(2)},${y(t.v).toFixed(2)}`).join(\" \");\r\n\r\n return {\r\n line: line,\r\n area: `${line} L${x(n - 1).toFixed(2)},100 L${x(0).toFixed(2)},100 Z`,\r\n color: this.typeColor(stats.eventTypeName, stats.waitClassName),\r\n max: max,\r\n lastX: x(n - 1),\r\n lastY: y(grouped[n - 1].v),\r\n start: this.hhmm(new Date(times[0])),\r\n middle: this.hhmm(new Date(times[Math.floor(times.length / 2)])),\r\n end: this.hhmm(new Date(times[times.length - 1])),\r\n average: values.reduce((a, b) => a + b, 0) / values.length,\r\n peak: Math.max(...values),\r\n points: points.length,\r\n interval: interval,\r\n group: size * interval\r\n };\r\n }\r\n\r\n // Massimo dell'asse arrotondato a un valore tondo: 1, 2, 2,5 o 5 per una potenza di 10\r\n private niceMax(value: number): number {\r\n if (!(value > 0))\r\n return 1;\r\n let power = Math.pow(10, Math.floor(Math.log10(value)));\r\n let fraction = value / power;\r\n return [1, 2, 2.5, 5, 10].find(t => fraction <= t + 1e-9) * power;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Presentazione\r\n\r\n typeColor(type: string, waitClass: string): string {\r\n return TYPE_COLORS[this.isIdle(type, waitClass) ? \"Idle\" : type] ?? TYPE_COLORS.Idle;\r\n }\r\n\r\n typeLabel(type: string, waitClass: string): string {\r\n let label = TYPE_LABELS[type] ?? type;\r\n return waitClass && waitClass != \"None\" ? `${label} · ${waitClass}` : label;\r\n }\r\n\r\n axisValue(value: number): string {\r\n return formatNumber(value, \"it\", \"1.0-3\");\r\n }\r\n\r\n duration(seconds: number): string {\r\n return formatDuration(seconds);\r\n }\r\n\r\n // Le date delle risposte sono UTC \"dd/MM/yyyy HH:mm:ss\" senza fuso: si leggono come UTC e si mostrano in ora locale\r\n parseUtc(value: string): Date {\r\n let m = /^(\\d{2})\\/(\\d{2})\\/(\\d{4}) (\\d{2}):(\\d{2}):(\\d{2})$/.exec(value ?? \"\");\r\n return m ? new Date(Date.UTC(+m[3], +m[2] - 1, +m[1], +m[4], +m[5], +m[6])) : value ? new Date(value) : null;\r\n }\r\n\r\n hhmm(value: Date | string): string {\r\n let date = typeof value == \"string\" ? this.parseUtc(value) : value;\r\n return date ? dayjs(date).format(\"HH:mm\") : \"—\";\r\n }\r\n\r\n ddmmhhmm(value: string): string {\r\n let date = this.parseUtc(value);\r\n return date ? dayjs(date).format(\"DD/MM HH:mm\") : \"—\";\r\n }\r\n\r\n minutesAgo(value: string): number {\r\n let date = this.parseUtc(value);\r\n return date ? Math.max(0, Math.floor((Date.now() - date.getTime()) / 60000)) : 0;\r\n }\r\n\r\n // \"{x} s fa\", \"{x} min fa\", \"{x} h {y} min fa\"; \"mai\" se nessuno è ancora uscito\r\n relative(value: string): string {\r\n let date = this.parseUtc(value);\r\n if (!date)\r\n return this.lc.loc(\"mai\");\r\n let seconds = Math.max(0, Math.round((Date.now() - date.getTime()) / 1000));\r\n if (seconds < 60)\r\n return `${seconds} ${this.lc.loc(\"s fa\")}`;\r\n let minutes = Math.floor(seconds / 60);\r\n if (minutes < 60)\r\n return `${minutes} ${this.lc.loc(\"min fa\")}`;\r\n return `${Math.floor(minutes / 60)} h ${minutes % 60} ${this.lc.loc(\"min fa\")}`;\r\n }\r\n\r\n private errorMessage(err: any): string {\r\n return `${this.lc.loc(\"Errore\")} ${err?.status ?? \"\"}: ${this.adms.errorText(err)}`;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Supporto\r\n\r\n private buildSources() {\r\n let orders: [ProfilerOrderBy, string][] = [\r\n [ProfilerOrderBy.Time, \"Tempo\"], [ProfilerOrderBy.TimeLessChildren, \"Tempo proprio\"], [ProfilerOrderBy.Calls, \"Chiamate\"],\r\n [ProfilerOrderBy.AvgTime, \"Tempo medio\"], [ProfilerOrderBy.PeakTime, \"Picco\"], [ProfilerOrderBy.SnapDeltaTime, \"Δ Tempo\"],\r\n [ProfilerOrderBy.SnapDeltaTimeLessChildren, \"Δ Tempo proprio\"], [ProfilerOrderBy.SnapDeltaCalls, \"Δ Chiamate\"], [ProfilerOrderBy.ActiveThreads, \"Thread attivi\"]\r\n ];\r\n this.TreeOrders = orders.map(t => new KeyValue(String(t[0]), this.lc.loc(t[1])));\r\n // La vista per nome parte dal tempo proprio e non ha il Δ del tempo totale\r\n this.FlatOrders = [1, 0, 2, 3, 4, 6, 7, 8].map(t => this.TreeOrders.find(k => k.id == String(t)));\r\n this.ChildrenOptions = [\"10\", \"25\", \"50\", \"100\"].map(t => new KeyValue(t, t)).concat([new KeyValue(\"0\", this.lc.loc(\"Tutti\"))]);\r\n this.ThresholdOptions = [new KeyValue(\"0\", this.lc.loc(\"Nessuna\")), new KeyValue(\"0.1\", \"≥ 0,1%\"), new KeyValue(\"1\", \"≥ 1%\"), new KeyValue(\"5\", \"≥ 5%\")];\r\n this.FlatTypes = [new KeyValue(\"*\", this.lc.loc(\"Tutti\"))].concat(EVENT_TYPES.map(t => new KeyValue(t, t)));\r\n this.FlatRows = [new KeyValue(\"100\", \"100\"), new KeyValue(\"500\", \"500\"), new KeyValue(\"1000\", \"1.000\")];\r\n this.updateOrderOptions();\r\n this.buildInstances();\r\n }\r\n\r\n // Le chiavi dei delta e i thread attivi si propongono solo in live (R10)\r\n private updateOrderOptions() {\r\n this.TreeOrderOptions = this.live ? this.TreeOrders : this.TreeOrders.slice(0, 5);\r\n this.FlatOrderOptions = this.live ? this.FlatOrders : this.FlatOrders.slice(0, 5);\r\n }\r\n\r\n // Indipendenti: l'istanza che risponde è facoltativa, l'elenco usa la gestione errori standard\r\n private loadInstances() {\r\n this.adms.getInstanceId(this.be).then(t => {\r\n this.instanceId = t;\r\n this.buildInstances();\r\n });\r\n this.adms.getInstances(this.be).then(t => {\r\n this.instanceIds = (t ?? []).map(k => k.id);\r\n this.buildInstances();\r\n });\r\n }\r\n\r\n private buildInstances() {\r\n this.Instances = [\r\n new KeyValue(INSTANCE_THIS, this.instanceId ? `${this.lc.loc(\"Questa istanza\")} (${this.instanceId})` : this.lc.loc(\"Questa istanza\")),\r\n new KeyValue(INSTANCE_ALL, this.instanceIds.length ? `${this.lc.loc(\"Tutto il cluster\")} (${this.instanceIds.length} ${this.instanceIds.length == 1 ? this.lc.loc(\"istanza\") : this.lc.loc(\"istanze\")})` : this.lc.loc(\"Tutto il cluster\")),\r\n ...this.instanceIds.map(t => new KeyValue(t, `${this.lc.loc(\"Solo\")} ${t}`))\r\n ];\r\n }\r\n\r\n private updateUrl() {\r\n let [path, query] = this.location.path().split(\"?\");\r\n let params = new URLSearchParams(query ?? \"\");\r\n if (this.rootId)\r\n params.set(\"root\", this.rootId);\r\n else\r\n params.delete(\"root\");\r\n this.location.replaceState(path, params.toString());\r\n }\r\n\r\n private applySettings(saved: ProfilerV2Settings) {\r\n this.orderBy = saved.orderBy ?? this.orderBy;\r\n this.maxChildren = saved.maxChildren ?? this.maxChildren;\r\n this.minPercentage = saved.minPercentage ?? this.minPercentage;\r\n this.snapValues = saved.snapValues ?? this.snapValues;\r\n this.flatOrderBy = saved.flatOrderBy ?? this.flatOrderBy;\r\n this.flatTop = saved.flatTop ?? this.flatTop;\r\n }\r\n\r\n private saveSettings() {\r\n let settings: ProfilerV2Settings = {\r\n orderBy: this.orderBy,\r\n maxChildren: this.maxChildren,\r\n minPercentage: this.minPercentage,\r\n snapValues: this.snapValues,\r\n flatOrderBy: this.flatOrderBy,\r\n flatTop: this.flatTop\r\n };\r\n this.localStorage.setItem(STORAGE_KEY, settings).subscribe();\r\n }\r\n\r\n private toDate(value: string): Date {\r\n return value ? this.dateExts.getDateConvertion(value).toDate() : null;\r\n }\r\n\r\n private fmt(date: Date): string {\r\n return dayjs(date).format(this.lc.token(\"getFullDateDisplayFormat\"));\r\n }\r\n\r\n private floorHour(date: Date): Date {\r\n let ret = new Date(date);\r\n ret.setMinutes(0, 0, 0);\r\n return ret;\r\n }\r\n\r\n // #endregion\r\n}\r\n","<div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"card app-overflow-visible\" widget>\r\n <div class=\"card-header\">\r\n <span class=\"text-uppercase\">{{'Profiler del Server' | localize: lc}}</span>\r\n </div>\r\n <div class=\"card-body widget-body pv2-body\">\r\n <!-- Barra dei comandi: quali dati caricare. Ogni cambio ricarica la vista e il dettaglio aperto -->\r\n <div class=\"pv2-toolbar\">\r\n <div class=\"pv2-cluster\">\r\n <div class=\"pv2-group\">\r\n <span class=\"pv2-group-label\">{{'Sorgente' | localize: lc}}</span>\r\n <div class=\"pv2-seg\">\r\n <button type=\"button\" [class.pv2-on]=\"live\" (click)=\"setLive(true)\"><span class=\"pv2-live-dot\"></span>Live</button>\r\n <button type=\"button\" [class.pv2-on]=\"!live\" (click)=\"setLive(false)\">{{'Storico' | localize: lc}}</button>\r\n </div>\r\n </div>\r\n <div class=\"pv2-field pv2-field-wide pv2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"instance\" (ngModelChange)=\"setInstance($event)\" name=\"instance\" [Source]=\"Instances\" [Placeholder]=\"'Istanze' | localize: lc\"></form-select>\r\n </div>\r\n </div>\r\n\r\n @if (!live) {\r\n <div class=\"pv2-cluster\">\r\n <div class=\"pv2-field\">\r\n <form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"filterfrom\" (ngModelChange)=\"filterfrom = $event; datesChanged()\" name=\"filterfrom\" [Placeholder]=\"'Dal' | localize: lc\"></form-datetime>\r\n </div>\r\n <div class=\"pv2-field\">\r\n <form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"filterto\" (ngModelChange)=\"filterto = $event; datesChanged()\" name=\"filterto\" [Placeholder]=\"'Al' | localize: lc\"></form-datetime>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"pv2-group\">\r\n <span class=\"pv2-group-label\">{{'Valori' | localize: lc}}</span>\r\n <div class=\"pv2-seg\">\r\n <button type=\"button\" [class.pv2-on]=\"!snapValues\" (click)=\"setSnapValues(false)\">{{\"Dall'avvio\" | localize: lc}}</button>\r\n <button type=\"button\" [class.pv2-on]=\"snapValues\" (click)=\"setSnapValues(true)\">{{\"Dall'ultimo snapshot\" | localize: lc}}</button>\r\n </div>\r\n </div>\r\n }\r\n\r\n <div class=\"pv2-cluster pv2-cluster-end\">\r\n <button type=\"button\" class=\"btn app-btn-search\" [disabled]=\"loading\" (click)=\"reloadAll()\" [title]=\"'Aggiorna' | localize: lc\">\r\n <i class=\"fa fa-refresh\" [class.fa-spin]=\"loading\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn app-btn-search\" (click)=\"downloadWorkloadReport()\" [title]=\"(workloadV2 ? 'Workload report' : 'Scarica il workload report') | localize: lc\">\r\n <i class=\"fa\" [class.fa-download]=\"!workloadV2\" [class.fa-file-text]=\"workloadV2\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Riga della finestra: sempre visibile sopra la vista -->\r\n <div class=\"pv2-window\">\r\n <span><strong>{{live ? 'Live' : ('Storico' | localize: lc)}}</strong> · {{instanceLabel}}</span>\r\n @if (current?.snapFrom; as snapFrom) {\r\n @if (live) {\r\n <span>{{\"Delta dall'ultimo snapshot delle\" | localize: lc}} {{hhmm(snapFrom)}} ({{minutesAgo(snapFrom)}} {{'min fa' | localize: lc}})</span>\r\n } @else {\r\n <span>{{'Snapshot dalle' | localize: lc}} {{ddmmhhmm(snapFrom)}} {{'alle' | localize: lc}} {{ddmmhhmm(current?.snapTo)}}</span>\r\n }\r\n } @else if (current && !live) {\r\n <span class=\"pv2-warn-text\">{{'Nessuno snapshot termina nella finestra scelta' | localize: lc}}</span>\r\n }\r\n @if (view == 'tree' && tree?.idleNode) {\r\n <span>{{tree.numNodes | pv2fmt: 'int'}} {{\"nodi nell'albero\" | localize: lc}} · {{tree.numReturnedNodes | pv2fmt: 'int'}} {{'nella risposta' | localize: lc}}</span>\r\n }\r\n @if (view == 'flat' && flat) {\r\n <span>{{flat.numItems | pv2fmt: 'int'}} {{'eventi distinti' | localize: lc}}</span>\r\n }\r\n @if (loading) {\r\n <span class=\"pv2-muted\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento…' | localize: lc}}</span>\r\n }\r\n </div>\r\n\r\n <div class=\"pv2-main\">\r\n <!-- Vista: albero o eventi per nome -->\r\n <div class=\"pv2-panel pv2-view\">\r\n <div class=\"pv2-view-bar\">\r\n <div class=\"pv2-seg\">\r\n <button type=\"button\" [class.pv2-on]=\"view == 'tree'\" (click)=\"setView('tree')\"><i class=\"fa fa-sitemap\"></i> {{'Albero' | localize: lc}}</button>\r\n <button type=\"button\" [class.pv2-on]=\"view == 'flat'\" (click)=\"setView('flat')\"><i class=\"fa fa-list\"></i> {{'Per nome' | localize: lc}}</button>\r\n </div>\r\n\r\n @if (view == 'tree') {\r\n <div class=\"pv2-field pv2-field-search\" [title]=\"'Per esempio MRD_METERREADINGS, ENQUEUE, ProfilesMgr' | localize: lc\">\r\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"searchText\" (ngModelChange)=\"searchText = $event; searchChanged()\" name=\"search\" [Placeholder]=\"'Cerca nei nomi o per id' | localize: lc\"></form-input>\r\n </div>\r\n <div class=\"pv2-field pv2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"orderBy\" (ngModelChange)=\"setOrderBy($event)\" name=\"orderBy\" [Source]=\"TreeOrderOptions\" [Placeholder]=\"'Ordina per' | localize: lc\"></form-select>\r\n </div>\r\n <div class=\"pv2-group\" [class.pv2-disabled]=\"!!activeSearch\">\r\n <span class=\"pv2-group-label\">{{'Figli per nodo' | localize: lc}}</span>\r\n <div class=\"pv2-seg\">\r\n @for (o of ChildrenOptions; track o.id) {\r\n <button type=\"button\" [disabled]=\"!!activeSearch\" [class.pv2-on]=\"maxChildren == o.id\" (click)=\"setMaxChildren(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"pv2-group\" [class.pv2-disabled]=\"!!activeSearch\">\r\n <span class=\"pv2-group-label\">{{'Soglia' | localize: lc}}</span>\r\n <div class=\"pv2-seg\">\r\n @for (o of ThresholdOptions; track o.id) {\r\n <button type=\"button\" [disabled]=\"!!activeSearch\" [class.pv2-on]=\"minPercentage == o.id\" (click)=\"setMinPercentage(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"pv2-field pv2-field-search\">\r\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"flatSearch\" (ngModelChange)=\"flatSearch = $event; flatSearchChanged()\" name=\"flatSearch\" [Placeholder]=\"'Cerca nei nomi' | localize: lc\"></form-input>\r\n </div>\r\n <div class=\"pv2-field pv2-field-narrow pv2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"flatType\" (ngModelChange)=\"flatType = $event; flatChanged()\" name=\"flatType\" [Source]=\"FlatTypes\" [Placeholder]=\"'Tipo' | localize: lc\"></form-select>\r\n </div>\r\n <div class=\"pv2-field pv2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"flatOrderBy\" (ngModelChange)=\"flatOrderBy = $event; flatChanged()\" name=\"flatOrderBy\" [Source]=\"FlatOrderOptions\" [Placeholder]=\"'Ordina per' | localize: lc\"></form-select>\r\n </div>\r\n <div class=\"pv2-group\">\r\n <span class=\"pv2-group-label\">{{'Righe' | localize: lc}}</span>\r\n <div class=\"pv2-seg\">\r\n @for (o of FlatRows; track o.id) {\r\n <button type=\"button\" [class.pv2-on]=\"flatTop == o.id\" (click)=\"setFlatTop(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"pv2-toggle\">\r\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [ngModel]=\"flatIncludeIdle\" (ngModelChange)=\"flatIncludeIdle = $event; flatChanged()\" name=\"flatIncludeIdle\"></form-checkbox>\r\n <span class=\"pv2-pointer\" (click)=\"flatIncludeIdle = !flatIncludeIdle; flatChanged()\">{{'Anche gli eventi idle' | localize: lc}}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (view == 'tree') {\r\n <!-- Percorso della radice: ogni antenato riporta l'albero a quel nodo -->\r\n @if (tree?.idleNode && tree?.rootPath?.length) {\r\n <nav class=\"pv2-crumbs\">\r\n @for (item of tree.rootPath; track item.nodeId) {\r\n <button type=\"button\" class=\"pv2-crumb\" [title]=\"item.nodeName\" (click)=\"setRoot(item.nodeId)\">{{item.nodeName}}</button>\r\n <span class=\"pv2-crumb-sep\">›</span>\r\n }\r\n <span class=\"pv2-crumb pv2-crumb-current\" [title]=\"tree.idleNode.nodeName\">{{tree.idleNode.nodeName}}</span>\r\n </nav>\r\n }\r\n\r\n @if (treeNotice) {\r\n <div class=\"pv2-alert pv2-alert-warn\">\r\n {{treeNotice}}\r\n <button type=\"button\" class=\"pv2-alert-close\" [title]=\"'Chiudi' | localize: lc\" (click)=\"treeNotice = null\">×</button>\r\n </div>\r\n }\r\n @if (activeSearch && tree) {\r\n @if (matchCount > 0) {\r\n <div class=\"pv2-alert\" [class.pv2-alert-warn]=\"tree.truncated\">\r\n {{matchCount | pv2fmt: 'int'}} {{'nodi trovati, con i loro antenati.' | localize: lc}}\r\n @if (tree.truncated) {\r\n <strong>{{'I nodi trovati sono più di 1.000: sono mostrati i primi per l\\'ordinamento scelto.' | localize: lc}}</strong>\r\n }\r\n </div>\r\n } @else if (!treeLoading) {\r\n <div class=\"pv2-alert\">{{'Nessun nodo contiene' | localize: lc}} «{{activeSearch}}».</div>\r\n }\r\n }\r\n @if (treeError) {\r\n <div class=\"pv2-alert pv2-alert-error\">{{treeError}}</div>\r\n }\r\n\r\n <div class=\"pv2-table-wrap\" tabindex=\"0\" (keydown)=\"treeKeydown($event)\">\r\n <table class=\"pv2-table\">\r\n <thead>\r\n <tr>\r\n <th class=\"pv2-col-node\">{{'Nodo' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Chiamate' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Tempo' | localize: lc}}</th>\r\n <th>{{snapMode ? 'Δ ' : ''}}{{'% del padre' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{(snapMode ? 'Δ Proprio' : 'Tempo proprio') | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Medio' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Picco' | localize: lc}}</th>\r\n @if (live) {\r\n <th class=\"pv2-num\">{{'Thread ora' | localize: lc}}</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of rows; track row.key) {\r\n @if (row.kind == 'node') {\r\n <tr [id]=\"'pv2-row-' + row.node.nodeId\" class=\"pv2-row\"\r\n [class.pv2-selected]=\"row.node.nodeId == selectedId\"\r\n [class.pv2-idle]=\"isIdle(row.node.eventTypeName, row.node.waitClassName)\"\r\n (click)=\"rowClicked(row.node)\" (dblclick)=\"toggle(row.node)\">\r\n <td class=\"pv2-col-node\">\r\n <div class=\"pv2-node\" [style.padding-left.px]=\"row.depth * 16\">\r\n @if (hasChildren(row.node)) {\r\n <button type=\"button\" class=\"pv2-caret\" tabindex=\"-1\" [attr.aria-expanded]=\"isExpanded(row.node)\" (click)=\"toggle(row.node, $event)\">\r\n <i class=\"fa\" [class.fa-caret-down]=\"isExpanded(row.node)\" [class.fa-caret-right]=\"!isExpanded(row.node)\"></i>\r\n </button>\r\n } @else {\r\n <span class=\"pv2-caret\"></span>\r\n }\r\n <span class=\"pv2-type\"><span class=\"pv2-dot\" [style.background]=\"typeColor(row.node.eventTypeName, row.node.waitClassName)\"></span>{{typeLabel(row.node.eventTypeName, row.node.waitClassName)}}</span>\r\n <span class=\"pv2-name\" [title]=\"row.node.nodeName\">@if (row.node.searchMatch && activeSearch) {@for (part of nameParts(row.node.nodeName, activeSearch); track $index) {@if (part.hit) {<mark>{{part.text}}</mark>} @else {<span>{{part.text}}</span>}}} @else {<span>{{row.node.nodeName}}</span>}</span>\r\n </div>\r\n </td>\r\n <td class=\"pv2-num\">{{calls(row.node) | pv2fmt: 'int'}}</td>\r\n <td class=\"pv2-num\">{{time(row.node) | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-perc\" [title]=\"(parentPerc(row.node) | pv2fmt: 'pct') + ' ' + ('del padre' | localize: lc) + ' · ' + (firstLevelPerc(row.node) | pv2fmt: 'pct') + ' ' + ('del nodo di primo livello' | localize: lc)\">\r\n <div class=\"pv2-perc-cell\">\r\n <div class=\"pv2-bar\"><div [style.width.%]=\"parentPerc(row.node)\" [style.background]=\"typeColor(row.node.eventTypeName, row.node.waitClassName)\"></div></div>\r\n <span>{{parentPerc(row.node) | pv2fmt: 'pct'}}</span>\r\n </div>\r\n </td>\r\n <td class=\"pv2-num\">{{self(row.node) | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-num\">{{avg(row.node) | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-num\">{{peak(row.node) | pv2fmt: 'dur'}}</td>\r\n @if (live) {\r\n <td class=\"pv2-num pv2-threads\">\r\n @if (isLongRunning(row.node.eventTypeName, row.node.waitClassName, row.node.activeMaxTime)) {\r\n <span class=\"pv2-long\" [title]=\"('Esecuzione in corso da' | localize: lc) + ' ' + duration(row.node.activeMaxTime) + ': ' + ('forse bloccata' | localize: lc)\"><i class=\"fa fa-clock\"></i> {{duration(row.node.activeMaxTime)}}</span>\r\n }\r\n @if (row.node.activeThreads > 0) {\r\n <span class=\"pv2-active\"><span class=\"pv2-active-dot\"></span>{{row.node.activeThreads}}</span>\r\n } @else {\r\n <span class=\"pv2-muted\">{{row.node.activeThreads ?? '—'}}</span>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n } @else if (row.kind == 'loading') {\r\n <tr class=\"pv2-service\">\r\n <td [attr.colspan]=\"live ? 8 : 7\">\r\n <div [style.padding-left.px]=\"row.depth * 16 + 24\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento dei figli…' | localize: lc}}</div>\r\n </td>\r\n </tr>\r\n } @else {\r\n <tr class=\"pv2-service\">\r\n <td [attr.colspan]=\"live ? 8 : 7\">\r\n <div [style.padding-left.px]=\"row.depth * 16 + 24\">\r\n {{row.node.omittedChildren | pv2fmt: 'int'}} {{'figli non mostrati' | localize: lc}} · {{omittedTime(row.node) | pv2fmt: 'dur'}}\r\n @if (!snapMode) {\r\n · {{row.node.omittedCalls | pv2fmt: 'int'}} {{'chiamate' | localize: lc}}\r\n }\r\n <button type=\"button\" class=\"pv2-link\" (click)=\"showAll(row.node, $event)\">{{'Mostra tutti' | localize: lc}}</button>\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n @if (rows.length == 0 && !treeError) {\r\n <div class=\"pv2-empty\">\r\n @if (!tree) {\r\n {{'Caricamento…' | localize: lc}}\r\n } @else if (!tree.snapFrom && !live) {\r\n {{'Nessuno snapshot termina nella finestra scelta: allargala o spostala indietro.' | localize: lc}}\r\n } @else {\r\n {{\"Il nodo non c'è nelle istanze scelte.\" | localize: lc}}\r\n }\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n @if (flatError) {\r\n <div class=\"pv2-alert pv2-alert-error\">{{flatError}}</div>\r\n }\r\n <div class=\"pv2-table-wrap\">\r\n <table class=\"pv2-table\">\r\n <thead>\r\n <tr>\r\n <th class=\"pv2-col-node\">{{'Evento' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{'Percorsi' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Chiamate' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{(snapMode ? 'Δ Proprio' : 'Tempo proprio') | localize: lc}}</th>\r\n <th>{{snapMode ? 'Δ ' : ''}}{{'% proprio' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Tempo' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{snapMode ? 'Δ ' : ''}}{{'Medio' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{(snapMode ? \"Picco dall'avvio\" : 'Picco') | localize: lc}}</th>\r\n @if (live) {\r\n <th class=\"pv2-num\">{{'Thread' | localize: lc}}</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (item of flat?.items ?? []; track flatKey(item)) {\r\n <tr class=\"pv2-row\" [class.pv2-idle]=\"isIdle(item.eventTypeName, item.waitClassName)\" [class.pv2-selected]=\"openFlat.has(flatKey(item))\" (click)=\"toggleFlat(item)\">\r\n <td class=\"pv2-col-node\">\r\n <div class=\"pv2-node\">\r\n <span class=\"pv2-caret\"><i class=\"fa\" [class.fa-caret-down]=\"openFlat.has(flatKey(item))\" [class.fa-caret-right]=\"!openFlat.has(flatKey(item))\"></i></span>\r\n <span class=\"pv2-type\"><span class=\"pv2-dot\" [style.background]=\"typeColor(item.eventTypeName, item.waitClassName)\"></span>{{typeLabel(item.eventTypeName, item.waitClassName)}}</span>\r\n <span class=\"pv2-name\" [title]=\"item.nodeName\">@for (part of nameParts(item.nodeName, (flatSearch ?? '').trim()); track $index) {@if (part.hit) {<mark>{{part.text}}</mark>} @else {<span>{{part.text}}</span>}}</span>\r\n </div>\r\n </td>\r\n <td class=\"pv2-num\">{{item.numPaths | pv2fmt: 'int'}}</td>\r\n <td class=\"pv2-num\">{{flatCalls(item) | pv2fmt: 'int'}}</td>\r\n <td class=\"pv2-num\">{{flatSelf(item) | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-perc\">\r\n <div class=\"pv2-perc-cell\">\r\n <div class=\"pv2-bar\"><div [style.width.%]=\"flatPerc(item)\" [style.background]=\"typeColor(item.eventTypeName, item.waitClassName)\"></div></div>\r\n <span>{{flatPerc(item) | pv2fmt: 'pct'}}</span>\r\n </div>\r\n </td>\r\n <td class=\"pv2-num\">{{flatTime(item) | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-num\">{{flatAvg(item) | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-num\">{{item.peakTime | pv2fmt: 'dur'}}</td>\r\n @if (live) {\r\n <td class=\"pv2-num pv2-threads\">\r\n @if (item.activeThreads > 0) {\r\n <span class=\"pv2-active\"><span class=\"pv2-active-dot\"></span>{{item.activeThreads}}</span>\r\n } @else {\r\n <span class=\"pv2-muted\">{{item.activeThreads ?? '—'}}</span>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n @if (openFlat.has(flatKey(item))) {\r\n <tr class=\"pv2-sub\">\r\n <td [attr.colspan]=\"live ? 9 : 8\">\r\n <div class=\"pv2-sub-title\">{{'Nodi con più tempo' | localize: lc}}</div>\r\n @for (id of item.nodeIds ?? []; track id) {\r\n <div class=\"pv2-sub-item\">\r\n <code>{{id}}</code>\r\n <button type=\"button\" class=\"pv2-link\" (click)=\"showDetail(id, $event)\">{{'Dettaglio' | localize: lc}}</button>\r\n <button type=\"button\" class=\"pv2-link\" (click)=\"openInTree(id, $event)\">{{\"Apri nell'albero\" | localize: lc}}</button>\r\n </div>\r\n }\r\n @if (item.numPaths > (item.nodeIds?.length ?? 0)) {\r\n <div class=\"pv2-muted\">+{{item.numPaths - (item.nodeIds?.length ?? 0) | pv2fmt: 'int'}} {{'altri' | localize: lc}}</div>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n @if (!flatError && (!flat || !flat.items?.length)) {\r\n <div class=\"pv2-empty\">{{(flat ? 'Nessun evento con questi filtri.' : 'Caricamento…') | localize: lc}}</div>\r\n }\r\n </div>\r\n @if (flat?.items?.length) {\r\n <div class=\"pv2-footer\">\r\n {{flat.numItems | pv2fmt: 'int'}} {{'eventi distinti' | localize: lc}}@if (flat.numItems > flat.items.length) {, {{'mostrati i primi' | localize: lc}} {{flat.items.length | pv2fmt: 'int'}}}.\r\n {{'La percentuale è sul tempo proprio di tutti gli eventi non idle.' | localize: lc}}\r\n </div>\r\n }\r\n }\r\n </div>\r\n\r\n <!-- Dettaglio del nodo selezionato, lo stesso per le due viste -->\r\n <aside class=\"pv2-panel pv2-detail\" [class.pv2-stale]=\"detailStale\">\r\n @if (!selectedId) {\r\n <div class=\"pv2-placeholder\">{{'Seleziona un nodo per vederne il dettaglio.' | localize: lc}}</div>\r\n } @else if (detailMissing && !detailLoading) {\r\n <div class=\"pv2-placeholder\">{{\"Il nodo non c'è nelle istanze o nella finestra scelte.\" | localize: lc}}</div>\r\n } @else if (detailError && !detailLoading) {\r\n <div class=\"pv2-placeholder pv2-error-text\">{{detailError}}</div>\r\n } @else if (!detail) {\r\n <div class=\"pv2-placeholder\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento…' | localize: lc}}</div>\r\n } @else {\r\n <div class=\"pv2-d-head\">\r\n <span class=\"pv2-type\"><span class=\"pv2-dot\" [style.background]=\"typeColor(detail.eventTypeName, detail.waitClassName)\"></span>{{typeLabel(detail.eventTypeName, detail.waitClassName)}}</span>\r\n @if (detailLoading) {\r\n <i class=\"fa fa-spinner fa-spin pv2-muted\"></i>\r\n }\r\n </div>\r\n <div class=\"pv2-fullname\">{{detail.nodeName}}</div>\r\n <div class=\"pv2-id\">\r\n Id <code #idText>{{detail.nodeId}}</code>\r\n <button type=\"button\" class=\"pv2-link\" (click)=\"copyId(idText)\">{{(copied ? 'Copiato' : 'Copia') | localize: lc}}</button>\r\n @if (detailsV2Enabled) {\r\n <button type=\"button\" class=\"pv2-link\" (click)=\"openFullDetail()\">{{'Dettaglio completo' | localize: lc}}</button>\r\n }\r\n </div>\r\n\r\n <div class=\"pv2-d-title\">{{'Percorso' | localize: lc}}</div>\r\n <div class=\"pv2-path\">\r\n @for (item of detail.fullWaitStack ?? []; track item.nodeId; let i = $index) {\r\n <button type=\"button\" class=\"pv2-path-item\" [style.padding-left.px]=\"i * 10\" [title]=\"item.nodeName\" (click)=\"select(item.nodeId)\">\r\n <span class=\"pv2-dot\" [style.background]=\"typeColor(item.eventTypeName, item.waitClassName)\"></span>{{item.nodeName}}\r\n </button>\r\n }\r\n <div class=\"pv2-path-item pv2-path-current\" [style.padding-left.px]=\"(detail.fullWaitStack?.length ?? 0) * 10\" [title]=\"detail.nodeName\">\r\n <span class=\"pv2-dot\" [style.background]=\"typeColor(detail.eventTypeName, detail.waitClassName)\"></span>{{detail.nodeName}}\r\n </div>\r\n </div>\r\n\r\n <div class=\"pv2-d-title\">{{(live ? \"Dall'avvio\" : 'Nella finestra') | localize: lc}}</div>\r\n <dl class=\"pv2-kv\">\r\n <dt>{{'Esecuzioni' | localize: lc}}</dt><dd>{{detail.executions | pv2fmt: 'int'}}</dd>\r\n <dt>{{'Tempo totale' | localize: lc}}</dt><dd>{{detail.elapsedTime | pv2fmt: 'dur'}}</dd>\r\n <dt>{{'Tempo proprio' | localize: lc}}</dt><dd>{{detail.elapsedTimeLessChildren | pv2fmt: 'dur'}}</dd>\r\n <dt>{{'Medio' | localize: lc}}</dt><dd>{{detail.avgTime | pv2fmt: 'dur'}}</dd>\r\n <dt>{{'Picco' | localize: lc}}</dt><dd>{{detail.peakTime | pv2fmt: 'dur'}}</dd>\r\n <dt>{{'Minimo' | localize: lc}}</dt><dd>{{detail.minTime ? (detail.minTime | pv2fmt: 'dur') : '—'}}</dd>\r\n </dl>\r\n\r\n @if (live) {\r\n <div class=\"pv2-d-title\">{{\"Dall'ultimo snapshot\" | localize: lc}}, {{hhmm(detail.snapFrom)}}</div>\r\n <dl class=\"pv2-kv\">\r\n <dt>{{'Esecuzioni' | localize: lc}}</dt><dd>{{detail.snapDeltaExecutions | pv2fmt: 'int'}}</dd>\r\n <dt>{{'Tempo totale' | localize: lc}}</dt><dd>{{detail.snapDeltaElapsedTime | pv2fmt: 'dur'}}</dd>\r\n <dt>{{'Tempo proprio' | localize: lc}}</dt><dd>{{detail.snapDeltaElapsedTimeLessChildren | pv2fmt: 'dur'}}</dd>\r\n </dl>\r\n\r\n <div class=\"pv2-d-title\">{{'Adesso' | localize: lc}}</div>\r\n <dl class=\"pv2-kv\">\r\n <dt>{{'Thread dentro' | localize: lc}}</dt>\r\n <dd>\r\n @if (detail.activeThreads > 0) {\r\n <span class=\"pv2-active\"><span class=\"pv2-active-dot\"></span>{{detail.activeThreads}}</span>\r\n } @else {\r\n {{detail.activeThreads ?? '—'}}\r\n }\r\n </dd>\r\n <dt>{{'Esecuzione più lunga' | localize: lc}}</dt>\r\n <dd>\r\n @if (detail.activeThreads > 0) {\r\n {{detail.activeMaxTime | pv2fmt: 'dur'}}\r\n @if (isLongRunning(detail.eventTypeName, detail.waitClassName, detail.activeMaxTime)) {\r\n <span class=\"pv2-long\"><i class=\"fa fa-clock\"></i> {{'forse bloccata' | localize: lc}}</span>\r\n }\r\n } @else {\r\n —\r\n }\r\n </dd>\r\n <dt>{{'Ultima uscita' | localize: lc}}</dt><dd>{{relative(detail.lastExitTime)}}</dd>\r\n </dl>\r\n }\r\n\r\n @if (typeParts.length > 0) {\r\n <div class=\"pv2-d-title\">{{'Tempo proprio del sottoalbero per tipo' | localize: lc}}</div>\r\n <div class=\"pv2-stack\">\r\n @for (part of typeParts; track part.type) {\r\n <div [style.width.%]=\"part.percentage\" [style.background]=\"part.color\" [title]=\"part.label + ' ' + (part.percentage | pv2fmt: 'pct')\"></div>\r\n }\r\n </div>\r\n <div class=\"pv2-legend\">\r\n @for (part of typeParts; track part.type) {\r\n <span class=\"pv2-legend-item\"><span class=\"pv2-swatch\" [style.background]=\"part.color\"></span>{{part.label}} <strong>{{part.percentage | pv2fmt: 'pct'}}</strong></span>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"pv2-d-title\">{{'Sessioni attive sul nodo e sui discendenti' | localize: lc}}</div>\r\n @if (chart) {\r\n <div class=\"pv2-chart\">\r\n <div class=\"pv2-chart-y\">\r\n <span>{{axisValue(chart.max)}}</span>\r\n <span>{{axisValue(chart.max / 2)}}</span>\r\n <span>0</span>\r\n </div>\r\n <div class=\"pv2-chart-plot\">\r\n <svg viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\r\n <line x1=\"0\" y1=\"50\" x2=\"100\" y2=\"50\" class=\"pv2-chart-grid\" vector-effect=\"non-scaling-stroke\" />\r\n <path [attr.d]=\"chart.area\" [attr.fill]=\"chart.color\" fill-opacity=\"0.25\" />\r\n <path [attr.d]=\"chart.line\" [attr.stroke]=\"chart.color\" fill=\"none\" stroke-width=\"1.5\" vector-effect=\"non-scaling-stroke\" />\r\n </svg>\r\n <span class=\"pv2-chart-last\" [style.left.%]=\"chart.lastX\" [style.top.%]=\"chart.lastY\" [style.background]=\"chart.color\"></span>\r\n </div>\r\n <span></span>\r\n <div class=\"pv2-chart-x\">\r\n <span>{{chart.start}}</span>\r\n <span>{{chart.middle}}</span>\r\n <span>{{chart.end}}</span>\r\n </div>\r\n </div>\r\n <div class=\"pv2-caption\">\r\n {{'Media' | localize: lc}} {{axisValue(chart.average)}} · {{'picco' | localize: lc}} {{axisValue(chart.peak)}} {{'sessioni' | localize: lc}}.\r\n {{chart.points | pv2fmt: 'int'}} {{\"punti dell'API\" | localize: lc}},\r\n @if (chart.interval == 1) {\r\n {{'uno al secondo' | localize: lc}},\r\n } @else {\r\n {{'uno ogni' | localize: lc}} {{chart.interval}} s,\r\n }\r\n {{'raggruppati a' | localize: lc}} {{chart.group}} s\r\n </div>\r\n } @else {\r\n <div class=\"pv2-muted pv2-small\">{{'Nessun campione in memoria per questa finestra: il grafico copre solo le ultime due ore circa.' | localize: lc}}</div>\r\n }\r\n\r\n @if (detail.instances?.length) {\r\n <div class=\"pv2-d-title\">{{'Per istanza' | localize: lc}}</div>\r\n <table class=\"pv2-mini\">\r\n <thead>\r\n <tr>\r\n <th>{{'Istanza' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{'Esecuzioni' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{'Tempo' | localize: lc}}</th>\r\n <th class=\"pv2-num\">{{'Proprio' | localize: lc}}</th>\r\n @if (live) {\r\n <th class=\"pv2-num\">{{'Thread' | localize: lc}}</th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (inst of detail.instances; track inst.instanceId) {\r\n <tr>\r\n <td><span class=\"pv2-ellipsis\" [title]=\"inst.instanceId\">{{inst.instanceId}}</span></td>\r\n <td class=\"pv2-num\">{{inst.executions | pv2fmt: 'int'}}</td>\r\n <td class=\"pv2-num\">{{inst.elapsedTime | pv2fmt: 'dur'}}</td>\r\n <td class=\"pv2-num\">{{inst.elapsedTimeLessChildren | pv2fmt: 'dur'}}</td>\r\n @if (live) {\r\n <td class=\"pv2-num\">{{inst.activeThreads ?? '—'}}</td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n }\r\n\r\n <div class=\"pv2-d-foot\">\r\n <span class=\"pv2-muted\">{{detail.numChildren | pv2fmt: 'int'}} {{'figli diretti' | localize: lc}} · {{detail.numDescendants | pv2fmt: 'int'}} {{'discendenti' | localize: lc}}</span>\r\n <button type=\"button\" class=\"pv2-btn\" (click)=\"setRoot(detail.nodeId)\"><i class=\"fa fa-sitemap\"></i> {{'Apri come radice' | localize: lc}}</button>\r\n </div>\r\n }\r\n </aside>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Dettaglio completo del nodo (DirectorFeature.DetailsV2) -->\r\n<div bsModal #dlgDetailsV2=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\" (onHidden)=\"detailsV2?.stop()\">\r\n @if (detailsV2Enabled) {\r\n <adm-details-v2 [Be]=\"be\" [CanShowSessions]=\"!!topActV2Enabled\" [CanOpenProfiler]=\"true\" (closed)=\"dlgDetailsV2.hide()\"\r\n (sessionsOnEvent)=\"showEventSessions($event)\" (openProfiler)=\"rootFromDetails($event)\"></adm-details-v2>\r\n }\r\n</div>\r\n","// Workload report v2 (specifica \"Workload report\"): richieste e risposte come le vuole e le manda il backend (camelCase).\r\n// Le date delle risposte sono UTC \"dd/MM/yyyy HH:mm:ss\" senza fuso\r\n\r\n// Senza snapshot il report è live; senza istanze e con global è dell'intero cluster\r\nexport class WorkloadReportV2Request {\r\n snapFrom?: number;\r\n snapTo?: number;\r\n instanceIds?: string[];\r\n global?: boolean;\r\n}\r\n\r\n// Snapshot che terminano fra from e to (ISO UTC)\r\nexport class WorkloadSnapshotsRequest {\r\n from?: string;\r\n to?: string;\r\n instanceIds?: string[];\r\n}\r\n\r\nexport class WorkloadSnapshotInstance {\r\n snapId: number;\r\n instanceId: string;\r\n // Avvio del processo che ha scritto lo snapshot\r\n startupTime: string;\r\n beginIntervalTime: string;\r\n endIntervalTime: string;\r\n // Tempo di scrittura dello snapshot, ms\r\n flushElapsed: number;\r\n manual: boolean;\r\n}\r\n\r\nexport class WorkloadSnapshot {\r\n // Lo stesso su tutte le istanze: è il valore di snapFrom e snapTo\r\n snapId: number;\r\n // L'inizio più vecchio e la fine più recente fra le istanze\r\n beginIntervalTime: string;\r\n endIntervalTime: string;\r\n manual: boolean;\r\n // Un'istanza è ripartita rispetto al suo snapshot precedente: counter e meter non attendibili in un report che lo comprende\r\n restart: boolean;\r\n instances: WorkloadSnapshotInstance[];\r\n}\r\n\r\nexport class WorkloadSnapshotList {\r\n // False se lo storico non è attivo: si può produrre solo il report live\r\n historyAvailable: boolean;\r\n // Dal più recente\r\n snapshots: WorkloadSnapshot[];\r\n}\r\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmWorkloadV2Loc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Workload report\", [\"Workload report\"]);\r\n super.set(\"it->en\", \"Errore\", [\"Error\"]);\r\n\r\n // Barra dei comandi e avvisi\r\n super.set(\"it->en\", \"Tipo\", [\"Type\"]);\r\n super.set(\"it->en\", \"Fra snapshot\", [\"Snapshot range\"]);\r\n super.set(\"it->en\", \"Istanze\", [\"Instances\"]);\r\n super.set(\"it->en\", \"Tutto il cluster\", [\"Whole cluster\"]);\r\n super.set(\"it->en\", \"tutto il cluster\", [\"whole cluster\"]);\r\n super.set(\"it->en\", \"istanze\", [\"instances\"]);\r\n super.set(\"it->en\", \"istanza\", [\"instance\"]);\r\n super.set(\"it->en\", \"Genera report\", [\"Generate report\"]);\r\n super.set(\"it->en\", \"Annulla\", [\"Cancel\"]);\r\n super.set(\"it->en\", \"Scegli il primo e l'ultimo snapshot\", [\"Choose the first and last snapshot\"]);\r\n super.set(\"it->en\", \"Lo storico non è attivo su questo ambiente: il report si può produrre solo live.\", [\"History is not active on this environment: only a live report can be produced.\"]);\r\n super.set(\"it->en\", \"Lo snapshot {id} segue un riavvio di {istanza}: counter e meter della finestra non sono attendibili.\", [\"Snapshot {id} follows a restart of {istanza}: counters and meters in the window are not reliable.\"]);\r\n super.set(\"it->en\", \"La finestra supera 24 ore: l'attività campionata ne copre solo le ultime 24.\", [\"The window is longer than 24 hours: sampled activity only covers the last 24.\"]);\r\n\r\n // Snapshot\r\n super.set(\"it->en\", \"Snapshot\", [\"Snapshot\"]);\r\n super.set(\"it->en\", \"Ultime 24 ore\", [\"Last 24 hours\"]);\r\n super.set(\"it->en\", \"Ultimi 7 giorni\", [\"Last 7 days\"]);\r\n super.set(\"it->en\", \"Tutto\", [\"All\"]);\r\n super.set(\"it->en\", \"Caricamento…\", [\"Loading…\"]);\r\n super.set(\"it->en\", \"Dalle\", [\"From\"]);\r\n super.set(\"it->en\", \"alle\", [\"to\"]);\r\n super.set(\"it->en\", \"dalle\", [\"from\"]);\r\n super.set(\"it->en\", \"scegli l'ultimo snapshot\", [\"choose the last snapshot\"]);\r\n super.set(\"it->en\", \"Azzera\", [\"Clear\"]);\r\n super.set(\"it->en\", \"Un clic sceglie il primo snapshot, un secondo clic l'ultimo.\", [\"One click chooses the first snapshot, a second click the last.\"]);\r\n super.set(\"it->en\", \"Inizio\", [\"Start\"]);\r\n super.set(\"it->en\", \"Fine\", [\"End\"]);\r\n super.set(\"it->en\", \"Durata\", [\"Duration\"]);\r\n super.set(\"it->en\", \"Manuale\", [\"Manual\"]);\r\n super.set(\"it->en\", \"Riavvio\", [\"Restart\"]);\r\n super.set(\"it->en\", \"Un'istanza è ripartita: counter e meter non sono attendibili\", [\"An instance restarted: counters and meters are not reliable\"]);\r\n super.set(\"it->en\", \"Nessuno snapshot nel periodo scelto: prova con un periodo più lungo.\", [\"No snapshots in the chosen period: try a longer one.\"]);\r\n super.set(\"it->en\", \"Orari in ora locale\", [\"Times in local time\"]);\r\n super.set(\"it->en\", \"g\", [\"d\"]);\r\n\r\n // Report\r\n super.set(\"it->en\", \"Generazione del report…\", [\"Generating the report…\"]);\r\n super.set(\"it->en\", \"Il report non si può produrre\", [\"The report cannot be produced\"]);\r\n super.set(\"it->en\", \"generato alle\", [\"generated at\"]);\r\n super.set(\"it->en\", \"Vai a…\", [\"Go to…\"]);\r\n super.set(\"it->en\", \"Scarica\", [\"Download\"]);\r\n super.set(\"it->en\", \"Apri in una scheda\", [\"Open in a tab\"]);\r\n super.set(\"it->en\", \"Gli orari del report sono in UTC.\", [\"Report times are in UTC.\"]);\r\n super.set(\"it->en\", \"Scegli tipo e istanze, poi genera il report.\", [\"Choose type and instances, then generate the report.\"]);\r\n }\r\n}\r\n","// Angular\r\nimport { Component, ElementRef, ViewChild } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { DomSanitizer, SafeHtml } from \"@angular/platform-browser\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { firstValueFrom, Subscription } from \"rxjs\";\r\n\r\n// Modelli\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { WorkloadReportV2Request, WorkloadSnapshot, WorkloadSnapshotsRequest } from \"../../models/components/WorkloadReportV2\";\r\n\r\n// Applicazione\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\n\r\n// Localizzazione\r\nimport { AdmWorkloadV2Loc } from \"./workload_v2.component.loc\";\r\n\r\ndeclare var dayjs;\r\n\r\nconst STORAGE_KEY = \"HotSearchWorkloadV2\";\r\nconst HOUR_MS = 3600 * 1000;\r\n\r\n// Sezioni principali del report con le ancore stabili della specifica: nel salto compaiono solo quelle presenti nel documento.\r\n// I titoli sono in inglese come nel report\r\nconst SECTIONS: [string, string][] = [\r\n [\"summary\", \"Report Summary\"], [\"loadprofile\", \"Load profile\"], [\"efficiency\", \"Instance efficiency\"], [\"topevents\", \"Top 10 events by time\"],\r\n [\"waitclasses\", \"Wait classes\"], [\"actsumtype\", \"Activity summary by event type\"], [\"actsumclass\", \"Activity summary by wait class\"],\r\n [\"aas\", \"Average active sessions\"], [\"topsess\", \"Top sessions\"], [\"topnodes\", \"Top profiler nodes\"], [\"topapis\", \"Top APIs\"], [\"topjobs\", \"Top jobs\"],\r\n [\"toptenants\", \"Top tenants\"], [\"protime\", \"Profiler nodes by time\"], [\"protimelc\", \"Profiler nodes by self time\"], [\"procalls\", \"Profiler nodes by calls\"],\r\n [\"wprotime\", \"Profiler waits\"], [\"iprotime\", \"Profiler idle\"], [\"sqltime\", \"SQL by elapsed time\"], [\"sqlexec\", \"SQL by executions\"], [\"sqlpeak\", \"SQL by peak\"],\r\n [\"sqltext\", \"Complete list of SQL text\"], [\"netstat\", \"Network\"], [\"iostat\", \"IO\"], [\"contwaits\", \"Waits on latches and locks\"], [\"latch\", \"Latch activity\"],\r\n [\"mgauges\", \"Metrics: gauges\"], [\"mcounters\", \"Metrics: counters\"], [\"mmeters\", \"Metrics: meters\"], [\"mhistograms\", \"Metrics: histograms\"],\r\n [\"mtimers\", \"Metrics: timers\"], [\"parameters\", \"Modified parameters\"]\r\n];\r\n\r\n// Ricordati fra una visita e l'altra (W12)\r\nclass WorkloadV2Settings {\r\n live: boolean;\r\n instances: string[];\r\n period: string;\r\n}\r\n\r\n// Il report mostrato, con i parametri con cui è stato chiesto: resta quello anche se poi si cambiano i comandi\r\nexport class WorkloadV2Report {\r\n html: string;\r\n doc: SafeHtml;\r\n live: boolean;\r\n instances: string[];\r\n snapFrom: number;\r\n snapTo: number;\r\n windowFrom: Date;\r\n windowTo: Date;\r\n generatedAt: Date;\r\n size: number;\r\n sections: KeyValue[];\r\n}\r\n\r\n@Component({\r\n selector: \"workload_v2\",\r\n providers: [{ provide: LocalizationService, useClass: AdmWorkloadV2Loc }],\r\n templateUrl: \"./workload_v2.component.html\",\r\n styleUrls: [\"./workload_v2.component.scss\"],\r\n standalone: false\r\n})\r\nexport class AdmWorkloadV2Component {\r\n @ViewChild(\"reportFrame\") reportFrame: ElementRef<HTMLIFrameElement>;\r\n\r\n // Comandi\r\n public live: boolean = true;\r\n // Vuoto = tutto il cluster\r\n public instances: string[] = [];\r\n // Giorni dell'elenco degli snapshot; \"0\" = tutto\r\n public period: string = \"7\";\r\n\r\n // Elenco degli snapshot\r\n public snapshots: WorkloadSnapshot[] = [];\r\n public historyAvailable: boolean = true;\r\n public snapshotsLoading: boolean = false;\r\n public snapshotsLoaded: boolean = false;\r\n public snapshotsError: string;\r\n // Primo e ultimo snapshot scelti, compresi (selTo null dopo il primo clic)\r\n public selFrom: number = null;\r\n public selTo: number = null;\r\n public warnings: string[] = [];\r\n\r\n // Report\r\n public generating: boolean = false;\r\n public reportError: string;\r\n public report: WorkloadV2Report;\r\n public section: string = \"\";\r\n\r\n public Instances: KeyValue[] = [];\r\n public Periods: KeyValue[] = [];\r\n\r\n private be: string;\r\n private reportSub: Subscription;\r\n private snapshotsGeneration: number = 0;\r\n\r\n constructor(\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private sanitizer: DomSanitizer,\r\n private adms: AdminModuleBaseService) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.Periods = [\r\n new KeyValue(\"1\", this.lc.loc(\"Ultime 24 ore\")),\r\n new KeyValue(\"7\", this.lc.loc(\"Ultimi 7 giorni\")),\r\n new KeyValue(\"0\", this.lc.loc(\"Tutto\"))\r\n ];\r\n\r\n let saved = this.route.snapshot.queryParams[\"ignoreStorage\"] ? null : await firstValueFrom(this.localStorage.getItem<WorkloadV2Settings>(STORAGE_KEY), { defaultValue: null });\r\n if (saved) {\r\n this.live = saved.live ?? this.live;\r\n this.instances = saved.instances ?? this.instances;\r\n this.period = saved.period ?? this.period;\r\n }\r\n\r\n this.adms.getInstances(this.be).then(t => this.Instances = t ?? []);\r\n this.loadSnapshots();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.reportSub?.unsubscribe();\r\n }\r\n\r\n // #region Comandi\r\n\r\n get clusterLabel(): string {\r\n return this.Instances.length ? `${this.lc.loc(\"Tutto il cluster\")} (${this.Instances.length} ${this.Instances.length == 1 ? this.lc.loc(\"istanza\") : this.lc.loc(\"istanze\")})` : this.lc.loc(\"Tutto il cluster\");\r\n }\r\n\r\n setLive(live: boolean) {\r\n if (!live && !this.historyAvailable)\r\n return;\r\n this.live = live;\r\n this.updateWarnings();\r\n this.saveSettings();\r\n }\r\n\r\n // W6: cambiando istanze l'elenco degli snapshot si ricarica\r\n instancesChanged(ids: string[]) {\r\n this.instances = ids ?? [];\r\n this.saveSettings();\r\n this.loadSnapshots();\r\n }\r\n\r\n setPeriod(id: string) {\r\n this.period = id;\r\n this.saveSettings();\r\n this.loadSnapshots();\r\n }\r\n\r\n // In \"Fra snapshot\" servono il primo e l'ultimo\r\n get canGenerate(): boolean {\r\n return this.live || (this.selFrom != null && this.selTo != null);\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Snapshot\r\n\r\n async loadSnapshots() {\r\n let generation = ++this.snapshotsGeneration;\r\n let req = new WorkloadSnapshotsRequest();\r\n if (+this.period > 0)\r\n req.from = new Date(Date.now() - +this.period * 24 * HOUR_MS).toISOString();\r\n if (this.instances.length)\r\n req.instanceIds = this.instances;\r\n\r\n this.snapshotsLoading = true;\r\n this.snapshotsError = null;\r\n try {\r\n let res = await this.adms.getWorkloadSnapshots(this.be, req);\r\n if (generation != this.snapshotsGeneration)\r\n return;\r\n\r\n // Senza risposta (per esempio DefaultOnFail) vale come storico spento\r\n this.historyAvailable = res?.historyAvailable ?? false;\r\n this.snapshots = res?.snapshots ?? [];\r\n this.snapshotsLoaded = true;\r\n if (!this.historyAvailable)\r\n this.live = true;\r\n\r\n // Se gli snapshot scelti non ci sono più, la scelta si azzera (W6)\r\n let ids = new Set(this.snapshots.map(t => t.snapId));\r\n if ((this.selFrom != null && !ids.has(this.selFrom)) || (this.selTo != null && !ids.has(this.selTo)))\r\n this.clearSelection();\r\n this.updateWarnings();\r\n }\r\n catch (err) {\r\n if (generation == this.snapshotsGeneration)\r\n this.snapshotsError = `${this.lc.loc(\"Errore\")} ${err?.status ?? \"\"}: ${this.adms.errorText(err)}`;\r\n }\r\n finally {\r\n if (generation == this.snapshotsGeneration)\r\n this.snapshotsLoading = false;\r\n }\r\n }\r\n\r\n // Un clic fissa il primo snapshot, un secondo l'ultimo (in qualsiasi ordine); un terzo ricomincia\r\n pick(snapshot: WorkloadSnapshot) {\r\n if (this.selFrom == null || this.selTo != null) {\r\n this.selFrom = snapshot.snapId;\r\n this.selTo = null;\r\n }\r\n else {\r\n let first = this.selFrom;\r\n this.selFrom = Math.min(first, snapshot.snapId);\r\n this.selTo = Math.max(first, snapshot.snapId);\r\n }\r\n this.updateWarnings();\r\n }\r\n\r\n clearSelection() {\r\n this.selFrom = null;\r\n this.selTo = null;\r\n this.updateWarnings();\r\n }\r\n\r\n inRange(snapshot: WorkloadSnapshot): boolean {\r\n if (this.selFrom == null)\r\n return false;\r\n return this.selTo == null ? snapshot.snapId == this.selFrom : snapshot.snapId >= this.selFrom && snapshot.snapId <= this.selTo;\r\n }\r\n\r\n isEdge(snapshot: WorkloadSnapshot): boolean {\r\n return snapshot.snapId == this.selFrom || snapshot.snapId == this.selTo;\r\n }\r\n\r\n // Finestra scelta: dall'inizio del primo snapshot alla fine dell'ultimo (ognuno copre l'intervallo dal precedente)\r\n get selectionWindow(): { from: Date, to: Date } {\r\n let first = this.snapshots.find(t => t.snapId == this.selFrom);\r\n let last = this.snapshots.find(t => t.snapId == (this.selTo ?? this.selFrom));\r\n return first && last ? { from: this.parseUtc(first.beginIntervalTime), to: this.parseUtc(last.endIntervalTime) } : null;\r\n }\r\n\r\n instancesTitle(snapshot: WorkloadSnapshot): string {\r\n return (snapshot.instances ?? []).map(t => t.instanceId).join(\"\\n\");\r\n }\r\n\r\n // W4: avvisi sulla finestra prima di generare, non bloccanti\r\n private updateWarnings() {\r\n let warnings: string[] = [];\r\n if (!this.live && this.selFrom != null && this.selTo != null) {\r\n this.snapshots.forEach((s, i) => {\r\n if (s.restart && s.snapId >= this.selFrom && s.snapId <= this.selTo)\r\n for (let instance of this.restartedInstances(i))\r\n warnings.push(this.lc.loc(\"Lo snapshot {id} segue un riavvio di {istanza}: counter e meter della finestra non sono attendibili.\").replace(\"{id}\", String(s.snapId)).replace(\"{istanza}\", instance));\r\n });\r\n let window = this.selectionWindow;\r\n if (window && window.to.getTime() - window.from.getTime() > 24 * HOUR_MS)\r\n warnings.push(this.lc.loc(\"La finestra supera 24 ore: l'attività campionata ne copre solo le ultime 24.\"));\r\n }\r\n this.warnings = warnings;\r\n }\r\n\r\n // L'istanza ripartita è quella con un avvio diverso dallo snapshot precedente (il successivo nell'elenco, che va dal più recente)\r\n private restartedInstances(index: number): string[] {\r\n let snapshot = this.snapshots[index];\r\n let previous = this.snapshots[index + 1];\r\n let ids = (snapshot.instances ?? []).filter(t => {\r\n let before = previous?.instances?.find(k => k.instanceId == t.instanceId);\r\n return before ? before.startupTime != t.startupTime : this.parseUtc(t.startupTime) > this.parseUtc(snapshot.beginIntervalTime);\r\n }).map(t => t.instanceId);\r\n return ids.length ? ids : (snapshot.instances ?? []).map(t => t.instanceId);\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Report\r\n\r\n // Il report si chiede solo su comando (W7); durante la richiesta lo stesso comando la annulla\r\n generateOrCancel() {\r\n if (this.generating)\r\n this.cancel();\r\n else\r\n this.generate();\r\n }\r\n\r\n private generate() {\r\n if (!this.canGenerate)\r\n return;\r\n\r\n let req = new WorkloadReportV2Request();\r\n // Mai global=false senza istanze: dietro un bilanciatore darebbe il report dell'istanza che risponde (W2)\r\n if (this.instances.length)\r\n req.instanceIds = [...this.instances];\r\n else\r\n req.global = true;\r\n let window = this.live ? null : this.selectionWindow;\r\n if (!this.live) {\r\n req.snapFrom = this.selFrom;\r\n req.snapTo = this.selTo;\r\n }\r\n\r\n this.generating = true;\r\n this.reportError = null;\r\n this.reportSub?.unsubscribe();\r\n this.reportSub = this.adms.getWorkloadReportV2(this.be, req).subscribe({\r\n next: html => {\r\n this.generating = false;\r\n this.showReport(html ?? \"\", req, window);\r\n },\r\n error: err => {\r\n this.generating = false;\r\n // La sessione scaduta la gestisce il servizio\r\n if (err?.status != 401)\r\n this.reportError = this.adms.errorText(err) || `${this.lc.loc(\"Errore\")} ${err?.status ?? \"\"}`;\r\n }\r\n });\r\n }\r\n\r\n cancel() {\r\n this.reportSub?.unsubscribe();\r\n this.reportSub = null;\r\n this.generating = false;\r\n }\r\n\r\n private showReport(html: string, req: WorkloadReportV2Request, window: { from: Date, to: Date }) {\r\n // Le sezioni del salto sono quelle che il documento ha davvero\r\n let parsed = new DOMParser().parseFromString(html, \"text/html\");\r\n let sections = SECTIONS.filter(t => parsed.getElementById(t[0])).map(t => new KeyValue(t[0], t[1]));\r\n\r\n this.report = {\r\n html: html,\r\n // Il report va in un iframe con sandbox senza script: lo stile e le ancore restano dentro il riquadro.\r\n // Il sanificatore di Angular toglierebbe gli stili inline del documento, per questo lo si marca come sicuro\r\n doc: this.sanitizer.bypassSecurityTrustHtml(html),\r\n live: req.snapFrom == null,\r\n instances: req.instanceIds ?? [],\r\n snapFrom: req.snapFrom,\r\n snapTo: req.snapTo,\r\n windowFrom: window?.from,\r\n windowTo: window?.to,\r\n generatedAt: new Date(),\r\n size: new Blob([html]).size,\r\n sections: sections\r\n };\r\n this.section = \"\";\r\n }\r\n\r\n // W11: porta il riquadro all'ancora scelta, senza far scorrere la pagina\r\n goToSection(anchor: string) {\r\n this.section = anchor;\r\n let doc = this.reportFrame?.nativeElement?.contentDocument;\r\n let target = doc?.getElementById(anchor);\r\n if (target)\r\n doc.defaultView.scrollTo({ top: target.getBoundingClientRect().top + doc.defaultView.scrollY - 8, behavior: \"smooth\" });\r\n }\r\n\r\n // W10: l'HTML in un file UTF-8 con un nome che dice cosa contiene\r\n download() {\r\n let url = URL.createObjectURL(this.reportBlob());\r\n let link = document.createElement(\"a\");\r\n link.href = url;\r\n link.download = this.fileName();\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n setTimeout(() => URL.revokeObjectURL(url), 1000);\r\n }\r\n\r\n openInTab() {\r\n let url = URL.createObjectURL(this.reportBlob());\r\n window.open(url, \"_blank\");\r\n // La scheda nuova ha già caricato il documento quando l'URL viene revocato\r\n setTimeout(() => URL.revokeObjectURL(url), 60000);\r\n }\r\n\r\n private reportBlob(): Blob {\r\n return new Blob([this.report.html], { type: \"text/html;charset=utf-8\" });\r\n }\r\n\r\n // workload-report_{live|snap-1201-1206}_{cluster|istanze}_{yyyyMMdd-HHmm}Z.html\r\n private fileName(): string {\r\n let r = this.report;\r\n let kind = r.live ? \"live\" : `snap-${r.snapFrom}-${r.snapTo}`;\r\n let scope = r.instances.length ? r.instances.map(t => t.replace(/[^\\w.-]+/g, \"-\")).join(\"+\") : \"cluster\";\r\n return `workload-report_${kind}_${scope}_${this.utcStamp(r.generatedAt)}Z.html`;\r\n }\r\n\r\n // yyyyMMdd-HHmm in UTC (il plugin utc di dayjs non è detto che ci sia)\r\n private utcStamp(date: Date): string {\r\n let pad = (n: number) => String(n).padStart(2, \"0\");\r\n return `${date.getUTCFullYear()}${pad(date.getUTCMonth() + 1)}${pad(date.getUTCDate())}-${pad(date.getUTCHours())}${pad(date.getUTCMinutes())}`;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Presentazione\r\n\r\n // Le date delle risposte sono UTC \"dd/MM/yyyy HH:mm:ss\" senza fuso: si leggono come UTC e si mostrano in ora locale (W16)\r\n parseUtc(value: string): Date {\r\n let m = /^(\\d{2})\\/(\\d{2})\\/(\\d{4}) (\\d{2}):(\\d{2}):(\\d{2})$/.exec(value ?? \"\");\r\n return m ? new Date(Date.UTC(+m[3], +m[2] - 1, +m[1], +m[4], +m[5], +m[6])) : value ? new Date(value) : null;\r\n }\r\n\r\n local(value: Date | string): string {\r\n let date = typeof value == \"string\" ? this.parseUtc(value) : value;\r\n return date ? dayjs(date).format(\"DD/MM HH:mm\") : \"—\";\r\n }\r\n\r\n hhmm(date: Date): string {\r\n return date ? dayjs(date).format(\"HH:mm\") : \"—\";\r\n }\r\n\r\n // Fuso dell'ora locale, per dire in che ora sono gli orari della pagina\r\n get zone(): string {\r\n return `UTC${dayjs().format(\"Z\")}`;\r\n }\r\n\r\n span(from: Date | string, to: Date | string): string {\r\n let a = typeof from == \"string\" ? this.parseUtc(from) : from;\r\n let b = typeof to == \"string\" ? this.parseUtc(to) : to;\r\n if (!a || !b)\r\n return \"—\";\r\n let minutes = Math.max(0, Math.round((b.getTime() - a.getTime()) / 60000));\r\n if (minutes < 60)\r\n return `${minutes} min`;\r\n let hours = Math.floor(minutes / 60);\r\n if (hours < 48)\r\n return minutes % 60 ? `${hours} h ${minutes % 60} min` : `${hours} h`;\r\n let days = Math.floor(hours / 24);\r\n return hours % 24 ? `${days} ${this.lc.loc(\"g\")} ${hours % 24} h` : `${days} ${this.lc.loc(\"g\")}`;\r\n }\r\n\r\n kilobytes(size: number): string {\r\n return `${Math.max(1, Math.round(size / 1024))} kB`;\r\n }\r\n\r\n scopeLabel(instances: string[]): string {\r\n return instances?.length ? instances.join(\", \") : this.lc.loc(\"tutto il cluster\");\r\n }\r\n\r\n private saveSettings() {\r\n let settings: WorkloadV2Settings = { live: this.live, instances: this.instances, period: this.period };\r\n this.localStorage.setItem(STORAGE_KEY, settings).subscribe();\r\n }\r\n\r\n // #endregion\r\n}\r\n","<div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"card app-overflow-visible\" widget>\r\n <div class=\"card-header\">\r\n <span class=\"text-uppercase\">{{'Workload report' | localize: lc}}</span>\r\n </div>\r\n <div class=\"card-body widget-body\">\r\n <!-- Barra dei comandi: tipo, istanze, genera. Il report si chiede solo con il comando -->\r\n <div class=\"wr-toolbar\">\r\n <div class=\"wr-group\">\r\n <span class=\"wr-group-label\">{{'Tipo' | localize: lc}}</span>\r\n <div class=\"wr-seg\">\r\n <button type=\"button\" [class.wr-on]=\"live\" (click)=\"setLive(true)\"><span class=\"wr-live-dot\"></span>Live</button>\r\n <button type=\"button\" [class.wr-on]=\"!live\" [disabled]=\"!historyAvailable\" (click)=\"setLive(false)\"\r\n [title]=\"historyAvailable ? '' : ('Lo storico non è attivo su questo ambiente: il report si può produrre solo live.' | localize: lc)\">\r\n {{'Fra snapshot' | localize: lc}}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"wr-group wr-field-wide\">\r\n <span class=\"wr-group-label\">{{'Istanze' | localize: lc}}</span>\r\n <form-multiselect class=\"wr-fill\" [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"instances\" (ngModelChange)=\"instancesChanged($event)\" name=\"instances\" [Source]=\"Instances\" [Placeholder]=\"clusterLabel\" [MaxShownElements]=\"2\"></form-multiselect>\r\n </div>\r\n <div class=\"wr-toolbar-end\">\r\n <button type=\"button\" class=\"wr-btn wr-btn-primary\" [disabled]=\"!generating && !canGenerate\" (click)=\"generateOrCancel()\"\r\n [title]=\"!generating && !canGenerate ? ('Scegli il primo e l\\'ultimo snapshot' | localize: lc) : ''\">\r\n @if (generating) {\r\n <i class=\"fa fa-times\"></i> {{'Annulla' | localize: lc}}\r\n } @else {\r\n <i class=\"fa fa-file-text\"></i> {{'Genera report' | localize: lc}}\r\n }\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Avvisi sulla finestra (W4): non bloccano la generazione -->\r\n @for (warning of warnings; track $index) {\r\n <div class=\"wr-alert wr-alert-warn\"><i class=\"fa fa-exclamation-triangle\"></i> {{warning}}</div>\r\n }\r\n @if (snapshotsLoaded && !historyAvailable) {\r\n <div class=\"wr-alert\"><i class=\"fa fa-info-circle\"></i> {{'Lo storico non è attivo su questo ambiente: il report si può produrre solo live.' | localize: lc}}</div>\r\n }\r\n\r\n <!-- Elenco degli snapshot, solo per il report fra snapshot -->\r\n @if (!live) {\r\n <div class=\"wr-panel\">\r\n <div class=\"wr-panel-header\">\r\n <span class=\"wr-title\">{{'Snapshot' | localize: lc}}</span>\r\n <div class=\"wr-seg wr-seg-small\">\r\n @for (p of Periods; track p.id) {\r\n <button type=\"button\" [class.wr-on]=\"period == p.id\" (click)=\"setPeriod(p.id)\">{{p.description}}</button>\r\n }\r\n </div>\r\n @if (snapshotsLoading) {\r\n <span class=\"wr-muted\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento…' | localize: lc}}</span>\r\n }\r\n <span class=\"wr-spacer\"></span>\r\n @if (selectionWindow; as w) {\r\n <span class=\"wr-window\">\r\n {{'Dalle' | localize: lc}} <strong>{{local(w.from)}}</strong> {{'alle' | localize: lc}} <strong>{{local(w.to)}}</strong>\r\n ({{span(w.from, w.to)}})\r\n @if (selTo == null) {\r\n <span class=\"wr-muted\">· {{\"scegli l'ultimo snapshot\" | localize: lc}}</span>\r\n }\r\n </span>\r\n <button type=\"button\" class=\"wr-link\" (click)=\"clearSelection()\">{{'Azzera' | localize: lc}}</button>\r\n } @else {\r\n <span class=\"wr-muted\">{{\"Un clic sceglie il primo snapshot, un secondo clic l'ultimo.\" | localize: lc}}</span>\r\n }\r\n </div>\r\n\r\n @if (snapshotsError) {\r\n <div class=\"wr-alert wr-alert-error\">{{snapshotsError}}</div>\r\n }\r\n\r\n <div class=\"wr-table-wrap\">\r\n <table class=\"wr-table\">\r\n <thead>\r\n <tr>\r\n <th class=\"wr-num\">{{'Snapshot' | localize: lc}}</th>\r\n <th>{{'Inizio' | localize: lc}}</th>\r\n <th>{{'Fine' | localize: lc}}</th>\r\n <th class=\"wr-num\">{{'Durata' | localize: lc}}</th>\r\n <th class=\"wr-num\">{{'Istanze' | localize: lc}}</th>\r\n <th>{{'Manuale' | localize: lc}}</th>\r\n <th>{{'Riavvio' | localize: lc}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of snapshots; track s.snapId) {\r\n <tr class=\"wr-row\" [class.wr-in-range]=\"inRange(s)\" [class.wr-edge]=\"isEdge(s)\" [class.wr-restart]=\"s.restart\" (click)=\"pick(s)\">\r\n <td class=\"wr-num\"><strong>{{s.snapId}}</strong></td>\r\n <td>{{local(s.beginIntervalTime)}}</td>\r\n <td>{{local(s.endIntervalTime)}}</td>\r\n <td class=\"wr-num\">{{span(s.beginIntervalTime, s.endIntervalTime)}}</td>\r\n <td class=\"wr-num\" [title]=\"instancesTitle(s)\">{{s.instances?.length ?? 0}}</td>\r\n <td>\r\n @if (s.manual) {\r\n <span class=\"wr-badge\"><i class=\"fa fa-hand-pointer\"></i> {{'Manuale' | localize: lc}}</span>\r\n }\r\n </td>\r\n <td>\r\n @if (s.restart) {\r\n <span class=\"wr-badge wr-badge-warn\" [title]=\"'Un\\'istanza è ripartita: counter e meter non sono attendibili' | localize: lc\"><i class=\"fa fa-power-off\"></i> {{'Riavvio' | localize: lc}}</span>\r\n }\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n @if (snapshotsLoaded && !snapshotsLoading && !snapshotsError && snapshots.length == 0 && historyAvailable) {\r\n <div class=\"wr-empty\">{{'Nessuno snapshot nel periodo scelto: prova con un periodo più lungo.' | localize: lc}}</div>\r\n }\r\n </div>\r\n <div class=\"wr-footnote\">{{'Orari in ora locale' | localize: lc}} ({{zone}})</div>\r\n </div>\r\n }\r\n\r\n <!-- Report -->\r\n <div class=\"wr-panel wr-report\">\r\n @if (generating) {\r\n <div class=\"wr-alert wr-alert-busy\">\r\n <i class=\"fa fa-spinner fa-spin\"></i> {{'Generazione del report…' | localize: lc}}\r\n <button type=\"button\" class=\"wr-link\" (click)=\"cancel()\">{{'Annulla' | localize: lc}}</button>\r\n </div>\r\n }\r\n @if (reportError) {\r\n <div class=\"wr-alert wr-alert-error\">{{'Il report non si può produrre' | localize: lc}}: {{reportError}}</div>\r\n }\r\n\r\n @if (report) {\r\n <div class=\"wr-report-bar\">\r\n <div class=\"wr-summary\">\r\n @if (report.live) {\r\n <strong>Live</strong>\r\n } @else {\r\n <strong>{{'Snapshot' | localize: lc}} {{report.snapFrom}}–{{report.snapTo}}</strong>\r\n }\r\n · {{scopeLabel(report.instances)}}\r\n @if (!report.live && report.windowFrom) {\r\n · {{'dalle' | localize: lc}} {{local(report.windowFrom)}} {{'alle' | localize: lc}} {{local(report.windowTo)}}\r\n }\r\n · {{'generato alle' | localize: lc}} {{hhmm(report.generatedAt)}} ({{kilobytes(report.size)}})\r\n </div>\r\n <div class=\"wr-actions\">\r\n @if (report.sections.length > 0) {\r\n <div class=\"wr-field wr-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"section\" (ngModelChange)=\"goToSection($event)\" name=\"section\" [Source]=\"report.sections\" [Placeholder]=\"'Vai a…' | localize: lc\"></form-select>\r\n </div>\r\n }\r\n <button type=\"button\" class=\"wr-btn\" (click)=\"download()\"><i class=\"fa fa-download\"></i> {{'Scarica' | localize: lc}}</button>\r\n <button type=\"button\" class=\"wr-btn\" (click)=\"openInTab()\"><i class=\"fa fa-external-link\"></i> {{'Apri in una scheda' | localize: lc}}</button>\r\n </div>\r\n </div>\r\n <div class=\"wr-footnote\"><i class=\"fa fa-clock\"></i> {{'Gli orari del report sono in UTC.' | localize: lc}}</div>\r\n <!-- Riquadro isolato e senza script: gli stili del report non toccano la pagina e le ancore dell'indice restano dentro (W8) -->\r\n <iframe #reportFrame class=\"wr-frame\" [class.wr-stale]=\"generating\" [srcdoc]=\"report.doc\" sandbox=\"allow-same-origin allow-popups\" title=\"Workload report\"></iframe>\r\n } @else if (!generating && !reportError) {\r\n <div class=\"wr-placeholder\">\r\n <i class=\"fa fa-file-text\"></i>\r\n {{'Scegli tipo e istanze, poi genera il report.' | localize: lc}}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","// Metriche v2 (specifica \"Metriche del Director\"): richieste e risposte come le vuole e le manda il backend (camelCase).\r\n// Le date delle risposte sono UTC \"dd/MM/yyyy HH:mm:ss\" senza fuso, al secondo\r\n\r\nexport enum MetricV2Type {\r\n Counter = 0,\r\n Gauge = 1,\r\n Histogram = 2,\r\n Timer = 3,\r\n Meter = 4\r\n}\r\n\r\n// Senza istanze e con global, tutto il cluster\r\nexport class MetricsV2CatalogRequest {\r\n global?: boolean;\r\n instanceIds?: string[];\r\n}\r\n\r\n// Live (realTime con snapFrom), storico per periodo (snapFrom/snapTo) o storico fra due snapshot (snapIdFrom/snapIdTo)\r\nexport class MetricsV2Request extends MetricsV2CatalogRequest {\r\n metricNames?: string[];\r\n realTime?: boolean;\r\n snapFrom?: string;\r\n snapTo?: string;\r\n snapIdFrom?: number;\r\n snapIdTo?: number;\r\n}\r\n\r\nexport class MetricsV2Info {\r\n // Le voci di un totale si chiamano \"{totale} - {elemento}\"\r\n name: string;\r\n metricType: MetricV2Type;\r\n unit: string;\r\n // Meter e timer: unità dei rate a 1, 5 e 15 minuti\r\n rateUnit: string;\r\n // Timer: unità delle durate\r\n durationUnit: string;\r\n instances: string[];\r\n}\r\n\r\n// Una metrica di un'istanza in un istante: i campi che non riguardano il tipo valgono 0 o null\r\nexport class MetricsV2Sample {\r\n instanceId: string;\r\n sampleTime: string;\r\n // Solo sullo storico\r\n snapId: number;\r\n name: string;\r\n metricType: MetricV2Type;\r\n unit: string;\r\n rateUnit: string;\r\n durationUnit: string;\r\n value: number;\r\n count: number;\r\n // Voci di un totale, solo live\r\n percent: number;\r\n meanRate: number;\r\n oneMinuteRate: number;\r\n fiveMinuteRate: number;\r\n fifteenMinuteRate: number;\r\n mean: number;\r\n stdDev: number;\r\n median: number;\r\n min: number;\r\n max: number;\r\n lastValue: number;\r\n percentile75: number;\r\n percentile95: number;\r\n percentile98: number;\r\n percentile99: number;\r\n percentile999: number;\r\n minUserValue: string;\r\n maxUserValue: string;\r\n lastUserValue: string;\r\n sampleSize: number;\r\n activeSessions: number;\r\n totalTime: number;\r\n // Differenze con il campione precedente della stessa istanza e metrica: null sul primo e sul primo dopo un riavvio\r\n intervalSeconds: number;\r\n deltaCount: number;\r\n ratePerSecond: number;\r\n deltaTotalTime: number;\r\n intervalMean: number;\r\n}\r\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmMetricsV2Loc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Metriche di Sistema\", [\"System Metrics\"]);\r\n super.set(\"it->en\", \"Errore\", [\"Error\"]);\r\n\r\n // Barra dei comandi\r\n super.set(\"it->en\", \"Sorgente\", [\"Source\"]);\r\n super.set(\"it->en\", \"Storico per periodo\", [\"History by period\"]);\r\n super.set(\"it->en\", \"Storico per snapshot\", [\"History by snapshot\"]);\r\n super.set(\"it->en\", \"Lo storico non è attivo su questo ambiente: ci sono solo i dati live.\", [\"History is not active on this environment: only live data is available.\"]);\r\n super.set(\"it->en\", \"Finestra\", [\"Window\"]);\r\n super.set(\"it->en\", \"1 ora\", [\"1 hour\"]);\r\n super.set(\"it->en\", \"Dal\", [\"From\"]);\r\n super.set(\"it->en\", \"Al\", [\"To\"]);\r\n super.set(\"it->en\", \"Dallo snapshot\", [\"From snapshot\"]);\r\n super.set(\"it->en\", \"Allo snapshot\", [\"To snapshot\"]);\r\n super.set(\"it->en\", \"Dalle\", [\"From\"]);\r\n super.set(\"it->en\", \"alle\", [\"at\"]);\r\n super.set(\"it->en\", \"Istanze\", [\"Instances\"]);\r\n super.set(\"it->en\", \"Tutto il cluster\", [\"Whole cluster\"]);\r\n super.set(\"it->en\", \"istanze\", [\"instances\"]);\r\n super.set(\"it->en\", \"istanza\", [\"instance\"]);\r\n super.set(\"it->en\", \"Aggiornato alle\", [\"Updated at\"]);\r\n super.set(\"it->en\", \"Pausa\", [\"Pause\"]);\r\n super.set(\"it->en\", \"Riprendi\", [\"Resume\"]);\r\n super.set(\"it->en\", \"Caricamento…\", [\"Loading…\"]);\r\n super.set(\"it->en\", \"Grafici\", [\"Charts\"]);\r\n super.set(\"it->en\", \"Tabella\", [\"Table\"]);\r\n super.set(\"it->en\", \"Lo snapshot {id} segue un riavvio di {istanza}: lì le serie si interrompono.\", [\"Snapshot {id} follows a restart of {istanza}: series break there.\"]);\r\n\r\n // Catalogo\r\n super.set(\"it->en\", \"Cerca una metrica…\", [\"Search a metric…\"]);\r\n super.set(\"it->en\", \"Processo\", [\"Process\"]);\r\n super.set(\"it->en\", \"API\", [\"API\"]);\r\n super.set(\"it->en\", \"Code asincrone\", [\"Async queues\"]);\r\n super.set(\"it->en\", \"Attività\", [\"Activity\"]);\r\n super.set(\"it->en\", \"di\", [\"of\"]);\r\n super.set(\"it->en\", \"metriche scelte\", [\"metrics chosen\"]);\r\n super.set(\"it->en\", \"Togli tutte\", [\"Remove all\"]);\r\n super.set(\"it->en\", \"Voci\", [\"Items\"]);\r\n super.set(\"it->en\", \"Aggiungi le {N} voci\", [\"Add the {N} items\"]);\r\n\r\n // Grafici e tessere\r\n super.set(\"it->en\", \"Scegli una o più metriche dal catalogo.\", [\"Choose one or more metrics from the catalog.\"]);\r\n super.set(\"it->en\", \"dall'avvio\", [\"since start\"]);\r\n super.set(\"it->en\", \"Orari in ora locale\", [\"Times in local time\"]);\r\n super.set(\"it->en\", \"trascina su un grafico per lo zoom\", [\"drag on a chart to zoom\"]);\r\n super.set(\"it->en\", \"Finestra intera\", [\"Whole window\"]);\r\n super.set(\"it->en\", \"Togli\", [\"Remove\"]);\r\n super.set(\"it->en\", \"Nessun campione di {metrica} nella finestra scelta\", [\"No samples of {metrica} in the chosen window\"]);\r\n super.set(\"it->en\", \"riavvio\", [\"restart\"]);\r\n super.set(\"it->en\", \"thread\", [\"threads\"]);\r\n super.set(\"it->en\", \"Livello\", [\"Level\"]);\r\n super.set(\"it->en\", \"Variazione\", [\"Change\"]);\r\n super.set(\"it->en\", \"Quote\", [\"Shares\"]);\r\n super.set(\"it->en\", \"Al secondo\", [\"Per second\"]);\r\n super.set(\"it->en\", \"Rate mobili\", [\"Moving rates\"]);\r\n super.set(\"it->en\", \"Percentili\", [\"Percentiles\"]);\r\n super.set(\"it->en\", \"Frequenza\", [\"Frequency\"]);\r\n super.set(\"it->en\", \"Chiamate e durata\", [\"Calls and duration\"]);\r\n super.set(\"it->en\", \"In corso\", [\"In progress\"]);\r\n super.set(\"it->en\", \"in corso\", [\"in progress\"]);\r\n super.set(\"it->en\", \"mediana\", [\"median\"]);\r\n super.set(\"it->en\", \"media nell'intervallo\", [\"interval mean\"]);\r\n\r\n // Tabella\r\n super.set(\"it->en\", \"Istanza\", [\"Instance\"]);\r\n super.set(\"it->en\", \"Istante\", [\"Time\"]);\r\n super.set(\"it->en\", \"Intervallo (s)\", [\"Interval (s)\"]);\r\n super.set(\"it->en\", \"Snapshot\", [\"Snapshot\"]);\r\n super.set(\"it->en\", \"Valore\", [\"Value\"]);\r\n super.set(\"it->en\", \"Conteggio\", [\"Count\"]);\r\n super.set(\"it->en\", \"Quota\", [\"Share\"]);\r\n super.set(\"it->en\", \"Mediana\", [\"Median\"]);\r\n super.set(\"it->en\", \"Massimo\", [\"Maximum\"]);\r\n super.set(\"it->en\", \"Chiamate\", [\"Calls\"]);\r\n super.set(\"it->en\", \"Durata media nell'intervallo\", [\"Mean duration in the interval\"]);\r\n super.set(\"it->en\", \"Esporta CSV\", [\"Export CSV\"]);\r\n super.set(\"it->en\", \"Mostrate le prime 300 righe di\", [\"Showing the first 300 rows of\"]);\r\n super.set(\"it->en\", \"l'esportazione le comprende tutte.\", [\"the export includes all of them.\"]);\r\n }\r\n}\r\n","// Angular\r\nimport { Component, ElementRef, EventEmitter, Input, NgZone, OnChanges, OnDestroy, OnInit, Output } from \"@angular/core\";\r\n\r\ndeclare var dayjs;\r\n\r\n// Un punto di una serie: gap = non unirlo al precedente (riavvio o buco nei campioni), v2 = estremo superiore di una fascia\r\nexport class Mv2Point {\r\n t: number;\r\n v: number;\r\n v2?: number;\r\n gap?: boolean;\r\n}\r\n\r\nexport class Mv2Series {\r\n key: string;\r\n label: string;\r\n color: string;\r\n kind: \"line\" | \"step\" | \"bars\" | \"dots\" | \"band\";\r\n points: Mv2Point[];\r\n dash?: string;\r\n opacity?: number;\r\n // false: la serie non compare nel riquadro dei valori del cursore (per esempio le fasce dei percentili)\r\n tooltip?: boolean;\r\n}\r\n\r\nexport class Mv2Mark {\r\n t: number;\r\n label: string;\r\n kind: \"restart\" | \"snapshot\";\r\n}\r\n\r\nclass Mv2Path { key: string; d: string; color: string; fill: boolean; dash: string; opacity: number; }\r\nclass Mv2Rect { key: string; x: number; y: number; w: number; h: number; color: string; }\r\nclass Mv2Dot { key: string; x: number; y: number; color: string; }\r\nclass Mv2Tick { key: string; pos: number; label: string; }\r\nclass Mv2MarkTick { key: string; pos: number; label: string; kind: string; }\r\nclass Mv2TipRow { color: string; label: string; value: string; }\r\n\r\nconst LEFT = 56;\r\nconst RIGHT = 10;\r\n// Spazio in alto per l'unità, che sta sopra la prima tacca\r\nconst TOP = 20;\r\nconst BOTTOM = 20;\r\nconst STEPS_MS = [60, 120, 300, 600, 900, 1800, 3600, 7200, 10800, 21600, 43200, 86400, 172800, 604800].map(t => t * 1000);\r\n\r\n// Grafico SVG delle metriche v2: lo stesso asse dei tempi per tutti i pannelli, cursore e zoom condivisi tramite la pagina.\r\n// Le serie arrivano già pronte (punti con le interruzioni segnate): qui solo geometria e interazione\r\n@Component({\r\n selector: \"mv2-chart\",\r\n template: `\r\n <div class=\"mv2c\" [style.height.px]=\"height\" (mousemove)=\"move($event)\" (mouseleave)=\"leave()\" (mousedown)=\"down($event)\" (mouseup)=\"up($event)\">\r\n <svg [attr.width]=\"width\" [attr.height]=\"height\" [attr.viewBox]=\"'0 0 ' + width + ' ' + height\">\r\n @for (tick of yTicks; track tick.key) {\r\n <line class=\"mv2c-grid\" [attr.x1]=\"left\" [attr.x2]=\"width - right\" [attr.y1]=\"tick.pos\" [attr.y2]=\"tick.pos\" />\r\n <text class=\"mv2c-ylabel\" [attr.x]=\"left - 6\" [attr.y]=\"tick.pos + 3\">{{tick.label}}</text>\r\n }\r\n @for (tick of xTicks; track tick.key) {\r\n <text class=\"mv2c-xlabel\" [attr.x]=\"tick.pos\" [attr.y]=\"height - 5\">{{tick.label}}</text>\r\n }\r\n @if (unit) {\r\n <text class=\"mv2c-unit\" [attr.x]=\"4\" [attr.y]=\"11\">{{unit}}</text>\r\n }\r\n @for (mark of markTicks; track mark.key) {\r\n <line class=\"mv2c-mark\" [class.mv2c-mark-restart]=\"mark.kind == 'restart'\" [class.mv2c-mark-snapshot]=\"mark.kind == 'snapshot'\" [attr.x1]=\"mark.pos\" [attr.x2]=\"mark.pos\" [attr.y1]=\"top\" [attr.y2]=\"height - bottom\" />\r\n <text class=\"mv2c-marklabel\" [attr.x]=\"mark.pos + 3\" [attr.y]=\"top + 9\">{{mark.label}}</text>\r\n }\r\n @for (p of paths; track p.key) {\r\n <path [attr.d]=\"p.d\" [attr.fill]=\"p.fill ? p.color : 'none'\" [attr.fill-opacity]=\"p.fill ? p.opacity : null\"\r\n [attr.stroke]=\"p.fill ? 'none' : p.color\" [attr.stroke-opacity]=\"p.fill ? null : p.opacity\" [attr.stroke-dasharray]=\"p.dash\" stroke-width=\"1.6\" stroke-linejoin=\"round\" />\r\n }\r\n @for (r of rects; track r.key) {\r\n <rect [attr.x]=\"r.x\" [attr.y]=\"r.y\" [attr.width]=\"r.w\" [attr.height]=\"r.h\" [attr.fill]=\"r.color\" fill-opacity=\"0.75\" />\r\n }\r\n @for (d of dots; track d.key) {\r\n <circle [attr.cx]=\"d.x\" [attr.cy]=\"d.y\" r=\"2\" [attr.fill]=\"d.color\" />\r\n }\r\n <line class=\"mv2c-axis\" [attr.x1]=\"left\" [attr.x2]=\"width - right\" [attr.y1]=\"height - bottom\" [attr.y2]=\"height - bottom\" />\r\n @if (cursorX != null) {\r\n <line class=\"mv2c-cursor\" [attr.x1]=\"cursorX\" [attr.x2]=\"cursorX\" [attr.y1]=\"top\" [attr.y2]=\"height - bottom\" />\r\n }\r\n @if (dragFrom != null && dragTo != null) {\r\n <rect class=\"mv2c-drag\" [attr.x]=\"min(dragFrom, dragTo)\" [attr.y]=\"top\" [attr.width]=\"abs(dragTo - dragFrom)\" [attr.height]=\"height - top - bottom\" />\r\n }\r\n </svg>\r\n @if (cursorX != null && tipRows.length > 0 && hovered) {\r\n <div class=\"mv2c-tip\" [style.left.px]=\"cursorX > width / 2 ? null : cursorX + 10\" [style.right.px]=\"cursorX > width / 2 ? width - cursorX + 10 : null\">\r\n <div class=\"mv2c-tip-time\">{{tipTime}}</div>\r\n @for (row of tipRows; track $index) {\r\n <div class=\"mv2c-tip-row\"><span class=\"mv2c-tip-dot\" [style.background]=\"row.color\"></span>{{row.label}} <strong>{{row.value}}</strong></div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n :host { display: block; position: relative; user-select: none; }\r\n .mv2c { position: relative; cursor: crosshair; }\r\n svg { display: block; overflow: visible; }\r\n .mv2c-grid { stroke: var(--p-content-border-color, #e2e8f0); stroke-dasharray: 2 3; }\r\n .mv2c-axis { stroke: var(--p-content-border-color, #cbd5e1); }\r\n .mv2c-ylabel { fill: var(--p-text-muted-color, #64748b); font-size: 10px; text-anchor: end; }\r\n .mv2c-xlabel { fill: var(--p-text-muted-color, #64748b); font-size: 10px; text-anchor: middle; }\r\n .mv2c-unit { fill: var(--p-text-muted-color, #64748b); font-size: 10px; }\r\n .mv2c-mark { stroke-width: 1; }\r\n .mv2c-mark-restart { stroke: #f59e0b; stroke-dasharray: 4 3; }\r\n .mv2c-mark-snapshot { stroke: var(--p-content-border-color, #e2e8f0); }\r\n .mv2c-marklabel { fill: var(--p-text-muted-color, #64748b); font-size: 9px; }\r\n .mv2c-cursor { stroke: var(--p-text-muted-color, #64748b); stroke-width: 1; }\r\n .mv2c-drag { fill: var(--p-primary-color, #6366f1); fill-opacity: .12; }\r\n .mv2c-tip { position: absolute; top: 4px; z-index: 3; min-width: 140px; max-width: 320px; padding: 6px 8px; border: 1px solid var(--p-content-border-color, #e2e8f0);\r\n border-radius: 6px; background: var(--p-content-background, #fff); box-shadow: 0 4px 14px rgba(15, 23, 42, .12); font-size: 11px; pointer-events: none; }\r\n .mv2c-tip-time { margin-bottom: 3px; color: var(--p-text-muted-color, #64748b); }\r\n .mv2c-tip-row { display: flex; align-items: center; gap: 5px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\r\n .mv2c-tip-row strong { margin-left: auto; padding-left: 8px; }\r\n .mv2c-tip-dot { flex: none; width: 8px; height: 8px; border-radius: 50%; }\r\n `],\r\n standalone: false\r\n})\r\nexport class MetricsV2ChartComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() series: Mv2Series[] = [];\r\n @Input() from: number;\r\n @Input() to: number;\r\n @Input() height: number = 170;\r\n @Input() unit: string;\r\n @Input() marks: Mv2Mark[] = [];\r\n @Input() cursor: number = null;\r\n @Input() format: (value: number) => string = t => String(t);\r\n\r\n @Output() cursorChange = new EventEmitter<number>();\r\n @Output() zoom = new EventEmitter<{ from: number, to: number }>();\r\n\r\n public width: number = 600;\r\n public readonly left = LEFT;\r\n public readonly right = RIGHT;\r\n public readonly top = TOP;\r\n public readonly bottom = BOTTOM;\r\n\r\n public paths: Mv2Path[] = [];\r\n public rects: Mv2Rect[] = [];\r\n public dots: Mv2Dot[] = [];\r\n public yTicks: Mv2Tick[] = [];\r\n public xTicks: Mv2Tick[] = [];\r\n public markTicks: Mv2MarkTick[] = [];\r\n // Il riquadro dei valori compare solo sul grafico sotto il mouse, la linea del cursore su tutti\r\n public hovered: boolean = false;\r\n public cursorX: number = null;\r\n public tipTime: string = \"\";\r\n public tipRows: Mv2TipRow[] = [];\r\n public dragFrom: number = null;\r\n public dragTo: number = null;\r\n\r\n private yMin = 0;\r\n private yMax = 1;\r\n private observer: ResizeObserver;\r\n\r\n constructor(private host: ElementRef<HTMLElement>, private zone: NgZone) { }\r\n\r\n ngOnInit() {\r\n this.observer = new ResizeObserver(entries => {\r\n let width = Math.floor(entries[0]?.contentRect?.width ?? 0);\r\n if (width > 0 && width != this.width)\r\n this.zone.run(() => {\r\n this.width = width;\r\n this.layout();\r\n });\r\n });\r\n this.observer.observe(this.host.nativeElement);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.observer?.disconnect();\r\n }\r\n\r\n ngOnChanges(changes: any) {\r\n if (changes.series || changes.from || changes.to || changes.height || changes.marks)\r\n this.layout();\r\n else if (changes.cursor)\r\n this.updateCursor();\r\n }\r\n\r\n min(a: number, b: number) { return Math.min(a, b); }\r\n abs(a: number) { return Math.abs(a); }\r\n\r\n // #region Geometria\r\n\r\n private get plotWidth(): number {\r\n return Math.max(10, this.width - LEFT - RIGHT);\r\n }\r\n\r\n private x(t: number): number {\r\n return LEFT + (t - this.from) / Math.max(1, this.to - this.from) * this.plotWidth;\r\n }\r\n\r\n private y(v: number): number {\r\n return TOP + (1 - (v - this.yMin) / Math.max(1e-12, this.yMax - this.yMin)) * (this.height - TOP - BOTTOM);\r\n }\r\n\r\n private timeAt(x: number): number {\r\n return this.from + (x - LEFT) / this.plotWidth * (this.to - this.from);\r\n }\r\n\r\n private layout() {\r\n if (this.from == null || this.to == null)\r\n return;\r\n\r\n // Scala verticale sui punti visibili, con lo zero se i valori sono positivi\r\n let values: number[] = [];\r\n for (let s of this.series ?? [])\r\n for (let p of s.points)\r\n if (p.t >= this.from && p.t <= this.to) {\r\n values.push(p.v);\r\n if (p.v2 != null)\r\n values.push(p.v2);\r\n }\r\n let lo = values.length ? Math.min(0, ...values) : 0;\r\n let hi = values.length ? Math.max(...values) : 1;\r\n if (hi <= lo)\r\n hi = lo + 1;\r\n let step = this.niceStep((hi - lo) / 4);\r\n this.yMin = Math.floor(lo / step) * step;\r\n this.yMax = Math.ceil(hi / step) * step;\r\n this.yTicks = [];\r\n for (let v = this.yMin; v <= this.yMax + step / 2; v += step)\r\n this.yTicks.push({ key: String(v), pos: this.y(v), label: this.format(Math.abs(v) < step / 1e6 ? 0 : v) });\r\n\r\n // Asse dei tempi: tacche a passi tondi, al massimo una ogni 90 pixel circa\r\n let span = this.to - this.from;\r\n let stepMs = STEPS_MS.find(t => span / t <= this.plotWidth / 90) ?? STEPS_MS[STEPS_MS.length - 1];\r\n let longRange = span > 36 * 3600 * 1000;\r\n let offset = new Date().getTimezoneOffset() * 60000;\r\n this.xTicks = [];\r\n for (let t = Math.ceil((this.from - offset) / stepMs) * stepMs + offset; t <= this.to; t += stepMs)\r\n this.xTicks.push({ key: String(t), pos: this.x(t), label: dayjs(t).format(longRange || stepMs >= 86400000 ? \"DD/MM HH:mm\" : \"HH:mm\") });\r\n\r\n // Segni: riavvii sempre, id degli snapshot solo se c'è spazio (altrimenti uno ogni tanto)\r\n let visible = (this.marks ?? []).filter(t => t.t >= this.from && t.t <= this.to);\r\n let snaps = visible.filter(t => t.kind == \"snapshot\");\r\n let every = Math.max(1, Math.ceil(snaps.length / Math.max(1, this.plotWidth / 45)));\r\n this.markTicks = visible.filter(t => t.kind == \"restart\" || snaps.indexOf(t) % every == 0)\r\n .map((t, i) => ({ key: `${t.kind}${t.t}${i}`, pos: this.x(t.t), label: t.label, kind: t.kind }));\r\n\r\n let paths: Mv2Path[] = [];\r\n let rects: Mv2Rect[] = [];\r\n let dots: Mv2Dot[] = [];\r\n let bars = (this.series ?? []).filter(t => t.kind == \"bars\");\r\n for (let s of this.series ?? []) {\r\n let points = s.points.filter(p => p.t >= this.from && p.t <= this.to);\r\n if (points.length == 0)\r\n continue;\r\n switch (s.kind) {\r\n case \"line\":\r\n case \"step\":\r\n paths.push({ key: s.key, d: this.linePath(points, s.kind == \"step\"), color: s.color, fill: false, dash: s.dash ?? null, opacity: s.opacity ?? 1 });\r\n // Un punto senza vicini (per esempio la durata di un timer con poche chiamate) come linea non si vedrebbe: diventa un pallino\r\n if ((s.opacity ?? 1) > 0)\r\n points.forEach((p, i) => {\r\n if ((i == 0 || p.gap) && (i == points.length - 1 || points[i + 1].gap))\r\n dots.push({ key: `${s.key}~${i}`, x: this.x(p.t), y: this.y(p.v), color: s.color });\r\n });\r\n break;\r\n case \"band\":\r\n paths.push({ key: s.key, d: this.bandPath(points), color: s.color, fill: true, dash: null, opacity: s.opacity ?? 0.2 });\r\n break;\r\n case \"dots\":\r\n points.forEach((p, i) => dots.push({ key: `${s.key}${i}`, x: this.x(p.t), y: this.y(p.v), color: s.color }));\r\n break;\r\n case \"bars\":\r\n let slot = this.plotWidth / Math.max(1, points.length) * 0.8;\r\n let w = Math.max(1, slot / bars.length);\r\n let index = bars.indexOf(s);\r\n let zero = this.y(Math.max(this.yMin, 0));\r\n points.forEach((p, i) => {\r\n let y = this.y(p.v);\r\n rects.push({ key: `${s.key}${i}`, x: this.x(p.t) - slot / 2 + index * w, y: Math.min(y, zero), w: w, h: Math.max(1, Math.abs(zero - y)), color: s.color });\r\n });\r\n break;\r\n }\r\n }\r\n this.paths = paths;\r\n this.rects = rects;\r\n this.dots = dots;\r\n this.updateCursor();\r\n }\r\n\r\n // Le linee si spezzano dove il punto ha gap: niente linea fra due campioni separati da un riavvio o da un buco\r\n private linePath(points: Mv2Point[], step: boolean): string {\r\n let d = \"\";\r\n points.forEach((p, i) => {\r\n let x = this.x(p.t).toFixed(1);\r\n let y = this.y(p.v).toFixed(1);\r\n if (i == 0 || p.gap)\r\n d += `M${x},${y}`;\r\n else if (step)\r\n d += `H${x}V${y}`;\r\n else\r\n d += `L${x},${y}`;\r\n });\r\n return d;\r\n }\r\n\r\n // Fascia fra v e v2, un poligono per ogni tratto senza interruzioni\r\n private bandPath(points: Mv2Point[]): string {\r\n let segments: Mv2Point[][] = [];\r\n for (let p of points) {\r\n if (p.v2 == null)\r\n continue;\r\n if (segments.length == 0 || p.gap)\r\n segments.push([]);\r\n segments[segments.length - 1].push(p);\r\n }\r\n return segments.filter(t => t.length > 0).map(seg => {\r\n let upper = seg.map((p, i) => `${i ? \"L\" : \"M\"}${this.x(p.t).toFixed(1)},${this.y(p.v2).toFixed(1)}`).join(\"\");\r\n let lower = [...seg].reverse().map(p => `L${this.x(p.t).toFixed(1)},${this.y(p.v).toFixed(1)}`).join(\"\");\r\n return upper + lower + \"Z\";\r\n }).join(\"\");\r\n }\r\n\r\n private niceStep(raw: number): number {\r\n if (!(raw > 0))\r\n return 1;\r\n let power = Math.pow(10, Math.floor(Math.log10(raw)));\r\n return [1, 2, 2.5, 5, 10].find(t => raw / power <= t + 1e-9) * power;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Cursore e zoom\r\n\r\n private updateCursor() {\r\n if (this.cursor == null || this.cursor < this.from || this.cursor > this.to) {\r\n this.cursorX = null;\r\n this.tipRows = [];\r\n return;\r\n }\r\n this.cursorX = this.x(this.cursor);\r\n this.tipTime = dayjs(this.cursor).format(\"DD/MM HH:mm:ss\");\r\n let rows: Mv2TipRow[] = [];\r\n for (let s of this.series ?? []) {\r\n if (s.tooltip === false || s.points.length == 0)\r\n continue;\r\n let nearest = this.nearest(s.points, this.cursor);\r\n if (nearest)\r\n rows.push({ color: s.color, label: s.label, value: this.format(nearest.v) });\r\n }\r\n this.tipRows = rows;\r\n }\r\n\r\n // Il campione più vicino, se non è più lontano di un intervallo tipico della serie\r\n private nearest(points: Mv2Point[], t: number): Mv2Point {\r\n let best: Mv2Point = null;\r\n for (let p of points)\r\n if (!best || Math.abs(p.t - t) < Math.abs(best.t - t))\r\n best = p;\r\n let typical = points.length > 1 ? (points[points.length - 1].t - points[0].t) / (points.length - 1) : Infinity;\r\n return best && Math.abs(best.t - t) <= Math.max(typical, 1000) ? best : null;\r\n }\r\n\r\n private plotX(event: MouseEvent): number {\r\n let rect = this.host.nativeElement.getBoundingClientRect();\r\n return Math.min(this.width - RIGHT, Math.max(LEFT, event.clientX - rect.left));\r\n }\r\n\r\n move(event: MouseEvent) {\r\n let x = this.plotX(event);\r\n this.hovered = true;\r\n if (this.dragFrom != null)\r\n this.dragTo = x;\r\n this.cursorChange.emit(this.timeAt(x));\r\n }\r\n\r\n leave() {\r\n this.hovered = false;\r\n this.dragFrom = null;\r\n this.dragTo = null;\r\n this.cursorChange.emit(null);\r\n }\r\n\r\n // Trascinando sull'area si sceglie la finestra dello zoom, per tutti i pannelli\r\n down(event: MouseEvent) {\r\n if (event.button != 0)\r\n return;\r\n event.preventDefault();\r\n this.dragFrom = this.plotX(event);\r\n this.dragTo = null;\r\n }\r\n\r\n up(event: MouseEvent) {\r\n let from = this.dragFrom;\r\n let to = this.plotX(event);\r\n this.dragFrom = null;\r\n this.dragTo = null;\r\n if (from != null && Math.abs(to - from) > 6)\r\n this.zoom.emit({ from: this.timeAt(Math.min(from, to)), to: this.timeAt(Math.max(from, to)) });\r\n }\r\n\r\n // #endregion\r\n}\r\n","// Angular\r\nimport { formatNumber } from \"@angular/common\";\r\nimport { Component } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { DateService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { firstValueFrom } from \"rxjs\";\r\n\r\n// Modelli\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { MetricsV2Info, MetricsV2Request, MetricsV2Sample, MetricV2Type } from \"../../models/components/MetricsV2\";\r\nimport { WorkloadSnapshot, WorkloadSnapshotsRequest } from \"../../models/components/WorkloadReportV2\";\r\nimport { Mv2Mark, Mv2Point, Mv2Series } from \"./metrics_v2_chart.component\";\r\n\r\n// Applicazione\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\n\r\n// Localizzazione\r\nimport { AdmMetricsV2Loc } from \"./metrics_v2.component.loc\";\r\n\r\ndeclare var dayjs;\r\n\r\nconst STORAGE_KEY = \"HotSearchMetricsV2\";\r\nconst MAX_METRICS = 12;\r\n// Ogni istanza campiona ogni 15 secondi: più spesso i campioni non cambiano (M19)\r\nconst REFRESH_MS = 15000;\r\nconst SELECTION_DELAY_MS = 350;\r\nconst DATES_DELAY_MS = 600;\r\nconst TABLE_ROWS = 300;\r\nconst INSTANCE_COLORS = [\"#1e88e5\", \"#e53935\", \"#43a047\", \"#fb8c00\", \"#8e24aa\", \"#00897b\", \"#6d4c41\", \"#3949ab\", \"#c0ca33\", \"#d81b60\"];\r\nconst ITEM_COLORS = [\"#3949ab\", \"#00897b\", \"#f4511e\", \"#8e24aa\", \"#7cb342\", \"#fdd835\", \"#6d4c41\", \"#039be5\", \"#d81b60\", \"#546e7a\"];\r\n// \"Active threads time\" è un meter in microsecondi di thread attivi: il suo rate al secondo diviso un milione è il numero medio di thread attivi\r\nconst ACTIVE_THREADS_TIME = \"Active threads time\";\r\nconst CPU_USAGE = \"CPU Usage\";\r\n\r\ntype Source = \"live\" | \"period\" | \"snap\";\r\n\r\n// flatMap non c'è nel lib di compilazione della libreria\r\nconst flatten = <T, U>(list: T[], map: (t: T) => U[]): U[] => list.reduce((all, t) => all.concat(map(t)), [] as U[]);\r\n\r\nconst PRESETS: [string, string[]][] = [\r\n [\"Processo\", [\"CPU Usage\", \"Working set\", \"Private memory\", \"Thread Pool Queue Length\"]],\r\n [\"API\", [\"API Call\", \"Requests\", \"400 Errors\", \"500 Errors\"]],\r\n [\"Code asincrone\", null],\r\n [\"Attività\", [\"Active sessions\", \"Active threads\", ACTIVE_THREADS_TIME]]\r\n];\r\n\r\nexport class Mv2CatalogEntry {\r\n info: MetricsV2Info;\r\n // Voci del totale (\"{totale} - {elemento}\")\r\n items: MetricsV2Info[];\r\n open: boolean;\r\n}\r\n\r\nexport class Mv2CatalogGroup {\r\n type: MetricV2Type;\r\n label: string;\r\n entries: Mv2CatalogEntry[];\r\n count: number;\r\n}\r\n\r\nexport class Mv2Chart {\r\n key: string;\r\n series: Mv2Series[];\r\n unit: string;\r\n height: number;\r\n}\r\n\r\nexport class Mv2Panel {\r\n info: MetricsV2Info;\r\n alts: KeyValue[];\r\n alt: string;\r\n charts: Mv2Chart[];\r\n empty: boolean;\r\n}\r\n\r\nexport class Mv2TileRow {\r\n instance: string;\r\n color: string;\r\n value: string;\r\n extra: string;\r\n}\r\n\r\nexport class Mv2Tile {\r\n info: MetricsV2Info;\r\n rows: Mv2TileRow[];\r\n sparks: { d: string, color: string }[];\r\n time: string;\r\n}\r\n\r\nexport class Mv2Column {\r\n key: string;\r\n label: string;\r\n num: boolean;\r\n}\r\n\r\nexport class Mv2TableSection {\r\n info: MetricsV2Info;\r\n columns: Mv2Column[];\r\n rows: { [key: string]: any }[];\r\n total: number;\r\n sortKey: string;\r\n sortDesc: boolean;\r\n}\r\n\r\n// Ricordate fra una visita e l'altra (M11)\r\nclass MetricsV2Settings {\r\n selected: string[];\r\n source: Source;\r\n instances: string[];\r\n liveMinutes: string;\r\n view: string;\r\n}\r\n\r\n@Component({\r\n selector: \"metrics_v2\",\r\n providers: [{ provide: LocalizationService, useClass: AdmMetricsV2Loc }],\r\n templateUrl: \"./metrics_v2.component.html\",\r\n styleUrls: [\"./metrics_v2.component.scss\"],\r\n standalone: false\r\n})\r\nexport class AdmMetricsV2Component {\r\n public readonly Max = MAX_METRICS;\r\n public readonly Type = MetricV2Type;\r\n\r\n // Comandi\r\n public source: Source = \"live\";\r\n public liveMinutes: string = \"30\";\r\n public filterfrom: string = \"\";\r\n public filterto: string = \"\";\r\n public snapFromId: string = \"\";\r\n public snapToId: string = \"\";\r\n // Vuoto = tutto il cluster\r\n public instances: string[] = [];\r\n public view: string = \"charts\";\r\n public paused: boolean = false;\r\n public lastUpdate: Date;\r\n\r\n // Catalogo e selezione\r\n public catalog: MetricsV2Info[] = [];\r\n public groups: Mv2CatalogGroup[] = [];\r\n public search: string = \"\";\r\n public selected: string[] = [];\r\n public catalogLoading: boolean = false;\r\n public catalogError: string;\r\n\r\n // Snapshot\r\n public snapshots: WorkloadSnapshot[] = [];\r\n public historyAvailable: boolean = true;\r\n public snapshotsLoaded: boolean = false;\r\n public SnapshotOptions: KeyValue[] = [];\r\n public warnings: string[] = [];\r\n\r\n // Dati\r\n public dataLoading: boolean = false;\r\n public dataError: string;\r\n public panels: Mv2Panel[] = [];\r\n public tiles: Mv2Tile[] = [];\r\n public tables: Mv2TableSection[] = [];\r\n public marks: Mv2Mark[] = [];\r\n public legend: { instance: string, color: string, hidden: boolean }[] = [];\r\n public domainFrom: number;\r\n public domainTo: number;\r\n public viewFrom: number = null;\r\n public viewTo: number = null;\r\n public cursor: number = null;\r\n\r\n public Sources: KeyValue[] = [];\r\n public LiveWindows: KeyValue[] = [];\r\n public Views: KeyValue[] = [];\r\n public Instances: KeyValue[] = [];\r\n public readonly Presets = PRESETS.map(t => t[0]);\r\n\r\n private be: string;\r\n private data: Map<string, Map<string, MetricsV2Sample[]>> = new Map();\r\n private seen: Set<string> = new Set();\r\n private hidden: Set<string> = new Set();\r\n private alts: { [name: string]: string } = {};\r\n private dataGeneration: number = 0;\r\n private catalogGeneration: number = 0;\r\n private refreshTimer: any;\r\n private selectionTimer: any;\r\n private datesTimer: any;\r\n private readonly visibilityHandler = () => this.visibilityChanged();\r\n public readonly format = (value: number) => this.number(value);\r\n\r\n constructor(\r\n public dateExts: DateService,\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.Sources = [new KeyValue(\"live\", \"Live\"), new KeyValue(\"period\", this.lc.loc(\"Storico per periodo\")), new KeyValue(\"snap\", this.lc.loc(\"Storico per snapshot\"))];\r\n this.LiveWindows = [new KeyValue(\"15\", \"15 min\"), new KeyValue(\"30\", \"30 min\"), new KeyValue(\"60\", this.lc.loc(\"1 ora\"))];\r\n this.Views = [new KeyValue(\"charts\", this.lc.loc(\"Grafici\")), new KeyValue(\"table\", this.lc.loc(\"Tabella\"))];\r\n\r\n let saved = this.route.snapshot.queryParams[\"ignoreStorage\"] ? null : await firstValueFrom(this.localStorage.getItem<MetricsV2Settings>(STORAGE_KEY), { defaultValue: null });\r\n if (saved) {\r\n this.selected = (saved.selected ?? []).slice(0, MAX_METRICS);\r\n this.source = saved.source ?? this.source;\r\n this.instances = saved.instances ?? this.instances;\r\n this.liveMinutes = saved.liveMinutes ?? this.liveMinutes;\r\n this.view = saved.view ?? this.view;\r\n }\r\n this.setLastDay();\r\n\r\n this.adms.getInstances(this.be).then(t => {\r\n this.Instances = t ?? [];\r\n this.rebuild();\r\n });\r\n this.loadSnapshots();\r\n await this.loadCatalog();\r\n this.loadData();\r\n\r\n this.refreshTimer = setInterval(() => this.refresh(), REFRESH_MS);\r\n document.addEventListener(\"visibilitychange\", this.visibilityHandler);\r\n }\r\n\r\n ngOnDestroy() {\r\n clearInterval(this.refreshTimer);\r\n clearTimeout(this.selectionTimer);\r\n clearTimeout(this.datesTimer);\r\n document.removeEventListener(\"visibilitychange\", this.visibilityHandler);\r\n }\r\n\r\n // #region Comandi\r\n\r\n get clusterLabel(): string {\r\n return this.Instances.length ? `${this.lc.loc(\"Tutto il cluster\")} (${this.Instances.length} ${this.Instances.length == 1 ? this.lc.loc(\"istanza\") : this.lc.loc(\"istanze\")})` : this.lc.loc(\"Tutto il cluster\");\r\n }\r\n\r\n get zone(): string {\r\n return `UTC${dayjs().format(\"Z\")}`;\r\n }\r\n\r\n setSource(id: string) {\r\n if (id != \"live\" && !this.historyAvailable)\r\n return;\r\n this.source = id as Source;\r\n if (this.source == \"snap\")\r\n this.defaultSnapshots();\r\n this.updateWarnings();\r\n this.saveSettings();\r\n this.loadData();\r\n }\r\n\r\n setLiveMinutes(id: string) {\r\n this.liveMinutes = id;\r\n this.saveSettings();\r\n this.loadData();\r\n }\r\n\r\n datesChanged() {\r\n clearTimeout(this.datesTimer);\r\n this.datesTimer = setTimeout(() => {\r\n if (this.toDate(this.filterfrom) && this.toDate(this.filterto))\r\n this.loadData();\r\n }, DATES_DELAY_MS);\r\n }\r\n\r\n snapshotsChanged() {\r\n this.updateWarnings();\r\n this.loadData();\r\n }\r\n\r\n // Cambiando istanze si ricaricano catalogo, snapshot e dati; le metriche che il catalogo non ha più si tolgono\r\n async instancesChanged(ids: string[]) {\r\n this.instances = ids ?? [];\r\n this.saveSettings();\r\n this.loadSnapshots();\r\n await this.loadCatalog();\r\n this.loadData();\r\n }\r\n\r\n setView(id: string) {\r\n this.view = id;\r\n this.saveSettings();\r\n }\r\n\r\n togglePause() {\r\n this.paused = !this.paused;\r\n if (!this.paused)\r\n this.refresh();\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Catalogo e selezione\r\n\r\n private async loadCatalog() {\r\n let generation = ++this.catalogGeneration;\r\n this.catalogLoading = true;\r\n this.catalogError = null;\r\n try {\r\n let req = this.instances.length ? { instanceIds: this.instances } : { global: true };\r\n let res = await this.adms.getMetricsCatalogV2(this.be, req);\r\n if (generation != this.catalogGeneration)\r\n return;\r\n this.catalog = res ?? [];\r\n let names = new Set(this.catalog.map(t => t.name));\r\n let kept = this.selected.filter(t => names.has(t));\r\n if (kept.length != this.selected.length) {\r\n this.selected = kept;\r\n this.saveSettings();\r\n }\r\n this.buildGroups();\r\n }\r\n catch (err) {\r\n if (generation == this.catalogGeneration)\r\n this.catalogError = this.errorMessage(err);\r\n }\r\n finally {\r\n if (generation == this.catalogGeneration)\r\n this.catalogLoading = false;\r\n }\r\n }\r\n\r\n // Gruppi per tipo; le voci di un totale stanno sotto il totale, chiuse (M10)\r\n buildGroups() {\r\n let text = (this.search ?? \"\").trim().toLowerCase();\r\n let matches = (info: MetricsV2Info) => !text || info.name.toLowerCase().includes(text);\r\n let parentOf = (info: MetricsV2Info) => this.catalog.filter(t => t != info && info.name.startsWith(t.name + \" - \")).sort((a, b) => b.name.length - a.name.length)[0];\r\n let opened = new Set(flatten(this.groups, g => g.entries.filter(e => e.open).map(e => e.info.name)));\r\n\r\n let types = [MetricV2Type.Gauge, MetricV2Type.Counter, MetricV2Type.Meter, MetricV2Type.Histogram, MetricV2Type.Timer];\r\n this.groups = types.map(type => {\r\n let infos = this.catalog.filter(t => t.metricType == type);\r\n let entries = infos.filter(t => !parentOf(t)).map(info => {\r\n let items = infos.filter(t => parentOf(t) == info);\r\n return { info: info, items: items.filter(t => matches(t) || matches(info)), open: opened.has(info.name) || (!!text && items.some(matches)) };\r\n }).filter(t => matches(t.info) || t.items.length > 0);\r\n return { type: type, label: MetricV2Type[type], entries: entries, count: infos.length };\r\n }).filter(t => t.entries.length > 0);\r\n }\r\n\r\n isSelected(name: string): boolean {\r\n return this.selected.includes(name);\r\n }\r\n\r\n canSelect(name: string): boolean {\r\n return this.isSelected(name) || this.selected.length < MAX_METRICS;\r\n }\r\n\r\n toggleMetric(name: string) {\r\n if (this.isSelected(name))\r\n this.selected = this.selected.filter(t => t != name);\r\n else if (this.selected.length < MAX_METRICS)\r\n this.selected = [...this.selected, name];\r\n this.selectionChanged();\r\n }\r\n\r\n addItems(entry: Mv2CatalogEntry) {\r\n let missing = [entry.info, ...entry.items].map(t => t.name).filter(t => !this.isSelected(t));\r\n this.selected = [...this.selected, ...missing].slice(0, MAX_METRICS);\r\n entry.open = true;\r\n this.selectionChanged();\r\n }\r\n\r\n clearSelection() {\r\n this.selected = [];\r\n this.selectionChanged();\r\n }\r\n\r\n // Insiemi pronti (M9): le metriche che il catalogo non ha si ignorano\r\n applyPreset(name: string) {\r\n let preset = PRESETS.find(t => t[0] == name);\r\n let names = preset[1] ?? this.catalog.filter(t => t.name.startsWith(\"AQ - \") && !this.catalog.some(k => k != t && t.name.startsWith(k.name + \" - \"))).map(t => t.name);\r\n let available = new Set(this.catalog.map(t => t.name));\r\n this.selected = names.filter(t => available.has(t)).slice(0, MAX_METRICS);\r\n this.selectionChanged();\r\n }\r\n\r\n removeMetric(name: string) {\r\n this.selected = this.selected.filter(t => t != name);\r\n this.selectionChanged();\r\n }\r\n\r\n // Più clic di seguito diventano una sola richiesta\r\n private selectionChanged() {\r\n this.saveSettings();\r\n clearTimeout(this.selectionTimer);\r\n this.selectionTimer = setTimeout(() => this.loadData(), SELECTION_DELAY_MS);\r\n }\r\n\r\n catalogUnit(info: MetricsV2Info): string {\r\n if (info.name == CPU_USAGE)\r\n return \"CPU\";\r\n let unit = info.unit || \"\";\r\n if (info.metricType == MetricV2Type.Timer && info.durationUnit)\r\n return [unit, this.durationLabel(info.durationUnit)].filter(t => t).join(\" · \");\r\n return unit;\r\n }\r\n\r\n addItemsLabel(entry: Mv2CatalogEntry): string {\r\n return this.lc.loc(\"Aggiungi le {N} voci\").replace(\"{N}\", String(entry.items.length));\r\n }\r\n\r\n emptyLabel(name: string): string {\r\n return this.lc.loc(\"Nessun campione di {metrica} nella finestra scelta\").replace(\"{metrica}\", name);\r\n }\r\n\r\n // \"2 di 3\" se la metrica non c'è su tutte le istanze\r\n instancesLabel(info: MetricsV2Info): string {\r\n let total = this.instances.length || this.Instances.length;\r\n return total && info.instances?.length < total ? `${info.instances.length} ${this.lc.loc(\"di\")} ${total}` : \"\";\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Snapshot\r\n\r\n private async loadSnapshots() {\r\n try {\r\n let req = new WorkloadSnapshotsRequest();\r\n req.from = new Date(Date.now() - 7 * 24 * 3600 * 1000).toISOString();\r\n if (this.instances.length)\r\n req.instanceIds = this.instances;\r\n let res = await this.adms.getWorkloadSnapshots(this.be, req);\r\n this.historyAvailable = res?.historyAvailable ?? false;\r\n this.snapshots = res?.snapshots ?? [];\r\n }\r\n catch {\r\n // Senza elenco degli snapshot resta il live: le sorgenti storiche restano disponibili per periodo\r\n this.snapshots = [];\r\n }\r\n this.snapshotsLoaded = true;\r\n this.SnapshotOptions = this.snapshots.map(t => new KeyValue(String(t.snapId), `${t.snapId} · ${this.local(t.endIntervalTime)}${t.restart ? \" ⟲\" : \"\"}${t.manual ? \" ✋\" : \"\"}`));\r\n if (!this.historyAvailable && this.source != \"live\") {\r\n this.source = \"live\";\r\n this.loadData();\r\n }\r\n let ids = new Set(this.snapshots.map(t => String(t.snapId)));\r\n if (!ids.has(this.snapFromId) || !ids.has(this.snapToId))\r\n this.defaultSnapshots();\r\n this.updateWarnings();\r\n }\r\n\r\n // Di default le ultime 12 ore di snapshot\r\n private defaultSnapshots() {\r\n if (this.snapshots.length == 0 || (this.snapFromId && this.snapToId && this.snapshots.some(t => String(t.snapId) == this.snapFromId)))\r\n return;\r\n this.snapToId = String(this.snapshots[0].snapId);\r\n this.snapFromId = String(this.snapshots[Math.min(11, this.snapshots.length - 1)].snapId);\r\n }\r\n\r\n get snapshotWindow(): { from: Date, to: Date } {\r\n let ids = [+this.snapFromId, +this.snapToId];\r\n let first = this.snapshots.find(t => t.snapId == Math.min(...ids));\r\n let last = this.snapshots.find(t => t.snapId == Math.max(...ids));\r\n return first && last ? { from: this.parseUtc(first.beginIntervalTime), to: this.parseUtc(last.endIntervalTime) } : null;\r\n }\r\n\r\n // M4: un riavvio fra i due snapshot interrompe le serie\r\n private updateWarnings() {\r\n let warnings: string[] = [];\r\n if (this.source == \"snap\" && this.snapFromId && this.snapToId) {\r\n let lo = Math.min(+this.snapFromId, +this.snapToId);\r\n let hi = Math.max(+this.snapFromId, +this.snapToId);\r\n this.snapshots.forEach((s, i) => {\r\n if (s.restart && s.snapId > lo && s.snapId <= hi) {\r\n let previous = this.snapshots[i + 1];\r\n let restarted = (s.instances ?? []).filter(t => {\r\n let before = previous?.instances?.find(k => k.instanceId == t.instanceId);\r\n return before ? before.startupTime != t.startupTime : true;\r\n }).map(t => t.instanceId);\r\n for (let instance of restarted)\r\n warnings.push(this.lc.loc(\"Lo snapshot {id} segue un riavvio di {istanza}: lì le serie si interrompono.\").replace(\"{id}\", String(s.snapId)).replace(\"{istanza}\", instance));\r\n }\r\n });\r\n }\r\n this.warnings = warnings;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Dati\r\n\r\n private request(): MetricsV2Request {\r\n let req = new MetricsV2Request();\r\n req.metricNames = [...this.selected];\r\n // Mai global=false senza istanze (M6)\r\n if (this.instances.length)\r\n req.instanceIds = [...this.instances];\r\n else\r\n req.global = true;\r\n\r\n if (this.source == \"live\") {\r\n req.realTime = true;\r\n req.snapFrom = new Date(Date.now() - +this.liveMinutes * 60000).toISOString();\r\n }\r\n else if (this.source == \"period\") {\r\n req.realTime = false;\r\n req.snapFrom = this.toDate(this.filterfrom)?.toISOString();\r\n req.snapTo = this.toDate(this.filterto)?.toISOString();\r\n }\r\n else {\r\n req.realTime = false;\r\n req.snapIdFrom = Math.min(+this.snapFromId, +this.snapToId);\r\n req.snapIdTo = Math.max(+this.snapFromId, +this.snapToId);\r\n }\r\n return req;\r\n }\r\n\r\n // Caricamento completo della finestra scelta; senza metriche scelte non parte nessuna chiamata (M8)\r\n async loadData() {\r\n let generation = ++this.dataGeneration;\r\n clearTimeout(this.selectionTimer);\r\n this.viewFrom = null;\r\n this.viewTo = null;\r\n this.dataError = null;\r\n\r\n if (this.selected.length == 0 || (this.source == \"snap\" && (!this.snapFromId || !this.snapToId))) {\r\n this.data = new Map();\r\n this.seen = new Set();\r\n this.rebuild();\r\n return;\r\n }\r\n\r\n let req = this.request();\r\n this.setDomain(req);\r\n this.dataLoading = true;\r\n try {\r\n let res = await this.adms.getMetricsV2(this.be, req);\r\n if (generation != this.dataGeneration)\r\n return;\r\n this.data = new Map();\r\n this.seen = new Set();\r\n this.merge(res ?? []);\r\n this.lastUpdate = new Date();\r\n this.rebuild();\r\n }\r\n catch (err) {\r\n if (generation == this.dataGeneration) {\r\n this.dataError = this.errorMessage(err);\r\n this.data = new Map();\r\n this.rebuild();\r\n }\r\n }\r\n finally {\r\n if (generation == this.dataGeneration)\r\n this.dataLoading = false;\r\n }\r\n }\r\n\r\n // M19: solo i campioni nuovi, da quello più vecchio fra gli ultimi delle istanze in pagina; sullo storico niente aggiornamento\r\n private async refresh() {\r\n if (this.source != \"live\" || this.paused || document.hidden || this.dataLoading || this.selected.length == 0)\r\n return;\r\n\r\n let lastByInstance = new Map<string, number>();\r\n this.data.forEach(byInstance => byInstance.forEach((list, instance) => {\r\n let last = list.length ? this.time(list[list.length - 1]) : null;\r\n if (last != null)\r\n lastByInstance.set(instance, Math.max(lastByInstance.get(instance) ?? 0, last));\r\n }));\r\n if (lastByInstance.size == 0)\r\n return this.loadData();\r\n\r\n let generation = this.dataGeneration;\r\n let req = this.request();\r\n req.snapFrom = new Date(Math.min(...lastByInstance.values())).toISOString();\r\n try {\r\n let res = await this.adms.getMetricsV2(this.be, req);\r\n if (generation != this.dataGeneration)\r\n return;\r\n this.merge(res ?? []);\r\n this.setDomain(this.request());\r\n // Fuori dalla finestra live si scartano\r\n this.data.forEach(byInstance => byInstance.forEach((list, instance) => byInstance.set(instance, list.filter(t => this.time(t) >= this.domainFrom))));\r\n this.lastUpdate = new Date();\r\n this.rebuild();\r\n }\r\n catch {\r\n // Un aggiornamento mancato si recupera al giro dopo\r\n }\r\n }\r\n\r\n // Nella fusione si tiene la versione già in pagina dei campioni ripetuti, che ha le differenze (chiave istanza, metrica, istante)\r\n private merge(samples: MetricsV2Sample[]) {\r\n for (let s of samples) {\r\n let key = `${s.instanceId}|${s.name}|${s.sampleTime}`;\r\n if (this.seen.has(key))\r\n continue;\r\n this.seen.add(key);\r\n if (!this.data.has(s.name))\r\n this.data.set(s.name, new Map());\r\n let byInstance = this.data.get(s.name);\r\n let instance = s.instanceId ?? \"\";\r\n if (!byInstance.has(instance))\r\n byInstance.set(instance, []);\r\n byInstance.get(instance).push(s);\r\n }\r\n this.data.forEach(byInstance => byInstance.forEach(list => list.sort((a, b) => this.time(a) - this.time(b))));\r\n }\r\n\r\n private setDomain(req: MetricsV2Request) {\r\n if (this.source == \"live\") {\r\n this.domainTo = Date.now();\r\n this.domainFrom = this.domainTo - +this.liveMinutes * 60000;\r\n }\r\n else if (this.source == \"period\") {\r\n this.domainFrom = new Date(req.snapFrom ?? Date.now() - 24 * 3600 * 1000).getTime();\r\n this.domainTo = new Date(req.snapTo ?? Date.now()).getTime();\r\n }\r\n else {\r\n let window = this.snapshotWindow;\r\n this.domainFrom = window?.from?.getTime() ?? Date.now() - 12 * 3600 * 1000;\r\n // I campioni sono alla fine degli snapshot (ogni istanza con i suoi secondi)\r\n this.domainTo = (window?.to?.getTime() ?? Date.now()) + 60000;\r\n }\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Grafici, tessere e tabella\r\n\r\n get chartFrom(): number { return this.viewFrom ?? this.domainFrom; }\r\n get chartTo(): number { return this.viewTo ?? this.domainTo; }\r\n\r\n zoomTo(range: { from: number, to: number }) {\r\n this.viewFrom = range.from;\r\n this.viewTo = range.to;\r\n }\r\n\r\n resetZoom() {\r\n this.viewFrom = null;\r\n this.viewTo = null;\r\n }\r\n\r\n toggleInstance(instance: string) {\r\n if (this.hidden.has(instance))\r\n this.hidden.delete(instance);\r\n else\r\n this.hidden.add(instance);\r\n this.rebuild();\r\n }\r\n\r\n setAlt(panel: Mv2Panel, alt: string) {\r\n this.alts[panel.info.name] = alt;\r\n this.rebuild();\r\n }\r\n\r\n info(name: string): MetricsV2Info {\r\n return this.catalog.find(t => t.name == name) ?? { name: name, metricType: MetricV2Type.Gauge, unit: \"\", rateUnit: null, durationUnit: null, instances: [] };\r\n }\r\n\r\n // Colore fisso per istanza, lo stesso in tutti i pannelli\r\n color(instance: string): string {\r\n let all = [...new Set([...this.Instances.map(t => t.id), ...flatten(this.catalog, t => t.instances ?? [])])].sort();\r\n let index = all.indexOf(instance);\r\n return INSTANCE_COLORS[(index >= 0 ? index : all.length) % INSTANCE_COLORS.length];\r\n }\r\n\r\n private rebuild() {\r\n let instances = new Set<string>();\r\n this.data.forEach(byInstance => byInstance.forEach((_, instance) => instances.add(instance)));\r\n this.legend = [...instances].sort().map(t => ({ instance: t, color: this.color(t), hidden: this.hidden.has(t) }));\r\n this.marks = this.buildMarks();\r\n this.panels = this.selected.map(name => this.buildPanel(this.info(name)));\r\n this.tiles = this.selected.map(name => this.buildTile(this.info(name)));\r\n this.tables = this.selected.map(name => this.buildTable(this.info(name), this.tables.find(t => t.info.name == name)));\r\n }\r\n\r\n private visibleSeries(name: string): [string, MetricsV2Sample[]][] {\r\n let byInstance = this.data.get(name);\r\n return byInstance ? [...byInstance.entries()].filter(t => !this.hidden.has(t[0]) && t[1].length > 0).sort((a, b) => a[0].localeCompare(b[0])) : [];\r\n }\r\n\r\n // M14: riavvii (un campione senza intervallo che non è il primo della serie) e, sullo storico per snapshot, gli id degli snapshot\r\n private buildMarks(): Mv2Mark[] {\r\n let marks: Mv2Mark[] = [];\r\n let seen = new Set<string>();\r\n this.data.forEach(byInstance => byInstance.forEach((list, instance) => list.forEach((s, i) => {\r\n if (i > 0 && s.intervalSeconds == null) {\r\n let t = this.time(s);\r\n let key = `${instance}|${Math.round(t / 60000)}`;\r\n if (!seen.has(key)) {\r\n seen.add(key);\r\n marks.push({ t: t, label: this.lc.loc(\"riavvio\"), kind: \"restart\" });\r\n }\r\n }\r\n })));\r\n if (this.source == \"snap\") {\r\n let bySnap = new Map<number, number>();\r\n this.data.forEach(byInstance => byInstance.forEach(list => list.forEach(s => {\r\n if (s.snapId != null && !bySnap.has(s.snapId))\r\n bySnap.set(s.snapId, this.time(s));\r\n })));\r\n [...bySnap.entries()].sort((a, b) => a[1] - b[1]).forEach(([id, t]) => marks.push({ t: t, label: String(id), kind: \"snapshot\" }));\r\n }\r\n return marks;\r\n }\r\n\r\n // Punti di una serie: si salta dove il valore manca e si interrompe la linea a un riavvio o se fra due campioni passa più del doppio dell'intervallo tipico\r\n private points(list: MetricsV2Sample[], value: (s: MetricsV2Sample) => number, upper?: (s: MetricsV2Sample) => number): Mv2Point[] {\r\n let times = list.map(t => this.time(t));\r\n let gaps = times.slice(1).map((t, i) => t - times[i]).sort((a, b) => a - b);\r\n let typical = gaps.length ? gaps[Math.floor(gaps.length / 2)] : 0;\r\n let out: Mv2Point[] = [];\r\n let pendingGap = false;\r\n list.forEach((s, i) => {\r\n let v = value(s);\r\n let gap = i > 0 && (s.intervalSeconds == null || (typical > 0 && times[i] - times[i - 1] > 2 * typical));\r\n if (v == null || isNaN(v)) {\r\n pendingGap = true;\r\n return;\r\n }\r\n out.push({ t: times[i], v: v, v2: upper ? upper(s) : undefined, gap: gap || pendingGap });\r\n pendingGap = false;\r\n });\r\n return out;\r\n }\r\n\r\n // Valore principale per tipo (tessere e grafico di default)\r\n private main(info: MetricsV2Info, s: MetricsV2Sample): number {\r\n switch (info.metricType) {\r\n case MetricV2Type.Gauge: return s.value;\r\n case MetricV2Type.Counter: return s.count;\r\n case MetricV2Type.Meter: return info.name == ACTIVE_THREADS_TIME ? (s.ratePerSecond == null ? null : s.ratePerSecond / 1000000) : s.ratePerSecond;\r\n case MetricV2Type.Histogram: return s.median;\r\n case MetricV2Type.Timer: return s.intervalMean;\r\n }\r\n return s.value;\r\n }\r\n\r\n mainUnit(info: MetricsV2Info): string {\r\n switch (info.metricType) {\r\n case MetricV2Type.Gauge: return info.name == CPU_USAGE ? \"CPU\" : info.unit || \"\";\r\n case MetricV2Type.Counter: return info.unit || \"\";\r\n case MetricV2Type.Meter: return info.name == ACTIVE_THREADS_TIME ? this.lc.loc(\"thread\") : `${info.unit || \"\"}/s`;\r\n case MetricV2Type.Histogram: return info.unit || \"\";\r\n case MetricV2Type.Timer: return this.durationLabel(info.durationUnit);\r\n }\r\n return info.unit || \"\";\r\n }\r\n\r\n private buildPanel(info: MetricsV2Info): Mv2Panel {\r\n let series = this.visibleSeries(info.name);\r\n let items = this.itemsOf(info);\r\n let alts: KeyValue[] = [];\r\n switch (info.metricType) {\r\n case MetricV2Type.Counter:\r\n alts = [new KeyValue(\"level\", this.lc.loc(\"Livello\")), new KeyValue(\"delta\", this.lc.loc(\"Variazione\"))];\r\n if (items.length) {\r\n alts.push(new KeyValue(\"items\", this.lc.loc(\"Voci\")));\r\n if (this.source == \"live\")\r\n alts.push(new KeyValue(\"share\", this.lc.loc(\"Quote\")));\r\n }\r\n break;\r\n case MetricV2Type.Meter:\r\n alts = [new KeyValue(\"rate\", this.lc.loc(\"Al secondo\")), new KeyValue(\"moving\", this.lc.loc(\"Rate mobili\"))];\r\n if (items.length)\r\n alts.push(new KeyValue(\"items\", this.lc.loc(\"Voci\")));\r\n break;\r\n case MetricV2Type.Histogram:\r\n alts = [new KeyValue(\"percentiles\", this.lc.loc(\"Percentili\")), new KeyValue(\"rate\", this.lc.loc(\"Frequenza\"))];\r\n break;\r\n case MetricV2Type.Timer:\r\n alts = [new KeyValue(\"duration\", this.lc.loc(\"Chiamate e durata\")), new KeyValue(\"active\", this.lc.loc(\"In corso\"))];\r\n break;\r\n }\r\n let alt = alts.find(t => t.id == this.alts[info.name])?.id ?? alts[0]?.id ?? \"\";\r\n return { info: info, alts: alts, alt: alt, charts: series.length ? this.buildCharts(info, alt, series, items) : [], empty: series.length == 0 };\r\n }\r\n\r\n // Le voci scelte di un totale, per l'area impilata e le quote\r\n private itemsOf(info: MetricsV2Info): MetricsV2Info[] {\r\n if (info.metricType != MetricV2Type.Counter && info.metricType != MetricV2Type.Meter)\r\n return [];\r\n return this.selected.filter(t => t.startsWith(info.name + \" - \") && !this.selected.some(k => k != info.name && t.startsWith(k + \" - \") && k.startsWith(info.name + \" - \"))).map(t => this.info(t));\r\n }\r\n\r\n private buildCharts(info: MetricsV2Info, alt: string, series: [string, MetricsV2Sample[]][], items: MetricsV2Info[]): Mv2Chart[] {\r\n let line = (key: string, instance: string, points: Mv2Point[], extra: Partial<Mv2Series> = {}): Mv2Series =>\r\n ({ key: `${key}|${instance}`, label: instance, color: this.color(instance), kind: \"line\", points: points, ...extra });\r\n let unit = info.unit || \"\";\r\n let rateUnit = `${unit}${this.rateLabel(info.rateUnit)}`;\r\n\r\n switch (info.metricType) {\r\n case MetricV2Type.Gauge:\r\n return [{ key: \"value\", unit: this.mainUnit(info), height: 170, series: series.map(([i, l]) => line(\"value\", i, this.points(l, s => s.value))) }];\r\n\r\n case MetricV2Type.Counter:\r\n if (alt == \"delta\")\r\n return [{ key: \"delta\", unit: unit, height: 170, series: series.map(([i, l]) => line(\"delta\", i, this.points(l, s => s.deltaCount), { kind: \"bars\" })) }];\r\n if (alt == \"items\")\r\n return [{ key: \"items\", unit: unit, height: 190, series: this.stacked(items, s => s.count) }];\r\n if (alt == \"share\")\r\n return [{ key: \"share\", unit: \"%\", height: 170, series: this.itemLines(items, s => s.percent) }];\r\n return [{ key: \"level\", unit: unit, height: 170, series: series.map(([i, l]) => line(\"level\", i, this.points(l, s => s.count))) }];\r\n\r\n case MetricV2Type.Meter:\r\n if (alt == \"moving\")\r\n return [{\r\n key: \"moving\", unit: rateUnit, height: 170,\r\n series: flatten(series, ([i, l]) => [\r\n line(\"m1\", i, this.points(l, s => s.oneMinuteRate), { label: `${i} · 1 min` }),\r\n line(\"m5\", i, this.points(l, s => s.fiveMinuteRate), { label: `${i} · 5 min`, dash: \"5 3\" }),\r\n line(\"m15\", i, this.points(l, s => s.fifteenMinuteRate), { label: `${i} · 15 min`, dash: \"1 3\" })\r\n ])\r\n }];\r\n if (alt == \"items\")\r\n return [{ key: \"items\", unit: `${unit}/s`, height: 190, series: this.stacked(items, s => s.ratePerSecond) }];\r\n return [{ key: \"rate\", unit: this.mainUnit(info), height: 170, series: series.map(([i, l]) => line(\"rate\", i, this.points(l, s => this.main(info, s)))) }];\r\n\r\n case MetricV2Type.Histogram:\r\n if (alt == \"rate\")\r\n return [{ key: \"rate\", unit: `${unit}/s`, height: 170, series: series.map(([i, l]) => line(\"rate\", i, this.points(l, s => s.ratePerSecond))) }];\r\n return [{ key: \"percentiles\", unit: unit, height: 190, series: flatten(series, ([i, l]) => this.percentileBand(i, l, s => s.median, `${i} · ${this.lc.loc(\"mediana\")}`)) }];\r\n\r\n case MetricV2Type.Timer:\r\n if (alt == \"active\")\r\n return [{ key: \"active\", unit: this.lc.loc(\"in corso\"), height: 170, series: series.map(([i, l]) => line(\"active\", i, this.points(l, s => s.activeSessions), { kind: \"step\" })) }];\r\n return [\r\n { key: \"calls\", unit: `${unit}/s`, height: 120, series: series.map(([i, l]) => line(\"calls\", i, this.points(l, s => s.ratePerSecond))) },\r\n { key: \"duration\", unit: this.durationLabel(info.durationUnit), height: 170, series: flatten(series, ([i, l]) => this.percentileBand(i, l, s => s.intervalMean, `${i} · ${this.lc.loc(\"media nell'intervallo\")}`, true)) }\r\n ];\r\n }\r\n return [];\r\n }\r\n\r\n // Fascia dei percentili del reservoir per istanza: per l'histogram mediana con max a punti, per il timer la durata media dell'intervallo\r\n private percentileBand(instance: string, list: MetricsV2Sample[], center: (s: MetricsV2Sample) => number, label: string, timer: boolean = false): Mv2Series[] {\r\n let color = this.color(instance);\r\n let ret: Mv2Series[] = [];\r\n if (!timer)\r\n ret.push({ key: `b1|${instance}`, label: instance, color: color, kind: \"band\", points: this.points(list, s => s.median, s => s.percentile75), opacity: 0.26, tooltip: false });\r\n ret.push({ key: `b2|${instance}`, label: instance, color: color, kind: \"band\", points: this.points(list, s => timer ? s.median : s.percentile75, s => s.percentile95), opacity: 0.15, tooltip: false });\r\n ret.push({ key: `b3|${instance}`, label: instance, color: color, kind: \"band\", points: this.points(list, s => s.percentile95, s => s.percentile99), opacity: 0.07, tooltip: false });\r\n ret.push({ key: `c|${instance}`, label: label, color: color, kind: \"line\", points: this.points(list, center) });\r\n if (!timer)\r\n ret.push({ key: `max|${instance}`, label: `${instance} · max`, color: color, kind: \"dots\", points: this.points(list, s => s.max) });\r\n return ret;\r\n }\r\n\r\n // Le voci di un totale sommate sulle istanze visibili, campione per campione (live: a 15 secondi; storico: per snapshot)\r\n private bucketed(item: MetricsV2Info, value: (s: MetricsV2Sample) => number, average: boolean): Map<number, { t: number, v: number }> {\r\n let buckets = new Map<number, { t: number, v: number, n: number }>();\r\n for (let [, list] of this.visibleSeries(item.name))\r\n for (let s of list) {\r\n let v = value(s);\r\n if (v == null)\r\n continue;\r\n let key = s.snapId ?? Math.round(this.time(s) / REFRESH_MS);\r\n let b = buckets.get(key) ?? { t: this.time(s), v: 0, n: 0 };\r\n b.v += v;\r\n b.n++;\r\n buckets.set(key, b);\r\n }\r\n return new Map([...buckets.entries()].map(([k, b]) => [k, { t: b.t, v: average ? b.v / b.n : b.v }]));\r\n }\r\n\r\n private stacked(items: MetricsV2Info[], value: (s: MetricsV2Sample) => number): Mv2Series[] {\r\n let perItem = items.map(t => this.bucketed(t, value, false));\r\n let keys = [...new Set(flatten(perItem, t => [...t.keys()]))].sort((a, b) => a - b);\r\n let base = new Map<number, number>(keys.map(k => [k, 0]));\r\n let bands: Mv2Series[] = items.map((item, i) => {\r\n let points: Mv2Point[] = keys.filter(k => perItem[i].has(k)).map(k => {\r\n let b = perItem[i].get(k);\r\n let lo = base.get(k);\r\n base.set(k, lo + b.v);\r\n return { t: b.t, v: lo, v2: lo + b.v };\r\n });\r\n let label = item.name.substring(item.name.lastIndexOf(\" - \") + 3);\r\n return { key: `stack|${item.name}`, label: label, color: ITEM_COLORS[i % ITEM_COLORS.length], kind: \"band\", points: points, opacity: 0.55, tooltip: false };\r\n });\r\n // Linee invisibili solo per il riquadro dei valori: il valore della voce, non la somma impilata\r\n let tips: Mv2Series[] = items.map((item, i) => ({\r\n key: `stacktip|${item.name}`, label: item.name.substring(item.name.lastIndexOf(\" - \") + 3), color: ITEM_COLORS[i % ITEM_COLORS.length], kind: \"line\",\r\n points: [...perItem[i].values()].sort((a, b) => a.t - b.t).map(b => ({ t: b.t, v: b.v })), opacity: 0\r\n }));\r\n return bands.reverse().concat(tips);\r\n }\r\n\r\n private itemLines(items: MetricsV2Info[], value: (s: MetricsV2Sample) => number): Mv2Series[] {\r\n return items.map((item, i) => ({\r\n key: `share|${item.name}`, label: item.name.substring(item.name.lastIndexOf(\" - \") + 3), color: ITEM_COLORS[i % ITEM_COLORS.length], kind: \"line\" as const,\r\n points: [...this.bucketed(item, value, true).values()].sort((a, b) => a.t - b.t).map(b => ({ t: b.t, v: b.v }))\r\n }));\r\n }\r\n\r\n // M17: valore principale dell'ultimo campione di ogni istanza, mini grafico, istante del campione\r\n private buildTile(info: MetricsV2Info): Mv2Tile {\r\n let rows: Mv2TileRow[] = [];\r\n let sparks: { d: string, color: string }[] = [];\r\n let latest = 0;\r\n for (let [instance, list] of this.visibleSeries(info.name)) {\r\n let last = [...list].reverse().find(t => this.main(info, t) != null);\r\n if (!last)\r\n continue;\r\n latest = Math.max(latest, this.time(last));\r\n rows.push({\r\n instance: instance, color: this.color(instance), value: `${this.number(this.main(info, last))} ${this.mainUnit(info)}`.trim(),\r\n extra: info.metricType == MetricV2Type.Meter ? `${this.number(last.count)} ${this.lc.loc(\"dall'avvio\")}` : \"\"\r\n });\r\n let points = this.points(list.slice(-80), s => this.main(info, s));\r\n if (points.length > 1) {\r\n let lo = Math.min(...points.map(t => t.v));\r\n let hi = Math.max(...points.map(t => t.v));\r\n let t0 = points[0].t;\r\n let t1 = points[points.length - 1].t;\r\n let d = points.map((p, i) => `${i == 0 || p.gap ? \"M\" : \"L\"}${((p.t - t0) / Math.max(1, t1 - t0) * 120).toFixed(1)},${(26 - (hi > lo ? (p.v - lo) / (hi - lo) : 0.5) * 24).toFixed(1)}`).join(\"\");\r\n sparks.push({ d: d, color: this.color(instance) });\r\n }\r\n }\r\n return { info: info, rows: rows, sparks: sparks, time: latest ? dayjs(latest).format(\"HH:mm:ss\") : \"\" };\r\n }\r\n\r\n // M18: colonne comuni e del tipo; ordinabile; esportabile\r\n private buildTable(info: MetricsV2Info, previous: Mv2TableSection): Mv2TableSection {\r\n let unit = info.unit ? ` (${info.unit})` : \"\";\r\n let dur = info.durationUnit ? ` (${this.durationLabel(info.durationUnit)})` : \"\";\r\n let columns: Mv2Column[] = [\r\n { key: \"instance\", label: this.lc.loc(\"Istanza\"), num: false },\r\n { key: \"time\", label: `${this.lc.loc(\"Istante\")} (${this.zone})`, num: false },\r\n { key: \"interval\", label: this.lc.loc(\"Intervallo (s)\"), num: true }\r\n ];\r\n if (this.source != \"live\")\r\n columns.push({ key: \"snapId\", label: this.lc.loc(\"Snapshot\"), num: true });\r\n let typed: [string, string, (s: MetricsV2Sample) => any][] = [];\r\n switch (info.metricType) {\r\n case MetricV2Type.Gauge:\r\n typed = [[\"value\", `${this.lc.loc(\"Valore\")}${info.name == CPU_USAGE ? \" (CPU)\" : unit}`, s => s.value]];\r\n break;\r\n case MetricV2Type.Counter:\r\n typed = [[\"count\", `${this.lc.loc(\"Conteggio\")}${unit}`, s => s.count], [\"delta\", `${this.lc.loc(\"Variazione\")}${unit}`, s => s.deltaCount], [\"percent\", `${this.lc.loc(\"Quota\")} (%)`, s => s.percent]];\r\n break;\r\n case MetricV2Type.Meter:\r\n typed = [[\"count\", `${this.lc.loc(\"Conteggio\")}${unit}`, s => s.count], [\"rate\", `${this.lc.loc(\"Al secondo\")} (${this.mainUnit(info)})`, s => this.main(info, s)],\r\n [\"m1\", `Rate 1 min (${info.unit || \"\"}${this.rateLabel(info.rateUnit)})`, s => s.oneMinuteRate], [\"m5\", \"Rate 5 min\", s => s.fiveMinuteRate], [\"m15\", \"Rate 15 min\", s => s.fifteenMinuteRate]];\r\n break;\r\n case MetricV2Type.Histogram:\r\n typed = [[\"count\", this.lc.loc(\"Conteggio\"), s => s.count], [\"median\", `${this.lc.loc(\"Mediana\")}${unit}`, s => s.median], [\"p95\", \"p95\", s => s.percentile95], [\"p99\", \"p99\", s => s.percentile99], [\"max\", this.lc.loc(\"Massimo\"), s => s.max]];\r\n break;\r\n case MetricV2Type.Timer:\r\n typed = [[\"count\", this.lc.loc(\"Chiamate\"), s => s.count], [\"rate\", `${this.lc.loc(\"Al secondo\")} (/s)`, s => s.ratePerSecond], [\"intervalMean\", `${this.lc.loc(\"Durata media nell'intervallo\")}${dur}`, s => s.intervalMean],\r\n [\"median\", `${this.lc.loc(\"Mediana\")}${dur}`, s => s.median], [\"p95\", \"p95\", s => s.percentile95], [\"p99\", \"p99\", s => s.percentile99], [\"active\", this.lc.loc(\"In corso\"), s => s.activeSessions]];\r\n break;\r\n }\r\n columns.push(...typed.map(([key, label]) => ({ key: key, label: label, num: true })));\r\n\r\n let rows = flatten(this.visibleSeries(info.name), ([instance, list]) => list.map(s => {\r\n let row: { [key: string]: any } = { instance: instance, time: this.time(s), utc: s.sampleTime, interval: s.intervalSeconds, snapId: s.snapId };\r\n typed.forEach(([key, , value]) => row[key] = value(s));\r\n return row;\r\n }));\r\n let section: Mv2TableSection = { info: info, columns: columns, rows: [], total: rows.length, sortKey: previous?.sortKey ?? \"time\", sortDesc: previous?.sortDesc ?? true };\r\n section.rows = this.sortRows(rows, section);\r\n return section;\r\n }\r\n\r\n sortBy(section: Mv2TableSection, column: Mv2Column) {\r\n section.sortDesc = section.sortKey == column.key ? !section.sortDesc : column.num || column.key == \"time\";\r\n section.sortKey = column.key;\r\n let rebuilt = this.buildTable(section.info, section);\r\n section.rows = rebuilt.rows;\r\n }\r\n\r\n private sortRows(rows: { [key: string]: any }[], section: Mv2TableSection): { [key: string]: any }[] {\r\n let key = section.sortKey;\r\n let sign = section.sortDesc ? -1 : 1;\r\n return rows.sort((a, b) => {\r\n let x = a[key];\r\n let y = b[key];\r\n if (x == null && y == null)\r\n return 0;\r\n if (x == null)\r\n return 1;\r\n if (y == null)\r\n return -1;\r\n return (typeof x == \"string\" ? x.localeCompare(y) : x - y) * sign;\r\n });\r\n }\r\n\r\n shownRows(section: Mv2TableSection) {\r\n return section.rows.slice(0, TABLE_ROWS);\r\n }\r\n\r\n cell(row: { [key: string]: any }, column: Mv2Column): string {\r\n let v = row[column.key];\r\n if (column.key == \"time\")\r\n return dayjs(v).format(\"DD/MM HH:mm:ss\");\r\n if (column.key == \"instance\" || column.key == \"snapId\")\r\n return v ?? \"—\";\r\n return this.number(v);\r\n }\r\n\r\n // CSV delle righe della metrica, con gli orari in UTC e le unità nelle intestazioni\r\n exportCsv(section: Mv2TableSection) {\r\n let quote = (v: any) => {\r\n let s = v == null ? \"\" : String(v);\r\n return /[\",\\n]/.test(s) ? `\"${s.replace(/\"/g, '\"\"')}\"` : s;\r\n };\r\n let columns = section.columns.map(t => t.key == \"time\" ? { ...t, label: `${this.lc.loc(\"Istante\")} (UTC)` } : t);\r\n let lines = [columns.map(t => quote(t.label)).join(\",\")];\r\n for (let row of section.rows)\r\n lines.push(columns.map(t => quote(t.key == \"time\" ? this.isoUtc(row[\"utc\"]) : row[t.key])).join(\",\"));\r\n let blob = new Blob([\"\" + lines.join(\"\\r\\n\")], { type: \"text/csv;charset=utf-8\" });\r\n let url = URL.createObjectURL(blob);\r\n let link = document.createElement(\"a\");\r\n link.href = url;\r\n link.download = `metriche_${section.info.name.replace(/[^\\w.-]+/g, \"-\")}.csv`;\r\n document.body.appendChild(link);\r\n link.click();\r\n link.remove();\r\n setTimeout(() => URL.revokeObjectURL(url), 1000);\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Supporto\r\n\r\n private visibilityChanged() {\r\n // Tornando sulla pagina si recupera subito invece di aspettare il giro dopo\r\n if (!document.hidden)\r\n this.refresh();\r\n }\r\n\r\n private errorMessage(err: any): string {\r\n return err?.status == 542 ? this.adms.errorText(err) : `${this.lc.loc(\"Errore\")} ${err?.status ?? \"\"}: ${this.adms.errorText(err)}`;\r\n }\r\n\r\n number(value: number): string {\r\n if (value == null || isNaN(value))\r\n return \"—\";\r\n let abs = Math.abs(value);\r\n let digits = abs >= 1000 ? \"1.0-0\" : abs >= 100 ? \"1.0-1\" : abs >= 1 ? \"1.0-2\" : \"1.0-3\";\r\n return formatNumber(value, \"it\", digits);\r\n }\r\n\r\n durationLabel(unit: string): string {\r\n switch (unit) {\r\n case \"Nanoseconds\": return \"ns\";\r\n case \"Microseconds\": return \"µs\";\r\n case \"Milliseconds\": return \"ms\";\r\n case \"Seconds\": return \"s\";\r\n case \"Minutes\": return \"min\";\r\n case \"Hours\": return \"h\";\r\n }\r\n return unit ?? \"\";\r\n }\r\n\r\n rateLabel(unit: string): string {\r\n switch (unit) {\r\n case \"Seconds\": return \"/s\";\r\n case \"Minutes\": return \"/min\";\r\n case \"Hours\": return \"/h\";\r\n case \"Days\": return \"/g\";\r\n }\r\n return unit ? `/${unit}` : \"\";\r\n }\r\n\r\n // Le date delle risposte sono UTC \"dd/MM/yyyy HH:mm:ss\" senza fuso: si leggono come UTC e si mostrano in ora locale (M24)\r\n parseUtc(value: string): Date {\r\n let m = /^(\\d{2})\\/(\\d{2})\\/(\\d{4}) (\\d{2}):(\\d{2}):(\\d{2})$/.exec(value ?? \"\");\r\n return m ? new Date(Date.UTC(+m[3], +m[2] - 1, +m[1], +m[4], +m[5], +m[6])) : value ? new Date(value) : null;\r\n }\r\n\r\n private time(s: MetricsV2Sample): number {\r\n return this.parseUtc(s.sampleTime)?.getTime() ?? 0;\r\n }\r\n\r\n private isoUtc(value: string): string {\r\n return this.parseUtc(value)?.toISOString().replace(\".000Z\", \"Z\") ?? \"\";\r\n }\r\n\r\n local(value: Date | string): string {\r\n let date = typeof value == \"string\" ? this.parseUtc(value) : value;\r\n return date ? dayjs(date).format(\"DD/MM HH:mm\") : \"—\";\r\n }\r\n\r\n hhmmss(date: Date): string {\r\n return date ? dayjs(date).format(\"HH:mm:ss\") : \"\";\r\n }\r\n\r\n private setLastDay() {\r\n let now = new Date();\r\n this.filterto = this.fmt(now);\r\n this.filterfrom = this.fmt(new Date(now.getTime() - 24 * 3600 * 1000));\r\n }\r\n\r\n private toDate(value: string): Date {\r\n return value ? this.dateExts.getDateConvertion(value).toDate() : null;\r\n }\r\n\r\n private fmt(date: Date): string {\r\n return dayjs(date).format(this.lc.token(\"getFullDateDisplayFormat\"));\r\n }\r\n\r\n private saveSettings() {\r\n let settings: MetricsV2Settings = { selected: this.selected, source: this.source, instances: this.instances, liveMinutes: this.liveMinutes, view: this.view };\r\n this.localStorage.setItem(STORAGE_KEY, settings).subscribe();\r\n }\r\n\r\n // #endregion\r\n}\r\n","<div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"card app-overflow-visible\" widget>\r\n <div class=\"card-header\">\r\n <span class=\"text-uppercase\">{{'Metriche di Sistema' | localize: lc}}</span>\r\n </div>\r\n <div class=\"card-body widget-body mv2-body\">\r\n <!-- Barra dei comandi: sorgente, finestra, istanze, vista, aggiornamento -->\r\n <div class=\"mv2-toolbar\">\r\n <div class=\"mv2-group\">\r\n <span class=\"mv2-group-label\">{{'Sorgente' | localize: lc}}</span>\r\n <div class=\"mv2-seg\">\r\n @for (o of Sources; track o.id) {\r\n <button type=\"button\" [class.mv2-on]=\"source == o.id\" [disabled]=\"o.id != 'live' && !historyAvailable\" (click)=\"setSource(o.id)\"\r\n [title]=\"o.id != 'live' && !historyAvailable ? ('Lo storico non è attivo su questo ambiente: ci sono solo i dati live.' | localize: lc) : ''\">\r\n @if (o.id == 'live') {\r\n <span class=\"mv2-live-dot\" [class.mv2-live-paused]=\"paused\"></span>\r\n }\r\n {{o.description}}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (source == 'live') {\r\n <div class=\"mv2-group\">\r\n <span class=\"mv2-group-label\">{{'Finestra' | localize: lc}}</span>\r\n <div class=\"mv2-seg\">\r\n @for (o of LiveWindows; track o.id) {\r\n <button type=\"button\" [class.mv2-on]=\"liveMinutes == o.id\" (click)=\"setLiveMinutes(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n } @else if (source == 'period') {\r\n <div class=\"mv2-cluster\">\r\n <div class=\"mv2-field\">\r\n <form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"filterfrom\" (ngModelChange)=\"filterfrom = $event; datesChanged()\" name=\"filterfrom\" [Placeholder]=\"'Dal' | localize: lc\"></form-datetime>\r\n </div>\r\n <div class=\"mv2-field\">\r\n <form-datetime [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"filterto\" (ngModelChange)=\"filterto = $event; datesChanged()\" name=\"filterto\" [Placeholder]=\"'Al' | localize: lc\"></form-datetime>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"mv2-cluster\">\r\n <div class=\"mv2-field mv2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"snapFromId\" (ngModelChange)=\"snapFromId = $event; snapshotsChanged()\" name=\"snapFrom\" [Source]=\"SnapshotOptions\" [Placeholder]=\"'Dallo snapshot' | localize: lc\"></form-select>\r\n </div>\r\n <div class=\"mv2-field mv2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"snapToId\" (ngModelChange)=\"snapToId = $event; snapshotsChanged()\" name=\"snapTo\" [Source]=\"SnapshotOptions\" [Placeholder]=\"'Allo snapshot' | localize: lc\"></form-select>\r\n </div>\r\n @if (snapshotWindow; as w) {\r\n <span class=\"mv2-muted\">{{'Dalle' | localize: lc}} {{local(w.from)}} {{'alle' | localize: lc}} {{local(w.to)}}</span>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"mv2-group mv2-field-wide\">\r\n <span class=\"mv2-group-label\">{{'Istanze' | localize: lc}}</span>\r\n <form-multiselect class=\"mv2-fill\" [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"instances\" (ngModelChange)=\"instancesChanged($event)\" name=\"instances\" [Source]=\"Instances\" [Placeholder]=\"clusterLabel\" [MaxShownElements]=\"2\"></form-multiselect>\r\n </div>\r\n\r\n <div class=\"mv2-cluster mv2-cluster-end\">\r\n @if (source == 'live') {\r\n <span class=\"mv2-muted\">\r\n @if (dataLoading) {\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n }\r\n @if (lastUpdate) {\r\n {{'Aggiornato alle' | localize: lc}} {{hhmmss(lastUpdate)}}\r\n }\r\n </span>\r\n <button type=\"button\" class=\"mv2-btn\" (click)=\"togglePause()\">\r\n <i class=\"fa\" [class.fa-pause]=\"!paused\" [class.fa-play]=\"paused\"></i> {{(paused ? 'Riprendi' : 'Pausa') | localize: lc}}\r\n </button>\r\n } @else if (dataLoading) {\r\n <span class=\"mv2-muted\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento…' | localize: lc}}</span>\r\n }\r\n <div class=\"mv2-seg\">\r\n @for (o of Views; track o.id) {\r\n <button type=\"button\" [class.mv2-on]=\"view == o.id\" (click)=\"setView(o.id)\">\r\n <i class=\"fa\" [class.fa-line-chart]=\"o.id == 'charts'\" [class.fa-table]=\"o.id == 'table'\"></i> {{o.description}}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Avvisi -->\r\n @for (warning of warnings; track $index) {\r\n <div class=\"mv2-alert mv2-alert-warn\"><i class=\"fa fa-exclamation-triangle\"></i> {{warning}}</div>\r\n }\r\n @if (snapshotsLoaded && !historyAvailable) {\r\n <div class=\"mv2-alert\"><i class=\"fa fa-info-circle\"></i> {{'Lo storico non è attivo su questo ambiente: ci sono solo i dati live.' | localize: lc}}</div>\r\n }\r\n @if (dataError) {\r\n <div class=\"mv2-alert mv2-alert-error\">{{dataError}}</div>\r\n }\r\n\r\n <div class=\"mv2-main\">\r\n <!-- Catalogo -->\r\n <aside class=\"mv2-panel mv2-catalog\">\r\n <div class=\"mv2-field-full\">\r\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [ngModel]=\"search\" (ngModelChange)=\"search = $event; buildGroups()\" name=\"search\" [Placeholder]=\"'Cerca una metrica…' | localize: lc\"></form-input>\r\n </div>\r\n <div class=\"mv2-presets\">\r\n @for (p of Presets; track p) {\r\n <button type=\"button\" class=\"mv2-chip\" (click)=\"applyPreset(p)\">{{p | localize: lc}}</button>\r\n }\r\n </div>\r\n <div class=\"mv2-counter\">\r\n <span>{{selected.length}} {{'di' | localize: lc}} {{Max}} {{'metriche scelte' | localize: lc}}</span>\r\n @if (selected.length > 0) {\r\n <button type=\"button\" class=\"mv2-link\" (click)=\"clearSelection()\">{{'Togli tutte' | localize: lc}}</button>\r\n }\r\n </div>\r\n\r\n @if (catalogLoading) {\r\n <div class=\"mv2-muted mv2-pad\"><i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento…' | localize: lc}}</div>\r\n }\r\n @if (catalogError) {\r\n <div class=\"mv2-alert mv2-alert-error\">{{catalogError}}</div>\r\n }\r\n @for (group of groups; track group.type) {\r\n <div class=\"mv2-cat-group\">\r\n <div class=\"mv2-cat-title\">{{group.label}} <span class=\"mv2-muted\">{{group.count}}</span></div>\r\n @for (entry of group.entries; track entry.info.name) {\r\n <div class=\"mv2-cat-item\" [class.mv2-cat-disabled]=\"!canSelect(entry.info.name)\">\r\n <label class=\"mv2-check\">\r\n <input type=\"checkbox\" [checked]=\"isSelected(entry.info.name)\" [disabled]=\"!canSelect(entry.info.name)\" (change)=\"toggleMetric(entry.info.name)\" />\r\n <span class=\"mv2-cat-name\" [title]=\"entry.info.name\">{{entry.info.name}}</span>\r\n </label>\r\n <span class=\"mv2-cat-meta\">\r\n {{catalogUnit(entry.info)}}\r\n @if (instancesLabel(entry.info)) {\r\n <span class=\"mv2-cat-inst\" [title]=\"entry.info.instances.join('\\n')\">{{instancesLabel(entry.info)}}</span>\r\n }\r\n </span>\r\n @if (entry.items.length > 0) {\r\n <button type=\"button\" class=\"mv2-caret\" (click)=\"entry.open = !entry.open\" [title]=\"'Voci' | localize: lc\">\r\n <i class=\"fa\" [class.fa-caret-down]=\"entry.open\" [class.fa-caret-right]=\"!entry.open\"></i> {{entry.items.length}}\r\n </button>\r\n }\r\n </div>\r\n @if (entry.open && entry.items.length > 0) {\r\n <div class=\"mv2-cat-items\">\r\n <button type=\"button\" class=\"mv2-link\" (click)=\"addItems(entry)\">{{addItemsLabel(entry)}}</button>\r\n @for (item of entry.items; track item.name) {\r\n <div class=\"mv2-cat-item mv2-cat-sub\" [class.mv2-cat-disabled]=\"!canSelect(item.name)\">\r\n <label class=\"mv2-check\">\r\n <input type=\"checkbox\" [checked]=\"isSelected(item.name)\" [disabled]=\"!canSelect(item.name)\" (change)=\"toggleMetric(item.name)\" />\r\n <span class=\"mv2-cat-name\" [title]=\"item.name\">{{item.name.substring(entry.info.name.length + 3)}}</span>\r\n </label>\r\n @if (instancesLabel(item)) {\r\n <span class=\"mv2-cat-inst\" [title]=\"item.instances.join('\\n')\">{{instancesLabel(item)}}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n }\r\n </div>\r\n }\r\n </aside>\r\n\r\n <!-- Grafici, tessere e tabella -->\r\n <section class=\"mv2-area\">\r\n @if (selected.length == 0) {\r\n <div class=\"mv2-panel mv2-placeholder\">\r\n <i class=\"fa fa-line-chart\"></i>\r\n {{'Scegli una o più metriche dal catalogo.' | localize: lc}}\r\n </div>\r\n } @else {\r\n <!-- Tessere dei valori correnti -->\r\n <div class=\"mv2-tiles\">\r\n @for (tile of tiles; track tile.info.name) {\r\n <div class=\"mv2-tile\">\r\n <div class=\"mv2-tile-name\" [title]=\"tile.info.name\">{{tile.info.name}}</div>\r\n @for (row of tile.rows; track row.instance) {\r\n <div class=\"mv2-tile-row\">\r\n <span class=\"mv2-dot\" [style.background]=\"row.color\" [title]=\"row.instance\"></span>\r\n <strong>{{row.value}}</strong>\r\n @if (row.extra) {\r\n <span class=\"mv2-muted\">{{row.extra}}</span>\r\n }\r\n </div>\r\n } @empty {\r\n <div class=\"mv2-muted\">—</div>\r\n }\r\n <svg class=\"mv2-spark\" viewBox=\"0 0 120 28\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\r\n @for (spark of tile.sparks; track $index) {\r\n <path [attr.d]=\"spark.d\" [attr.stroke]=\"spark.color\" fill=\"none\" stroke-width=\"1.3\" vector-effect=\"non-scaling-stroke\" />\r\n }\r\n </svg>\r\n @if (tile.time) {\r\n <div class=\"mv2-muted mv2-small\">{{'alle' | localize: lc}} {{tile.time}}</div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Legenda comune: un clic nasconde o mostra l'istanza ovunque -->\r\n <div class=\"mv2-legend-bar\">\r\n <div class=\"mv2-legend\">\r\n @for (item of legend; track item.instance) {\r\n <button type=\"button\" class=\"mv2-legend-item\" [class.mv2-legend-off]=\"item.hidden\" (click)=\"toggleInstance(item.instance)\">\r\n <span class=\"mv2-dot\" [style.background]=\"item.color\"></span>{{item.instance}}\r\n </button>\r\n }\r\n </div>\r\n <span class=\"mv2-muted mv2-small\">{{'Orari in ora locale' | localize: lc}} ({{zone}}) · {{'trascina su un grafico per lo zoom' | localize: lc}}</span>\r\n @if (viewFrom != null) {\r\n <button type=\"button\" class=\"mv2-btn\" (click)=\"resetZoom()\"><i class=\"fa fa-arrows-h\"></i> {{'Finestra intera' | localize: lc}}</button>\r\n }\r\n </div>\r\n\r\n @if (view == 'charts') {\r\n @for (panel of panels; track panel.info.name) {\r\n <div class=\"mv2-panel mv2-chart-panel\">\r\n <div class=\"mv2-panel-header\">\r\n <span class=\"mv2-panel-title\">{{panel.info.name}}</span>\r\n <span class=\"mv2-type\">{{Type[panel.info.metricType]}}</span>\r\n <span class=\"mv2-muted\">{{mainUnit(panel.info)}}</span>\r\n <span class=\"mv2-spacer\"></span>\r\n @if (panel.alts.length > 1) {\r\n <div class=\"mv2-seg mv2-seg-small\">\r\n @for (o of panel.alts; track o.id) {\r\n <button type=\"button\" [class.mv2-on]=\"panel.alt == o.id\" (click)=\"setAlt(panel, o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n }\r\n <button type=\"button\" class=\"mv2-icon-btn\" [title]=\"'Togli' | localize: lc\" (click)=\"removeMetric(panel.info.name)\">×</button>\r\n </div>\r\n @if (panel.empty) {\r\n <div class=\"mv2-empty\">\r\n @if (dataLoading) {\r\n <i class=\"fa fa-spinner fa-spin\"></i> {{'Caricamento…' | localize: lc}}\r\n } @else {\r\n {{emptyLabel(panel.info.name)}}\r\n }\r\n </div>\r\n } @else {\r\n @for (chart of panel.charts; track chart.key) {\r\n <mv2-chart [series]=\"chart.series\" [from]=\"chartFrom\" [to]=\"chartTo\" [height]=\"chart.height\" [unit]=\"chart.unit\" [marks]=\"marks\"\r\n [cursor]=\"cursor\" [format]=\"format\" (cursorChange)=\"cursor = $event\" (zoom)=\"zoomTo($event)\"></mv2-chart>\r\n }\r\n }\r\n </div>\r\n }\r\n } @else {\r\n @for (section of tables; track section.info.name) {\r\n <div class=\"mv2-panel\">\r\n <div class=\"mv2-panel-header\">\r\n <span class=\"mv2-panel-title\">{{section.info.name}}</span>\r\n <span class=\"mv2-type\">{{Type[section.info.metricType]}}</span>\r\n <span class=\"mv2-spacer\"></span>\r\n @if (section.total > 0) {\r\n <button type=\"button\" class=\"mv2-btn\" (click)=\"exportCsv(section)\"><i class=\"fa fa-download\"></i> {{'Esporta CSV' | localize: lc}}</button>\r\n }\r\n </div>\r\n @if (section.total == 0) {\r\n <div class=\"mv2-empty\">{{emptyLabel(section.info.name)}}</div>\r\n } @else {\r\n <div class=\"mv2-table-wrap\">\r\n <table class=\"mv2-table\">\r\n <thead>\r\n <tr>\r\n @for (column of section.columns; track column.key) {\r\n <th [class.mv2-num]=\"column.num\" (click)=\"sortBy(section, column)\">\r\n {{column.label}}\r\n @if (section.sortKey == column.key) {\r\n <i class=\"fa\" [class.fa-caret-down]=\"section.sortDesc\" [class.fa-caret-up]=\"!section.sortDesc\"></i>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (row of shownRows(section); track $index) {\r\n <tr>\r\n @for (column of section.columns; track column.key) {\r\n <td [class.mv2-num]=\"column.num\">\r\n @if (column.key == 'instance') {\r\n <span class=\"mv2-dot\" [style.background]=\"color(row['instance'])\"></span>\r\n }\r\n {{cell(row, column)}}\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n @if (section.total > section.rows.length || section.total > 300) {\r\n <div class=\"mv2-muted mv2-small mv2-pad\">{{'Mostrate le prime 300 righe di' | localize: lc}} {{section.total}}; {{\"l'esportazione le comprende tutte.\" | localize: lc}}</div>\r\n }\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n </section>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { AppSearch } from \"@esfaenza/es-table\";\r\nimport { TopActivity } from \"./TopActivity\";\r\n\r\nexport class TopActivitiesDataView extends AppSearch<TopActivity>{\r\n constructor() { super(); }\r\n\r\n filterfrom: string;\r\n filterto: string;\r\n filterrealtime: boolean;\r\n filterbe: string;\r\n filterglobal: boolean;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmTopActivitieLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Sessioni Attive\", [\"Active Sessions\"]);\r\n super.set(\"it->en\", \"Prime Istruzioni\", [\"Top Nodes\"]);\r\n super.set(\"it->en\", \"Prime Sessioni\", [\"Top Sessions\"]);\r\n super.set(\"it->en\", \"Carico i Dati\", [\"Loading Data\"]);\r\n super.set(\"it->en\", \"Attività Principali\", [\"Top Activities\"]);\r\n super.set(\"it->en\", \"Descrizione Nodo\", [\"Node Description\"]);\r\n super.set(\"it->en\", \"Nodo\", [\"Node\"]);\r\n super.set(\"it->en\", \"Attività\", [\"Activity\"]);\r\n super.set(\"it->en\", \"Limite\", [\"Limit\"]);\r\n super.set(\"it->en\", \"Tipo Nodo\", [\"Node Type\"]);\r\n super.set(\"it->en\", \"Utente\", [\"User\"]);\r\n super.set(\"it->en\", \"Tenant\", [\"Tenant\"]);\r\n super.set(\"it->en\", \"Processo\", [\"Process\"]);\r\n super.set(\"it->en\", \"Aggiorna ogni\", [\"Update every\"]);\r\n super.set(\"it->en\", \"secondo/i\", [\"second/s\"]);\r\n super.set(\"it->en\", \"Thread Massimi\", [\"Maximum Threads\"]);\r\n super.set(\"it->en\", \"CPU\", [\"CPUs\"]);\r\n super.set(\"it->en\", \"Classe Attesa\", [\"Wait Class Name\"]);\r\n\r\n super.set(\"it->en\", \"Seriale\", [\"Serial\"]);\r\n super.set(\"it->en\", \"Stato\", [\"Status\"]);\r\n super.set(\"it->en\", \"Tipo\", [\"Type\"]);\r\n super.set(\"it->en\", \"Utente\", [\"User\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject, Optional, ViewChild } from \"@angular/core\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { BaseChartComponent, BaseInterval, DateValue, Limit, LineChartData, LineSerie } from \"@esfaenza/es-charts\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { ItemsSelection } from \"@esfaenza/es-table\";\r\nimport { DateService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport * as am5xy from \"@amcharts/amcharts5/xy\";\r\nimport { ReplaySubject } from \"rxjs\";\r\nimport { Dayjs } from \"dayjs\";\r\n\r\n// Modelli\r\nimport { DirectorInfos } from \"../../models/components/DirectorInfos\";\r\nimport { TopActivitiesDataView } from \"../../models/components/TopActivitiesDataView\";\r\nimport { TopNode } from \"../../models/components/TopNode\";\r\nimport { TopSession } from \"../../models/components/TopSession\";\r\nimport { NodeStats } from \"../../models/components/NodeStats\";\r\n\r\nimport { SessionStats } from \"../../models/components/SessionStats\";\r\nimport { SessionThread } from \"../../models/components/SessionThread\";\r\n\r\n// Applicazione\r\nimport { ADM_DETAILS_V2, ADM_MODULE_PATH, ADM_PROFILER_V2 } from \"../../tokens\";\r\nimport { AdmDetailsV2Component, DetailsV2EventLink, DetailsV2Options } from \"../details_v2/details_v2.component\";\r\nimport { ModalDirective } from \"ngx-bootstrap/modal\";\r\n\r\n// Localizzazione\r\nimport { AdmTopActivitieLoc } from \"./topact_search.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\n\r\ndeclare var dayjs;\r\n\r\n@Component({\r\n selector: \"topact_search\",\r\n providers: [{ provide: LocalizationService, useClass: AdmTopActivitieLoc }],\r\n templateUrl: \"./topact_search.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmTopActivitiesComponent {\r\n public searchView: TopActivitiesDataView = new TopActivitiesDataView();\r\n public storageSub: any;\r\n private LastDataPoint: any;\r\n\r\n public autoUpdate: boolean = false;\r\n public seconds: string = \"5\";\r\n\r\n private ChartInstance: BaseChartComponent<any>;\r\n public NodeDetails: NodeStats;\r\n\r\n private rtWindow: { from: Dayjs, to: Dayjs } = null;\r\n\r\n protected destroyed$: ReplaySubject<boolean> = new ReplaySubject(1);\r\n @ViewChild(\"dlgNodeDetails\") dlgNodeDetails: ModalDirective;\r\n @ViewChild(\"dlgSessionDetails\") dlgSessionDetails: ModalDirective;\r\n @ViewChild(\"dlgDetailsV2\") dlgDetailsV2: ModalDirective;\r\n @ViewChild(AdmDetailsV2Component) detailsV2: AdmDetailsV2Component;\r\n\r\n public be: string;\r\n\r\n constructor(\r\n public dateExts: DateService,\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private location: Location,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string,\r\n private router: Router,\r\n // Con DirectorFeature.DetailsV2 il backend-for-frontend risponde a GetNodeStats e GetSessionStats solo con il contratto nuovo:\r\n // nodi e sessioni si aprono nel dettaglio v2 anche da questa pagina\r\n @Optional() @Inject(ADM_DETAILS_V2) public detailsV2Enabled: boolean,\r\n @Optional() @Inject(ADM_PROFILER_V2) public profilerV2Enabled: boolean) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n ngOnInit() {\r\n\r\n // Ogni minuto calcolo qual è la finestra del realTime\r\n // interval(60 * 1000).pipe(takeUntil(this.destroyed$)).subscribe(_ => {\r\n // this.updateRealTimeWindow();\r\n // });\r\n\r\n this.storageSub = this.route.queryParams.subscribe(params => {\r\n this.Init(params[\"ignoreStorage\"]);\r\n });\r\n }\r\n\r\n async updateRealTimeWindow() {\r\n let data = new TopActivitiesDataView();\r\n data.filterbe = this.be;\r\n data = await this.adms.getTopActivities(this.be, data);\r\n let reference = data.items[0];\r\n for (let i = 0; i < reference.actsessions.length; i++) {\r\n let itemref = reference.actsessions[i];\r\n let theD = this.dateExts.getDateConvertion(itemref.sampletime);\r\n\r\n if (!this.rtWindow)\r\n this.rtWindow = { from: theD, to: theD };\r\n else {\r\n if (theD.isBefore(this.rtWindow.from))\r\n this.rtWindow.from = theD;\r\n if (theD.isAfter(this.rtWindow.to))\r\n this.rtWindow.to = theD;\r\n }\r\n }\r\n }\r\n\r\n Init(ignoreStore) {\r\n this.doInit(ignoreStore);\r\n }\r\n\r\n async doInit(ignoreStorage) {\r\n let item = await this.localStorage.getItem<TopActivitiesDataView>(\"HotSearchTopAct\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/topact`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotSearchTopAct\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: TopActivitiesDataView) {\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetItems(this.searchView, false);\r\n }\r\n else {\r\n this.searchView = new TopActivitiesDataView();\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroyed$.next(true);\r\n this.destroyed$.complete();\r\n\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n async sendSearch(resetPage: boolean = true, update: boolean = false, searchViewOverride: TopActivitiesDataView = null) {\r\n let sv = searchViewOverride ?? this.searchView;\r\n if ((sv.filterfrom || sv.filterto) && !this.rtWindow)\r\n await this.updateRealTimeWindow();\r\n\r\n let dateRequestOnRealtimeWindow: boolean =\r\n sv.filterfrom && this.dateExts.getDateConvertion(sv.filterfrom).isAfter(this.rtWindow.from) &&\r\n sv.filterto && this.dateExts.getDateConvertion(sv.filterto).isBefore(this.rtWindow.to);\r\n\r\n sv.filterrealtime = dateRequestOnRealtimeWindow;\r\n sv.searchinprogress = true;\r\n\r\n this.POSTGetItems(sv, update);\r\n }\r\n\r\n async POSTGetItems(data: TopActivitiesDataView, update: boolean) {\r\n data.filterbe = this.be;\r\n let res = await this.adms.getTopActivities(this.be, data);\r\n //Se sono in modalità di update non devo toccare la searchView attuale se non per il searchinprogress che viene messo dall'es table\r\n if (!update) {\r\n this.searchView = res;\r\n this.localStorage.setItem(\"HotSearchTopAct\", this.searchView).subscribe();\r\n }\r\n // DirectorInfos anche se per qualche motivo crasha di brutto è comunque non obbligatorio, evito di non caricare la pagina solo perché lui scoppia\r\n let dirinfos = await this.adms.getInfos(this.be);\r\n this.searchView.searchinprogress = false;\r\n this.reviewBindings(update, res, dirinfos);\r\n }\r\n\r\n openNodeDetails(nodeId: string) {\r\n if (this.detailsV2Enabled) {\r\n this.detailsV2.openNode(nodeId, { ...this.detailsWindow(), global: this.searchView.filterglobal });\r\n this.dlgDetailsV2.show();\r\n return;\r\n }\r\n this.loadNodeDetails(nodeId);\r\n this.dlgNodeDetails.show();\r\n }\r\n\r\n openSessionDetails(sessionId: number, serialNo: number, instanceid: string) {\r\n if (this.detailsV2Enabled) {\r\n this.detailsV2.openSession(instanceid, sessionId, serialNo, { ...this.detailsWindow(), realTime: !!this.searchView.filterrealtime });\r\n this.dlgDetailsV2.show();\r\n return;\r\n }\r\n this.loadSessionDetails(sessionId, serialNo, instanceid);\r\n this.dlgSessionDetails.show();\r\n }\r\n\r\n // La finestra della ricerca, di default l'ultima ora\r\n private detailsWindow(): DetailsV2Options {\r\n let to = this.searchView.filterto ? this.dateExts.getDateConvertion(this.searchView.filterto).toDate() : new Date();\r\n let from = this.searchView.filterfrom ? this.dateExts.getDateConvertion(this.searchView.filterfrom).toDate() : new Date(to.getTime() - 3600 * 1000);\r\n return { from: from, to: to };\r\n }\r\n\r\n // Senza la Top Activity v2 \"Sessioni su questo evento\" non si propone; il nodo come radice c'è solo nel profiler v2\r\n showEventSessions(link: DetailsV2EventLink) {\r\n this.dlgDetailsV2.hide();\r\n }\r\n\r\n openInProfiler(nodeId: string) {\r\n this.dlgDetailsV2.hide();\r\n this.router.navigate([`/pages/${this.mod}/profiler`, ...(this.be ? [this.be] : [])], { queryParams: { root: nodeId } });\r\n }\r\n\r\n loadNodeDetails(nodeId: string) {\r\n this.NodeDetails = null;\r\n requestAnimationFrame(async () => {\r\n this.NodeDetails = await this.adms.getNodeStats(this.be, nodeId, this.searchView.filterglobal);\r\n });\r\n }\r\n\r\n // **************************************************** Trasformazione da searchview con unico elemento con tutto ai 3 elementi:\r\n // **************************************************** Grafico, TopNodes e TopSessions\r\n TopActiveSessions: LineChartData;\r\n TopNodes: TopNode[];\r\n TopSessions: TopSession[];\r\n DirInfos: DirectorInfos;\r\n DirInfosGlobal: DirectorInfos;\r\n seriesPropertiesMapping: { [index: string]: LineSerie } = {};\r\n propertiesSeriesMapping: { [index: string]: string } = {\r\n [\"cputime\"]: \"CPU\",\r\n [\"waittime\"]: \"Wait\",\r\n [\"scripttime\"]: \"Scripting\",\r\n [\"dbtime\"]: \"DB\",\r\n [\"nettime\"]: \"Network\",\r\n [\"throttletime\"]: \"Throttling\",\r\n [\"sleeptime\"]: \"Sleep\",\r\n [\"iotime\"]: \"IO\"\r\n };\r\n\r\n reviewBindings(update: boolean, searchViewOverride?, dirInfos?: DirectorInfos) {\r\n let reference = (searchViewOverride ?? this.searchView).items[0];\r\n this.TopNodes = reference.topnodes;\r\n this.TopSessions = reference.topsessions;\r\n this.DirInfos = dirInfos?.cluster ? dirInfos : null;\r\n this.DirInfosGlobal = !dirInfos?.cluster ? dirInfos : null;\r\n\r\n if (!reference.actsessions || reference.actsessions.length == 0) {\r\n this.TopActiveSessions = null;\r\n return;\r\n }\r\n\r\n let series: LineSerie[] = []; \r\n let props = Object.keys(reference.actsessions[0]);\r\n for (let i = 0; i < props.length; i++) {\r\n if (props[i] != 'sampletime') {\r\n let s = new LineSerie(this.propertiesSeriesMapping[props[i]], [], null, null, \"sessions\");\r\n series.push(s);\r\n this.seriesPropertiesMapping[props[i]] = s;\r\n }\r\n }\r\n\r\n for (let i = 0; i < reference.actsessions.length; i++) {\r\n let itemref = reference.actsessions[i];\r\n let theD = new Date(itemref.sampletime);\r\n\r\n for (let i = 0; i < props.length; i++)\r\n if (props[i] != 'sampletime' && (!update || this.dateExts.getDateConvertion(theD).isAfter(this.LastDataPoint)))\r\n this.seriesPropertiesMapping[props[i]].values.push(new DateValue(theD, itemref[props[i]]));\r\n }\r\n\r\n if (update && this.ChartInstance) {\r\n let data = new LineChartData(series, new Limit(dirInfos?.threads, this.lc.loc(\"Thread Massimi\")));\r\n if (series.some(t => t.values.length > 0)) {\r\n this.ChartInstance.addData(data);\r\n this.LastDataPoint = series.map(t => dayjs.max(t.values.map(v => this.dateExts.getDateConvertion(v.d))))[0];\r\n }\r\n }\r\n else {\r\n this.TopActiveSessions = new LineChartData(series, new Limit(dirInfos?.threads, this.lc.loc(\"Thread Massimi\")));\r\n this.LastDataPoint = series.map(t => dayjs.max(t.values.map(v => this.dateExts.getDateConvertion(v.d))))[0];\r\n }\r\n }\r\n\r\n // #region Gestione update automatico\r\n updateTimer: any;\r\n autoUpdateChanged() {\r\n if (!/^[1-9]\\d*$/.test(this.seconds))\r\n this.seconds = '10';\r\n const secondsInMs = parseInt(this.seconds, null) * 1000;\r\n if (this.autoUpdate) {\r\n this.sendSearch(false, true);\r\n this.updateTimer = setInterval(() => { this.sendSearch(false, true); }, secondsInMs);\r\n }\r\n else\r\n clearInterval(this.updateTimer);\r\n }\r\n // #endregion\r\n\r\n private from: Date;\r\n private to: Date;\r\n\r\n dataSelectionChanged(event: { from: Date, to: Date, initial: boolean }) {\r\n this.from = event.initial ? (this.searchView.filterfrom ? this.dateExts.getDateConvertion(this.searchView.filterfrom).toDate() : \"\") : event.from;\r\n this.to = event.initial ? (this.searchView.filterto ? this.dateExts.getDateConvertion(this.searchView.filterto).toDate() : \"\") : event.to;\r\n\r\n var pseudoSearchView: TopActivitiesDataView = JSON.parse(JSON.stringify(this.searchView));\r\n pseudoSearchView.filterfrom = this.from ? dayjs(this.from).format(this.lc.token(\"getFullDateDisplayFormat\")) : \"\";\r\n pseudoSearchView.filterto = this.to ? dayjs(this.to).format(this.lc.token(\"getFullDateDisplayFormat\")) : \"\";\r\n this.sendSearch(true, true, pseudoSearchView);\r\n }\r\n\r\n onChartLoaded(chart: BaseChartComponent<any>, overwriteInstance: boolean = true) {\r\n if(overwriteInstance)\r\n this.ChartInstance = chart;\r\n\r\n let readyHandler = () => {\r\n (chart.Chart as am5xy.XYChart).xAxes.each(x => x.zoom(0, 1, 0));\r\n (chart.Chart as am5xy.XYChart).yAxes.each(y => y.zoom(0, 1, 0));\r\n\r\n chart.Chart!.root.events.off(\"frameended\", readyHandler);\r\n };\r\n\r\n chart.Chart!.root.events.onDebounced(\"frameended\", readyHandler, 500);\r\n }\r\n\r\n // **************************************************** Gestione dettaglio sessione\r\n\r\n SessionDetails: SessionStats;\r\n SelectedTopNodes: TopNode[];\r\n SelectedSessions: LineChartData;\r\n\r\n seriesPropertiesMapping2: { [index: string]: LineSerie } = {};\r\n\r\n loadSessionDetails(sessionId: number, serialNo: number, instanceid: string) {\r\n this.SessionDetails = null;\r\n requestAnimationFrame(async () => {\r\n this.SessionDetails = await this.adms.getSessionStats(this.be, sessionId?.toString(), serialNo?.toString(), instanceid);\r\n this.threadSelectionChanged(null);\r\n });\r\n }\r\n\r\n threadSelectionChanged(selection?: ItemsSelection<SessionThread>) {\r\n this.SelectedTopNodes = null;\r\n this.SelectedSessions = null;\r\n\r\n requestAnimationFrame(() => {\r\n let sessDet = (selection?.count || 0) == 0 ? this.SessionDetails : selection.items[0];\r\n\r\n this.SelectedTopNodes = sessDet.nodes;\r\n\r\n let series: LineSerie[] = []; \r\n let props = Object.keys(sessDet.sessions[0]);\r\n for (let i = 0; i < props.length; i++) {\r\n if (props[i] != 'sampletime') {\r\n let s = new LineSerie(this.propertiesSeriesMapping[props[i]], [], null , null, \"sessions\");\r\n series.push(s);\r\n this.seriesPropertiesMapping2[props[i]] = s;\r\n }\r\n }\r\n \r\n for (let i = 0; i < sessDet.sessions.length; i++) {\r\n let itemref = sessDet.sessions[i];\r\n let theD = new Date(itemref.sampletime);\r\n \r\n for (let i = 0; i < props.length; i++)\r\n if (props[i] != 'sampletime')\r\n this.seriesPropertiesMapping2[props[i]].values.push(new DateValue(theD, itemref[props[i]]));\r\n }\r\n\r\n this.SelectedSessions = new LineChartData(series);\r\n\r\n });\r\n }\r\n}","<div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"card app-overflow-visible\" widget>\r\n <div class=\"card-header\">\r\n <span class=\"text-uppercase\">\r\n {{'Attività Principali' | localize: lc}}\r\n <span *ngIf=\"DirInfos && !DirInfosGlobal\"> - \r\n {{'' + DirInfos.cpus + ' ' + ('CPU' | localize: lc) + (DirInfos.rssplan ? ' - ' + DirInfos.rssplan : '')}} \r\n Load average: {{ DirInfos.lavg1 | number : '1.1-2' : 'it'}} {{ DirInfos.lavg5 | number : '1.1-2' : 'it'}} {{ DirInfos.lavg15 | number : '1.1-2' : 'it'}}\r\n </span> \r\n <span *ngIf=\"DirInfosGlobal\"> | \r\n {{'' + DirInfosGlobal.cpus + ' ' + ('CPU (Global)' | localize: lc) + (DirInfosGlobal.rssplan ? ' - ' + DirInfosGlobal.rssplan : '')}} \r\n Load average: {{ DirInfosGlobal.lavg1 | number : '1.1-2' : 'it'}} {{ DirInfosGlobal.lavg5 | number : '1.1-2' : 'it'}} {{ DirInfosGlobal.lavg15 | number : '1.1-2' : 'it'}}\r\n <span *ngIf=\"(DirInfosGlobal?.perinstancedata?.length || 0) > 0\">\r\n \r\n <a class=\"app-link app-pointer app-inline\" (click)=\"dlgDirInfos.show();\">[{{'Info per Istanza' | localize: lc}}...]</a>\r\n </span>\r\n </span> \r\n </span>\r\n </div>\r\n <div class=\"card-body widget-body\">\r\n <div class=\"col-md-12 app-relative\">\r\n <form role=\"form\">\r\n <div class=\"row app-first-filter-line\">\r\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\r\n <form-datetime [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterfrom\" name=\"filterfrom\" [Placeholder]=\"'Da' | localize: lc\"></form-datetime>\r\n </div>\r\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\r\n <form-datetime [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterto\" name=\"filterto\" [Placeholder]=\"'A' | localize: lc\"></form-datetime>\r\n </div>\r\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\r\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterglobal\" name=\"filterglobal\"></form-checkbox> \r\n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterglobal = !searchView.filterglobal\">{{'Globale' | localize: lc}}</span>\r\n </div>\r\n <button [disabled]=\"searchView.searchinprogress || autoUpdate\" class=\"input-group-addon btn app-btn-search app-margin-top-20\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\r\n\r\n <div class=\"app-absolute app-right-25 app-top-40\">\r\n <div class=\"pull-right\">\r\n {{'Aggiorna ogni' | localize: lc}} <input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control app-updevery-input\" type=\"text\" [(ngModel)]=\"seconds\" name=\"seconds\" /> {{'secondo/i' | localize: lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2 app-margin-right-5\">\r\n <label class=\"switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" name=\"autoUpdate\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-12 app-margin-top-5\">\r\n <p *ngIf=\"!searchView\"><em>{{'Carico i Dati' | localize: lc}}</em></p>\r\n <div *ngIf=\"searchView\" class=\"row\">\r\n <div class=\"col-md-12 app-no-padding\">\r\n <div style=\"width: 100%; height: 290px\">\r\n <es-line-chart *ngIf=\"TopActiveSessions\"\r\n [MinGridDistance]=\"65\"\r\n [Timeline]=\"false\"\r\n [FinalInstants]=\"false\"\r\n [Stacked]=\"true\"\r\n [LegendPadding]=\"{top: 0, bottom: 7, right: 0, left: 10}\"\r\n [Fill]=\"true\"\r\n [MergeDatasets]=\"true\"\r\n [Data]=\"TopActiveSessions\"\r\n [Legend]=\"true\" \r\n name=\"topactsession\"\r\n [DataGroupingThreshold]=\"99999999\"\r\n (onSelectionChanged)=\"dataSelectionChanged($event)\" (chartLoaded)=\"onChartLoaded($event)\"></es-line-chart>\r\n </div>\r\n </div>\r\n <div class=\"col-md-5\">\r\n <h5>{{'Prime Istruzioni' | localize: lc}}</h5>\r\n <es-table [(ngModel)]=\"TopNodes\" [HidePaging]=\"true\">\r\n <ng-template #header>\r\n <th class=\"app-col-min\">{{'Nodo' | localize: lc}}</th>\r\n <th>{{'Descrizione Nodo' | localize: lc}}</th>\r\n <th class=\"app-col-min\">{{'Attività' | localize: lc}}</th>\r\n <th class=\"app-col-min app-nowrap\">{{'Tipo Nodo' | localize: lc}}</th>\r\n <th class=\"app-col-min app-nowrap\">{{'Classe Attesa' | localize: lc}}</th>\r\n </ng-template>\r\n <ng-template #body let-node>\r\n <td class=\"app-col-min\"><span class=\"app-link\" (click)=\"openNodeDetails(node.profnodeid)\">{{node.profnodeid}}</span></td>\r\n <td><span title=\"{{node.profnodedesc}}\">{{node.profnodedesc.length > 40 ? node.profnodedesc.substr(0,40) + \"...\" : node.profnodedesc}}</span></td>\r\n <td class=\"app-nowrap\">{{node.activity | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{node.nodetypename}}</td>\r\n <td>{{node.waitclassname}}</td>\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n <div class=\"col-md-7\">\r\n <h5>{{'Prime Sessioni' | localize: lc}}</h5>\r\n <es-table [(ngModel)]=\"TopSessions\" [HidePaging]=\"true\">\r\n <ng-template #header>\r\n <th class=\"app-col-min\">ID</th>\r\n <th>{{'Utente' | localize: lc}}</th>\r\n <th>{{'Tenant' | localize : lc}}</th>\r\n <th>{{'Processo' | localize: lc}}</th>\r\n <th>{{'Attività' | localize: lc}}</th>\r\n <th>Cpu</th>\r\n <th>Wait</th>\r\n <th>DB</th>\r\n <th>Script</th>\r\n <th>Throttle</th>\r\n <th>Sleep</th>\r\n <th>Networking</th>\r\n <th>IO</th>\r\n </ng-template>\r\n\r\n <ng-template #body let-session>\r\n <td class=\"app-col-min\"><span class=\"app-link\" title=\"{{session.instanceid? (' - ' + session.instanceid) : ''}}\" (click)=\"openSessionDetails(session.sid, session.serial, session.instanceid)\">{{session.sid}}</span></td>\r\n <td>{{session.user}}</td>\r\n <td>{{session.tenant}}</td>\r\n <td>{{session.bgprocess}}</td>\r\n <td>{{session.activity | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.cpu | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.wait | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.db | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.script | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.throttle | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.sleep | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.net | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{session.io | number : '1.1-2' : 'it'}} %</td>\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div bsModal #dlgDirInfos=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-feminist\" emaDraggable>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title pull-left\">{{'Dettaglio per Istanza' | localize: lc}}</h4>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"dlgDirInfos.hide()\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\r\n </div>\r\n <div class=\"modal-body\" *ngIf=\"(DirInfosGlobal?.perinstancedata?.length || 0) > 0\">\r\n <div class=\"row\" *ngFor=\"let info of DirInfosGlobal.perinstancedata\">\r\n <div class=\"col-md-12\"> \r\n <strong>{{info.instance}}</strong>: \r\n {{'' + info.cpus + ' ' + ('CPU (Global)' | localize: lc) + (info.rssplan ? ' - ' + info.rssplan : '')}} \r\n Load average: {{ info.lavg1 | number : '1.1-2' : 'it'}} {{ info.lavg5 | number : '1.1-2' : 'it'}} {{ info.lavg15 | number : '1.1-2' : 'it'}}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"dlgDirInfos.hide()\">{{'Chiudi' | localize: lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div bsModal #dlgNodeDetails=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <node-detail *ngIf=\"NodeDetails\" [NodeDetails]=\"NodeDetails\" (onClose)=\"dlgNodeDetails.hide()\"></node-detail>\r\n</div>\r\n\r\n<div bsModal #dlgSessionDetails=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-feminist\" emaDraggable>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title pull-left\">{{'Dettaglio Sessione' | localize: lc}}<span *ngIf=\"SessionDetails\"> {{SessionDetails.sid}}</span></h4>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"dlgSessionDetails.hide()\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\r\n </div>\r\n <div class=\"modal-body\" *ngIf=\"SessionDetails\">\r\n <div class=\"row\">\r\n <div *ngIf=\"SessionDetails.instanceid\" class=\"col-md-6\"><strong>{{'Istanza' | localize: lc}}</strong>: {{SessionDetails.instanceid}} </div>\r\n <div class=\"col-md-6\"><strong>{{'Seriale' | localize: lc}}</strong>: {{SessionDetails.serial}} </div>\r\n <div class=\"col-md-6\"><strong>{{'Stato' | localize: lc}}</strong>: {{SessionDetails.status}} </div>\r\n <div class=\"col-md-6\"><strong>{{'Tipo' | localize: lc}}</strong>: {{SessionDetails.type}}</div>\r\n <div class=\"col-md-6\"><strong>{{'Utente' | localize: lc}}</strong>: {{SessionDetails.user}} <span *ngIf=\"SessionDetails.tenant\">({{SessionDetails.tenant}})</span></div>\r\n </div>\r\n\r\n <div style=\"display: flex; width: 100%; margin-top: 15px;\">\r\n <div style=\"flex-grow: 0;display: flex;flex-direction: column\">\r\n <h5>Prime Istruzioni</h5>\r\n <div *ngIf=\"SelectedTopNodes\">\r\n <es-table [(ngModel)]=\"SelectedTopNodes\" [ArraymodeItemsPerPage]=\"10\">\r\n <ng-template #header>\r\n <th class=\"app-col-min\">{{'Nodo' | localize: lc}}</th>\r\n <th>{{'Descrizione Nodo' | localize: lc}}</th>\r\n <th class=\"app-col-min\">{{'Attività' | localize: lc}}</th>\r\n <th class=\"app-col-min app-nowrap\">{{'Tipo Nodo' | localize: lc}}</th>\r\n <th class=\"app-col-min app-nowrap\">{{'Classe Attesa' | localize: lc}}</th>\r\n </ng-template>\r\n \r\n <ng-template #body let-node>\r\n <td class=\"app-col-min\"><span class=\"app-link\"(click)=\"loadNodeDetails(node.profnodeid); dlgNodeDetails.show();\">{{node.profnodeid}}</span></td>\r\n <td><span title=\"{{node.profnodedesc}}\">{{node.profnodedesc.length > 40 ? node.profnodedesc.substr(0,40) + \"...\" : node.profnodedesc}}</span></td>\r\n <td class=\"app-nowrap\">{{(node.activity == \"NaN\" ? null : node.activity) | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{node.nodetypename}}</td>\r\n <td>{{node.waitclassname}}</td>\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n </div>\r\n <div style=\"width: 15px;\"></div>\r\n <div style=\"flex-grow: 2;display: flex;flex-direction: column\">\r\n <h5>Attività</h5>\r\n <div *ngIf=\"SelectedSessions\" style=\"width: 100%; height: 290px\">\r\n <es-line-chart [MinGridDistance]=\"65\"\r\n [Timeline]=\"false\"\r\n [FinalInstants]=\"false\"\r\n [Stacked]=\"true\"\r\n [LegendPadding]=\"{top: 0, bottom: 7, right: 0, left: 10}\"\r\n [Fill]=\"true\"\r\n [MergeDatasets]=\"true\"\r\n [Data]=\"SelectedSessions\"\r\n [Legend]=\"true\" \r\n name=\"session_details\"\r\n [DataGroupingThreshold]=\"99999999\"\r\n (chartLoaded)=\"onChartLoaded($event, true)\">\r\n </es-line-chart>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n <div style=\"display: flex; width: 100%;\">\r\n <div style=\"flex-grow: 1;\">\r\n <h5>Statistiche Thread</h5>\r\n <div>\r\n <es-table [(ngModel)]=\"SessionDetails.threads\" [ArraymodeItemsPerPage]=\"10\" [Selection]=\"true\" [SingleSelection]=\"true\" (onSelectionChanged)=\"threadSelectionChanged($event)\">\r\n <ng-template #header>\r\n <th>Thread</th>\r\n <th>Stato</th>\r\n <th>Tipo</th>\r\n <th>API</th>\r\n <th>Attesa corrente</th>\r\n <th>Nodo di attesa</th>\r\n <th>Attesa su</th>\r\n <th>Classe</th>\r\n <th>Par. 1</th>\r\n <th>Par. 2</th>\r\n <th>Par. 3</th>\r\n <th>Tempo Attesa</th>\r\n </ng-template>\r\n \r\n <ng-template #body let-thread>\r\n <td>{{thread.tid}}</td>\r\n <td>{{thread.status}}</td>\r\n <td>{{thread.type}}</td>\r\n <td>{{thread.api}}</td>\r\n <td>{{thread.wait}}</td>\r\n <td>{{thread.waitnode}}</td>\r\n <td>{{thread.waiteventtype}}</td>\r\n <td>{{thread.waitclassname}}</td>\r\n <td>{{thread.waitpar1}}</td>\r\n <td>{{thread.waitpar2}}</td>\r\n <td>{{thread.waitpar3}}</td>\r\n <td>{{(thread.waittime == \"NaN\" ? null : thread.waittime) | number : '1.1-2' : 'it'}}</td>\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"dlgSessionDetails.hide()\">{{'Chiudi' | localize: lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Dettaglio v2 di nodo e sessione (DirectorFeature.DetailsV2) -->\r\n<div bsModal #dlgDetailsV2=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\" (onHidden)=\"detailsV2?.stop()\">\r\n @if (detailsV2Enabled) {\r\n <adm-details-v2 [Be]=\"be\" [CanShowSessions]=\"false\" [CanOpenProfiler]=\"!!profilerV2Enabled\" (closed)=\"dlgDetailsV2.hide()\"\r\n (sessionsOnEvent)=\"showEventSessions($event)\" (openProfiler)=\"openInProfiler($event)\"></adm-details-v2>\r\n }\r\n</div>\r\n","import { TopActivityDataSource, TopActivityDimension, TopActivityMaximumThreads, TopActivityResolution } from \"./TopActivityV2Enums\";\r\n\r\nexport class TopActivityV2Filter {\r\n dimension: TopActivityDimension;\r\n // key di un componente o di una riga; \"\" seleziona l'attività senza valore\r\n value: string;\r\n}\r\n\r\n// Richiesta della Top Activity v2: date in ISO UTC (…Z), campi non valorizzati = default del backend.\r\n// Il backend-for-frontend legge i nomi senza badare a maiuscole e minuscole\r\nexport class TopActivityV2Request {\r\n from?: string;\r\n to?: string;\r\n global?: boolean;\r\n instanceId?: string;\r\n dataSource?: TopActivityDataSource;\r\n dimension?: TopActivityDimension;\r\n filters?: TopActivityV2Filter[];\r\n totalActivity?: boolean;\r\n maximumThreads?: TopActivityMaximumThreads;\r\n resolution?: TopActivityResolution;\r\n maxComponents?: number;\r\n tablesFrom?: string;\r\n tablesTo?: string;\r\n tables?: TopActivityDimension[];\r\n topCount?: number;\r\n}\r\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmTopActivityV2Loc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Attività Principali\", [\"Top Activities\"]);\r\n super.set(\"it->en\", \"CPU\", [\"CPUs\"]);\r\n super.set(\"it->en\", \"Da\", [\"From\"]);\r\n super.set(\"it->en\", \"A\", [\"To\"]);\r\n super.set(\"it->en\", \"Cerca\", [\"Search\"]);\r\n super.set(\"it->en\", \"Istanza\", [\"Instance\"]);\r\n super.set(\"it->en\", \"Istanza corrente\", [\"Current instance\"]);\r\n super.set(\"it->en\", \"Tutte le istanze\", [\"All instances\"]);\r\n super.set(\"it->en\", \"Ultime\", [\"Last\"]);\r\n super.set(\"it->en\", \"Origine dati\", [\"Data source\"]);\r\n super.set(\"it->en\", \"Memoria\", [\"Memory\"]);\r\n super.set(\"it->en\", \"Memoria + storico\", [\"Memory + history\"]);\r\n super.set(\"it->en\", \"Aggiornamento automatico\", [\"Auto refresh\"]);\r\n super.set(\"it->en\", \"Dividi per\", [\"Split by\"]);\r\n super.set(\"it->en\", \"Risoluzione\", [\"Resolution\"]);\r\n super.set(\"it->en\", \"Bassa\", [\"Low\"]);\r\n super.set(\"it->en\", \"Media\", [\"Medium\"]);\r\n super.set(\"it->en\", \"Alta\", [\"High\"]);\r\n super.set(\"it->en\", \"Massima\", [\"Maximum\"]);\r\n super.set(\"it->en\", \"Attività totale\", [\"Total activity\"]);\r\n super.set(\"it->en\", \"Limite\", [\"Limit\"]);\r\n super.set(\"it->en\", \"Nessuno\", [\"None\"]);\r\n super.set(\"it->en\", \"CPU Massime\", [\"Maximum CPUs\"]);\r\n super.set(\"it->en\", \"Thread Massimi\", [\"Maximum Threads\"]);\r\n super.set(\"it->en\", \"Sessioni attive medie per\", [\"Average active sessions by\"]);\r\n super.set(\"it->en\", \"Picco\", [\"Peak\"]);\r\n super.set(\"it->en\", \"un punto ogni\", [\"one point every\"]);\r\n super.set(\"it->en\", \"stima per campionamento\", [\"sampling estimate\"]);\r\n super.set(\"it->en\", \"Valori stimati contando i campioni, come in Oracle, invece che misurati\", [\"Values estimated by counting samples, as in Oracle, rather than measured\"]);\r\n super.set(\"it->en\", \"Stima contando i campioni: il totale può differire di poco da quello misurato delle sessioni\", [\"Estimated by counting samples: the total may differ slightly from the measured sessions total\"]);\r\n super.set(\"it->en\", \"Filtri\", [\"Filters\"]);\r\n super.set(\"it->en\", \"Rimuovi\", [\"Remove\"]);\r\n super.set(\"it->en\", \"Clic per filtrare\", [\"Click to filter\"]);\r\n super.set(\"it->en\", \"Prima di questo istante i dati vengono dallo storico (un campione ogni 10 secondi)\", [\"Before this instant data comes from history (one sample every 10 seconds)\"]);\r\n super.set(\"it->en\", \"sessioni\", [\"sessions\"]);\r\n super.set(\"it->en\", \"Carico i Dati\", [\"Loading Data\"]);\r\n super.set(\"it->en\", \"Nessun dato nella finestra\", [\"No data in the window\"]);\r\n super.set(\"it->en\", \"Finestra tabelle\", [\"Tables window\"]);\r\n super.set(\"it->en\", \"Ultimi 5 minuti\", [\"Last 5 minutes\"]);\r\n super.set(\"it->en\", \"Finestra fissa\", [\"Fixed window\"]);\r\n super.set(\"it->en\", \"Prime righe per\", [\"Top rows by\"]);\r\n super.set(\"it->en\", \"Attività\", [\"Activity\"]);\r\n super.set(\"it->en\", \"Altri\", [\"Others\"]);\r\n super.set(\"it->en\", \"(non attribuito)\", [\"(not attributed)\"]);\r\n super.set(\"it->en\", \"(nessuno)\", [\"(none)\"]);\r\n super.set(\"it->en\", \"Classe di attesa\", [\"Wait class\"]);\r\n super.set(\"it->en\", \"Tipo evento\", [\"Event type\"]);\r\n super.set(\"it->en\", \"Nodo\", [\"Node\"]);\r\n super.set(\"it->en\", \"Sessione\", [\"Session\"]);\r\n super.set(\"it->en\", \"Utente\", [\"User\"]);\r\n super.set(\"it->en\", \"Tenant\", [\"Tenant\"]);\r\n super.set(\"it->en\", \"Tipo sessione\", [\"Session type\"]);\r\n super.set(\"it->en\", \"Sessione di background\", [\"Background session\"]);\r\n super.set(\"it->en\", \"Job\", [\"Job\"]);\r\n super.set(\"it->en\", \"Gruppo di consumo\", [\"Consumer group\"]);\r\n super.set(\"it->en\", \"Tipo thread\", [\"Thread type\"]);\r\n super.set(\"it->en\", \"Macchina\", [\"Machine\"]);\r\n super.set(\"it->en\", \"Tipo\", [\"Type\"]);\r\n super.set(\"it->en\", \"Processo\", [\"Process\"]);\r\n super.set(\"it->en\", \"Errore\", [\"Error\"]);\r\n }\r\n}\r\n","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class SessionDetailLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Dettaglio Sessione\", [\"Session Detail\"]);\r\n super.set(\"it->en\", \"Istanza\", [\"Instance\"]);\r\n super.set(\"it->en\", \"Seriale\", [\"Serial\"]);\r\n super.set(\"it->en\", \"Stato\", [\"Status\"]);\r\n super.set(\"it->en\", \"Tipo\", [\"Type\"]);\r\n super.set(\"it->en\", \"Utente\", [\"User\"]);\r\n super.set(\"it->en\", \"Prime Istruzioni\", [\"Top Nodes\"]);\r\n super.set(\"it->en\", \"Nodo\", [\"Node\"]);\r\n super.set(\"it->en\", \"Descrizione Nodo\", [\"Node Description\"]);\r\n super.set(\"it->en\", \"Attività\", [\"Activity\"]);\r\n super.set(\"it->en\", \"Tipo Nodo\", [\"Node Type\"]);\r\n super.set(\"it->en\", \"Classe Attesa\", [\"Wait Class Name\"]);\r\n super.set(\"it->en\", \"Statistiche Thread\", [\"Thread Statistics\"]);\r\n super.set(\"it->en\", \"Attesa corrente\", [\"Current Wait\"]);\r\n super.set(\"it->en\", \"Nodo di attesa\", [\"Wait Node\"]);\r\n super.set(\"it->en\", \"Attesa su\", [\"Waiting On\"]);\r\n super.set(\"it->en\", \"Classe\", [\"Class\"]);\r\n super.set(\"it->en\", \"Tempo Attesa\", [\"Wait Time\"]);\r\n super.set(\"it->en\", \"Chiudi\", [\"Close\"]);\r\n }\r\n}\r\n","// Angular\r\nimport { Component, EventEmitter, Input, Output } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { BaseChartComponent, DateValue, LineChartData, LineSerie } from \"@esfaenza/es-charts\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { ItemsSelection } from \"@esfaenza/es-table\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport * as am5xy from \"@amcharts/amcharts5/xy\";\r\n\r\n// Applicazione\r\nimport { SessionStats } from \"../../models/components/SessionStats\";\r\nimport { SessionThread } from \"../../models/components/SessionThread\";\r\nimport { TopNode } from \"../../models/components/TopNode\";\r\n\r\n// Localizzazione\r\nimport { SessionDetailLoc } from \"./session_detail.component.loc\";\r\n\r\n// Dettaglio sessione condiviso (stesso contenuto del dialog della pagina Top Activity di sempre): il dialog che lo ospita resta del chiamante,\r\n// il clic su un nodo viene rilanciato con onNodeSelected perché il dettaglio nodo è anch'esso un dialog del chiamante\r\n@Component({\r\n selector: \"session-detail\",\r\n viewProviders: [{ provide: LocalizationService, useClass: SessionDetailLoc }],\r\n templateUrl: \"./session_detail.component.html\",\r\n // Il componente sta fra il bsModal e il .modal-dialog: inline perderebbe la centratura del dialog\r\n styles: [\":host { display: block; }\"],\r\n standalone: false\r\n})\r\nexport class SessionDetailComponent {\r\n\r\n @Input() SessionDetails: SessionStats;\r\n\r\n @Output() onClose: EventEmitter<boolean> = new EventEmitter<boolean>();\r\n @Output() onNodeSelected: EventEmitter<string> = new EventEmitter<string>();\r\n\r\n SelectedTopNodes: TopNode[];\r\n SelectedSessions: LineChartData;\r\n\r\n private seriesPropertiesMapping: { [index: string]: LineSerie } = {};\r\n private propertiesSeriesMapping: { [index: string]: string } = {\r\n [\"cputime\"]: \"CPU\",\r\n [\"waittime\"]: \"Wait\",\r\n [\"scripttime\"]: \"Scripting\",\r\n [\"dbtime\"]: \"DB\",\r\n [\"nettime\"]: \"Network\",\r\n [\"throttletime\"]: \"Throttling\",\r\n [\"sleeptime\"]: \"Sleep\",\r\n [\"iotime\"]: \"IO\"\r\n };\r\n\r\n constructor(public lc: LocalizationService) { }\r\n\r\n ngOnInit() {\r\n this.threadSelectionChanged(null);\r\n }\r\n\r\n threadSelectionChanged(selection?: ItemsSelection<SessionThread>) {\r\n this.SelectedTopNodes = null;\r\n this.SelectedSessions = null;\r\n\r\n requestAnimationFrame(() => {\r\n let sessDet = (selection?.count || 0) == 0 ? this.SessionDetails : selection.items[0];\r\n\r\n this.SelectedTopNodes = sessDet.nodes;\r\n\r\n if (!sessDet.sessions || sessDet.sessions.length == 0)\r\n return;\r\n\r\n let series: LineSerie[] = [];\r\n let props = Object.keys(sessDet.sessions[0]);\r\n for (let i = 0; i < props.length; i++) {\r\n if (props[i] != 'sampletime') {\r\n let s = new LineSerie(this.propertiesSeriesMapping[props[i]], [], null, null, \"sessions\");\r\n series.push(s);\r\n this.seriesPropertiesMapping[props[i]] = s;\r\n }\r\n }\r\n\r\n for (let i = 0; i < sessDet.sessions.length; i++) {\r\n let itemref = sessDet.sessions[i];\r\n let theD = new Date(itemref.sampletime);\r\n\r\n for (let i = 0; i < props.length; i++)\r\n if (props[i] != 'sampletime')\r\n this.seriesPropertiesMapping[props[i]].values.push(new DateValue(theD, itemref[props[i]]));\r\n }\r\n\r\n this.SelectedSessions = new LineChartData(series);\r\n });\r\n }\r\n\r\n onChartLoaded(chart: BaseChartComponent<any>) {\r\n let readyHandler = () => {\r\n (chart.Chart as am5xy.XYChart).xAxes.each(x => x.zoom(0, 1, 0));\r\n (chart.Chart as am5xy.XYChart).yAxes.each(y => y.zoom(0, 1, 0));\r\n\r\n chart.Chart!.root.events.off(\"frameended\", readyHandler);\r\n };\r\n\r\n chart.Chart!.root.events.onDebounced(\"frameended\", readyHandler, 500);\r\n }\r\n\r\n closeDialog() {\r\n this.onClose.emit(true);\r\n }\r\n}\r\n","<div class=\"modal-dialog modal-xl\" emaDraggable>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title pull-left\">{{'Dettaglio Sessione' | localize: lc}}<span *ngIf=\"SessionDetails\"> {{SessionDetails.sid}}</span></h4>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"closeDialog()\" aria-label=\"Close\"><span aria-hidden=\"true\">×</span></button>\r\n </div>\r\n <div class=\"modal-body\" *ngIf=\"SessionDetails\">\r\n <div class=\"row\">\r\n <div *ngIf=\"SessionDetails.instanceid\" class=\"col-md-6\"><strong>{{'Istanza' | localize: lc}}</strong>: {{SessionDetails.instanceid}} </div>\r\n <div class=\"col-md-6\"><strong>{{'Seriale' | localize: lc}}</strong>: {{SessionDetails.serial}} </div>\r\n <div class=\"col-md-6\"><strong>{{'Stato' | localize: lc}}</strong>: {{SessionDetails.status}} </div>\r\n <div class=\"col-md-6\"><strong>{{'Tipo' | localize: lc}}</strong>: {{SessionDetails.type}}</div>\r\n <div class=\"col-md-6\"><strong>{{'Utente' | localize: lc}}</strong>: {{SessionDetails.user}} <span *ngIf=\"SessionDetails.tenant\">({{SessionDetails.tenant}})</span></div>\r\n </div>\r\n\r\n <!-- Istruzioni e grafico affiancati finché c'è spazio, altrimenti il grafico va sotto -->\r\n <div style=\"display: flex; flex-wrap: wrap; gap: 15px; width: 100%; margin-top: 15px;\">\r\n <div style=\"flex: 1 1 520px; min-width: 0; display: flex; flex-direction: column\">\r\n <h5>{{'Prime Istruzioni' | localize: lc}}</h5>\r\n <div *ngIf=\"SelectedTopNodes\">\r\n <es-table [(ngModel)]=\"SelectedTopNodes\" [ArraymodeItemsPerPage]=\"10\">\r\n <ng-template #header>\r\n <th class=\"app-col-min\">{{'Nodo' | localize: lc}}</th>\r\n <th>{{'Descrizione Nodo' | localize: lc}}</th>\r\n <th class=\"app-col-min\">{{'Attività' | localize: lc}}</th>\r\n <th class=\"app-col-min app-nowrap\">{{'Tipo Nodo' | localize: lc}}</th>\r\n <th class=\"app-col-min app-nowrap\">{{'Classe Attesa' | localize: lc}}</th>\r\n </ng-template>\r\n\r\n <ng-template #body let-node>\r\n <td class=\"app-col-min\"><span class=\"app-link\" (click)=\"onNodeSelected.emit(node.profnodeid)\">{{node.profnodeid}}</span></td>\r\n <td><span title=\"{{node.profnodedesc}}\">{{node.profnodedesc?.length > 40 ? node.profnodedesc.substr(0,40) + \"...\" : node.profnodedesc}}</span></td>\r\n <td class=\"app-nowrap\">{{(node.activity == \"NaN\" ? null : node.activity) | number : '1.1-2' : 'it'}} %</td>\r\n <td>{{node.nodetypename}}</td>\r\n <td>{{node.waitclassname}}</td>\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n </div>\r\n <div style=\"flex: 1 1 380px; min-width: 0; display: flex; flex-direction: column\">\r\n <h5>{{'Attività' | localize: lc}}</h5>\r\n <div *ngIf=\"SelectedSessions\" style=\"width: 100%; height: 290px\">\r\n <es-line-chart [MinGridDistance]=\"65\"\r\n [Timeline]=\"false\"\r\n [FinalInstants]=\"false\"\r\n [Stacked]=\"true\"\r\n [LegendPadding]=\"{top: 0, bottom: 7, right: 0, left: 10}\"\r\n [Fill]=\"true\"\r\n [MergeDatasets]=\"true\"\r\n [Data]=\"SelectedSessions\"\r\n [Legend]=\"true\"\r\n name=\"shared_session_details\"\r\n [DataGroupingThreshold]=\"99999999\"\r\n (chartLoaded)=\"onChartLoaded($event)\">\r\n </es-line-chart>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"display: flex; width: 100%;\">\r\n <div style=\"flex-grow: 1;\">\r\n <h5>{{'Statistiche Thread' | localize: lc}}</h5>\r\n <div>\r\n <es-table [(ngModel)]=\"SessionDetails.threads\" [ArraymodeItemsPerPage]=\"10\" [Selection]=\"true\" [SingleSelection]=\"true\" (onSelectionChanged)=\"threadSelectionChanged($event)\">\r\n <ng-template #header>\r\n <th>Thread</th>\r\n <th>{{'Stato' | localize: lc}}</th>\r\n <th>{{'Tipo' | localize: lc}}</th>\r\n <th>API</th>\r\n <th>{{'Attesa corrente' | localize: lc}}</th>\r\n <th>{{'Nodo di attesa' | localize: lc}}</th>\r\n <th>{{'Attesa su' | localize: lc}}</th>\r\n <th>{{'Classe' | localize: lc}}</th>\r\n <th>Par. 1</th>\r\n <th>Par. 2</th>\r\n <th>Par. 3</th>\r\n <th>{{'Tempo Attesa' | localize: lc}}</th>\r\n </ng-template>\r\n\r\n <ng-template #body let-thread>\r\n <td>{{thread.tid}}</td>\r\n <td>{{thread.status}}</td>\r\n <td>{{thread.type}}</td>\r\n <td>{{thread.api}}</td>\r\n <td>{{thread.wait}}</td>\r\n <td>{{thread.waitnode}}</td>\r\n <td>{{thread.waiteventtype}}</td>\r\n <td>{{thread.waitclassname}}</td>\r\n <td>{{thread.waitpar1}}</td>\r\n <td>{{thread.waitpar2}}</td>\r\n <td>{{thread.waitpar3}}</td>\r\n <td>{{(thread.waittime == \"NaN\" ? null : thread.waittime) | number : '1.1-2' : 'it'}}</td>\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"closeDialog()\">{{'Chiudi' | localize: lc}}</button>\r\n </div>\r\n </div>\r\n</div>\r\n","// Angular\r\nimport { Component, Inject, NgZone, Optional, ViewChild } from \"@angular/core\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\n\r\n// Configurazioni\r\nimport { BaseChartComponent, DateValue, Limit, LineChartData, LineSerie } from \"@esfaenza/es-charts\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { DateService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport * as am5 from \"@amcharts/amcharts5\";\r\nimport { ModalDirective } from \"ngx-bootstrap/modal\";\r\nimport { firstValueFrom } from \"rxjs\";\r\n\r\n// Modelli\r\nimport { DirectorInfos } from \"../../models/components/DirectorInfos\";\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { NodeStats } from \"../../models/components/NodeStats\";\r\nimport { SessionStats } from \"../../models/components/SessionStats\";\r\nimport { TopActivityDataSource, TopActivityDimension, TopActivityMaximumThreads, TopActivityResolution } from \"../../models/components/TopActivityV2Enums\";\r\nimport { TopActivityV2Filter, TopActivityV2Request } from \"../../models/components/TopActivityV2Request\";\r\nimport { TopActivityV2Breakdown, TopActivityV2Response, TopActivityV2Session, TopActivityV2Table, TopActivityV2TableItem } from \"../../models/components/TopActivityV2Response\";\r\n\r\n// Applicazione\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { LIMIT_COLOR, OTHER_COLOR, TOTAL_COLOR, bucketInterval, componentColor, parseUtc } from \"../_shared/activity_chart_v2\";\r\nimport { AdmDetailsV2Component, DetailsV2EventLink, DetailsV2Options } from \"../details_v2/details_v2.component\";\r\nimport { ADM_DETAILS_V2, ADM_MODULE_PATH, ADM_PROFILER_V2 } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmTopActivityV2Loc } from \"./topact_v2.component.loc\";\r\n\r\ndeclare var dayjs;\r\n\r\nconst STORAGE_KEY = \"HotSearchTopActV2\";\r\nconst TABLES_WINDOW_MS = 5 * 60 * 1000;\r\nconst INSTANCE_CURRENT = \"@current\";\r\nconst INSTANCE_ALL = \"@all\";\r\n\r\nexport class TopActivityV2LegendItem {\r\n key: string;\r\n label: string;\r\n color: string;\r\n other: boolean;\r\n activity: number;\r\n percentage: number;\r\n}\r\n\r\nexport class TopActivityV2FilterChip {\r\n filter: TopActivityV2Filter;\r\n label: string;\r\n}\r\n\r\n// Impostazioni ricordate fra una visita e l'altra (finestra temporale e istanza ripartono sempre dai default)\r\nclass TopActivityV2Settings {\r\n dataSource: string;\r\n dimension: string;\r\n resolution: string;\r\n totalActivity: boolean;\r\n maxCpu: boolean;\r\n maxThreadsKind: string;\r\n tableDims: string[];\r\n filters: TopActivityV2FilterChip[];\r\n}\r\n\r\n@Component({\r\n selector: \"topact_v2\",\r\n providers: [{ provide: LocalizationService, useClass: AdmTopActivityV2Loc }],\r\n templateUrl: \"./topact_v2.component.html\",\r\n styleUrls: [\"./topact_v2.component.scss\"],\r\n standalone: false\r\n})\r\nexport class AdmTopActivityV2Component {\r\n @ViewChild(\"dlgNodeDetails\") dlgNodeDetails: ModalDirective;\r\n @ViewChild(\"dlgSessionDetails\") dlgSessionDetails: ModalDirective;\r\n @ViewChild(\"dlgDetailsV2\") dlgDetailsV2: ModalDirective;\r\n @ViewChild(AdmDetailsV2Component) detailsV2: AdmDetailsV2Component;\r\n\r\n public readonly Dim = TopActivityDimension;\r\n public readonly TotalColor = TOTAL_COLOR;\r\n public readonly LimitColor = LIMIT_COLOR;\r\n\r\n // Filtri\r\n public filterfrom: string = \"\";\r\n public filterto: string = \"\";\r\n // Di default tutte le istanze: è il quadro che serve aprendo la pagina, e non viene ricordato fra una visita e l'altra\r\n public instance: string = INSTANCE_ALL;\r\n public dataSource: string = String(TopActivityDataSource.MemoryAndStored);\r\n public dimension: string = String(TopActivityDimension.WaitClass);\r\n public resolution: string = String(TopActivityResolution.Medium);\r\n public totalActivity: boolean = false;\r\n public maxCpu: boolean = true;\r\n public maxThreadsKind: string = String(TopActivityMaximumThreads.Threads);\r\n public tableDims: string[] = [String(TopActivityDimension.UserSession), String(TopActivityDimension.WaitEvent)];\r\n public filters: TopActivityV2FilterChip[] = [];\r\n public refreshSeconds: string = \"0\";\r\n // Ore dell'intervallo rapido scelto (null se le date sono state scritte a mano)\r\n public activeRange: number = 1;\r\n\r\n // Sorgenti di select e pulsanti\r\n public Instances: KeyValue[] = [];\r\n public DataSources: KeyValue[] = [];\r\n public Dimensions: KeyValue[] = [];\r\n public Resolutions: KeyValue[] = [];\r\n public LimitOptions: KeyValue[] = [];\r\n public RefreshOptions: KeyValue[] = [];\r\n public readonly QuickRanges: number[] = [1, 6, 24];\r\n\r\n // Risultato\r\n public loading: boolean = false;\r\n public result: TopActivityV2Response;\r\n public chartData: LineChartData;\r\n public chartMax: number;\r\n public legend: TopActivityV2LegendItem[] = [];\r\n public tables: TopActivityV2Table[] = [];\r\n public memoryFrom: string;\r\n public limitLabel: string;\r\n\r\n // Time slider: fine della finestra di 5 minuti delle tabelle, in millisecondi\r\n public sliderMin: number = 0;\r\n public sliderMax: number = 0;\r\n public sliderStep: number = 1000;\r\n public sliderValue: number = 0;\r\n public sliderAnchored: boolean = true;\r\n public tablesWindowLabel: string = \"\";\r\n\r\n // Dettagli\r\n public DirInfos: DirectorInfos;\r\n public NodeDetails: NodeStats;\r\n public SessionDetails: SessionStats;\r\n\r\n public be: string;\r\n private chartFrom: number = 0;\r\n private chartTo: number = 0;\r\n private colors: { [key: string]: string } = {};\r\n private lastChartKey: string;\r\n private chart: BaseChartComponent<any>;\r\n private windowAxis: any;\r\n private windowRange: any;\r\n private refreshTimer: any;\r\n\r\n constructor(\r\n public dateExts: DateService,\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService,\r\n private zone: NgZone,\r\n private router: Router,\r\n @Inject(ADM_MODULE_PATH) private mod: string,\r\n // Con DirectorFeature.DetailsV2 nodi e sessioni si aprono nel dettaglio v2; \"Apri nel profiler\" vuole il profiler v2\r\n @Optional() @Inject(ADM_DETAILS_V2) public detailsV2Enabled: boolean,\r\n @Optional() @Inject(ADM_PROFILER_V2) public profilerV2Enabled: boolean) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.buildSources();\r\n\r\n let saved = this.route.snapshot.queryParams[\"ignoreStorage\"] ? null : await firstValueFrom(this.localStorage.getItem<TopActivityV2Settings>(STORAGE_KEY), { defaultValue: null });\r\n if (saved)\r\n this.applySettings(saved);\r\n\r\n this.setLastHours(this.activeRange);\r\n\r\n // \"Sessioni su questo evento\" dal dettaglio di un nodo aperto in un'altra pagina (profiler): filtro sull'evento, stessa finestra\r\n let query = this.route.snapshot.queryParams;\r\n if (query[\"event\"])\r\n this.applyEventFilter(query[\"event\"], query[\"eventName\"], query[\"from\"] ? new Date(query[\"from\"]) : null, query[\"to\"] ? new Date(query[\"to\"]) : null);\r\n\r\n this.loadInstances();\r\n this.refreshInfos();\r\n this.search();\r\n }\r\n\r\n ngOnDestroy() {\r\n clearInterval(this.refreshTimer);\r\n }\r\n\r\n // #region Ricerca\r\n\r\n searchClicked() {\r\n this.refreshInfos();\r\n this.search();\r\n }\r\n\r\n quickRange(hours: number) {\r\n this.activeRange = hours;\r\n this.setLastHours(hours);\r\n this.search();\r\n }\r\n\r\n datesEdited() {\r\n this.activeRange = null;\r\n }\r\n\r\n setDataSource(id: string) {\r\n this.dataSource = id;\r\n this.search();\r\n }\r\n\r\n setResolution(id: string) {\r\n this.resolution = id;\r\n this.search();\r\n }\r\n\r\n // Limite: \"0\" nessuno, altrimenti il tipo (thread o CPU)\r\n get limitValue(): string {\r\n return this.maxCpu ? this.maxThreadsKind : String(TopActivityMaximumThreads.None);\r\n }\r\n\r\n setLimit(id: string) {\r\n this.maxCpu = +id != TopActivityMaximumThreads.None;\r\n if (this.maxCpu)\r\n this.maxThreadsKind = id;\r\n this.search();\r\n }\r\n\r\n setRefresh(id: string) {\r\n this.refreshSeconds = id;\r\n this.refreshChanged();\r\n }\r\n\r\n async search() {\r\n let req = this.buildRequest();\r\n this.loading = true;\r\n try {\r\n let res = await this.adms.getTopActivitiesV2(this.be, req);\r\n this.applyResult(req, res);\r\n this.saveSettings();\r\n }\r\n catch (err) {\r\n // Finestra non valida e simili arrivano come 542 (avviso), il resto come errore. La sessione scaduta la gestisce il servizio\r\n if (err?.status != 401)\r\n this.showError(err);\r\n }\r\n finally {\r\n this.loading = false;\r\n }\r\n }\r\n\r\n private showError(err: any) {\r\n let text = this.adms.errorText(err);\r\n if (err?.status == 542)\r\n this.adms.msgExts.simpleWarning(text);\r\n else\r\n this.adms.msgExts.simpleError(`${this.lc.loc(\"Errore\")} ${err?.status ?? \"\"}: ${text}`);\r\n }\r\n\r\n private buildRequest(): TopActivityV2Request {\r\n let to = this.toDate(this.filterto) ?? new Date();\r\n let from = this.toDate(this.filterfrom) ?? new Date(to.getTime() - 3600 * 1000);\r\n\r\n let req = new TopActivityV2Request();\r\n req.from = from.toISOString();\r\n req.to = to.toISOString();\r\n req.global = this.instance != INSTANCE_CURRENT;\r\n if (this.instance != INSTANCE_CURRENT && this.instance != INSTANCE_ALL)\r\n req.instanceId = this.instance;\r\n req.dataSource = +this.dataSource;\r\n req.dimension = +this.dimension;\r\n if (this.filters.length > 0)\r\n req.filters = this.filters.map(t => t.filter);\r\n req.totalActivity = this.totalActivity;\r\n req.maximumThreads = this.maxCpu ? +this.maxThreadsKind : TopActivityMaximumThreads.None;\r\n req.resolution = +this.resolution;\r\n req.tables = this.tableDims.map(t => +t);\r\n req.topCount = 10;\r\n\r\n // Lo slider agganciato a destra segue la fine del grafico; spostato resta fermo finché cade dentro la finestra\r\n let outside = this.sliderValue <= from.getTime() || this.sliderValue > to.getTime();\r\n if (this.sliderAnchored || outside) {\r\n this.sliderAnchored = true;\r\n this.sliderValue = to.getTime();\r\n }\r\n req.tablesTo = new Date(this.sliderValue).toISOString();\r\n req.tablesFrom = new Date(Math.max(from.getTime(), this.sliderValue - TABLES_WINDOW_MS)).toISOString();\r\n return req;\r\n }\r\n\r\n private applyResult(req: TopActivityV2Request, res: TopActivityV2Response) {\r\n this.result = res;\r\n this.tables = res?.tables ?? [];\r\n this.chartFrom = new Date(req.from).getTime();\r\n this.chartTo = new Date(req.to).getTime();\r\n\r\n this.sliderStep = Math.max(1, res?.bucketSeconds || 1) * 1000;\r\n this.sliderMin = Math.min(this.chartTo, this.chartFrom + TABLES_WINDOW_MS);\r\n this.sliderMax = this.chartTo;\r\n this.sliderValue = new Date(req.tablesTo).getTime();\r\n this.updateTablesWindowLabel();\r\n\r\n if (!res) {\r\n this.chartData = null;\r\n this.legend = [];\r\n this.lastChartKey = null;\r\n return;\r\n }\r\n\r\n let memoryFrom = res.memoryFrom ? parseUtc(res.memoryFrom) : null;\r\n this.memoryFrom = memoryFrom && memoryFrom.getTime() > this.chartFrom ? this.fmt(memoryFrom) : null;\r\n this.limitLabel = this.lc.loc(+this.maxThreadsKind == TopActivityMaximumThreads.Cores ? \"CPU Massime\" : \"Thread Massimi\");\r\n\r\n // Se è cambiata solo la finestra delle tabelle il grafico resta quello di prima: ridisegnarlo lo farebbe lampeggiare\r\n let chartKey = JSON.stringify({ ...req, tablesFrom: null, tablesTo: null, tables: null, topCount: null });\r\n if (chartKey == this.lastChartKey && this.chartData) {\r\n this.drawTablesWindow();\r\n return;\r\n }\r\n this.lastChartKey = chartKey;\r\n\r\n let times = (res.times ?? []).map(t => parseUtc(t));\r\n let interval = bucketInterval(res.bucketSeconds);\r\n let fixed = res.dimension == TopActivityDimension.WaitClass || res.dimension == TopActivityDimension.EventType;\r\n let uom = this.lc.loc(\"sessioni\");\r\n let series: LineSerie[] = [];\r\n\r\n this.colors = {};\r\n this.legend = (res.components ?? []).map((c, i) => {\r\n let color = componentColor(c.key, c.other, i, fixed);\r\n if (c.key != null)\r\n this.colors[c.key] = color;\r\n let label = this.valueLabel(c.label, c.other, res.dimension);\r\n series.push(new LineSerie(label, times.map((t, j) => new DateValue(t, c.values?.[j] ?? 0)), interval, color, uom));\r\n return { key: c.key, label: label, color: color, other: c.other, activity: c.activity, percentage: c.percentage };\r\n });\r\n\r\n // L'attività totale è una linea scura sopra le aree impilate, non impilata a sua volta\r\n if (res.totalActivity)\r\n series.push(new LineSerie(this.lc.loc(\"Attività totale\"), times.map((t, j) => new DateValue(t, res.totalActivity[j] ?? 0)), interval, TOTAL_COLOR, uom, false, false));\r\n\r\n let limit: Limit = null;\r\n if (res.maximumThreads != null)\r\n limit = new Limit(res.maximumThreads, this.limitLabel, LIMIT_COLOR);\r\n\r\n // L'asse Y non si allarga da solo per le linee limite: lo allargo solo se l'attività arriva ad almeno un quarto del limite,\r\n // altrimenti con il sistema scarico il grafico diventerebbe una riga piatta sul fondo (il valore del limite resta in legenda)\r\n let peak = Math.max(res.peakActiveSessions ?? 0, ...(res.totalActivity ?? [0]));\r\n this.chartMax = limit && peak >= res.maximumThreads / 4 ? Math.max(peak, res.maximumThreads) * 1.1 : undefined;\r\n this.chartData = series.length > 0 ? new LineChartData(series, limit) : null;\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Grafico, legenda e filtri\r\n\r\n onChartLoaded(chart: BaseChartComponent<any>) {\r\n // Il grafico viene ricreato a ogni cambio di dati: l'area della finestra delle tabelle va rifatta\r\n this.chart = chart;\r\n this.windowAxis = null;\r\n this.drawTablesWindow();\r\n }\r\n\r\n private drawTablesWindow() {\r\n let dateAxis = (this.chart?.ChartService as any)?.dateAxis;\r\n if (!dateAxis || !this.sliderMax)\r\n return;\r\n\r\n let end = this.sliderValue;\r\n let start = Math.max(this.chartFrom, end - TABLES_WINDOW_MS);\r\n\r\n this.zone.runOutsideAngular(() => {\r\n if (this.windowAxis !== dateAxis) {\r\n this.windowAxis = dateAxis;\r\n this.windowRange = dateAxis.makeDataItem({ value: start, endValue: end });\r\n dateAxis.createAxisRange(this.windowRange);\r\n this.windowRange.get(\"axisFill\")?.setAll({ fill: am5.color(0x6366f1), fillOpacity: 0.12, visible: true });\r\n this.windowRange.get(\"grid\")?.set(\"forceHidden\", true);\r\n this.windowRange.get(\"label\")?.set(\"forceHidden\", true);\r\n }\r\n else\r\n this.windowRange.setAll({ value: start, endValue: end });\r\n });\r\n }\r\n\r\n addFilter(item: TopActivityV2LegendItem) {\r\n // Il componente \"altri\" non è filtrabile, come in Oracle\r\n if (item.other || !this.result)\r\n return;\r\n\r\n let filter = new TopActivityV2Filter();\r\n filter.dimension = this.result.dimension;\r\n filter.value = item.key ?? \"\";\r\n if (this.filters.some(t => t.filter.dimension == filter.dimension && t.filter.value == filter.value))\r\n return;\r\n\r\n this.filters.push({ filter: filter, label: `${this.dimensionLabel(filter.dimension)} = ${item.label}` });\r\n this.totalActivity = true;\r\n this.search();\r\n }\r\n\r\n removeFilter(index: number) {\r\n this.filters.splice(index, 1);\r\n this.search();\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Time slider e tabelle\r\n\r\n sliderMoving() {\r\n this.updateTablesWindowLabel();\r\n this.drawTablesWindow();\r\n }\r\n\r\n sliderChanged() {\r\n // Il range input arrotonda al passo: \"agganciato\" se è a meno di un passo dalla fine\r\n this.sliderAnchored = this.sliderMax - this.sliderValue < this.sliderStep;\r\n this.search();\r\n }\r\n\r\n private updateTablesWindowLabel() {\r\n if (!this.sliderMax) {\r\n this.tablesWindowLabel = \"\";\r\n return;\r\n }\r\n let start = Math.max(this.chartFrom, this.sliderValue - TABLES_WINDOW_MS);\r\n this.tablesWindowLabel = `${this.fmt(new Date(start))} - ${this.fmt(new Date(this.sliderValue))}`;\r\n }\r\n\r\n isClickable(item: TopActivityV2TableItem): boolean {\r\n return !item.other && (!!item.session || !!item.event?.eventId);\r\n }\r\n\r\n openItem(item: TopActivityV2TableItem) {\r\n if (!this.isClickable(item))\r\n return;\r\n if (item.session)\r\n this.loadSessionDetails(item.session);\r\n else\r\n this.loadNodeDetails(item.event.eventId);\r\n }\r\n\r\n breakdownWidth(item: TopActivityV2TableItem, part: TopActivityV2Breakdown): number {\r\n return item.activity ? part.activity / item.activity * 100 : 0;\r\n }\r\n\r\n breakdownColor(part: TopActivityV2Breakdown): string {\r\n return part.other || part.key == null ? OTHER_COLOR : this.colors[part.key] ?? OTHER_COLOR;\r\n }\r\n\r\n itemLabel(item: TopActivityV2TableItem, table: TopActivityV2Table): string {\r\n return this.valueLabel(item.label, item.other, table.dimension);\r\n }\r\n\r\n loadNodeDetails(nodeId: string) {\r\n if (this.detailsV2Enabled) {\r\n // D4: tutte le istanze, l'istanza scelta, oppure quella che risponde\r\n let instance = this.instance != INSTANCE_CURRENT && this.instance != INSTANCE_ALL ? this.instance : null;\r\n let memoryFrom = this.result?.memoryFrom ? parseUtc(this.result.memoryFrom) : null;\r\n this.detailsV2.openNode(nodeId, { ...this.detailsWindow(), global: this.instance == INSTANCE_ALL, instanceId: instance, memoryFrom: memoryFrom });\r\n this.dlgDetailsV2.show();\r\n return;\r\n }\r\n this.NodeDetails = null;\r\n this.dlgNodeDetails.show();\r\n requestAnimationFrame(async () => {\r\n this.NodeDetails = await this.adms.getNodeStats(this.be, nodeId, this.instance != INSTANCE_CURRENT);\r\n });\r\n }\r\n\r\n loadSessionDetails(session: TopActivityV2Session) {\r\n if (this.detailsV2Enabled) {\r\n this.detailsV2.openSession(session.instanceId, session.sessionId, session.serialNo, { ...this.detailsWindow(), realTime: +this.dataSource == TopActivityDataSource.Memory });\r\n this.dlgDetailsV2.show();\r\n return;\r\n }\r\n this.SessionDetails = null;\r\n this.dlgSessionDetails.show();\r\n requestAnimationFrame(async () => {\r\n this.SessionDetails = await this.adms.getSessionStats(this.be, session.sessionId?.toString(), session.serialNo?.toString(), session.instanceId);\r\n });\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Dettaglio v2 di nodo e sessione\r\n\r\n // Il dettaglio eredita la finestra del grafico, non quella delle tabelle, e l'aggiornamento automatico della pagina (D2, D5)\r\n private detailsWindow(): DetailsV2Options {\r\n return { from: new Date(this.chartFrom), to: new Date(this.chartTo), refreshSeconds: +this.refreshSeconds };\r\n }\r\n\r\n // N8: questa pagina filtrata sull'evento esatto, con la tabella per sessione e la finestra del dettaglio\r\n showEventSessions(link: DetailsV2EventLink) {\r\n this.dlgDetailsV2.hide();\r\n this.applyEventFilter(link.nodeId, link.nodeName, link.from, link.to);\r\n this.search();\r\n }\r\n\r\n // N7: il profiler v2 con il nodo come radice\r\n openInProfiler(nodeId: string) {\r\n this.dlgDetailsV2.hide();\r\n this.router.navigate([`/pages/${this.mod}/profiler`, ...(this.be ? [this.be] : [])], { queryParams: { root: nodeId } });\r\n }\r\n\r\n private applyEventFilter(nodeId: string, nodeName: string, from: Date, to: Date) {\r\n let filter = new TopActivityV2Filter();\r\n filter.dimension = TopActivityDimension.WaitEvent;\r\n filter.value = nodeId;\r\n this.filters = [{ filter: filter, label: `${this.dimensionLabel(TopActivityDimension.WaitEvent)} = ${nodeName || nodeId}` }];\r\n this.tableDims = [String(TopActivityDimension.UserSession), this.tableDims[1] ?? String(TopActivityDimension.WaitEvent)];\r\n if (from && to && !isNaN(from.getTime()) && !isNaN(to.getTime())) {\r\n this.filterfrom = this.fmt(from);\r\n this.filterto = this.fmt(to);\r\n this.activeRange = null;\r\n }\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Aggiornamento automatico\r\n\r\n refreshChanged() {\r\n clearInterval(this.refreshTimer);\r\n this.refreshTimer = null;\r\n\r\n let seconds = +this.refreshSeconds;\r\n if (seconds > 0)\r\n this.refreshTimer = setInterval(() => this.shiftWindow(), seconds * 1000);\r\n }\r\n\r\n // Sposta in avanti la finestra della stessa durata: lo slider agganciato la segue, quello spostato resta dov'è\r\n private shiftWindow() {\r\n if (this.loading)\r\n return;\r\n\r\n let to = this.toDate(this.filterto) ?? new Date();\r\n let from = this.toDate(this.filterfrom) ?? new Date(to.getTime() - 3600 * 1000);\r\n let now = new Date();\r\n this.filterfrom = this.fmt(new Date(now.getTime() - (to.getTime() - from.getTime())));\r\n this.filterto = this.fmt(now);\r\n this.search();\r\n }\r\n\r\n // #endregion\r\n\r\n // #region Supporto\r\n\r\n private buildSources() {\r\n this.DataSources = [\r\n new KeyValue(String(TopActivityDataSource.Memory), this.lc.loc(\"Memoria\")),\r\n new KeyValue(String(TopActivityDataSource.MemoryAndStored), this.lc.loc(\"Memoria + storico\"))\r\n ];\r\n this.Dimensions = Object.keys(TopActivityDimension).filter(t => !isNaN(+t)).map(t => new KeyValue(t, this.dimensionLabel(+t)));\r\n this.Resolutions = [\r\n new KeyValue(String(TopActivityResolution.Low), this.lc.loc(\"Bassa\")),\r\n new KeyValue(String(TopActivityResolution.Medium), this.lc.loc(\"Media\")),\r\n new KeyValue(String(TopActivityResolution.High), this.lc.loc(\"Alta\")),\r\n new KeyValue(String(TopActivityResolution.Maximum), this.lc.loc(\"Massima\"))\r\n ];\r\n this.LimitOptions = [\r\n new KeyValue(String(TopActivityMaximumThreads.None), this.lc.loc(\"Nessuno\")),\r\n new KeyValue(String(TopActivityMaximumThreads.Threads), \"Thread\"),\r\n new KeyValue(String(TopActivityMaximumThreads.Cores), \"CPU\")\r\n ];\r\n this.RefreshOptions = [\r\n new KeyValue(\"0\", \"Off\"),\r\n new KeyValue(\"15\", \"15 s\"),\r\n new KeyValue(\"30\", \"30 s\"),\r\n new KeyValue(\"60\", \"60 s\")\r\n ];\r\n this.Instances = [\r\n new KeyValue(INSTANCE_ALL, this.lc.loc(\"Tutte le istanze\")),\r\n new KeyValue(INSTANCE_CURRENT, this.lc.loc(\"Istanza corrente\"))\r\n ];\r\n }\r\n\r\n private async loadInstances() {\r\n try {\r\n let instances = await this.adms.getInstances(this.be);\r\n this.Instances = [...this.Instances.slice(0, 2), ...(instances ?? []).map(t => new KeyValue(t.id, t.description))];\r\n }\r\n catch {\r\n // Senza elenco istanze restano \"corrente\" e \"tutte\"\r\n }\r\n }\r\n\r\n private async refreshInfos() {\r\n // DirectorInfos è facoltativo: se scoppia la pagina va avanti lo stesso\r\n this.DirInfos = await this.adms.getInfos(this.be);\r\n }\r\n\r\n dimensionLabel(dimension: TopActivityDimension): string {\r\n switch (dimension) {\r\n case TopActivityDimension.WaitClass: return this.lc.loc(\"Classe di attesa\");\r\n case TopActivityDimension.EventType: return this.lc.loc(\"Tipo evento\");\r\n case TopActivityDimension.WaitEvent: return this.lc.loc(\"Nodo\");\r\n case TopActivityDimension.Instance: return this.lc.loc(\"Istanza\");\r\n case TopActivityDimension.UserSession: return this.lc.loc(\"Sessione\");\r\n case TopActivityDimension.UserName: return this.lc.loc(\"Utente\");\r\n case TopActivityDimension.Tenant: return this.lc.loc(\"Tenant\");\r\n case TopActivityDimension.SessionType: return this.lc.loc(\"Tipo sessione\");\r\n case TopActivityDimension.BackgroundSession: return this.lc.loc(\"Sessione di background\");\r\n case TopActivityDimension.JobName: return this.lc.loc(\"Job\");\r\n case TopActivityDimension.ConsumerGroup: return this.lc.loc(\"Gruppo di consumo\");\r\n case TopActivityDimension.ThreadType: return this.lc.loc(\"Tipo thread\");\r\n case TopActivityDimension.Api: return \"API\";\r\n case TopActivityDimension.Machine: return this.lc.loc(\"Macchina\");\r\n case TopActivityDimension.Thread: return \"Thread\";\r\n }\r\n return String(dimension);\r\n }\r\n\r\n private valueLabel(label: string, other: boolean, dimension: TopActivityDimension): string {\r\n if (other)\r\n return this.lc.loc(\"Altri\");\r\n if (label == null || label === \"\")\r\n return this.lc.loc(dimension == TopActivityDimension.WaitEvent ? \"(non attribuito)\" : \"(nessuno)\");\r\n return label;\r\n }\r\n\r\n private applySettings(saved: TopActivityV2Settings) {\r\n this.dataSource = saved.dataSource ?? this.dataSource;\r\n this.dimension = saved.dimension ?? this.dimension;\r\n this.resolution = saved.resolution ?? this.resolution;\r\n this.totalActivity = saved.totalActivity ?? this.totalActivity;\r\n this.maxCpu = saved.maxCpu ?? this.maxCpu;\r\n this.maxThreadsKind = saved.maxThreadsKind ?? this.maxThreadsKind;\r\n this.tableDims = saved.tableDims?.length == 2 ? saved.tableDims : this.tableDims;\r\n // Filtri salvati con i nomi delle prime versioni (PascalCase) non sono più validi\r\n this.filters = (saved.filters ?? []).filter(t => t?.filter?.dimension != null);\r\n }\r\n\r\n private saveSettings() {\r\n let settings: TopActivityV2Settings = {\r\n dataSource: this.dataSource,\r\n dimension: this.dimension,\r\n resolution: this.resolution,\r\n totalActivity: this.totalActivity,\r\n maxCpu: this.maxCpu,\r\n maxThreadsKind: this.maxThreadsKind,\r\n tableDims: this.tableDims,\r\n filters: this.filters\r\n };\r\n this.localStorage.setItem(STORAGE_KEY, settings).subscribe();\r\n }\r\n\r\n private setLastHours(hours: number) {\r\n let now = new Date();\r\n this.filterfrom = this.fmt(new Date(now.getTime() - hours * 3600 * 1000));\r\n this.filterto = this.fmt(now);\r\n }\r\n\r\n private toDate(value: string): Date {\r\n return value ? this.dateExts.getDateConvertion(value).toDate() : null;\r\n }\r\n\r\n private fmt(date: Date): string {\r\n return dayjs(date).format(this.lc.token(\"getFullDateDisplayFormat\"));\r\n }\r\n\r\n // #endregion\r\n}\r\n","<div class=\"row\">\r\n <div class=\"col-12\">\r\n <div class=\"card app-overflow-visible\" widget>\r\n <div class=\"card-header\">\r\n <span class=\"text-uppercase\">\r\n {{'Attività Principali' | localize: lc}}\r\n @if (DirInfos) {\r\n <span> - \r\n {{'' + DirInfos.cpus + ' ' + ('CPU' | localize: lc) + (DirInfos.rssplan ? ' - ' + DirInfos.rssplan : '')}} \r\n Load average: {{ DirInfos.lavg1 | number : '1.1-2' : 'it'}} {{ DirInfos.lavg5 | number : '1.1-2' : 'it'}} {{ DirInfos.lavg15 | number : '1.1-2' : 'it'}}\r\n </span>\r\n }\r\n </span>\r\n </div>\r\n <div class=\"card-body widget-body\">\r\n <!-- Barra in alto: quali dati caricare (finestra, istanza, origine). Come disegnarli sta nell'intestazione del grafico -->\r\n <form role=\"form\">\r\n <!-- Tre gruppi che vanno a capo interi: periodo, sorgente (con la ricerca), aggiornamento automatico -->\r\n <div class=\"tav2-toolbar\">\r\n <div class=\"tav2-cluster\">\r\n <div class=\"tav2-field\">\r\n <form-datetime [readonly]=\"refreshSeconds != '0'\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterfrom\" name=\"filterfrom\" [Placeholder]=\"'Da' | localize: lc\" (inputChange)=\"datesEdited()\"></form-datetime>\r\n </div>\r\n <div class=\"tav2-field\">\r\n <form-datetime [readonly]=\"refreshSeconds != '0'\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterto\" name=\"filterto\" [Placeholder]=\"'A' | localize: lc\" (inputChange)=\"datesEdited()\"></form-datetime>\r\n </div>\r\n <div class=\"tav2-group\">\r\n <span class=\"tav2-group-label\">{{'Ultime' | localize: lc}}</span>\r\n <div class=\"tav2-seg\">\r\n @for (h of QuickRanges; track h) {\r\n <button type=\"button\" [class.tav2-on]=\"activeRange == h\" (click)=\"quickRange(h)\">{{h}} h</button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"tav2-cluster\">\r\n <div class=\"tav2-field tav2-field-wide tav2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"instance\" name=\"instance\" [Source]=\"Instances\" [Placeholder]=\"'Istanza' | localize: lc\" (inputChange)=\"search()\"></form-select>\r\n </div>\r\n <div class=\"tav2-group\">\r\n <span class=\"tav2-group-label\">{{'Origine dati' | localize: lc}}</span>\r\n <div class=\"tav2-seg\">\r\n @for (o of DataSources; track o.id) {\r\n <button type=\"button\" [class.tav2-on]=\"dataSource == o.id\" (click)=\"setDataSource(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n <button [disabled]=\"loading || refreshSeconds != '0'\" class=\"btn app-btn-search\" (click)=\"searchClicked()\" type=\"submit\" [title]=\"'Cerca' | localize: lc\">\r\n <i class=\"fa\" [class.fa-search]=\"!loading\" [class.fa-spinner]=\"loading\" [class.fa-spin]=\"loading\"></i>\r\n </button>\r\n </div>\r\n\r\n <div class=\"tav2-cluster tav2-cluster-end\">\r\n <div class=\"tav2-group\">\r\n <span class=\"tav2-group-label\"><i class=\"fa fa-refresh\"></i> {{'Aggiornamento automatico' | localize: lc}}</span>\r\n <div class=\"tav2-seg\">\r\n @for (o of RefreshOptions; track o.id) {\r\n <button type=\"button\" [class.tav2-on]=\"refreshSeconds == o.id\" (click)=\"setRefresh(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n\r\n <!-- Grafico -->\r\n <div class=\"tav2-panel\">\r\n <div class=\"tav2-panel-header tav2-chart-header\">\r\n <div class=\"tav2-heading\">\r\n <span class=\"tav2-title\">{{'Sessioni attive medie per' | localize: lc}} {{dimensionLabel(result?.dimension ?? +dimension) | lowercase}}</span>\r\n @if (result) {\r\n <span class=\"tav2-muted\">\r\n {{'Media' | localize: lc}} <strong>{{result.estimated ? '≈ ' : ''}}{{result.averageActiveSessions | number : '1.2-3' : 'it'}}</strong>\r\n · {{'Picco' | localize: lc}} <strong>{{result.estimated ? '≈ ' : ''}}{{result.peakActiveSessions | number : '1.2-3' : 'it'}}</strong>\r\n · {{'un punto ogni' | localize: lc}} {{result.bucketSeconds}} s\r\n @if (result.estimated) {\r\n <span class=\"tav2-estimate\" [title]=\"'Valori stimati contando i campioni, come in Oracle, invece che misurati' | localize: lc\">{{'stima per campionamento' | localize: lc}}</span>\r\n }\r\n @if (loading) {\r\n <i class=\"fa fa-spinner fa-spin\"></i>\r\n }\r\n </span>\r\n }\r\n </div>\r\n\r\n <!-- Come disegnare i dati -->\r\n <div class=\"tav2-view-controls\">\r\n <div class=\"tav2-field tav2-field-wide tav2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"dimension\" name=\"dimension\" [Source]=\"Dimensions\" [Placeholder]=\"'Dividi per' | localize: lc\" (inputChange)=\"search()\"></form-select>\r\n </div>\r\n <div class=\"tav2-group\">\r\n <span class=\"tav2-group-label\">{{'Risoluzione' | localize: lc}}</span>\r\n <div class=\"tav2-seg\">\r\n @for (o of Resolutions; track o.id) {\r\n <button type=\"button\" [class.tav2-on]=\"resolution == o.id\" (click)=\"setResolution(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"tav2-group\">\r\n <span class=\"tav2-group-label\">{{'Limite' | localize: lc}}</span>\r\n <div class=\"tav2-seg\">\r\n @for (o of LimitOptions; track o.id) {\r\n <button type=\"button\" [class.tav2-on]=\"limitValue == o.id\" (click)=\"setLimit(o.id)\">{{o.description}}</button>\r\n }\r\n </div>\r\n </div>\r\n <div class=\"tav2-toggle\">\r\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"totalActivity\" (inputChange)=\"search()\"></form-checkbox>\r\n <span class=\"tav2-pointer\" (click)=\"totalActivity = !totalActivity; search()\">{{'Attività totale' | localize: lc}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n @if (filters.length > 0) {\r\n <div class=\"tav2-chips\">\r\n <span class=\"tav2-muted\">{{'Filtri' | localize: lc}}</span>\r\n @for (chip of filters; track $index) {\r\n <span class=\"tav2-chip\">\r\n {{chip.label}}\r\n <button type=\"button\" [title]=\"'Rimuovi' | localize: lc\" (click)=\"removeFilter($index)\">×</button>\r\n </span>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"tav2-chart\">\r\n @if (chartData) {\r\n <es-line-chart [MinGridDistance]=\"65\"\r\n [Timeline]=\"false\"\r\n [FinalInstants]=\"false\"\r\n [Stacked]=\"true\"\r\n [Step]=\"true\"\r\n [Fill]=\"true\"\r\n [MergeDatasets]=\"true\"\r\n [AllowGaps]=\"false\"\r\n [Data]=\"chartData\"\r\n [Max]=\"chartMax\"\r\n [Legend]=\"false\"\r\n name=\"topactv2\"\r\n [DataGroupingThreshold]=\"99999999\"\r\n (chartLoaded)=\"onChartLoaded($event)\"></es-line-chart>\r\n } @else {\r\n <div class=\"tav2-empty\">{{(loading ? 'Carico i Dati' : 'Nessun dato nella finestra') | localize: lc}}</div>\r\n }\r\n </div>\r\n\r\n <!-- Legenda: un clic su una voce la aggiunge ai filtri (\"altri\" non è filtrabile) -->\r\n @if (legend.length > 0) {\r\n <div class=\"tav2-legend\">\r\n @for (item of legend; track $index) {\r\n <span class=\"tav2-legend-item\" [class.tav2-clickable]=\"!item.other\" [title]=\"item.other ? '' : ('Clic per filtrare' | localize: lc)\" (click)=\"addFilter(item)\">\r\n <span class=\"tav2-swatch\" [style.background]=\"item.color\"></span>\r\n {{item.label}}\r\n <span class=\"tav2-muted\">{{item.percentage | number : '1.0-1' : 'it'}}%</span>\r\n </span>\r\n }\r\n @if (result?.totalActivity) {\r\n <span class=\"tav2-legend-item\">\r\n <span class=\"tav2-line\" [style.border-color]=\"TotalColor\"></span>\r\n {{'Attività totale' | localize: lc}}\r\n </span>\r\n }\r\n @if (result?.maximumThreads != null) {\r\n <span class=\"tav2-legend-item\">\r\n <span class=\"tav2-line\" [style.border-color]=\"LimitColor\"></span>\r\n {{limitLabel}} <strong>{{result.maximumThreads}}</strong>\r\n </span>\r\n }\r\n </div>\r\n }\r\n\r\n @if (memoryFrom) {\r\n <div class=\"tav2-note\">\r\n <i class=\"fa fa-info-circle\"></i>\r\n {{'Prima di questo istante i dati vengono dallo storico (un campione ogni 10 secondi)' | localize: lc}}: {{memoryFrom}}\r\n </div>\r\n }\r\n\r\n <!-- Time slider: finestra di 5 minuti per le tabelle -->\r\n @if (sliderMax > sliderMin) {\r\n <div class=\"tav2-slider\">\r\n <span class=\"tav2-slider-label\">\r\n <span class=\"tav2-muted\">{{'Finestra tabelle' | localize: lc}}</span>\r\n <strong>{{tablesWindowLabel}}</strong>\r\n </span>\r\n <input type=\"range\" [min]=\"sliderMin\" [max]=\"sliderMax\" [step]=\"sliderStep\" [ngModel]=\"sliderValue\" (ngModelChange)=\"sliderValue = $event; sliderMoving()\" (change)=\"sliderChanged()\" />\r\n <span class=\"tav2-badge\" [class.tav2-badge-off]=\"!sliderAnchored\">{{(sliderAnchored ? 'Ultimi 5 minuti' : 'Finestra fissa') | localize: lc}}</span>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Tabelle -->\r\n <div class=\"tav2-tables\">\r\n @for (table of tables; track $index; let i = $index) {\r\n <div class=\"tav2-panel\">\r\n <div class=\"tav2-panel-header\">\r\n <span class=\"tav2-title\">{{'Prime righe per' | localize: lc}}</span>\r\n <div class=\"tav2-field tav2-field-wide tav2-noclear\">\r\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"tableDims[i]\" name=\"tabledim{{i}}\" [Source]=\"Dimensions\" (inputChange)=\"search()\"></form-select>\r\n </div>\r\n <span class=\"tav2-muted\">{{'Attività' | localize: lc}} <strong>{{table.estimated ? '≈ ' : ''}}{{table.activity | number : '1.2-3' : 'it'}}</strong></span>\r\n @if (table.estimated) {\r\n <span class=\"tav2-estimate\" [title]=\"'Stima contando i campioni: il totale può differire di poco da quello misurato delle sessioni' | localize: lc\">{{'stima per campionamento' | localize: lc}}</span>\r\n }\r\n </div>\r\n <es-table [(ngModel)]=\"table.items\" [HidePaging]=\"true\">\r\n <ng-template #header>\r\n <th>{{dimensionLabel(table.dimension)}}</th>\r\n <th class=\"app-col-min\">{{'Attività' | localize: lc}}</th>\r\n <th class=\"app-col-min tav2-right\">%</th>\r\n @if (table.dimension == Dim.UserSession) {\r\n <th>{{'Utente' | localize: lc}}</th>\r\n <th>{{'Tipo' | localize: lc}}</th>\r\n <th>{{'Processo' | localize: lc}}</th>\r\n }\r\n @if (table.dimension == Dim.WaitEvent) {\r\n <th class=\"app-col-min app-nowrap\">{{'Tipo' | localize: lc}}</th>\r\n }\r\n </ng-template>\r\n <ng-template #body let-item>\r\n <td>\r\n @if (isClickable(item)) {\r\n <span class=\"app-link tav2-ellipsis\" [title]=\"item.label || item.key\" (click)=\"openItem(item)\">{{itemLabel(item, table)}}</span>\r\n } @else {\r\n <span class=\"tav2-ellipsis\" [class.tav2-muted]=\"item.other || !item.label\">{{itemLabel(item, table)}}</span>\r\n }\r\n </td>\r\n <td class=\"app-nowrap\">\r\n <div class=\"tav2-bar-cell\">\r\n <div class=\"tav2-bar\">\r\n @for (part of item.breakdown; track $index) {\r\n <div [style.width.%]=\"breakdownWidth(item, part)\" [style.background]=\"breakdownColor(part)\" [title]=\"part.key\"></div>\r\n }\r\n </div>\r\n <span>{{table.estimated ? '≈ ' : ''}}{{item.activity | number : '1.2-3' : 'it'}}</span>\r\n </div>\r\n </td>\r\n <td class=\"app-nowrap tav2-right\">{{item.percentage | number : '1.1-1' : 'it'}}</td>\r\n @if (table.dimension == Dim.UserSession) {\r\n <td class=\"app-nowrap\">\r\n {{item.session?.userName}}\r\n @if (item.session?.tenantId) {\r\n <span class=\"tav2-muted\">· {{item.session.tenantId}}</span>\r\n }\r\n </td>\r\n <td class=\"tav2-muted\">{{item.session?.sessionType | titlecase}}</td>\r\n <td><span class=\"tav2-ellipsis tav2-ellipsis-short\" [title]=\"item.session?.bgProcessName || item.session?.jobName || ''\">{{item.session?.bgProcessName || item.session?.jobName}}</span></td>\r\n }\r\n @if (table.dimension == Dim.WaitEvent) {\r\n <td class=\"app-nowrap\">\r\n {{item.event?.eventType}}\r\n @if (item.event?.waitClass && item.event.waitClass != 'None') {\r\n <span class=\"tav2-muted\">· {{item.event.waitClass}}</span>\r\n }\r\n </td>\r\n }\r\n </ng-template>\r\n </es-table>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- Dettaglio v2 di nodo e sessione (DirectorFeature.DetailsV2) -->\r\n<div bsModal #dlgDetailsV2=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\" (onHidden)=\"detailsV2?.stop()\">\r\n @if (detailsV2Enabled) {\r\n <adm-details-v2 [Be]=\"be\" [CanShowSessions]=\"true\" [CanOpenProfiler]=\"!!profilerV2Enabled\" (closed)=\"dlgDetailsV2.hide()\"\r\n (sessionsOnEvent)=\"showEventSessions($event)\" (openProfiler)=\"openInProfiler($event)\"></adm-details-v2>\r\n }\r\n</div>\r\n\r\n<div bsModal #dlgNodeDetails=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n @if (NodeDetails) {\r\n <node-detail [NodeDetails]=\"NodeDetails\" (onClose)=\"dlgNodeDetails.hide()\"></node-detail>\r\n }\r\n</div>\r\n\r\n<div bsModal #dlgSessionDetails=\"bs-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n @if (SessionDetails) {\r\n <session-detail [SessionDetails]=\"SessionDetails\" (onClose)=\"dlgSessionDetails.hide()\" (onNodeSelected)=\"loadNodeDetails($event)\"></session-detail>\r\n }\r\n</div>\r\n","import { AppSearch, GenericItem } from \"@esfaenza/es-table\";\r\n\r\nexport class LocksView extends AppSearch<GenericItem>{\r\n constructor() { super(); }\r\n\r\n filtersid: string;\r\n filterlock: string;\r\n filterglobal: boolean;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmEnqLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Ricerca Lock Applicativi\", [\"Search Application Locks\"]);\r\n super.set(\"it->en\", \"Nome\", [\"Name\"]);\r\n super.set(\"it->en\", \"Carico i Lock Applicativi\", [\"Loading Application Locks\"]);\r\n super.set(\"it->en\", \"Globale\", [\"Global\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { ExportService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Applicazione\r\nimport { LocksView } from \"../../models/components/LocksView\";\r\nimport { ADM_MODULE_PATH } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmEnqLoc } from \"./adm_enq.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { GenericItem } from \"@esfaenza/core/domain\";\r\n\r\n@Component({\r\n selector: \"adm_enq\",\r\n viewProviders: [{ provide: LocalizationService, useClass: AdmEnqLoc }],\r\n templateUrl: \"./adm_enq.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmEnqComponent {\r\n public locksView: LocksView = new LocksView();\r\n public storageSub: any;\r\n private be: string;\r\n\r\n constructor(\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n public expExts: ExportService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private location: Location,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n ngOnInit() {\r\n this.storageSub = this.route.queryParams.subscribe(params => { this.Init(params[\"ignoreStorage\"]); });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n async Init(ignoreStorage) {\r\n let item = await this.localStorage.getItem<LocksView>(\"HotEnqueue\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/serverenqueues`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotEnqueue\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: LocksView) {\r\n if (HotPotato) {\r\n this.locksView = HotPotato;\r\n this.POSTGetProcesses(this.locksView);\r\n }\r\n else {\r\n this.locksView = new LocksView();\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n if (resetPage)\r\n this.locksView.page = 1;\r\n\r\n this.POSTGetProcesses(this.locksView);\r\n }\r\n\r\n async POSTGetProcesses(data: LocksView) {\r\n this.locksView = await this.adms.getServerLocks(this.be, data);\r\n this.locksView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotEnqueue\", this.locksView).subscribe();\r\n }\r\n\r\n async prepareExport(callback) {\r\n var view = JSON.parse(JSON.stringify(this.locksView));\r\n view.page = 1;\r\n view.itemsperpageoverride = 9999999;\r\n let tmp = await this.adms.getServerLocks(this.be, view);\r\n callback(tmp.items, GenericItem);\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Ricerca Lock Applicativi' | localize: lc}}</span>\n </div>\n <div class=\"card-body widget-body\">\n <form role=\"form\">\n <div class=\"col-md-12 row app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"locksView.filtersid\" name=\"filtersid\" [Placeholder]=\"'SID'\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"locksView.filterlock\" name=\"filterlock\" [Placeholder]=\"'Nome' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"locksView.filterglobal\" name=\"filterglobal\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"locksView.filterglobal = !locksView.filterglobal\">{{'Globale' | localize: lc}}</span>\n </div>\n <button class=\"input-group-addon btn app-btn-search app-margin-top-20\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n </form>\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!locksView) {\n <p><em>{{'Carico i Lock Applicativi' | localize: lc}}...</em></p>\n }\n @if (locksView) {\n <div>\n <es-table [(ngModel)]=\"locksView\" [AutoUpdate]=\"true\" [OrderByColumn]=\"true\" (onSearchRequest)=\"sendSearch($event);\"\n [ExportFileName]=\"'Application Locks.csv'\" [ExportFunction]=\"prepareExport.bind(this)\" [Export]=\"true\"></es-table>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>","import { AppSearch } from \"@esfaenza/es-table\";\r\nimport { Metric } from \"./Metric\";\r\n\r\nexport class MetricsView extends AppSearch<Metric> {\r\n constructor() { super(); }\r\n\r\n filterfrom: string;\r\n filterto: string;\r\n filtersid: string;\r\n filterserial: string;\r\n filtermetrics: string[];\r\n filterrealtime: boolean;\r\n fitlerinstance: string;\r\n filterglobal: boolean;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmMetricsLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Metriche di Sistema\", [\"System Metrics\"]);\r\n super.set(\"it->en\", \"Cod. Sessione\", [\"Session ID\"]);\r\n super.set(\"it->en\", \"Seriale Sessione\", [\"Session Serial\"]);\r\n super.set(\"it->en\", \"Filtra Metriche...\", [\"Filter Metrics...\"]);\r\n super.set(\"it->en\", \"Carico i Dati\", [\"Loading Data\"]);\r\n super.set(\"it->en\", \"Aggiorna ogni\", [\"Update every\"]);\r\n super.set(\"it->en\", \"secondo/i\", [\"second/s\"]);\r\n super.set(\"it->en\", \"Istanza Metriche\", [\"Metrics Instance\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { BaseChartComponent } from \"@esfaenza/es-charts\";\r\nimport { DateService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Applicazione\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { Metric } from \"../../models/components/Metric\";\r\nimport { MetricChart } from \"../../models/components/MetricChart\";\r\nimport { MetricsView } from \"../../models/components/MetricsView\";\r\nimport { ADM_MODULE_PATH } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmMetricsLoc } from \"./metrics_search.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\n\r\ndeclare var dayjs;\r\n\r\n@Component({\r\n selector: \"metrics_search\",\r\n providers: [{ provide: LocalizationService, useClass: AdmMetricsLoc }],\r\n templateUrl: \"./metrics_search.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmMetricsComponent {\r\n\r\n public Metrics: Metric[];\r\n private MetricsChartCache: { [name: string]: { chart: BaseChartComponent<any>, lastTs: Date } } = {};\r\n\r\n public searchView: MetricsView = new MetricsView();\r\n public storageSub: any;\r\n\r\n public autoUpdate: boolean = false;\r\n public seconds: string = \"5\";\r\n private be: string;\r\n\r\n constructor(\r\n public dateExts: DateService,\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private location: Location,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n ngOnInit() {\r\n this.storageSub = this.route.queryParams.subscribe(params => {\r\n this.Init(params[\"ignoreStorage\"]);\r\n });\r\n }\r\n\r\n Init(ignoreStore) {\r\n this.doInit(ignoreStore);\r\n }\r\n\r\n async dateChanged() {\r\n // Pulizia di tutti i parametri di ricerca dipendenti dalle date\r\n this.metricsToShow = [];\r\n this.Metrics = [];\r\n this.instanceRequired = false;\r\n this.Instances = [];\r\n this.selectedInstance = \"\";\r\n this.searchView.filtermetrics = [];\r\n\r\n this.Metrics = await this.adms.getMetricsList(this.be, this.searchView.filterfrom || \"\", this.searchView.filterto || \"\");\r\n }\r\n\r\n async doInit(ignoreStorage) {\r\n let item = await this.localStorage.getItem<MetricsView>(\"HotSearchMetrics\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/metrics`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotSearchMetrics\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: MetricsView) {\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetItems(this.searchView, false);\r\n }\r\n else {\r\n this.searchView = new MetricsView();\r\n this.sendSearch();\r\n }\r\n this.dateChanged();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n sendSearch(resetPage: boolean = true, update: boolean = false, searchViewOverride: MetricsView = null) {\r\n if (!update)\r\n this.MetricsChartCache = {};\r\n\r\n this.searchView.searchinprogress = true;\r\n // Questa ricerca prende i nomi distinct delle metriche quindi devo prendere tutto per forza\r\n this.searchView.itemsperpageoverride = 999999;\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n this.POSTGetItems(searchViewOverride ?? this.searchView, update);\r\n }\r\n\r\n public Instances: KeyValue[] = []\r\n public selectedInstance = \"\";\r\n public instanceRequired: boolean = false;\r\n public metricsToShow: Metric[] = [];\r\n\r\n async POSTGetItems(data: MetricsView, update: boolean) {\r\n data.filterrealtime = update ? data.filterrealtime : !(!!data.filterfrom || !!data.filterto);\r\n\r\n let res = await this.adms.getMetrics(this.be, data);\r\n //Se sono in modalità di update non devo toccare la searchView attuale se non per il searchinprogress che viene messo dall'es table\r\n if (!update) {\r\n this.selectedInstance = \"\";\r\n this.metricsToShow = [];\r\n this.searchView = res;\r\n this.searchView.items.forEach(m => {\r\n if (m.instance && !this.Instances.find(t => t.id == m.instance))\r\n this.Instances.push(new KeyValue(m.instance, m.instance));\r\n });\r\n this.instanceRequired = this.Instances.length > 1;\r\n if (this.Instances.length == 1) {\r\n this.selectedInstance = this.Instances[0].id;\r\n this.instanceSelected();\r\n }\r\n else\r\n this.instanceSelected(true);\r\n this.localStorage.setItem(\"HotSearchMetrics\", this.searchView).subscribe();\r\n }\r\n else {\r\n // Per ogni grafico di ogni metrica aggiungo tutti i valori che sono DOPO all'ultimo ts registrato per quel grafico\r\n res.items.forEach(m => {\r\n m.values.forEach(c => {\r\n let refm = this.MetricsChartCache[this.metricKey(m, c)];\r\n if (refm) {\r\n c.series.forEach(s => { s.values = s.values.filter(v => this.dateExts.getDateConvertion(v.d).isAfter(refm.lastTs)); });\r\n if (c.series.some(t => t.values.length > 0)) {\r\n refm.lastTs = c.series.map(t => dayjs.max(t.values.map(v => this.dateExts.getDateConvertion(v.d))))[0];\r\n refm.chart.addData(c);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n this.searchView.searchinprogress = false;\r\n }\r\n\r\n instanceSelected(allowNull: boolean = false) {\r\n if (!this.selectedInstance && !allowNull)\r\n return;\r\n\r\n this.metricsToShow = this.searchView.items.filter(t => !this.selectedInstance || (t.instance == this.selectedInstance));\r\n }\r\n\r\n linkChartToMetric(metric: Metric, metricChart: MetricChart, chartComp: BaseChartComponent<any>) {\r\n this.MetricsChartCache[this.metricKey(metric, metricChart)] = { chart: chartComp, lastTs: metricChart.series.map(t => dayjs.max(t.values.map(v => this.dateExts.getDateConvertion(v.d))))[0] };\r\n }\r\n\r\n private metricKey(metric: Metric, value: MetricChart): string {\r\n return metric.name + \" - \" + value.xtitle + (metric.instance ? \" - \" + metric.instance : \"\");\r\n }\r\n\r\n // #region Gestione update automatico\r\n updateTimer: any;\r\n autoUpdateChanged() {\r\n if (!/^[1-9]\\d*$/.test(this.seconds))\r\n this.seconds = '10';\r\n const secondsInMs = parseInt(this.seconds, null) * 1000;\r\n if (this.autoUpdate) {\r\n this.sendSearch(false, true);\r\n this.updateTimer = setInterval(() => { this.sendSearch(false, true); }, secondsInMs);\r\n }\r\n else\r\n clearInterval(this.updateTimer);\r\n }\r\n // #endregion\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">\n {{'Metriche di Sistema' | localize: lc}}\n </span>\n </div>\n <div class=\"card-body widget-body\">\n <div class=\"col-md-12\">\n <form role=\"form\">\n <div class=\"row\">\n <div class=\"col-md-11\">\n <div class=\"col-md-12 row app-no-padding app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-datetime [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterfrom\" name=\"filterfrom\" [Placeholder]=\"'Da' | localize: lc\" (inputChange)=\"dateChanged();\"></form-datetime>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-datetime [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterto\" name=\"filterto\" [Placeholder]=\"'A' | localize: lc\" (inputChange)=\"dateChanged();\"></form-datetime>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtersid\" name=\"filtersid\" [Placeholder]=\"'Cod. Sessione' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterserial\" name=\"filterserial\" [Placeholder]=\"'Seriale Sessione' | localize: lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterglobal\" name=\"filterglobal\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterglobal = !searchView.filterglobal\">{{'Globale' | localize: lc}}</span>\n </div>\n </div>\n <div class=\"col-md-12 row app-no-padding\">\n <div class=\"col-12 app-filter-wrapper\">\n <form-multiselect [readonly]=\"autoUpdate\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filtermetrics\" [IdField]=\"'name'\" [Display]=\"'{name}'\" name=\"filtermetrics\" [Placeholder]=\"'Filtra Metriche...' | localize: lc\" [Source]=\"Metrics\"></form-multiselect>\n </div>\n </div>\n <div class=\"clearfix\"></div>\n </div>\n <div class=\"col-md-1 app-no-padding\">\n <button [disabled]=\"searchView.searchinprogress || autoUpdate\" class=\"input-group-addon btn app-btn-search\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n <div class=\"clearfix\"></div>\n </div>\n </form>\n <div class=\"app-col-12 app-margin-top-15\">\n <div class=\"pull-right\">\n {{'Aggiorna ogni' | localize: lc}} <input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control app-updevery-input\" type=\"text\" [(ngModel)]=\"seconds\" name=\"seconds\" /> {{'secondo/i' | localize: lc}}\n </div>\n <div class=\"pull-right m-t-2 app-margin-right-5\">\n <label class=\"switch\">\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" name=\"autoUpdate\" (ngModelChange)=\"autoUpdateChanged();\" />\n <div class=\"slider round\"></div>\n </label>\n </div>\n <div class=\"clearfix\"></div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!searchView) {\n <p><em>{{'Carico i Dati' | localize: lc}}</em></p>\n }\n @if (searchView && instanceRequired) {\n <div>\n <form-select [Validation]=\"false\" [Label]=\"'Istanza Metriche' | localize: lc\" [(ngModel)]=\"selectedInstance\" name=\"instance\" [Source]=\"Instances\" (inputChange)=\"instanceSelected()\" required></form-select>\n </div>\n }\n @if (searchView && metricsToShow && metricsToShow.length > 0) {\n <div>\n <div class=\"col-md-12 app-padding-right-0 row app-margin-top-15\">\n @for (metric of metricsToShow; track metric; let i = $index) {\n @for (chart of metric.values; track chart; let z = $index) {\n <div class=\"col-md-4 app-no-padding app-simple-border\">\n <div style=\"width: 100%; height: 260px\">\n <es-line-chart [XTitle]=\"chart.xtitle\"\n [YTitle]=\"chart.ytitle\"\n [MinGridDistance]=\"65\"\n [Timeline]=\"false\"\n [LegendPadding]=\"{top: 0, bottom: 7, right: 0, left: 10}\"\n [MergeDatasets]=\"true\"\n [Data]=\"chart\"\n [Animations]=\"true\"\n [Legend]=\"chart.legend\"\n name=\"metric_{{i}}_chart_{{z}}\"\n (chartLoaded)=\"linkChartToMetric(metric, chart, $event);\"\n [DataGroupingThreshold]=\"99999999\">\n </es-line-chart>\n </div>\n </div>\n }\n }\n </div>\n <div class=\"clearfix\"></div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmLogsLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Log del Server\", [\"Server Logs\"]);\r\n }\r\n}","// Angular\r\nimport { Component } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Localizzazione\r\nimport { AdmLogsLoc } from \"./adm_logs.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\n\r\n@Component({\r\n selector: \"adm_logs\",\r\n viewProviders: [{ provide: LocalizationService, useClass: AdmLogsLoc }],\r\n templateUrl: \"./adm_logs.component.html\",\r\n styleUrls: [\"./adm_logs.component.scss\"],\r\n standalone: false\r\n})\r\nexport class AdmLogsComponent {\r\n public Log: string;\r\n\r\n public filterfrom: string = \"\";\r\n public filterto: string = \"\";\r\n public filterinstance: string = \"\";\r\n public filtertarget: string = \"\";\r\n\r\n public searchinprogress: boolean;\r\n private be: string;\r\n\r\n public AvailableInstances: KeyValue[];\r\n public AvailableTargets: KeyValue[];\r\n\r\n constructor(\r\n private intercom: InterComService,\r\n private lc: LocalizationService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.instanceChanged();\r\n this.AvailableInstances = await this.adms.getInstances(this.be);\r\n\r\n await this.sendSearch();\r\n }\r\n\r\n async instanceChanged(){\r\n this.AvailableTargets = await this.adms.getLogTargets(this.be, this.filterinstance);\r\n }\r\n\r\n async sendSearch(){\r\n this.searchinprogress = true;\r\n this.Log = await this.adms.getServerLogs(this.be, this.filterfrom, this.filterto, this.filterinstance, this.filtertarget);\r\n this.searchinprogress = false;\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12 bottom-15\">\n <form role=\"form\">\n <div class=\"row app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-date [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterfrom\" name=\"filterfrom\" [Placeholder]=\"'Da'\"></form-date>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-date [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterto\" name=\"filterto\" [Placeholder]=\"'A'\"></form-date>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterinstance\" name=\"filterinstance\" [Placeholder]=\"'Istanza'\" [Source]=\"AvailableInstances\" (inputChange)=\"instanceChanged();\"></form-select>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filtertarget\" name=\"filtertarget\" [Placeholder]=\"'Target'\" [Source]=\"AvailableTargets\"></form-select>\n </div>\n <button [disabled]=\"searchinprogress\" class=\"input-group-addon btn app-btn-search app-margin-top-20 app-margin-right-5\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n </form>\n </div>\n @if (Log) {\n <p class=\"app-whitespace-prewrap app-log-monospace\" [innerHTML]=\"Log\"></p>\n }\n\n</div>","import { AppSearch, GenericItem } from \"@esfaenza/es-table\";\r\n\r\nexport class DynamicViewsView extends AppSearch<GenericItem> {\r\n constructor() { super(); }\r\n\r\n filtername: string;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmDynamicViewsLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Ricerca Viste Dinamiche Applicative\", [\"Search Application Dynamic Views\"]);\r\n super.set(\"it->en\", \"Nome\", [\"Name\"]);\r\n super.set(\"it->en\", \"Carico le Viste Dinamiche Applicative\", [\"Loading Application Dynamic Views\"]);\r\n super.set(\"it->en\", \"Il nome della vista è obbligatorio per le operazioni di ricerca\", [\"View Name is mandatory for search operations\"]);\r\n super.set(\"it->en\", \"Nessun elemento trovato per la vista dinamica\", [\"No element found for Dynamic View\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\nimport { AppSearch } from \"@esfaenza/es-table\";\r\n\r\n// Applicazione\r\nimport { DynamicViewsView } from \"../../models/components/DynamicViewsView\";\r\nimport { KeyValue } from \"../../models/shared/KeyValue\";\r\nimport { ADM_MODULE_PATH } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { AdmDynamicViewsLoc } from \"./adm_dynamic_views.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { GenericItem } from \"@esfaenza/core/domain\";\r\n\r\n@Component({\r\n selector: \"adm_dynamic_views\",\r\n viewProviders: [{ provide: LocalizationService, useClass: AdmDynamicViewsLoc }],\r\n templateUrl: \"./adm_dynamic_views.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmDynamicViewsComponent {\r\n\r\n public searchView: DynamicViewsView = new DynamicViewsView();\r\n public Names: KeyValue[] = [];\r\n public storageSub: any;\r\n public badSearch: boolean = false;\r\n\r\n public currentName: string = \"\";\r\n\r\n // Staccato dalla view perché deve essere distrutta e ricreata di continuo\r\n public filterName:string = \"\";\r\n\r\n private be: string;\r\n\r\n constructor(\r\n public lc: LocalizationService,\r\n private intercom: InterComService,\r\n private localStorage: PreferencesService,\r\n private route: ActivatedRoute,\r\n private location: Location,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.Names = await this.adms.getDynamicViews(this.be);\r\n this.storageSub = this.route.queryParams.subscribe(params => { this.Init(params[\"ignoreStorage\"]); });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n async Init(ignoreStorage) {\r\n let item = await this.localStorage.getItem<DynamicViewsView>(\"HotDinamitato\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/serverviews`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotDinamitato\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: DynamicViewsView) {\r\n //Se ho la HotPotato vuol dire che sono appena tornato dall'edit/nuovo. Rifaccio la ricerca in base ai filtri precedenti\r\n //Altirmenti genero il modello nuovo normalmente\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetItems();\r\n }\r\n else {\r\n this.searchView = new DynamicViewsView();\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n this.searchView.searchinprogress = true;\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n this.searchView.filtername = this.filterName;\r\n this.POSTGetItems();\r\n }\r\n\r\n async prepareExportDynamicView(callback) {\r\n var view = JSON.parse(JSON.stringify(this.searchView));\r\n view.page = 1;\r\n view.itemsperpageoverride = 9999999;\r\n let tmp = await this.adms.getDynamicViewData(this.be, view);\r\n callback(tmp.items, GenericItem);\r\n }\r\n\r\n async POSTGetItems() {\r\n if (!this.searchView.filtername) {\r\n this.badSearch = true;\r\n AppSearch.reset(this.searchView);\r\n return;\r\n }\r\n else\r\n this.badSearch = false;\r\n\r\n // Per force-resettare l'estable\r\n if (this.currentName != this.searchView.filtername) {\r\n this.currentName = this.searchView.filtername;\r\n\r\n this.searchView = new DynamicViewsView();\r\n this.searchView.page = 1;\r\n this.searchView.filtername = this.currentName;\r\n }\r\n \r\n this.searchView = await this.adms.getDynamicViewData(this.be, this.searchView);\r\n this.searchView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotDinamitato\", this.searchView).subscribe();\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Ricerca Viste Dinamiche Applicative' | localize: lc}}</span>\n </div>\n <div class=\"card-body widget-body\">\n <div class=\"col-md-12 bottom-15\">\n <form role=\"form\">\n <div class=\"row app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"filterName\" name=\"filtername\" [Source]=\"Names\" [Placeholder]=\"'Nome' | localize: lc\"></form-select>\n </div>\n <button class=\"input-group-addon btn app-btn-search app-margin-top-20\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n </form>\n </div>\n <div class=\"row\">\n <div class=\"col-md-12\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (badSearch) {\n <div class=\"card card-info app-white-text app-padding-10\">{{'Il nome della vista è obbligatorio per le operazioni di ricerca' | localize: lc}}</div>\n }\n @if (!badSearch) {\n @if (!searchView) {\n <p><em>{{'Carico le Viste Dinamiche Applicative' | localize: lc}}...</em></p>\n }\n @if (searchView && searchView.items.length > 0) {\n <div>\n <es-table [(ngModel)]=\"searchView\" [AutoUpdate]=\"true\" [ExportFunction]=\"prepareExportDynamicView.bind(this)\" [Export]=\"true\" [OrderByColumn]=\"true\" (onSearchRequest)=\"sendSearch($event);\"></es-table>\n </div>\n }\n @if (searchView && searchView.items.length == 0 && !searchView.searchinprogress) {\n <div class=\"card card-info app-white-text app-padding-10\">\n {{'Nessun elemento trovato per la vista dinamica' | localize: lc}} <strong>{{searchView.filtername}}</strong>\n </div>\n }\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>","import { AppSearch, GenericItem } from \"@esfaenza/es-table\";\r\n\r\nexport class QueryView extends AppSearch<GenericItem>{\r\n constructor() { super(); }\r\n\r\n filterquery: string;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class MtdQueryLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"it->en\", \"Esecuzione Query Metadati\", [\"Metadata Query Execution\"]);\r\n super.set(\"it->en\", \"Query\", [\"Query\"]);\r\n super.set(\"it->en\", \"Carico i Risultati\", [\"Loading Results\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { ExportService, InboundMessageTypes, InterComService } from \"@esfaenza/extensions\";\r\n\r\n// Applicazione\r\nimport { QueryView } from \"../../models/components/QueryView\";\r\nimport { ADM_MODULE_PATH } from \"../../tokens\";\r\n\r\n// Localizzazione\r\nimport { MtdQueryLoc } from \"./mtd_query.component.loc\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { GenericItem } from \"@esfaenza/core/domain\";\r\n\r\n@Component({\r\n selector: \"adm_mtd_query\",\r\n viewProviders: [{ provide: LocalizationService, useClass: MtdQueryLoc }],\r\n templateUrl: \"./mtd_query.component.html\",\r\n standalone: false\r\n})\r\nexport class MtdQueryComponent {\r\n public searchView: QueryView = new QueryView();\r\n public storageSub: any;\r\n\r\n public searching: boolean = false;\r\n private be: string;\r\n\r\n constructor(\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n public expExts: ExportService,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private location: Location,\r\n private adms: AdminModuleBaseService,\r\n @Inject(ADM_MODULE_PATH) private mod: string) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n ngOnInit() {\r\n this.storageSub = this.route.queryParams.subscribe(params => { this.Init(params[\"ignoreStorage\"]); });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n async Init(ignoreStorage) {\r\n let item = await this.localStorage.getItem<QueryView>(\"HotQuery\").toPromise();\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/metadataquery`);\r\n this.route.snapshot.queryParams = [];\r\n await this.localStorage.removeItem(\"HotQuery\").toPromise();\r\n }\r\n }\r\n\r\n init(HotPotato: QueryView) {\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n this.POSTGetSearch(this.searchView);\r\n }\r\n else {\r\n this.searchView = new QueryView();\r\n this.sendSearch();\r\n }\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n this.searching = true;\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n if(!this.searchView.filterquery)\r\n return;\r\n\r\n this.POSTGetSearch(this.searchView);\r\n }\r\n\r\n async POSTGetSearch(data: QueryView) {\r\n this.searchView = await this.adms.getServerQuery(this.be, data);\r\n this.searchView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotEnqueue\", this.searchView).subscribe();\r\n this.searching = false;\r\n }\r\n\r\n async prepareExport(callback) {\r\n var view = JSON.parse(JSON.stringify(this.searchView));\r\n view.page = 1;\r\n view.itemsperpageoverride = 9999999;\r\n let tmp = await this.adms.getServerQuery(this.be, view);\r\n callback(tmp.items, GenericItem);\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Esecuzione Query Metadati' | localize: lc}}</span>\n </div>\n <div class=\"card-body widget-body\">\n <form role=\"form\">\n <div class=\"col-md-12 row app-first-filter-line\">\n <div class=\"col-xl-11 col-lg-11 col-md-11 app-filter-wrapper\">\n <form-textarea rows=\"3\" [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterquery\" name=\"filterquery\" [Placeholder]=\"'Query'\"></form-textarea>\n </div>\n <button class=\"input-group-addon btn app-btn-search app-margin-top-20\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"fa fa-search\"></i></button>\n </div>\n </form>\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!searchView) {\n <p><em>{{'Carico i Risultati' | localize: lc}}...</em></p>\n }\n @if (searchView && !searching) {\n <div>\n <es-table [(ngModel)]=\"searchView\" [AutoUpdate]=\"true\" [OrderByColumn]=\"true\" (onSearchRequest)=\"sendSearch($event);\" [Export]=\"true\" [ExportFileName]=\"'Results.csv'\" [ExportFunction]=\"prepareExport.bind(this)\"></es-table>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>","import { AppSearch } from \"@esfaenza/es-table\";\r\nimport { SystemParameters } from \"./SystemParameters\";\r\n\r\nexport class SystemParametersView extends AppSearch<SystemParameters>{\r\n constructor() { super(); }\r\n\r\n filterparameter: string;\r\n filterlevel: string;\r\n filterglobal: boolean;\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n@Injectable()\r\nexport class AdmSystemParametersLoc extends LocalizationService {\r\n constructor(injector: Injector) {\r\n super(injector);\r\n\r\n super.set(\"it->en\", \"Parametri di sistema\", [\"System Parameters\"]);\r\n super.set(\"it->en\", \"Nome parametro\", [\"Parameter Name\"]);\r\n super.set(\"it->en\", \"Carico Parametri di sistema\", [\"Loading System Parameters\"]);\r\n super.set(\"it->en\", \"Valore\", [\"Value\"]);\r\n super.set(\"it->en\", \"Valore Default\", [\"Default value\"]); \r\n super.set(\"it->en\", \"Descrizione\", [\"Description\"]);\r\n super.set(\"it->en\", \"Default\", [\"Default\"]); super.set(\"it->en\", \"Modificabile\", [\"Modifiable\"]);\r\n super.set(\"it->en\", \"Modifica parametro\", [\"Edit Parameter\"]);\r\n\r\n super.set(\"it->en\", \"Parametro di Sistema modificato con successo \", [\"System Parameter succesfully edited\"]);\r\n super.set(\"it->en\", \"Errori nella modifica del Parametro di Sistema\", [\"Errors editing System Parameter\"]);\r\n }\r\n}","// Angular\r\nimport { Component, Inject, ViewChild } from \"@angular/core\";\r\nimport { ActivatedRoute } from \"@angular/router\";\r\nimport { Location } from \"@angular/common\";\r\nimport { NgForm } from \"@angular/forms\";\r\n\r\n// Configurazioni\r\nimport { InboundMessageTypes, InterComService, MessageService, UtilityService } from \"@esfaenza/extensions\";\r\nimport { AdminModuleBaseService } from \"../../services/admin-feature.base.service\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\nimport { KeyValue } from \"@esfaenza/core/domain\";\r\n\r\n// Classi\r\nimport { SystemParametersView } from \"../../models/components/SystemParametersView\";\r\nimport { SystemParameters } from \"../../models/components/SystemParameters\";\r\n\r\n// Direttive, Componenti, Librerie\r\nimport { firstValueFrom } from \"rxjs\";\r\nimport { ADM_MODULE_PATH } from \"../../tokens\";\r\n\r\n// Loc\r\nimport { AdmSystemParametersLoc } from \"./adm_syspars.component.loc\";\r\n\r\n@Component({\r\n selector: \"adm_syspars\",\r\n viewProviders: [{ provide: LocalizationService, useClass: AdmSystemParametersLoc }],\r\n templateUrl: \"./adm_syspars.component.html\",\r\n standalone: false\r\n})\r\nexport class AdmSystemParametersComponent {\r\n\r\n public searchView: SystemParametersView = new SystemParametersView();\r\n public storageSub: any;\r\n\r\n public LevelsSource: KeyValue[] = [];\r\n public lastSelectedLevel = \"\";\r\n\r\n private be: string;\r\n \r\n constructor(\r\n public lc: LocalizationService,\r\n private localStorage: PreferencesService,\r\n private location: Location,\r\n private intercom: InterComService,\r\n private route: ActivatedRoute,\r\n private adms: AdminModuleBaseService,\r\n private msgExts: MessageService,\r\n private utiExts: UtilityService,\r\n @Inject(ADM_MODULE_PATH) private mod: string) {\r\n this.be = route.snapshot.params[\"be\"] || \"\";\r\n\r\n this.intercom.send(InboundMessageTypes.Navigation, { sub: false, routeTitle: this.lc.loc(this.route.snapshot.data[\"title\"]) });\r\n }\r\n\r\n async ngOnInit() {\r\n this.LevelsSource = [new KeyValue(\"SYS\", \"System\"), new KeyValue(\"SES\", \"Session\")];\r\n\r\n this.AvailableInstances = await this.adms.getInstances(this.be);\r\n\r\n this.storageSub = this.route.queryParams.subscribe(params => {\r\n this.Init(params[\"ignoreStorage\"]);\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.storageSub)\r\n this.storageSub.unsubscribe();\r\n }\r\n\r\n async Init(ignoreStorage) {\r\n let item = await firstValueFrom(this.localStorage.getItem<SystemParametersView>(\"HotSysParConfiggato\"));\r\n if (!ignoreStorage && item) {\r\n this.init(item);\r\n } else {\r\n this.init(null);\r\n this.location.replaceState(`/pages/${this.mod}/syspars`);\r\n this.route.snapshot.queryParams = [];\r\n await firstValueFrom(this.localStorage.removeItem(\"HotSysParConfiggato\"));\r\n }\r\n }\r\n\r\n init(HotPotato: SystemParametersView) {\r\n //Se ho la HotPotato vuol dire che sono appena tornato dall'edit/nuovo. Rifaccio la ricerca in base ai filtri precedenti\r\n //Altirmenti genero il modello nuovo normalmente\r\n if (HotPotato) {\r\n this.searchView = HotPotato;\r\n\r\n this.POSTGetItems(this.searchView);\r\n }\r\n else {\r\n this.searchView = new SystemParametersView();\r\n this.searchView.filterlevel = \"SES\";\r\n \r\n this.sendSearch();\r\n }\r\n }\r\n\r\n sendSearch(resetPage: boolean = true) {\r\n if (!this.searchView.filterlevel) {\r\n this.msgExts.simpleError(\"È obbligatorio specificare il filtro 'livello' per procedere alla ricerca\");\r\n return;\r\n }\r\n\r\n if (this.searchView.filterlevel == \"SES\") {\r\n this.searchView.filterglobal = false;\r\n }\r\n\r\n if (resetPage)\r\n this.searchView.page = 1;\r\n\r\n this.POSTGetItems(this.searchView);\r\n }\r\n\r\n async POSTGetItems(data: SystemParametersView) {\r\n this.lastSelectedLevel = this.searchView.filterlevel;\r\n \r\n this.searchView = await this.adms.getSystemParameters(this.be, data);\r\n this.searchView.searchinprogress = false;\r\n this.localStorage.setItem(\"HotSysParConfiggato\", this.searchView).subscribe();\r\n }\r\n\r\n //*********************************************EDIT************************************\r\n\r\n ParOnEdit: SystemParameters = null;\r\n @ViewChild(\"editConfigForm\", { static: true }) editConfigForm: NgForm;\r\n\r\n AvailableInstances: KeyValue[] = [];\r\n\r\n setupEdit(item: SystemParameters) {\r\n this.utiExts.cleanForm(this.editConfigForm);\r\n setTimeout(() => {\r\n this.ParOnEdit = this.utiExts.deepClone(item);\r\n this.ParOnEdit.memory = true;\r\n });\r\n }\r\n\r\n submitForm() {\r\n this.adms.updateSystemParameter(this.be, this.ParOnEdit).then(t => {\r\n this.msgExts.manageStringResponse(t, this.lc.loc(\"Parametro di Sistema modificato con successo \"), this.lc.loc(\"Errori nella modifica del Parametro di Sistema\"), () => { this.sendSearch() });\r\n })\r\n return true;\r\n }\r\n\r\n //*********************************************RESET************************************\r\n\r\n setupReset(item: SystemParameters) {\r\n this.msgExts.simpleWarningWithChoice(\r\n this.lc.loc(\"Richiesta conferma\"),\r\n this.lc.loc(\"Si desidera procedere al reset del parametro??\"),\r\n async () => {\r\n let t = await this.adms.resetSystemParameter(this.be, item.parametername, this.lastSelectedLevel);\r\n this.msgExts.manageStringResponse(t, this.lc.loc(\"Parametro di Sistema resettato con successo \"), this.lc.loc(\"Errori nel reset del Parametro di Sistema\"), () => { this.sendSearch() });\r\n });\r\n }\r\n}","<div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card app-overflow-visible\" widget>\n <div class=\"card-header\">\n <span class=\"text-uppercase\">{{'Parametri di sistema' | localize : lc}}</span>\n </div>\n <div class=\"card-body widget-body\">\n <div class=\"col-md-12 bottom-15\">\n <form role=\"form\">\n <div class=\"row app-first-filter-line\">\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-input [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterparameter\" name=\"filterparameter\" [Placeholder]=\"'Nome parametro' | localize : lc\"></form-input>\n </div>\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\">\n <form-select [FormLayout]=\"false\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterlevel\" name=\"filterlevel\" [Placeholder]=\"'Livello' | localize : lc\" [Source]=\"LevelsSource\"></form-select>\n </div>\n @if (searchView.filterlevel == 'SYS') {\n <div class=\"col-xl-2 col-lg-2 col-md-12 app-filter-wrapper\" style=\"display: flex; height: 38px;\">\n <form-checkbox [FormLayout]=\"false\" [SliderMode]=\"true\" [Validation]=\"false\" [(ngModel)]=\"searchView.filterglobal\" name=\"filterglobal\"></form-checkbox> \n <span class=\"app-pointer app-padding-top-5 app-padding-left-5\" (click)=\"searchView.filterglobal = !searchView.filterglobal\">{{'Globale' | localize: lc}}</span>\n </div>\n }\n <button class=\"input-group-addon btn app-btn-search app-margin-top-20\" (click)=\"sendSearch()\" type=\"submit\"><i class=\"far fa-search\"></i></button>\n </div>\n </form>\n </div>\n <div class=\"row\">\n <div class=\"col-md-12\">\n @if (!searchView) {\n <p><em>{{'Carico Parametri di sistema' | localize : lc}}...</em></p>\n }\n @if (searchView) {\n <div>\n <es-table [(ngModel)]=\"searchView\" (onSearchRequest)=\"sendSearch($event);\">\n <ng-template #header>\n <th class=\"app-col-min\"></th>\n <th class=\"app-col-min\"></th>\n <th class=\"app-nowrap\">{{'Nome parametro' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Valore' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Default' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Descrizione' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Modificabile' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Valore Default' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Modificabile a livello di Sessione' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Modificabile a livello di Sistema' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Modificato' | localize : lc}}</th>\n <th class=\"app-nowrap\">{{'Aggiustato' | localize : lc}}</th>\n </ng-template>\n <ng-template #body let-item>\n <td class=\"app-no-wrap app-right-0 app-padding-top-8\">\n @if (!item.isreadonly && ((lastSelectedLevel == 'SYS' && item.syseditable) || (lastSelectedLevel == 'SES' && item.seseditable))) {\n <a class=\"app-link far fa-edit\" (click)=\"setupEdit(item); dlgEdit.show();\"></a>\n }\n </td>\n <td class=\"app-no-wrap app-right-0 app-padding-top-8\">\n @if (!item.isreadonly && ((lastSelectedLevel == 'SYS' && item.syseditable) || (lastSelectedLevel == 'SES' && item.seseditable))) {\n <a class=\"app-link far fa-refresh\" (click)=\"setupReset(item);\"></a>\n }\n </td>\n <td class=\"app-nowrap\"><strong>{{item.parametername}}</strong></td>\n <td class=\"app-nowrap\">{{item.value}}</td>\n <td class=\"app-nowrap\" [class.text-success]=\"item.isdefault\" [class.text-danger]=\"!item.isdefault\">\n {{ item.isdefault ? ('Sì' | localize : lc) : ('No' | localize : lc) }}\n </td>\n <td class=\"app-nowrap\">{{item.parameterdescription}}</td>\n <td class=\"app-nowrap\" [class.text-success]=\"!item.isreadonly\" [class.text-danger]=\"item.isreadonly\">\n {{ !item.isreadonly ? ('Sì' | localize : lc) : ('No' | localize : lc) }}\n </td>\n <td class=\"app-nowrap\">{{item.defaultvalue}}</td>\n <td class=\"app-nowrap\" [class.text-success]=\"item.seseditable\" [class.text-danger]=\"!item.seseditable\">\n {{ item.seseditable ? ('Sì' | localize : lc) : ('No' | localize : lc) }}\n </td>\n <td class=\"app-nowrap\" [class.text-success]=\"item.syseditable\" [class.text-danger]=\"!item.syseditable\">\n {{ item.syseditable ? ('Sì' | localize : lc) : ('No' | localize : lc) }}\n </td>\n <td class=\"app-nowrap\">{{item.modified}}</td>\n <td class=\"app-nowrap\" [class.text-success]=\"item.adjusted\" [class.text-danger]=\"!item.adjusted\">\n {{ item.adjusted ? ('Sì' | localize : lc) : ('No' | localize : lc) }}\n </td>\n </ng-template>\n </es-table>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div esModal #dlgEdit=\"es-modal\" class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-lg\" emaDraggable>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title pull-left\">{{ 'Modifica parametro' | localize : lc }}</h5>\n <button type=\"button\" class=\"close pull-right\" (click)=\"dlgEdit.hide()\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <form novalidate #editConfigForm=\"ngForm\" (ngSubmit)=\"editConfigForm.valid && submitForm() && dlgEdit.hide()\">\n @if (ParOnEdit) {\n <div class=\"modal-body\">\n <form-input [LabelInputRatio]=\"'3 9'\" [Label]=\"'Nome parametro' | localize : lc\" [(ngModel)]=\"ParOnEdit.parametername\" [disabled]=\"true\" name=\"parametername\"></form-input>\n <form-input [LabelInputRatio]=\"'3 9'\" [Label]=\"'Valore' | localize : lc\" [(ngModel)]=\"ParOnEdit.value\" name=\"value\" [Last]=\"lastSelectedLevel == 'SES'\"></form-input>\n @if (lastSelectedLevel == 'SYS') {\n <form-checkbox [LabelInputRatio]=\"'3 9'\" [Label]=\"'File Configurazione' | localize : lc\" [(ngModel)]=\"ParOnEdit.configfile\" name=\"configfile\"></form-checkbox>\n <form-checkbox [LabelInputRatio]=\"'3 9'\" [Label]=\"'Memoria' | localize : lc\" [(ngModel)]=\"ParOnEdit.memory\" name=\"memory\"></form-checkbox>\n <form-multiselect [LabelInputRatio]=\"'3 9'\" [Label]=\"'Applica solo a' | localize : lc\" [Source]=\"AvailableInstances\" name=\"instanceids\" [(ngModel)]=\"ParOnEdit.instanceids\" [Last]=\"true\"> </form-multiselect>\n }\n </div>\n }\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary app-margin-right-10\" (click)=\"dlgEdit.hide()\">{{'Annulla' | localize : lc}}</button>\n <button type=\"submit\" contextAware class=\"btn btn-primary\">{{'Conferma' | localize : lc}}</button>\n </div>\n </form>\n </div>\n </div>\n</div>","// Angular\r\nimport { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n@Pipe({ name: 'format_time' })\r\nexport class FormatTimePipe implements PipeTransform {\r\n\r\n constructor() { }\r\n\r\n transform(value: number | string) {\r\n return this.secondsToHms(value);\r\n }\r\n\r\n secondsToHms(d: number | string): string {\r\n d = Number(d);\r\n var h = Math.floor(d / 3600);\r\n var m = Math.floor(d % 3600 / 60);\r\n var s = Math.floor(d % 3600 % 60);\r\n \r\n var hDisplay = h > 0 ? h + \" h, \" : \"\";\r\n var mDisplay = m > 0 ? m + \" min, \" : \"\";\r\n var sDisplay = s > 0 ? s + \" sec\" : \"\";\r\n return hDisplay + mDisplay + sDisplay; \r\n }\r\n}","/** Chiave di questo modulo, da utilizzare per i messaggi */\r\nexport const MK_ADM = \"EsAdminModule\";\r\n\r\n/** Messaggi gestiti da questo modulo */\r\nexport enum AdmMessageTypes{\r\n Message\r\n}","// Angular\r\nimport { Injectable } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { InterComService, InterComMessage } from \"@esfaenza/extensions\";\r\n\r\n// Modelli\r\nimport { AdmMessageTypes, MK_ADM } from \"./admin-feature-messages\";\r\n\r\ndeclare var myconfig;\r\n\r\n@Injectable()\r\nexport class AdminModuleCommService {\r\n\r\n constructor(private intercom: InterComService) { }\r\n\r\n public register() {\r\n this.intercom.register(MK_ADM);\r\n this.intercom.outbounds[MK_ADM].subscribe((t: InterComMessage) => { this.handleOutbound(t.type, t.message); });\r\n }\r\n\r\n private handleOutbound(type: AdmMessageTypes, message: any) {\r\n switch (type) {\r\n case AdmMessageTypes.Message:\r\n if (myconfig.DEBUG_MODE)\r\n console.log(\"@admin-feature outbound message: \" + message);\r\n break;\r\n }\r\n }\r\n}","// Angular\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { NgModule, inject } from \"@angular/core\";\r\nimport { CanMatchFn, RouterModule } from \"@angular/router\";\r\n\r\n// Libs\r\nimport { ModalModule } from \"ngx-bootstrap/modal\";\r\nimport { BsDropdownModule } from \"ngx-bootstrap/dropdown\";\r\nimport { TooltipModule } from \"ngx-bootstrap/tooltip\";\r\n\r\n// Esfaenza\r\nimport { EsTableModule } from \"@esfaenza/es-table\";\r\nimport { FormsAndValidationsModule } from \"@esfaenza/forms-and-validations\";\r\nimport { EsChartsModule } from \"@esfaenza/es-charts\";\r\nimport { EsGertrudeModule } from \"@esfaenza/gertrude\";\r\nimport { ExtensionsModule } from \"@esfaenza/extensions\";\r\nimport { LocalizationModule } from \"@esfaenza/localizations\";\r\nimport { ContextMenuModule } from \"@esfaenza/ngx-contextmenu\";\r\n\r\n// Components\r\nimport { AdmAuditsComponent } from \"./components/audits/adm_audits.component\";\r\nimport { AdmWrkComponent } from \"./components/workers/adm_wrk.component\";\r\nimport { AdmProfilerComponent } from \"./components/profiler/adm_profiler.component\";\r\nimport { AdmProfilerV2Component } from \"./components/profiler_v2/profiler_v2.component\";\r\nimport { AdmWorkloadV2Component } from \"./components/workload_v2/workload_v2.component\";\r\nimport { AdmMetricsV2Component } from \"./components/metrics_v2/metrics_v2.component\";\r\nimport { AdmDetailsV2Component } from \"./components/details_v2/details_v2.component\";\r\nimport { ActivityChartV2Component } from \"./components/_shared/activity_chart_v2.component\";\r\nimport { MetricsV2ChartComponent } from \"./components/metrics_v2/metrics_v2_chart.component\";\r\nimport { AdmTopActivitiesComponent } from \"./components/topact/topact_search.component\";\r\nimport { AdmTopActivityV2Component } from \"./components/topact_v2/topact_v2.component\";\r\nimport { SessionDetailComponent } from \"./components/_shared/session_detail.component\";\r\nimport { AdmEnqComponent } from \"./components/enqueues/adm_enq.component\";\r\nimport { AdmMetricsComponent } from \"./components/metrics/metrics_search.component\";\r\nimport { AdmLogsComponent } from \"./components/logs/adm_logs.component\";\r\nimport { NodeDetailComponent } from \"./components/_shared/node_detail.component\";\r\nimport { AdmDynamicViewsComponent } from \"./components/dynamic_views/adm_dynamic_views.component\";\r\nimport { MtdQueryComponent } from \"./components/mtd_query/mtd_query.component\";\r\nimport { AdmSystemParametersComponent } from \"./components/syspars/adm_syspars.component\";\r\n\r\n// Pipes\r\nimport { FormatTimePipe } from \"./pipes/format_time.pipe\";\r\nimport { ProfilerFormatPipe } from \"./pipes/profiler_format.pipe\";\r\n\r\n// Communication Service\r\nimport { AdminModuleCommService } from \"./admin-feature.comms.service\";\r\n\r\n// Tokens\r\nimport { ADM_CONVERSATIONS, ADM_DETAILS_V2, ADM_METRICS_V2, ADM_PROFILER_V2, ADM_TOPACT_V2, ADM_WORKLOAD_V2 } from \"./tokens\";\r\nimport { ComponentsModule } from \"@esfaenza/core/components\";\r\nimport { DirectivesModule } from \"@esfaenza/core/directives\";\r\n\r\ndeclare var myconfig;\r\n\r\n// La Top Activity v2 prende la rotta \"topact\" solo se DirectorFeature.TopActivityV2 è attivo nella configurazione del modulo,\r\n// altrimenti la guardia fallisce e la rotta successiva apre la pagina di sempre\r\nexport const topActivityV2Enabled: CanMatchFn = () => inject(ADM_TOPACT_V2, { optional: true }) ?? false;\r\n// Lo stesso per il profiler con DirectorFeature.ProfilerV2\r\nexport const profilerV2Enabled: CanMatchFn = () => inject(ADM_PROFILER_V2, { optional: true }) ?? false;\r\n// La pagina del workload report c'è solo con DirectorFeature.WorkloadReportV2: prima il report era solo un file da scaricare dal profiler\r\nexport const workloadReportV2Enabled: CanMatchFn = () => inject(ADM_WORKLOAD_V2, { optional: true }) ?? false;\r\n// Le metriche v2 prendono la rotta \"metrics\" solo con DirectorFeature.MetricsV2, come la Top Activity\r\nexport const metricsV2Enabled: CanMatchFn = () => inject(ADM_METRICS_V2, { optional: true }) ?? false;\r\n\r\nexport const routeConfig = [\r\n {\r\n path: \"\", children: [\r\n { path: \"serverworkers/:be\", component: AdmWrkComponent, data: { title: \"Ricerca Processi Applicativi\", internalNavigation: false } },\r\n { path: \"profiler/:be\", component: AdmProfilerV2Component, canMatch: [profilerV2Enabled], data: { title: \"Profiler del Server\", internalNavigation: false } },\r\n { path: \"profiler/:be\", component: AdmProfilerComponent, data: { title: \"Profiler del Server\", internalNavigation: false } },\r\n { path: \"workload/:be\", component: AdmWorkloadV2Component, canMatch: [workloadReportV2Enabled], data: { title: \"Workload report\", internalNavigation: false } },\r\n { path: \"topact/:be\", component: AdmTopActivityV2Component, canMatch: [topActivityV2Enabled], data: { title: \"Attività Principali\", internalNavigation: false } },\r\n { path: \"topact/:be\", component: AdmTopActivitiesComponent, data: { title: \"Attività Principali\", internalNavigation: false } },\r\n { path: \"metrics/:be\", component: AdmMetricsV2Component, canMatch: [metricsV2Enabled], data: { title: \"Metriche di Sistema\", internalNavigation: false } },\r\n { path: \"metrics/:be\", component: AdmMetricsComponent, data: { title: \"Metriche di Sistema\", internalNavigation: false } },\r\n { path: \"serverlogs/:be\", component: AdmLogsComponent, data: { title: \"Log del Server\", internalNavigation: false } },\r\n { path: \"serveraudits/:be\", component: AdmAuditsComponent, data: { title: \"Ricerca Audit Applicativi\", internalNavigation: false } },\r\n { path: \"serverenqueues/:be\", component: AdmEnqComponent, data: { title: \"Ricerca Lock Applicativi\", internalNavigation: false } },\r\n { path: \"serverviews/:be\", component: AdmDynamicViewsComponent, data: { title: \"Ricerca Viste Dinamiche Applicative\", internalNavigation: false } },\r\n { path: \"metadataquery/:be\", component: MtdQueryComponent, data: { title: \"Query Viste Dinamiche\", internalNavigation: false } },\r\n { path: \"serverworkers\", component: AdmWrkComponent, data: { title: \"Ricerca Processi Applicativi\", internalNavigation: false } },\r\n { path: \"profiler\", component: AdmProfilerV2Component, canMatch: [profilerV2Enabled], data: { title: \"Profiler del Server\", internalNavigation: false } },\r\n { path: \"profiler\", component: AdmProfilerComponent, data: { title: \"Profiler del Server\", internalNavigation: false } },\r\n { path: \"workload\", component: AdmWorkloadV2Component, canMatch: [workloadReportV2Enabled], data: { title: \"Workload report\", internalNavigation: false } },\r\n { path: \"topact\", component: AdmTopActivityV2Component, canMatch: [topActivityV2Enabled], data: { title: \"Attività Principali\", internalNavigation: false } },\r\n { path: \"topact\", component: AdmTopActivitiesComponent, data: { title: \"Attività Principali\", internalNavigation: false } },\r\n { path: \"metrics\", component: AdmMetricsV2Component, canMatch: [metricsV2Enabled], data: { title: \"Metriche di Sistema\", internalNavigation: false } },\r\n { path: \"metrics\", component: AdmMetricsComponent, data: { title: \"Metriche di Sistema\", internalNavigation: false } },\r\n { path: \"serverlogs\", component: AdmLogsComponent, data: { title: \"Log del Server\", internalNavigation: false } },\r\n { path: \"serveraudits\", component: AdmAuditsComponent, data: { title: \"Ricerca Audit Applicativi\", internalNavigation: false } },\r\n { path: \"serverenqueues\", component: AdmEnqComponent, data: { title: \"Ricerca Lock Applicativi\", internalNavigation: false } },\r\n { path: \"serverviews\", component: AdmDynamicViewsComponent, data: { title: \"Ricerca Viste Dinamiche Applicative\", internalNavigation: false } },\r\n { path: \"metadataquery\", component: MtdQueryComponent, data: { title: \"Query Viste Dinamiche\", internalNavigation: false } },\r\n { path: \"syspars\", component: AdmSystemParametersComponent, data: { title: \"Parametri di sistema\", internalNavigation: false } }]\r\n }\r\n];\r\n\r\nconst MODULES = [\r\n // Base\r\n CommonModule,\r\n FormsModule,\r\n\r\n // Bootstrap\r\n ModalModule,\r\n TooltipModule,\r\n BsDropdownModule,\r\n\r\n // Esfaenza e componenti visuali\r\n ContextMenuModule,\r\n LocalizationModule,\r\n ExtensionsModule,\r\n EsTableModule,\r\n FormsAndValidationsModule,\r\n EsGertrudeModule,\r\n EsChartsModule,\r\n ComponentsModule,\r\n DirectivesModule,\r\n\r\n RouterModule.forChild(routeConfig),\r\n];\r\n\r\nconst COMPONENTS = [\r\n AdmWrkComponent,\r\n AdmProfilerComponent,\r\n AdmProfilerV2Component,\r\n AdmWorkloadV2Component,\r\n AdmMetricsV2Component,\r\n MetricsV2ChartComponent,\r\n AdmDetailsV2Component,\r\n ActivityChartV2Component,\r\n AdmTopActivitiesComponent,\r\n AdmTopActivityV2Component,\r\n SessionDetailComponent,\r\n AdmDynamicViewsComponent,\r\n AdmLogsComponent,\r\n AdmAuditsComponent,\r\n AdmEnqComponent,\r\n AdmMetricsComponent,\r\n NodeDetailComponent,\r\n MtdQueryComponent,\r\n AdmSystemParametersComponent\r\n];\r\n\r\nconst PIPES = [\r\n FormatTimePipe,\r\n ProfilerFormatPipe\r\n]\r\n\r\n@NgModule({\r\n imports: [...MODULES, ...PIPES],\r\n declarations: [...COMPONENTS],\r\n providers: [\r\n AdminModuleCommService,\r\n { provide: ADM_CONVERSATIONS, useFactory: () => !!myconfig.TransactionTimeoutSeconds },\r\n { provide: ADM_TOPACT_V2, useFactory: () => !!myconfig?.DirectorFeature?.TopActivityV2 },\r\n { provide: ADM_PROFILER_V2, useFactory: () => !!myconfig?.DirectorFeature?.ProfilerV2 },\r\n { provide: ADM_WORKLOAD_V2, useFactory: () => !!myconfig?.DirectorFeature?.WorkloadReportV2 },\r\n { provide: ADM_METRICS_V2, useFactory: () => !!myconfig?.DirectorFeature?.MetricsV2 },\r\n // Dettaglio di nodo e sessione v2: lo aprono tutte le pagine che mostrano nodi e sessioni, v1 comprese, perché con il flag il backend-for-frontend\r\n // risponde a GetNodeStats e GetSessionStats solo con il contratto nuovo\r\n { provide: ADM_DETAILS_V2, useFactory: () => !!myconfig?.DirectorFeature?.DetailsV2 }\r\n ]\r\n})\r\nexport class AdmModule {\r\n constructor(private commService: AdminModuleCommService) {\r\n console.log(\"@esfaenza/admin-feature: BOOTSTRAP\");\r\n this.commService.register();\r\n }\r\n}","/*\r\n * Public API Surface of admin-feature\r\n */\r\n\r\nexport * from './lib/admin-feature.module';\r\nexport * from './lib/tokens';\r\nexport * from \"./lib/admin-feature-messages\";","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i6.AdminModuleBaseService","i8","i9","i10","i11","i1","HOUR_MS","i3.AdminModuleBaseService","i4","i5","i6","i7.ActivityChartV2Component","i9.ProfilerFormatPipe","i3","i12.AdmDetailsV2Component","i13.NodeDetailComponent","STORAGE_KEY","INSTANCE_ALL","DATES_DELAY_MS","i11.AdmDetailsV2Component","i12.ProfilerFormatPipe","i5.AdminModuleBaseService","i7","i9.MetricsV2ChartComponent","i12","i13.AdmDetailsV2Component","i14.NodeDetailComponent","i13.SessionDetailComponent","i15","i4.AdminModuleBaseService","KeyValue","i1.AdminModuleCommService"],"mappings":"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"}
|