TripPin μέρος 8 - Προσθήκη διαγνωστικού ελέγχου
Σημείωμα
Αυτό το περιεχόμενο αναφέρεται επί του παρόντος σε περιεχόμενο από μια υλοποίηση παλαιού τύπου για διαγνωστικά στο Visual Studio. Το περιεχόμενο θα ενημερωθεί στο εγγύς μέλλον για να καλύψει το νέο SDK Power Query στο Visual Studio Code.
Αυτή η εκμάθηση πολλαπλών τμημάτων καλύπτει τη δημιουργία μιας νέας επέκτασης προέλευσης δεδομένων για το Power Query. Το εκπαιδευτικό βοήθημα προορίζεται να γίνει διαδοχικά. Κάθε μάθημα βασίζεται στη σύνδεση που δημιουργήθηκε σε προηγούμενα μαθήματα, προσθέτοντας σταδιακά νέες δυνατότητες στη σύνδεσή σας.
Σε αυτό το μάθημα, θα κάνετε τα εξής:
- Μάθετε σχετικά με τη συνάρτηση Diagnostics.Trace
- Χρησιμοποιήστε τις συναρτήσεις βοηθητικών στοιχείων διαγνωστικών για να προσθέσετε πληροφορίες ανίχνευσης για να βοηθήσετε στον εντοπισμό σφαλμάτων στη σύνδεσή σας
Ενεργοποίηση διαγνωστικού ελέγχου
Οι χρήστες του Power Query μπορούν να ενεργοποιήσουν την καταγραφή ανίχνευσης, επιλέγοντας το πλαίσιο ελέγχου στην περιοχή Επιλογές | Διαγνωστικά.
Όταν ενεργοποιηθεί, οποιαδήποτε επόμενα ερωτήματα θα προκαλέσουν την ενσωμάτωση πληροφοριών ανίχνευσης στον μηχανισμό M στα αρχεία καταγραφής που βρίσκονται σε έναν σταθερό κατάλογο χρηστών.
Κατά την εκτέλεση ερωτημάτων M μέσα από το SDK του Power Query, η ανίχνευση ενεργοποιείται σε επίπεδο έργου. Στη σελίδα ιδιοτήτων έργου, υπάρχουν τρεις ρυθμίσεις που σχετίζονται με την ανίχνευση:
- Εκκαθάριση αρχείου καταγραφής— όταν οριστεί σε
true
, θα γίνει επαναφορά/απαλοιφή του αρχείου καταγραφής κατά την εκτέλεση των ερωτημάτων σας. Συνιστούμε να διατηρείτε αυτή τη ρύθμιση σεtrue
. - Εμφάνιση ανιχνεύσεων μηχανής— Αυτή η ρύθμιση ελέγχει την έξοδο ενσωματωμένων ανιχνεύσεων από τον μηχανισμό M. Αυτές οι ανιχνεύσεις είναι χρήσιμες μόνο για τα μέλη της ομάδας Power Query, επομένως συνήθως θα θέλετε να διατηρήσετε αυτήν τη ρύθμιση ρυθμισμένη στο
false
. - Εμφάνιση ανιχνεύσεων χρήστη — Αυτή η ρύθμιση ελέγχει την έξοδο πληροφοριών ανίχνευσης από τη σύνδεσή σας. Ορίστε αυτή την επιλογή σε
true
.
Όταν ενεργοποιηθεί, θα αρχίσετε να βλέπετε καταχωρήσεις αρχείου καταγραφής στο παράθυρο Έξοδος ερωτήματος M, στην καρτέλα Αρχείο καταγραφής.
Diagnostics.Trace
Η συνάρτηση Diagnostics.Trace χρησιμοποιείται για την εγγραφή μηνυμάτων στο αρχείο καταγραφής ανίχνευσης της μηχανής M.
Diagnostics.Trace = (traceLevel as number, message as text, value as any, optional delayed as nullable logical as any) => ...
Σημαντικό
Η M είναι μια λειτουργική γλώσσα με αργή αξιολόγηση. Όταν χρησιμοποιείτε Diagnostics.Trace
το , να θυμάστε ότι η συνάρτηση θα καλείται μόνο εάν η παράσταση στην οποία ανήκει στην πραγματικότητα αξιολογείται. Μπορείτε να βρείτε παραδείγματα για αυτό παρακάτω σε αυτό το πρόγραμμα εκμάθησης.
Η traceLevel
παράμετρος μπορεί να είναι μία από τις ακόλουθες τιμές (σε φθίνουσα σειρά):
TraceLevel.Critical
TraceLevel.Error
TraceLevel.Warning
TraceLevel.Information
TraceLevel.Verbose
Όταν είναι ενεργοποιημένη η ανίχνευση, ο χρήστης μπορεί να επιλέξει το μέγιστο επίπεδο μηνυμάτων που θα ήθελε να δει. Όλα τα μηνύματα ανίχνευσης αυτού του επιπέδου και κάτω θα εξαχθούν στο αρχείο καταγραφής. Για παράδειγμα, εάν ο χρήστης επιλέξει το επίπεδο "Προειδοποίηση", τα μηνύματα ανίχνευσης των TraceLevel.Warning
, TraceLevel.Error
και TraceLevel.Critical
θα εμφανίζονται στα αρχεία καταγραφής.
Η message
παράμετρος είναι το πραγματικό κείμενο που θα εξάγεται στο αρχείο ανίχνευσης. Το κείμενο δεν θα περιέχει την value
παράμετρο, εκτός εάν την συμπεριλάβετε ρητά στο κείμενο.
Η value
παράμετρος είναι αυτή που θα επιστρέψει η συνάρτηση. Όταν η παράμετρος delayed
οριστεί σε true
, value
θα είναι μια συνάρτηση παραμέτρου μηδέν που επιστρέφει την πραγματική τιμή που αξιολογείτε. Όταν delayed
οριστεί σε false
, value
θα είναι η πραγματική τιμή. Μπορείτε να βρείτε ένα παράδειγμα του τρόπου λειτουργίας του παρακάτω.
Χρήση διαγνωστικών. Ανίχνευση στη σύνδεση TripPin
Για ένα πρακτικό παράδειγμα χρήσης του Diagnostics.Trace και της επίδρασης της delayed
παραμέτρου, ενημερώστε τη συνάρτηση της GetSchemaForEntity
σύνδεσης TripPin για να αναδιπλώσετε την error
εξαίρεση:
GetSchemaForEntity = (entity as text) as type =>
try
SchemaTable{[Entity=entity]}[Type]
otherwise
let
message = Text.Format("Couldn't find entity: '#{0}'", {entity})
in
Diagnostics.Trace(TraceLevel.Error, message, () => error message, true);
Μπορείτε να εξαναγκάσετε ένα σφάλμα κατά τη διάρκεια της αξιολόγησης (για σκοπούς δοκιμής!) διαβιβάζοντας ένα μη έγκυρο όνομα οντότητας στη GetEntity
συνάρτηση. Εδώ αλλάζετε τη withData
γραμμή στη συνάρτηση, αντικαθιστώντας [Name]
την TripPinNavTable
με "DoesNotExist"
.
TripPinNavTable = (url as text) as table =>
let
// Use our schema table as the source of top level items in the navigation tree
entities = Table.SelectColumns(SchemaTable, {"Entity"}),
rename = Table.RenameColumns(entities, {{"Entity", "Name"}}),
// Add Data as a calculated column
withData = Table.AddColumn(rename, "Data", each GetEntity(url, "DoesNotExist"), type table),
// Add ItemKind and ItemName as fixed text values
withItemKind = Table.AddColumn(withData, "ItemKind", each "Table", type text),
withItemName = Table.AddColumn(withItemKind, "ItemName", each "Table", type text),
// Indicate that the node should not be expandable
withIsLeaf = Table.AddColumn(withItemName, "IsLeaf", each true, type logical),
// Generate the nav table
navTable = Table.ToNavigationTable(withIsLeaf, {"Name"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
in
navTable;
Ενεργοποιήστε την ανίχνευση για το έργο σας και εκτελέστε τα ερωτήματα δοκιμής. Errors
Στην καρτέλα θα πρέπει να δείτε το κείμενο του σφάλματος που ενεργοποιήσατε:
Επίσης, στην Log
καρτέλα, θα πρέπει να δείτε το ίδιο μήνυμα. Εάν χρησιμοποιείτε διαφορετικές τιμές για τις message
παραμέτρους και value
, αυτές θα διαφέρουν.
Σημειώστε επίσης ότι το Action
πεδίο του μηνύματος καταγραφής περιέχει το όνομα (Είδος προέλευσης δεδομένων) της επέκτασής σας (σε αυτή την περίπτωση, Engine/Extension/TripPin
). Αυτό διευκολύνει την εύρεση των μηνυμάτων που σχετίζονται με την επέκτασή σας όταν εμπλέκονται πολλά ερωτήματα ή/και είναι ενεργοποιημένη η ανίχνευση συστήματος (μηχανή συνδυασμού δεδομένων).
Καθυστερημένη αξιολόγηση
Ως παράδειγμα του τρόπου λειτουργίας της delayed
παραμέτρου, θα κάνετε ορισμένες τροποποιήσεις και θα εκτελέσετε ξανά τα ερωτήματα.
Πρώτα, ορίστε την delayed
τιμή σε false
, αλλά αφήστε την value
παράμετρο ως έχει:
Diagnostics.Trace(TraceLevel.Error, message, () => error message, false);
Όταν εκτελείτε το ερώτημα, θα λάβετε ένα μήνυμα σφάλματος ότι "Δεν είναι δυνατή η μετατροπή μιας τιμής τύπου Συνάρτηση σε τύπο τύπου" και όχι το πραγματικό σφάλμα που δημιουργήσατε. Αυτό συμβαίνει επειδή η κλήση επιστρέφει τώρα μια function
τιμή, αντί για την ίδια την τιμή.
Στη συνέχεια, καταργήστε τη συνάρτηση από την value
παράμετρο:
Diagnostics.Trace(TraceLevel.Error, message, error message, false);
Όταν εκτελείτε το ερώτημα, θα λάβετε το σωστό σφάλμα, αλλά εάν ελέγξετε την καρτέλα Αρχείο καταγραφής , δεν θα υπάρχουν μηνύματα. Αυτό συμβαίνει επειδή το error
αποτέλεσμα καταλήγει να ενεργοποιείται/αξιολογείται κατά τη διάρκεια της κλήσης στο Diagnostics.Trace
, επομένως το μήνυμα δεν προκύπτει ποτέ στην πραγματικότητα.
Τώρα που κατανοείτε την επίδραση της
delayed
παραμέτρου, φροντίστε να επαναφέρετε τη σύνδεσή σας ξανά σε κατάσταση εργασίας προτού συνεχίσετε.
Λειτουργίες βοηθητικών διαγνωστικών στο Diagnostics.pqm
Το αρχείο Diagnostics.pqm που περιλαμβάνεται σε αυτό το έργο περιέχει πολλές βοηθητικές συναρτήσεις που διευκολύνουν την ανίχνευση. Όπως φαίνεται στην προηγούμενη εκμάθηση, μπορείτε να συμπεριλάβετε αυτό το αρχείο στο έργο σας (θυμηθείτε να ορίσετε την Ενέργεια δόμησης σε Μεταγλώττιση) και, στη συνέχεια, να το φορτώσετε στο αρχείο σύνδεσης. Το κάτω μέρος του αρχείου σύνδεσης θα πρέπει τώρα να μοιάζει με το παρακάτω τμήμα κώδικα. Μην διστάσετε να εξερευνήσετε τις διάφορες συναρτήσεις που παρέχει αυτή η εκπαιδευτική ενότητα, αλλά σε αυτό το δείγμα, θα χρησιμοποιείτε μόνο τις Diagnostics.LogValue
συναρτήσεις και Diagnostics.LogFailure
.
// Diagnostics module contains multiple functions. We can take the ones we need.
Diagnostics = Extension.LoadFunction("Diagnostics.pqm");
Diagnostics.LogValue = Diagnostics[LogValue];
Diagnostics.LogFailure = Diagnostics[LogFailure];
Diagnostics.LogValue
Η Diagnostics.LogValue
συνάρτηση μοιάζει πολύ με Diagnostics.Trace
, και μπορεί να χρησιμοποιηθεί για την έξοδο της τιμής των στοιχείων που αξιολογείτε.
Diagnostics.LogValue = (prefix as text, value as any) as any => ...
Η prefix
παράμετρος προστίθεται στο μήνυμα αρχείου καταγραφής. Θα το χρησιμοποιούσατε για να διαπιστώσετε ποια κλήση εξάγει το μήνυμα. Η value
παράμετρος είναι αυτή που θα επιστρέψει η συνάρτηση και θα γραφτεί επίσης στην ανίχνευση ως μια αναπαράσταση κειμένου της τιμής M. Για παράδειγμα, εάν value
το ισούται με a table
με τις στήλες A και B, το αρχείο καταγραφής θα περιέχει την ισοδύναμη #table
αναπαράσταση: #table({"A", "B"}, {{"row1 A", "row1 B"}, {"row2 A", row2 B"}})
Σημείωμα
Η σειριοποίηση των τιμών M σε κείμενο μπορεί να είναι μια δαπανηρή λειτουργία. Να γνωρίζετε το πιθανό μέγεθος των τιμών που δημιουργείτε στην ανίχνευση.
Σημείωμα
Τα περισσότερα περιβάλλοντα Power Query θα περικόπτουν τα μηνύματα ανίχνευσης στο μέγιστο μήκος.
Για παράδειγμα, θα ενημερώσετε τη TripPin.Feed
συνάρτηση για ανίχνευση των ορισμάτων url
και schema
που μεταβιβάζονται στη συνάρτηση.
TripPin.Feed = (url as text, optional schema as type) as table =>
let
_url = Diagnostics.LogValue("Accessing url", url),
_schema = Diagnostics.LogValue("Schema type", schema),
//result = GetAllPagesByNextLink(url, schema)
result = GetAllPagesByNextLink(_url, _schema)
in
result;
Πρέπει να χρησιμοποιήσετε τις νέες _url
τιμές και _schema
στην κλήση στο GetAllPagesByNextLink
. Εάν χρησιμοποιήσατε τις αρχικές παραμέτρους της συνάρτησης, οι Diagnostics.LogValue
κλήσεις δεν θα αξιολογηθούν ποτέ στην πραγματικότητα, με αποτέλεσμα να μην υπάρχουν μηνύματα που να έχουν γραφτεί στην ανίχνευση. Ο λειτουργικός προγραμματισμός είναι διασκεδαστικός!
Όταν εκτελείτε τα ερωτήματά σας, θα πρέπει τώρα να βλέπετε νέα μηνύματα στο αρχείο καταγραφής.
Πρόσβαση στη διεύθυνση URL:
Τύπος σχήματος:
Βλέπετε τη σειριοποιημένη έκδοση της schema
παραμέτρου type
, αντί για αυτό που θα λάβετε όταν κάνετε μια απλή Text.FromValue
τιμή σε μια τιμή τύπου (η οποία έχει ως αποτέλεσμα "τύπο").
Diagnostics.LogFailure
Η Diagnostics.LogFailure
συνάρτηση μπορεί να χρησιμοποιηθεί για την αναδίπλωση κλήσεων συναρτήσεων και θα κάνει εγγραφή στην ανίχνευση μόνο εάν αποτύχει η κλήση της συνάρτησης (δηλαδή, επιστρέφει ).error
Diagnostics.LogFailure = (text as text, function as function) as any => ...
Εσωτερικά, Diagnostics.LogFailure
προσθέτει έναν try
τελεστή στην function
κλήση. Εάν η κλήση αποτύχει, η text
τιμή εγγράφεται στην ανίχνευση πριν επιστρέψει την αρχική error
. Εάν η function
κλήση είναι επιτυχής, το αποτέλεσμα επιστρέφεται χωρίς την εγγραφή τίποτα στην ανίχνευση. Δεδομένου ότι τα σφάλματα M δεν περιέχουν ανίχνευση πλήρους στοίβας (δηλαδή, συνήθως βλέπετε μόνο το μήνυμα του σφάλματος), αυτό μπορεί να είναι χρήσιμο όταν θέλετε να εντοπίσετε πού προέκυψε το σφάλμα.
Ως ένα (κακό) παράδειγμα, τροποποιήστε τη withData
γραμμή της TripPinNavTable
συνάρτησης για να επιβάλετε ένα σφάλμα για άλλη μια φορά:
withData = Table.AddColumn(rename, "Data", each Diagnostics.LogFailure("Error in GetEntity", () => GetEntity(url, "DoesNotExist")), type table),
Στην ανίχνευση, μπορείτε να βρείτε το μήνυμα σφάλματος που προκύπτει text
, το οποίο περιέχει τις αρχικές πληροφορίες σφάλματος και τις αρχικές πληροφορίες.
Φροντίστε να επαναφέρετε τη συνάκησή σας σε κατάσταση εργασίας προτού συνεχίσετε με την επόμενη εκμάθηση.
Συμπέρασμα
Αυτό το σύντομο (αλλά σημαντικό!) μάθημα σάς έδειξε πώς να χρησιμοποιήσετε τις λειτουργίες βοηθητικών διαγνωστικών για να συνδεθείτε στα αρχεία ανίχνευσης του Power Query. Όταν χρησιμοποιούνται σωστά, αυτές οι συναρτήσεις είναι χρήσιμες για τον εντοπισμό σφαλμάτων εντός της σύνδεσής σας.
Σημείωμα
Ως προγραμματιστής συνδέσεων, είναι δική σας ευθύνη να βεβαιωθείτε ότι δεν θα καταγράφετε ευαίσθητα ή προσωπικά στοιχεία (PII) ως μέρος της καταγραφής διαγνωστικού ελέγχου. Επίσης, πρέπει να είστε προσεκτικοί ώστε να μην παράγει πάρα πολλές πληροφορίες ανίχνευσης, καθώς μπορεί να έχουν αρνητικές επιπτώσεις στις επιδόσεις.