TripPin časť 8 – Pridanie diagnostiky
Poznámka
Tento obsah v súčasnosti odkazuje na obsah zo staršej implementácie na diagnostiku vo Visual Studiu. Obsah sa v blízkej budúcnosti aktualizuje tak, aby zahŕňal novú súpravu Power Query SDK v programe Visual Studio Code.
Tento kurz s viacerými časťami sa zaoberá vytváraním nového rozšírenia zdroja údajov pre Power Query. Tento kurz sa má uskutočniť postupne – každá lekcia vychádza z konektora vytvoreného v predchádzajúcich lekciách a postupne pridáva nové možnosti do konektora.
V tejto lekcii:
- Ďalšie informácie o funkcii Diagnostics.Trace
- Použitie pomocných funkcií diagnostiky na pridanie informácií o sledovaní na pomoc pri ladení konektora
Povolenie diagnostiky
Používatelia doplnku Power Query môžu povoliť zapisovanie do denníka sledovania začiarknutím políčka v časti Možnosti | Diagnostika.
Po povolení všetky nasledujúce dotazy spôsobia, že nástroj M vydáva informácie o sledovaní do súborov denníka umiestnených v pevnom adresári používateľa.
Pri spúšťaní dotazov jazyka M v rámci súpravy Power Query SDK sa sledovanie povolí na úrovni projektu. Na stránke vlastností projektu sú tri nastavenia súvisiace so sledovaním:
- Vymazať denník – ak je toto nastavené na
true
, denník sa pri spustení dotazov resetuje alebo vymaže. Odporúčame, aby ste si toto nastavenie ponechali natrue
. - Zobraziť sledovania nástroja – toto nastavenie ovláda výstup vstavaných sledovaní z nástroja jazyka M. Tieto sledovania sú užitočné len pre členov tímu Power Query, takže zvyčajne budete chcieť ponechať toto nastavenie na
false
hodnotu . - Zobraziť sledovania používateľa – toto nastavenie riadi výstup informácií o sledovaní vašim konektorom. Toto nastavenie budete chcieť nastaviť na
true
hodnotu .
Po povolení sa položky denníka začnú zobrazovať v okne Výstup dotazu jazyka M na karte Denník.
Diagnostics.Trace
Funkcia Diagnostics.Trace sa používa na zapisovanie správ do denníka sledovania nástroja M.
Diagnostics.Trace = (traceLevel as number, message as text, value as any, optional delayed as nullable logical as any) => ...
Dôležité
M je funkčný jazyk s lenivým hodnotením. Pri používaní Diagnostics.Trace
nezabudnite, že funkcia sa volá len vtedy, ak sa výraz, ktorý obsahuje, vyhodnotí. Príklady nájdete neskôr v tomto kurze.
Parameter traceLevel
môže byť jednou z nasledujúcich hodnôt (v zostupnom poradí):
TraceLevel.Critical
TraceLevel.Error
TraceLevel.Warning
TraceLevel.Information
TraceLevel.Verbose
Keď je sledovanie povolené, používateľ si môže vybrať maximálnu úroveň správ, ktoré si želá zobraziť. Všetky hlásenia o sledovaní tejto úrovne a pod budú výstupom do denníka. Ak používateľ napríklad vyberie úroveň Upozornenie, v denníkoch sa zobrazia hlásenia o TraceLevel.Warning
sledovaní , TraceLevel.Error
a TraceLevel.Critical
.
Parameter message
je skutočný text, ktorý bude výstupom do súboru sledovania. Text nebude obsahovať parameter, value
pokiaľ ho výslovne nezahrniete do textu.
Parameter value
je to, čo funkcia vráti. delayed
Keď je parameter nastavený na true
hodnotu , value
bude funkciou parametra nula, ktorá vráti skutočnú hodnotu, ktorú vyhodnocujete. Hodnota , keď delayed
je nastavená na false
, value
bude skutočnou hodnotou. Príklad, ako to funguje, je uvedený nižšie.
Používanie funkcie Diagnostika. Sledovanie v konektore TripPin
V praktickom príklade použitia funkcie Diagnostics.Trace a vplyvu delayed
parametra aktualizujte funkciu konektora GetSchemaForEntity
TripPin a zabaľte výnimku 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);
Počas hodnotenia (na testovacie účely) môžete vynútiť chybu odovzdaním neplatného názvu GetEntity
entity do funkcie. Tu zmeníte withData
riadok TripPinNavTable
funkcie nahradením [Name]
parametrom "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;
Zapnite sledovanie pre svoj projekt a spustite testovacie dotazy. Na karte Errors
by sa mal zobraziť text hlásenej chyby:
Log
Na karte by sa tiež mala zobraziť rovnaká správa. Ak použijete pre parametre a value
iné hodnotymessage
, bude to iné.
Všimnite si tiež, že Action
pole správy denníka obsahuje názov vášho rozšírenia (v tomto prípade Engine/Extension/TripPin
typ zdroja údajov). To uľahčuje vyhľadávanie správ súvisiacich s vaším rozšírením, keď je povolených viacero dotazov a/alebo sledovanie systému (mashup engine).
Oneskorené vyhodnotenie
Ako príklad fungovania parametra delayed
vykonáte úpravy a znova spustíte dotazy.
Najprv nastavte delayed
hodnotu na false
, ale parameter ponechajte v tvare value
:
Diagnostics.Trace(TraceLevel.Error, message, () => error message, false);
Pri spustení dotazu sa zobrazí chybové hlásenie s textom "Nemôžeme konvertovať hodnotu typu Funkcia na typ" a nie so skutočnou chybou, ktorú ste vyvolali. Je to spôsobené tým, že volanie teraz vracia function
hodnotu, a nie samotnú hodnotu.
Potom odstráňte funkciu z parametra value
:
Diagnostics.Trace(TraceLevel.Error, message, error message, false);
Pri spustení dotazu sa zobrazí správna chyba, ale ak začiarknete kartu Denník , nebudú k dispozícii žiadne správy. Dôvodom je, že výsledok error
sa vyvolá /vyhodnotí počas volania funkcie Diagnostics.Trace
, takže správa nie je nikdy výstupom.
Teraz, keď viete, aký vplyv
delayed
má parameter, nezabudnite pred pokračovaním obnoviť konektor späť do pracovného stavu.
Diagnostické pomocné funkcie v Diagnostics.pqm
Súbor Diagnostics.pqm , ktorý je súčasťou tohto projektu, obsahuje množstvo pomocných funkcií, ktoré zjednodušujú sledovanie. Ako môžete vidieť v predchádzajúcom kurze, tento súbor môžete zahrnúť do svojho projektu (nezabudnite nastaviť akciu zostaviť na kompilovať) a potom ju načítať do súboru konektora. Spodná časť súboru konektora by teraz mala vyzerať približne ako úryvok kódu uvedený nižšie. Neváhajte preskúmať rôzne funkcie, ktoré tento modul poskytuje, ale v tejto ukážke Diagnostics.LogValue
budete používať len funkcie a 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
Funkcia Diagnostics.LogValue
je veľmi dená ako Diagnostics.Trace
, a možno ju použiť na výstup hodnoty, ktorú vyhodnocujete.
Diagnostics.LogValue = (prefix as text, value as any) as any => ...
Parameter prefix
je odoslaný do správy denníka. Toto by ste použili na určenie výstupu volania správy. Parameter value
je to, čo funkcia vráti, a bude tiež zapísaná do sledovania ako textové vyjadrenie hodnoty jazyka M. Ak sa table
napríklad value
rovná hodnote so stĺpcami A a B, denník bude obsahovať ekvivalentné #table
vyjadrenie:#table({"A", "B"}, {{"row1 A", "row1 B"}, {"row2 A", row2 B"}})
Poznámka
Serializácia hodnôt jazyka M do textu môže byť náročná operácia. Uvedomte si potenciálnu veľkosť hodnôt, ktorých výstupom je sledovanie.
Poznámka
Väčšina prostredí Power Query skracuje hlásenia o sledovaní na maximálnu dĺžku.
V príklade aktualizujete funkciu a TripPin.Feed
budete sledovať url
argumenty a schema
prenesené do funkcie.
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;
Musíte použiť nové _url
hodnoty a _schema
vo volaní na GetAllPagesByNextLink
. Ak by ste použili pôvodné parametre funkcie, Diagnostics.LogValue
volania by sa nikdy nevyhodnotili, výsledkom čoho by neboli žiadne správy zapísané do sledovania. Funkčné programovanie je zábavné!
Keď spustíte dotazy, mali by sa teraz v denníku zobrazovať nové správy.
Prístup k URL adrese:
Typ schémy:
Keď vykonáte jednoduchú Text.FromValue
verziu s hodnotou typu (výsledkom je "typ" sa zobrazí serializovaná verzia schema
parametra type
, a nie to, čo by ste získali.
Diagnostics.LogFailure
Funkciu Diagnostics.LogFailure
možno použiť na zalomenie volaní funkcie a zapíše sa do sledovania len v prípade zlyhania volania funkcie (to znamená, že vráti hodnotu error
).
Diagnostics.LogFailure = (text as text, function as function) as any => ...
Pridá operátor do function
volania interne. Diagnostics.LogFailure
try
Ak volanie zlyhá, hodnota sa zapíše text
do sledovania pred vrátením pôvodnej error
hodnoty . Ak je function
volanie úspešné, vráti sa výsledok bez toho, aby sa do sledovania zapísal niečo. Keďže chyby jazyka M neobsahujú úplné sledovanie zásobníka (t. j. zvyčajne sa zobrazuje iba hlásenie o chybe), môže to byť užitočné, ak chcete určiť, kde bola chyba vyvolaná.
Ako (slabý) príklad zmeňte withData
riadok TripPinNavTable
funkcie tak, aby sa chyba opäť vynútila:
withData = Table.AddColumn(rename, "Data", each Diagnostics.LogFailure("Error in GetEntity", () => GetEntity(url, "DoesNotExist")), type table),
V sledovaní môžete nájsť výsledné chybové hlásenie obsahujúce informácie o vašej text
chybe a pôvodné informácie o chybe.
Skôr než budete pokračovať v ďalšom kurze, nezabudnite resetovať funkciu do pracovného stavu.
Záver
V tejto stručnej (ale dôležitej!) lekcii ste sa naučili, ako využívať funkcie diagnostickej pomoci na prihlásenie do súborov sledovania Power Query. Ak sa tieto funkcie používajú správne, sú užitočné pri ladení problémov v rámci konektora.
Poznámka
Ako vývojár konektora je vašou zodpovednosťou zabezpečiť, aby ste do diagnostického zapisovania nepíšu citlivé alebo osobne identifikovateľné informácie (PII). Dávajte si tiež pozor, aby ste nevyšli na výstupe príliš veľa informácií o sledovaní, pretože to môže mať negatívny vplyv na výkon.