Analitica - Errore su un Modello

Analitica - Errore su un Modello

di Franky Vallori -
Numero di risposte: 6

Ciao,
nel lanciare l'elaborazione: 

Addestramento modelli
\tool_analytics\task\train_models

si genera un errore generico, che non riesco a interpretare in maniera più approfondita:
Eccezione - Call to a member function get_data() on null !!!

Avete dei consigli?

Moodle 3.7.2, all'interno della piattaforma ci sono dei plugin aggiuntivi, ma non sono tra gli indicatori del modello.

Nome modello "Studenti a rischio di abbandono" --> \core_course\analytics\target\course_dropout

grazie,
Franky

Media dei voti:  -
In riposta a Franky Vallori

Ri: Analitica - Errore su un Modello

di Matteo Scaramuccia -

Ciao Franky,
per approfondire il tuo errore dovresti attivare il debugging di Moodle a livello Developer così da far apparire uno stack trace che possa dare indicazioni di quale sia il vero problema e in quale parte del codice venga scatenato.

HTH,
Matteo

In riposta a Matteo Scaramuccia

Ri: Analitica - Errore su un Modello

di Franky Vallori -

Ciao Matteo,
ho messo il debugging ed ha generato l'errore, in allegato.

E' un errore strano...anche perchè utilizzo un Modello del Core di Moodle.

Tra l'altro nel modello ho selezionato solo indicatori del Core e non tutti.

Si blocca in un determinato corso, dopo aver passato altri corsi senza problemi; corso che non utilizza Plugin aggiuntivi.

Cosa ne pensi?

Grazie,
Franky

Allegato error_analitic.jpg
In riposta a Franky Vallori

Ri: Analitica - Errore su un Modello

di Matteo Scaramuccia -

Ciao Franky,
sicuramente il codice è debole perché in caso di errore dovrebbe saltare il processamento di quella informazione eventualmente scrivendo nei log che ha saltato quel dato.

Secondo me c'è - o c'è stato - nel tuo sistema qualche plug-in che non ha implementato correttamente la gestione degli eventi ma la mia è pura speculazione in questo momento.

Facendo una copia preliminare, prova a modificare il file analytics/classes/local/indicator/community_of_inquiry_activity.php in questo modo:

$ git diff
diff --git a/analytics/classes/local/indicator/community_of_inquiry_activity.php b/analytics/classes/local/indicator/community_of_inquiry_activity.php
index 555bb420e7c..ff22224e826 100644
--- a/analytics/classes/local/indicator/community_of_inquiry_activity.php
+++ b/analytics/classes/local/indicator/community_of_inquiry_activity.php
@@ -518,6 +518,12 @@ abstract class community_of_inquiry_activity extends linear {
         // At the same time we want to keep this array reasonably "not-massive".
         $processedevents = array();
         foreach ($events as $event) {
+            // $event could be null if \core\event\base::restore() will not be able to recreate the \core\event\base object.
+            // Unfortunately \core\event\base::restore() does not log the reason of its failure; more in lib/classes/event/base.php.
+            if ($event === null) {
+                continue;
+            }
+
             if (!isset($processedevents[$event->contextid])) {
                 $processedevents[$event->contextid] = array();
             }

così facendo il codice salterà quegli eventi "anomali" che il sistema non riesce a ricostruire dalle sole informazioni su DB - si riferiscono a plug-in disinstallati?
Bisognerebbe aggiungere dei log in più in altre parti di codice per capire chi ha generato questi eventi e se il problema è "solo" perché sono stati "mal implementati"; prova, previa copia, a modificare anche lib/classes/event/base.php:

diff --git a/lib/classes/event/base.php b/lib/classes/event/base.php
index 0d7831fe731..63a58d26f59 100644
--- a/lib/classes/event/base.php
+++ b/lib/classes/event/base.php
@@ -375,6 +375,7 @@ abstract class base implements \IteratorAggregate {

         // Security: make 100% sure this really is an event class.
         if ($classname !== "\\{$component}\\event\\{$target}_{$action}") {
+            error_log("'${classname}' is not an event class name. Expected: '\\{$component}\\event\\{$target}_{$action}'");
             return false;
         }

@@ -383,6 +384,7 @@ abstract class base implements \IteratorAggregate {
         }
         $event = new $classname();
         if (!($event instanceof \core\event\base)) {
+            error_log("'${classname}' does not implement \core\event\base");
             return false;
         }

Nota: le righe evidenziate in verde e con il "+" iniziale vanno aggiunte senza il "+" iniziale che è solo il marcatore della nuova linea aggiunta.

Non appena mi sarà più chiaro il problema aprirò un ticket sul Tracker di Moodle per descrivere come replicarlo.

HTH,
Matteo

In riposta a Matteo Scaramuccia

Ri: Analitica - Errore su un Modello

di Franky Vallori -
Ciao Matteo,
dopo le modifiche che mi hai consigliato per il Debug (grazie mille ancora)...ti mostro il debug...

Questa ha finito questa volta, visto il "continue;".

Cosa ne pensi?

Un saluto,
Franky
Allegato error_analitic_2.jpg
In riposta a Franky Vallori

Ri: Analitica - Errore su un Modello

di Matteo Scaramuccia -

Ciao Franky,
faccio in po' di fatica a leggere i log anche perché mi mancano dei pezzi di testo in particolare l'inizio dei messaggi di log inseriti per quanto riguarda il supposto classname.
Mi stupisce infatti che il codice si "rompa" su un evento core mentre avrei pensato più a problemi derivati da terze parti.

Detto questo, possiamo provare a capire se il problema derivi dall'impossibilità di ricavere alcune informazioni (unserialize) aggiungendo:

$ git diff
diff --git a/admin/tool/log/classes/helper/reader.php b/admin/tool/log/classes/helper/reader.php
index 2e947748da0..fc2f9f182c4 100644
--- a/admin/tool/log/classes/helper/reader.php
+++ b/admin/tool/log/classes/helper/reader.php
@@ -74,6 +74,7 @@ trait reader {
      * @return mixed Decoded value
      */
     public static function decode_other(?string $other) {
+        error_log("DEBUG - decode_other: ${other}");
         if ($other === 'N;' || preg_match('~^.:~', $other)) {
             return unserialize($other);
         } else {

Sicuramente il codice è imperfetto anche qui e andarà migliorato (sto tenendo traccia di tutto in questo post per poi proporre la soluzione finale).

Se puoi, copia e incolla direttamente i log all'interno di un tag <pre /> - che editor usi qui nella Community? - così puoi:

  1. anonimizzare il root path prima di incollare i log favorendo di più la leggibilità
  2. permettermi di leggere meglio il resto dei log ammiccante

HTH,
Matteo