Nedávno navštívené

V "Nedávno navštívené" umožňuje vidět historii prokliků.

historie.png


V tabulce vidíme:

historie1.png

Statistika návštěv - přímé čtení z databáze (pro administrátory)

Každé úspěšné otevření detailu (diagram, element, balíček, atribut, operace, kořenový balíček modelu) se zapisuje do tabulky infoport."VisitedDetails" v databázi Infoportu. Tato tabulka je zdrojem funkce "Nedávno navštívené". Pro administrátora nemá aplikace žádnou obrazovku ani statistiky nad touto tabulkou, data lze číst pouze přímo SQL dotazem do databáze.

Struktura tabulky infoport."VisitedDetails"

Sloupec Význam
ID Primární klíč (autoinkrement).
UserId Odkaz na AspNetUsers.Id. Při smazání uživatele se smažou i jeho záznamy.
RepositoryId Odkaz na Repositories.Id.
Guid EA GUID zobrazené položky (ea_guid).
DetailKind Typ položky: 1 = diagram, 2 = element, 3 = balíček, 4 = atribut, 5 = operace, 10 = model (kořenový balíček).
VisitTimestamp Čas serveru (místní čas serveru, nikoli UTC).

Indexy jsou pouze na sloupcích UserId a RepositoryId, na VisitTimestamp žádný index není.

Kdy záznam vzniká

Retence - důležité pro statistiky

Noční úloha údržby maže záznamy starší než hodnota CleanAfterXDays. Výchozí hodnota je 30 dní a nastavuje se v Configuration Manageru. Úloha běží ve výchozím plánu v 01:00 a spustí se i při startu aplikace. Pro dlouhodobé statistiky je proto nutné tuto hodnotu zvýšit, nebo data každý den archivovat (např. do agregační tabulky).

Příklady dotazů (PostgreSQL)

-- aktivita uživatelů
select u."UserName", count(*) as zobrazeni, count(distinct v."Guid") as unikatni,
       count(distinct v."VisitTimestamp"::date) as aktivni_dny, max(v."VisitTimestamp") as posledni
from infoport."VisitedDetails" v
join infoport."AspNetUsers" u on u."Id" = v."UserId"
group by u."UserName"
order by zobrazeni desc;

-- nejnavštěvovanější položky
select "RepositoryId", "DetailKind", "Guid", count(*) as n, count(distinct "UserId") as uzivatelu
from infoport."VisitedDetails"
group by 1, 2, 3
order by n desc
limit 50;

-- denní průběh
select date_trunc('day', "VisitTimestamp") as den, count(*) as zobrazeni, count(distinct "UserId") as uzivatelu
from infoport."VisitedDetails"
group by 1
order by 1;

-- hodinový průběh
select extract(hour from "VisitTimestamp") as h, count(*) as zobrazeni
from infoport."VisitedDetails"
group by 1
order by 1;

-- poměr typů položek
select "DetailKind", count(*) as zobrazeni
from infoport."VisitedDetails"
group by 1
order by 1;

-- "sezení": mezera delší než 30 minut = nové sezení
select t.*, sum(novy) over (partition by "UserId" order by "VisitTimestamp") as sezeni
from (
  select v.*, case when "VisitTimestamp" - lag("VisitTimestamp") over w > interval '30 min'
                     or lag("VisitTimestamp") over w is null then 1 else 0 end as novy
  from infoport."VisitedDetails" v
  window w as (partition by "UserId" order by "VisitTimestamp")
) t;

Pomocí funkce lag("Guid") lze sledovat i přechody z položky na položku, tedy jak uživatelé procházejí model.

Omezení

Další zdroj dat - Insights log

Pokud potřebujete záznam všech HTTP požadavků (nejen otevření detailu), zapněte v Configuration Manageru (App Logs) volbu Insights a nastavte Log Type na Debug. Každý požadavek se zapíše do souboru insights.log ve složce logů (LogPath) ve tvaru: [doba] [stavový kód] [uživatel nebo no user] [adresa včetně dotazu a těla požadavku, u přihlášení bez hesla]. Soubor se rotuje podle nastavení RollingInterval. Upozornění: Debug zapisuje obsah požadavků, používejte jej jen dočasně a v interním prostředí.


Revision #6
Created 30 May 2022 14:27:35
Updated 6 November 2026 17:01:23 by Jitka Kalíšová