Täysautomatisoitu raportointiympäristö Joni-Petteri Paavilainen Jani Alatalo
Miksi tähän ryhdyttiin?
Miten asiassa edettiin?
Vaatimuksia Reaaliaikaisuus n 15 min Hallitut käyttöoikeudet Raportin tekijöillä ei välttämättä näkyvyyttä koko dataan Kukin näkee datasta vain sen mihin on oikeutettu Käyttöoikeuksien määrittelylle helppo prosessi Datan lisääminen järjestelmään helppoa ja yksinkertaista
Visio Tieto virtaa lähes reaaliaikaisesti Operatiivisista järjestelmistä tietokantaan Tietokannasta SAS VA:n muistiin Ei manuaalista ylläpitoa VA:n päässä Lähes reaaliaikainen raportti kokoajan monitorilla KPIt, jotka indikoivat paineen kasvua Korjaavat toimet voidaan aloittaa ilmiön alkaessa
Tiimi Joni-Petteri Paavilainen, Elisa Appelsiini Niko Mäkelä, Elisa Appelsiini, Data Ville Kajatsalo, Tae Konsultointi, Data Jaakko Marila, Javascript, Dashboard Pasi Helenius, Dashboard Jani Sassi, Tietoturva Pertti Viitamäki, Data Ilkka Maristo, Päivitys Johannes Koskinen, Asennukset Jani Alatalo, Tech lead
Toteutus Tietokanta Yksi rajapinta dataan Datalähteet suojassa SAS Visual Analytics Dashboardit monitoreilla Raportit
Performanssi toteutuksesta Tietokanta & AD Palomuuri SAS Visual Analytics Palomuuri Käyttäjät, Raportin tekijät Data, joka ihanasti virtailee
Varoitus!! SAS akronyymejä 200) { Code var lastupdate = 0; var updateframe = function() { var iframe = document.getelementbyid('dashboardframe'); iframe.src = iframe.src; }; var checkupdatefile = function () { var filerequest = new XMLHttpRequest(); filerequest.onreadystatechange = handlestatechange; filerequest.open("get", "d1_updated.txt", true); filerequest.send(); Esitys sisältää Koodia Teknisiä yksityiskohtia function handlestatechange() { if (filerequest.readystate === 4 && filerequest.status == if (lastupdate == 0) lastupdate = parseint(filerequest.responsetext); else if (parseint(filerequest.responsetext)!= lastupdate) { lastupdate = parseint(filerequest.responsetext); updateframe(); } } }; }; window.onload = function() { var intervalid = setinterval(checkupdatefile, 30000); };
Täysautomatisoitu Dataflow Rivikohtainen tietoturva Metadata rakenteet Itsensä virkistävä raportti
Dataflow 1. Luetaan kannasta taulut 2. Luetaan lataussäännöt ohjaustaulusta - jos uusitaulu, lisätään ohjaustauluunuusirivi 3. Jokaista taulua kohden 1. Tarkistetaan onko uuttadata 2. Jos on käynnistetään ohjaustaulun määräämä ajo 3. Luetaan muuttuneet tiedot kannasta (delta) 4. Tarkistetaan deltanrakenne 5. Jos sama, deltalataus (upsert) 6. Jos eri, täyslataus ja metadatan päivitys 7. Ehdolliset lukuoikeudet
Deltalataus Delta muistiin Päällekkäiset rivit pois taulusta Lisätään delta tauluun proc imstat data=laseri.kohdetaulu noprint; where %dellist ; deleterows / purge; run; where; set delta_taulu / drop; quit;
Täyslataus Uusi kopio muistiin apu Poistetaan taulu Luodaan uuden kaltainen taulu tyhjänä Lisätään tyhjään tauluun rivit apu taulusta Dropataan apu taulu data LASeRi.t_Taulu; set ondisk.taulu; run; *Drop table from memory; proc delete data=laseri.taulu; run; *Create empty table; data LASeRi.Taulu; set ondisk.taulu(obs=0); run; *append loaded table to empty and drop temp table; proc imstat data=laseri.taulu; set t_taulu / drop; run;
Rivikohtainen tietoturva Käyttövaltuutuksien hallinta AD:ssa Ryhmän nimet ja muuttujan sisältö 1:1 Vain Read Metadata + Ehdollinen Read data work.auth_call; set authdata.lasr_table_authorizations; length tname $ 200; tname = "omsobj:physicaltable?@name='" Lasr_name "'"; rc_remove = METASEC_SETAUTH('', tname, type, name, "Remove", permission, ""); rc_add = METASEC_SETAUTH('', tname, type, name, action, permission, condition); run;
Metadatarakenteet AD:sta merkityt ryhmät Metadataan Ryhmiin kuuluvat käyttäjät AD Sync koodin jatkeella uusille ryhmille Kansiorakenne ACT + ACE suojaamaan sisältöä actrc = METASEC_APPLYACT("", t_uri, act_uri,0);
Itsensä virkistävä raportti Jaakko Marila HTML sivu Javascript iframe Data valmis aikaleima web tiedostoon javascript havaitsee päivityksen iframelle refresh data _NULL_; file "xxx/yyy/ddd/htdocs/asia/d1_updated.txt"; length updatetime $20; updatetime = put(datetime(), 20.0); put updatetime; run; if (lastupdate == 0) lastupdate = parseint(filerequest.responsetext); else if (parseint(filerequest.responsetext)!= lastupdate) { lastupdate = parseint(filerequest.responsetext); updateframe();
Kehitysajatuksia Latauksiin tarkistukset ja hälytykset Kaksivaiheinen tunnistautuminen
Olemmeko visiossa?
Kysymyksiä? jani.alatalo@sas.com