TripPin 8. rész – Diagnosztikák hozzáadása
Feljegyzés
Ez a tartalom jelenleg a Visual Studióban történő diagnosztikához használt örökölt implementációból származó tartalmakra hivatkozik. A tartalom a közeljövőben frissülni fog, hogy lefedje a Visual Studio Code új Power Query SDK-ját.
Ez a többrészes oktatóanyag a Power Query új adatforrásbővítményének létrehozását ismerteti. Az oktatóanyagot egymás után kell elvégezni – minden lecke az előző leckékben létrehozott összekötőre épül, és növekményesen új képességeket ad hozzá az összekötőhöz.
Ebben a leckében a következőt fogja:
- Tudnivalók a Diagnostics.Trace függvényről
- A Diagnosztikai segédfüggvények használatával nyomkövetési információkat adhat hozzá az összekötő hibakereséséhez
Diagnosztika engedélyezése
A Power Query felhasználói engedélyezhetik a nyomkövetési naplózást a Beállítások | Diagnosztika.
Ha engedélyezve van, a későbbi lekérdezések hatására az M motor nyomkövetési információkat bocsát ki a rögzített felhasználói címtárban található naplófájlok számára.
Ha M-lekérdezéseket futtat a Power Query SDK-ból, a nyomkövetés a projekt szintjén engedélyezve van. A projekttulajdonságok lapon három beállítás van a nyomkövetéshez:
- Napló törlése – ha ez a beállítás be van állítva
true
, a rendszer visszaállítja/törli a naplót a lekérdezések futtatásakor. Javasoljuk, hogy ezt a beállítást tartsa a következőretrue
: . - Motorkövetések megjelenítése – ez a beállítás szabályozza az M motor beépített nyomkövetéseinek kimenetét. Ezek a nyomkövetések csak a Power Query-csapat tagjai számára hasznosak, ezért általában ezt a beállítást
false
érdemes megtartani. - Felhasználói nyomkövetések megjelenítése – ez a beállítás szabályozza az összekötő nyomkövetési információinak kimenetét. Ezt a beállítást a következőre szeretné beállítani
true
: .
Ha engedélyezve van, a naplóbejegyzések az M Lekérdezés kimenete ablakban, a Napló lap alatt jelennek meg.
Diagnostics.Trace
A Diagnostics.Trace függvény üzenetek írására szolgál az M motor nyomkövetési naplójába.
Diagnostics.Trace = (traceLevel as number, message as text, value as any, optional delayed as nullable logical as any) => ...
Fontos
Az M egy funkcionális nyelv lusta kiértékeléssel. A használat során Diagnostics.Trace
ne feledje, hogy a függvény csak akkor lesz meghívva, ha a kifejezés, amelynek a része, ténylegesen kiértékelve lesz. Erre az oktatóanyag későbbi részében talál példákat.
A traceLevel
paraméter a következő értékek egyike lehet (csökkenő sorrendben):
TraceLevel.Critical
TraceLevel.Error
TraceLevel.Warning
TraceLevel.Information
TraceLevel.Verbose
Ha a nyomkövetés engedélyezve van, a felhasználó kiválaszthatja a megtekinteni kívánt üzenetek maximális szintjét. Az ilyen szintű és alatti nyomkövetési üzenetek a naplóba kerülnek. Ha például a felhasználó a "Figyelmeztetés" szintet választja, a naplókban megjelennek a nyomkövetési TraceLevel.Warning
TraceLevel.Error
TraceLevel.Critical
üzenetek.
A message
paraméter az a tényleges szöveg, amely a nyomkövetési fájl kimenete lesz. A szöveg csak akkor tartalmazza a value
paramétert, ha kifejezetten belefoglalja a szövegbe.
A value
függvény a paramétert adja vissza. delayed
A paraméter beállításakor true
value
egy nulla paraméterfüggvény lesz, amely a kiértékelendő tényleges értéket adja vissza. Ha delayed
be van állítva false
, value
akkor a tényleges érték lesz. Az alábbiakban talál egy példát a működésre.
A diagnosztika használata. Nyomkövetés a TripPin-összekötőben
A Diagnostics.Trace használatának gyakorlati példájához és a delayed
paraméter hatásához frissítse a TripPin-összekötő függvényét GetSchemaForEntity
a error
kivétel körbefuttatásához:
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);
A kiértékelés során (tesztelési célokra!) egy érvénytelen entitásnevet adhat át a GetEntity
függvénynek. Itt módosíthatja a withData
függvény sorát, és lecserélheti [Name]
a TripPinNavTable
következőre"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;
Engedélyezze a projekt nyomkövetését , és futtassa a teszt lekérdezéseit. Errors
A lapon a felmerült hiba szövegének kell megjelennie:
Emellett a Log
lapon ugyanazt az üzenetet kell látnia. Ha különböző értékeket használ a paraméterekhez és value
a message
paraméterekhez, ezek eltérőek lesznek.
Vegye figyelembe, hogy a Action
naplóüzenet mezője tartalmazza a bővítmény nevét (ebben az esetben Engine/Extension/TripPin
). Így könnyebben megtalálhatja a bővítményhez kapcsolódó üzeneteket, ha több lekérdezés is van, és/vagy a rendszer (összefésülési motor) nyomkövetése engedélyezve van.
Késleltetett kiértékelés
Példa a delayed
paraméter működésére, néhány módosítást végrehajt, és újra futtatja a lekérdezéseket.
Először állítsa be az delayed
értéket a következő értékre false
, de hagyja meg a value
paramétert a következőképpen:
Diagnostics.Trace(TraceLevel.Error, message, () => error message, false);
A lekérdezés futtatásakor a következő hibaüzenet jelenik meg: "Nem tudunk típus típusú függvényt átalakítani" hibaüzenet jelenik meg, és nem a tényleges, ön által felvetett hiba. Ennek az az oka, hogy a hívás most egy function
értéket ad vissza, nem magát az értéket.
Ezután távolítsa el a függvényt a value
paraméterből:
Diagnostics.Trace(TraceLevel.Error, message, error message, false);
A lekérdezés futtatásakor a megfelelő hibaüzenet jelenik meg, de ha bejelöli a Napló lapot, nem lesznek üzenetek. Ennek az az oka, hogy a rendszer végül a error
hívás Diagnostics.Trace
során emeli/értékeli ki, így az üzenet valójában soha nem lesz kimenet.
Most, hogy megismerte a
delayed
paraméter hatását, mindenképpen állítsa vissza az összekötőt működő állapotba a folytatás előtt.
Diagnosztikai segédfüggvények a Diagnostics.pqm-ben
A projektben található Diagnostics.pqm fájl számos segédfüggvényt tartalmaz, amelyek megkönnyítik a nyomkövetést. Ahogy az előző oktatóanyagban is látható, ezt a fájlt belefoglalhatja a projektbe (ne felejtse el lefordítani a buildelési műveletet), majd betöltheti az összekötőfájlba. Az összekötőfájl aljának most az alábbi kódrészlethez hasonlóan kell kinéznie. Nyugodtan fedezze fel a modul által biztosított különböző függvényeket, de ebben a mintában csak a Diagnostics.LogValue
függvényeket fogja Diagnostics.LogFailure
használni.
// 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
A Diagnostics.LogValue
függvény nagyon hasonló Diagnostics.Trace
, és a kiértékelendő érték kimenetére használható.
Diagnostics.LogValue = (prefix as text, value as any) as any => ...
A prefix
paraméter elő van állítva a naplóüzenetre. Ezzel állapíthatja meg, hogy melyik hívás kimenete legyen az üzenet. A value
függvény a paramétert adja vissza, és az M érték szöveges ábrázolásaként is meg lesz írva a nyomkövetésre. Ha például value
az A és b oszlopokkal egyenlő table
, a napló az egyenértékű #table
ábrázolásokat fogja tartalmazni: #table({"A", "B"}, {{"row1 A", "row1 B"}, {"row2 A", row2 B"}})
Feljegyzés
Az M értékek szöveggé való szerializálása költséges művelet lehet. Ügyeljen arra, hogy a nyomkövetéshez kivezetett értékek mérete mekkora lehet.
Feljegyzés
A Legtöbb Power Query-környezet a nyomkövetési üzeneteket a maximális hosszra csonkítja.
Példaként frissítenie kell a függvényt, TripPin.Feed
hogy nyomon kövesse a url
függvénybe átadott argumentumokat és schema
argumentumokat.
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;
A hívásban szereplő új _url
és _schema
értékeket kell használnia GetAllPagesByNextLink
. Ha az eredeti függvényparamétereket használta, a Diagnostics.LogValue
hívások soha nem lesznek kiértékelve, így nem lesznek a nyomkövetésre írt üzenetek. A funkcionális programozás szórakoztató!
A lekérdezések futtatásakor mostantól új üzeneteknek kell megjelennie a naplóban.
Url-cím elérése:
Séma típusa:
A paraméter type
szerializált verzióját látja ahelyettschema
, hogy azt kapná, amit egy egyszerű Text.FromValue
típusérték esetén kap (ami "típust" eredményez).
Diagnostics.LogFailure
A Diagnostics.LogFailure
függvény függvényhívások burkolására használható, és csak akkor ír a nyomkövetésre, ha a függvényhívás meghiúsul (vagyis egy függvényt error
ad vissza).
Diagnostics.LogFailure = (text as text, function as function) as any => ...
Belsőleg Diagnostics.LogFailure
hozzáad egy operátort try
a function
híváshoz. Ha a hívás sikertelen, az text
érték a nyomkövetésbe lesz írva, mielőtt visszaadja az eredetit error
. Ha a function
hívás sikeres, az eredmény anélkül lesz visszaadva, hogy bármit is írna a nyomkövetéshez. Mivel az M-hibák nem tartalmaznak teljes veremkövetést (azaz általában csak a hiba üzenetét látja), ez akkor lehet hasznos, ha meg szeretné határozni, hogy hol történt a hiba.
Gyenge példaként módosítsa a withData
függvény sorát TripPinNavTable
, hogy ismét hibát kényszerítsen ki:
withData = Table.AddColumn(rename, "Data", each Diagnostics.LogFailure("Error in GetEntity", () => GetEntity(url, "DoesNotExist")), type table),
A nyomkövetésben megtalálhatja az ön és az eredeti hibainformációt tartalmazó text
hibaüzenetet.
A következő oktatóanyag elvégzése előtt mindenképpen állítsa vissza a függvényt működő állapotba.
Összegzés
Ez a rövid (de fontos!) lecke bemutatta, hogyan használhatja a diagnosztikai segédfüggvényeket a Power Query nyomkövetési fájljaiba való bejelentkezéshez. A megfelelő használat esetén ezek a függvények hasznosak az összekötőn belüli hibakeresési problémák esetén.
Feljegyzés
Összekötő-fejlesztőként az Ön felelőssége annak biztosítása, hogy a diagnosztikai naplózás részeként ne naplózza a bizalmas vagy személyazonosításra alkalmas adatokat (PII). Ügyeljen arra is, hogy ne adjon ki túl sok nyomkövetési információt, mivel az negatív hatással lehet a teljesítményre.