Nedávno navštívené
V tabulce vidíme:
- Datum
- Čas
- Diagram/element/package/atribute/operace - řádek lze prokliknout na artefakt
- GUID
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á
- Jeden řádek vzniká při každém úspěšném otevření detailu.
- Nic se neslučuje: obnovení stránky, vynucené obnovení nebo opakované otevření vytvoří další řádek.
- Při přístupu přes veřejný klíč se návštěva zapíše pod uživatele, kterému klíč patří.
- Nezapisuje se odmítnutý přístup (403/404), procházení stromu, vyhledávání, IP adresa ani session.
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í
- Chybí názvy položek. Tabulka obsahuje jen GUID. Název a typ je nutné dohledat v databázi Enterprise Architect příslušného repozitáře (t_object, t_diagram, t_package, t_attribute, t_operation podle ea_guid). Jde o jinou databázi, proto je nutné propojení (dblink/FDW) nebo export.
- Smazané položky v EA nedohledáte. Aplikace je v historii uživatele tiše vynechává.
- Opakovaná otevření nafukují počty, proto rozlišujte count(*) a count(distinct ...).
- Návštěvy přes veřejný klíč nelze odlišit od běžných návštěv vlastníka klíče.
- Pomalé dotazy u velkých dat: chybí index na VisitTimestamp. Vyplatil by se index (UserId, VisitTimestamp).
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í.