La situation de départ
Une "Class Query" dans l'espace de noms %SYS fournissant des valeurs système réelles.
L' objectif à atteindre
Présentation des données dans le navigateur, accompagnée de
quelques visualisations graphiques, par exemple un graphique à barres.
L’ objectif est d’obtenir les valeurs réelles en un seul clic ou en actualisant.
La solution doit être indépendante de Windows, Linux, OSX, AIX, ...
Il existe suffisamment de collections de bibliothèques graphiques
dans différents langages, comme JavaScript, Python, ...
Mais ils ont tous besoin d'un code à ajouter en dehors d'IRIS.
Cela peut entraîner une dépendance au système d'exploitation du serveur.
À ce moment-là, je me suis retourné vers IRIS. Je me suis rappelé que DeepSee
possède toutes les options requises et s'adapte toujours à l'environnement.
Et comme il s'agit d'une approche interne d'IRIS, je pourrais tout faire en utilisant
InterSystems ObjectScript et appliquer toutes les astuces que j'ai utilisées et
développées moi-même dans le passé.
Maintenant le développement étape par étape
Les valeurs système ne peuvent être collectées que dans l'espace de noms %SYS
Le transport de valeurs vers un autre espace de noms est réalisé par une table temporaire
Il est situé dans la database IRISTEMP et évite la journalisation. C'est vite.
Après un effacement total, le SystemClassQuery insère ses résultats et
ajoute la date et l'heure. La collection de valeurs est complète.
Dans mon espace de noms opérationnel, j'ai la même définition de classe.
Class Parameter DEFAULTGLOBAL = "^mtemp.ZX"; pointe vers le même stockage.
Et
À ce stade, nous pouvons déjà voir le résultat numérique avec n'importe quelle
vue de table dans SystemManagementPortal. Il n'y a simplement aucun graphique.
Prochaine étape :
DeepSee crée des cubes basés sur des classes persistantes (des tables)
Utiliser DeepSee Architect n'est qu'une question de minutes pour construire un cube adapté
Et il dispose également de l'outil pour remplir le cube avec du contenu.
Prochaine étape :
DeepSeeAnalyzer nous permet de composer une belle vue de tableau et propose
une collection de présentations graphiques. Formidable !
Mais les valeurs de 2000 et d'autres de 33 ne semblent pas si bien dans un
graphique commun. Je n'ai pas trouvé d'option pour un axe logarithmique.
Alors, j'ai ajouté des propriétés calculées à ma table pour renvoyer $ZLOG(val).
Et un deuxième cube est alimenté avec des valeurs logarithmiques.
Le graphique est désormais plus pratique. Le tableau est moins impressionnant.
Prochaine étape :
Dans DeepSeeUserPortal, vous pouvez composer un Dashboard qui est une
page Web indépendante. Ici, vous organisez les vues de tableau et les graphiques
comme vous le souhaitez.
Et voici ma seule exception à l'utilisation exclusive d'InterSystems ObjectScript:
Un Portlet est un petit morceau de code HTML que j'ai utilisé pour afficher
la date et l'heure des valeurs collectées.
Dernière étape furieuse :
Comment cela marche-t-il?
Notre joli Dashboard est démarré par une page CSP. La page elle-même est vide.
Mais chaque page CSP possède une
- Premiere étape - Collecter les valeurs de %SYS
- Prochaine étape - Reconstruiser les deux cubes
- Redirection vers l'URL de notre joli Dashboard.
Alors on danse !
Quelques morceaux de code :
Class ZX.timestamp Extends %DeepSee.Component.Portlet.abstractPortlet
{
Method %DrawHTML()
{
&html<<div style="font-size: 25px;" height=50 class="portletDiv">#(^mtemp.ZXD)#</div>>
}
}
Class ZX.dbdash Extends %CSP.Page [ Not ProcedureBlock ]
{
ClassMethod OnPreHTTP() As %Boolean [ ServerOnly = 1 ]
{
do ##class(%ZX.dbfree).Load()
set sc=##class(%DeepSee.Utils).%BuildCube("ZX.DBdata",,0)
set sc=##class(%DeepSee.Utils).%BuildCube("ZX.DBlog",,0)
Set %response.ServerSideRedirect="/csp/user/_DeepSee.UserPortal.DashboardViewer.zen?DASHBOARD=ZXfree.dashboard"
quit $$$OK
}
ClassMethod OnPage() As %Status
{
quit $$$OK
}
}
Class ZX.dbfree Extends %Persistent [ Final, SqlRowIdPrivate ]
{
Parameter MANAGEDEXTENT As INTEGER [ Constraint = "0,1", Flags = ENUM ] = 0;
Parameter DEFAULTGLOBAL = "^mtemp.ZX";
Property DatabaseName As %String;
Property mbSize As %Integer;
Property logSize As %Decimal(SCALE = 2) [ Calculated, SqlComputeCode = {set {*}=$s({mbSize}<1:0,1:$ZLOG({mbSize}))}, SqlComputed ];
Property mbAvail As %Decimal(SCALE = 1);
Property logAvail As %Decimal(SCALE = 2) [ Calculated, SqlComputeCode = {set {*}=$s({mbAvail}<1:0,1:$ZLOG({mbAvail}))}, SqlComputed ];
Property FreePrz As %Decimal(SCALE = 2);
Property logFreePrz As %Decimal(SCALE = 2) [ Calculated, SqlComputeCode = {set {*}=$s({FreePrz}<1:0,1:$ZLOG({FreePrz}))}, SqlComputed ];
Property Timestamp As %String [ Calculated, SqlComputeCode = {set {*}=^mtemp.ZXD}, SqlComputed ];
Index idx On DatabaseName [ IdKey ];