Zdieľať cez


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.

Zapnite sledovanie v doplnku Power Query.

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 na true.
  • 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 falsehodnotu .
  • Zobraziť sledovania používateľa – toto nastavenie riadi výstup informácií o sledovaní vašim konektorom. Toto nastavenie budete chcieť nastaviť na truehodnotu .

Vlastnosti projektu.

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.Tracenezabudnite, ž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.Warningsledovaní , TraceLevel.Errora 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 truehodnotu , 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:

Chybové hlásenie.

Log Na karte by sa tiež mala zobraziť rovnaká správa. Ak použijete pre parametre a value iné hodnotymessage, bude to iné.

Denník chýb.

Všimnite si tiež, že Action pole správy denníka obsahuje názov vášho rozšírenia (v tomto prípade Engine/Extension/TripPintyp 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:

Prístup k správe URL adresy.

Typ schémy:

Správa typu 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 errorhodnoty . 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 textchybe a pôvodné informácie o chybe.

Správa LogFailure.

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.

Ďalšie kroky

TripPin Časť 9 - Test Pripojenie ion