TripPin část 8 – Přidání diagnostiky
Poznámka:
Tento obsah aktuálně odkazuje na obsah ze starší implementace diagnostiky v sadě Visual Studio. Obsah se bude v blízké budoucnosti aktualizovat tak, aby zahrnoval novou sadu Power Query SDK v editoru Visual Studio Code.
Tento vícedílný kurz popisuje vytvoření nového rozšíření zdroje dat pro Power Query. Tento kurz se má provést postupně – každá lekce vychází z konektoru vytvořeného v předchozích lekcích a postupně přidává do konektoru nové funkce.
V této lekci:
- Další informace o funkci Diagnostics.Trace
- Použití pomocných funkcí diagnostiky k přidání informací o trasování, které vám pomůžou ladit váš konektor
Povolení diagnostiky
Uživatelé Power Query mohou povolit protokolování trasování zaškrtnutím políčka v části Možnosti | Diagnostika.
Po povolení všechny následné dotazy způsobí, že modul M vygeneruje trasovací informace do souborů protokolu umístěných v pevném uživatelském adresáři.
Při spouštění dotazů M ze sady Power Query SDK je trasování povolené na úrovni projektu. Na stránce vlastností projektu existují tři nastavení související s trasováním:
- Vymazat protokol – když je tato možnost nastavená
true
, protokol se při spouštění dotazů resetuje nebo vymaže. Doporučujeme ponechat tuto možnost nastavenou natrue
hodnotu . - Zobrazit trasování modulu – toto nastavení řídí výstup integrovaných trasování z modulu M. Tyto trasování jsou užitečné jenom pro členy týmu Power Query, takže obvykle budete chtít tuto sadu
false
ponechat . - Zobrazit trasování uživatelů – toto nastavení řídí výstup informací o trasování konektorem. Toto nastavení budete chtít nastavit na
true
hodnotu .
Po povolení se v okně Výstup dotazu M na kartě Protokol začnou zobrazovat položky protokolu.
Diagnostics.Trace
Funkce Diagnostics.Trace slouží k zápisu zpráv do protokolu trasování modulu 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 opožděným vyhodnocením. Při použití Diagnostics.Trace
mějte na paměti, že funkce bude volána pouze v případě, že výraz, který je součástí, je skutečně vyhodnocen. Příklady najdete dále v tomto kurzu.
Parametr traceLevel
může být jedna z následujících hodnot (v sestupném pořadí):
TraceLevel.Critical
TraceLevel.Error
TraceLevel.Warning
TraceLevel.Information
TraceLevel.Verbose
Když je trasování povolené, uživatel může vybrat maximální úroveň zpráv, které by chtěli zobrazit. Všechny zprávy trasování této úrovně a pod budou výstupem protokolu. Pokud například uživatel vybere úroveň Upozornění, zprávy TraceLevel.Warning
TraceLevel.Error
trasování , a TraceLevel.Critical
zobrazí se v protokolech.
Parametr message
je skutečný text, který bude výstupem do trasovacího souboru. Text nebude obsahovat value
parametr, pokud ho explicitně nezahrnete do textu.
Parametr value
je to, co funkce vrátí. delayed
Pokud je parametr nastaven na true
, value
bude nulová funkce parametru, která vrátí skutečnou hodnotu, kterou vyhodnocujete. Pokud delayed
je nastavená hodnota false
, value
bude skutečná hodnota. Příklad toho, jak to funguje, najdete níže.
Pomocí diagnostiky. Trasování v konektoru TripPin
V praktickém příkladu použití Diagnostics.Trace a dopadu delayed
parametru aktualizujte funkci konektoru GetSchemaForEntity
TripPin tak, aby zabalil error
výjimku:
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);
Chybu můžete vynutit při vyhodnocování (pro účely testu!) předáním neplatného názvu entity do GetEntity
funkce. Tady změníte withData
řádek ve TripPinNavTable
funkci a nahradíte [Name]
ho ."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;
Povolte trasování projektu a spusťte testovací dotazy. Errors
Na kartě by se měl zobrazit text chyby, kterou jste vyvolali:
Na Log
kartě by se také měla zobrazit stejná zpráva. Pokud pro parametry message
value
použijete jiné hodnoty, budou se lišit.
Všimněte si také, že Action
pole zprávy protokolu obsahuje název (druh zdroje dat) vašeho rozšíření (v tomto případě Engine/Extension/TripPin
). To usnadňuje vyhledání zpráv souvisejících s vaším rozšířením, když je povolené více dotazů nebo trasování systému (mashupového modulu).
Zpožděné vyhodnocení
Jako příklad fungování parametru delayed
provedete určité úpravy a znovu spustíte dotazy.
Nejprve nastavte delayed
hodnotu na false
, ale ponechte value
parametr tak, jak je:
Diagnostics.Trace(TraceLevel.Error, message, () => error message, false);
Když spustíte dotaz, zobrazí se chyba" Nemůžeme převést hodnotu typu Funkce na typ, a ne skutečnou chybu, kterou jste vyvolali. Důvodem je to, že volání nyní vrací function
hodnotu, nikoli samotnou hodnotu.
Dále odeberte funkci z parametru value
:
Diagnostics.Trace(TraceLevel.Error, message, error message, false);
Při spuštění dotazu se zobrazí správná chyba, ale pokud zkontrolujete kartu Protokol , nebudou k dispozici žádné zprávy. Důvodem je to, že error
se nakonec vyvolá nebo vyhodnotí během volání Diagnostics.Trace
, takže zpráva není ve skutečnosti výstupem.
Teď, když rozumíte dopadu parametru
delayed
, nezapomeňte před pokračováním resetovat konektor zpět do funkčního stavu.
Diagnostické pomocné funkce v Diagnostics.pqm
Soubor Diagnostics.pqm zahrnutý v tomto projektu obsahuje mnoho pomocných funkcí, které usnadňují trasování. Jak je znázorněno v předchozím kurzu, můžete tento soubor zahrnout do projektu (nezapomeňte nastavit akci sestavení na kompilaci) a pak ho načíst do souboru konektoru. Dolní část souboru konektoru by teď měla vypadat přibližně jako fragment kódu níže. Nebojte se prozkoumat různé funkce, které tento modul poskytuje, ale v této ukázce budete používat Diagnostics.LogValue
pouze funkce a Diagnostics.LogFailure
funkce.
// 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
Funkce Diagnostics.LogValue
je hodně podobná Diagnostics.Trace
a dá se použít k výstupu hodnoty, kterou vyhodnocujete.
Diagnostics.LogValue = (prefix as text, value as any) as any => ...
Parametr prefix
je před zprávou protokolu. To byste použili k zjištění výstupu volání zprávy. Parametr value
je to, co funkce vrátí, a zapíše se také do trasování jako textové vyjádření hodnoty M. Pokud value
se například rovná table
sloupci A a B, bude protokol obsahovat ekvivalentní #table
reprezentaci: #table({"A", "B"}, {{"row1 A", "row1 B"}, {"row2 A", row2 B"}})
Poznámka:
Serializace hodnot M na text může být náročná operace. Mějte na paměti potenciální velikost hodnot, které do trasování vypíšete.
Poznámka:
Většina prostředí Power Query zkrátí trasovací zprávy na maximální délku.
Například aktualizujete TripPin.Feed
funkci tak, aby trasování url
argumentů a schema
argumentů předaných do funkce.
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žít nové _url
a _schema
hodnoty ve volání GetAllPagesByNextLink
. Pokud jste použili původní parametry funkce, volání by se nikdy ve skutečnosti nevyhodnotila, což by vedlo k tomu, Diagnostics.LogValue
že do trasování nebyly zapsány žádné zprávy. Funkční programování je zábavné!
Při spouštění dotazů by se teď v protokolu měly zobrazit nové zprávy.
Přístup k adrese URL:
Typ schématu:
Zobrazí se serializovaná verze parametru schema
type
, a ne to, co byste získali, když provedete jednoduchou Text.FromValue
hodnotu typu (což má za následek "typ").
Diagnostics.LogFailure
Funkci Diagnostics.LogFailure
lze použít k zalamování volání funkce a zapíše se do trasování pouze v případě, že volání funkce selže (to znamená, že vrátí error
hodnotu ).
Diagnostics.LogFailure = (text as text, function as function) as any => ...
Interně Diagnostics.LogFailure
přidá try
operátor do function
volání. Pokud volání selže, text
hodnota se před vrácením původní error
hodnoty zapíše do trasování . function
Pokud volání proběhne úspěšně, vrátí se výsledek bez napsání čehokoli do trasování. Vzhledem k tomu, že chyby M neobsahují úplné trasování zásobníku (to znamená, že se obvykle zobrazí pouze zpráva o chybě), může to být užitečné, když chcete určit, kde byla chyba vyvolána.
Jako příklad (špatný) upravte withData
řádek TripPinNavTable
funkce tak, aby vynutil chybu znovu:
withData = Table.AddColumn(rename, "Data", each Diagnostics.LogFailure("Error in GetEntity", () => GetEntity(url, "DoesNotExist")), type table),
V trasování najdete výslednou chybovou zprávu obsahující vaši text
a původní informace o chybě.
Než budete pokračovat v dalším kurzu, nezapomeňte funkci obnovit do funkčního stavu.
Závěr
Tato stručná (ale důležitá!) lekce vám ukázala, jak pomocí diagnostických pomocných funkcí protokolovat do trasovacích souborů Power Query. Při správném použití jsou tyto funkce užitečné při ladění problémů v rámci konektoru.
Poznámka:
Jako vývojář konektoru je vaší zodpovědností zajistit, abyste jako součást protokolování diagnostiky nezaregistrovávejte citlivé nebo identifikovatelné osobní údaje. Musíte být také opatrní, abyste nevykreslili příliš mnoho informací trasování, protože to může mít negativní dopad na výkon.