TripPin del 8 – Tilføjelse af diagnosticering
Bemærk
Dette indhold refererer i øjeblikket til indhold fra en ældre implementering til diagnosticering i Visual Studio. Indholdet opdateres i den nærmeste fremtid, så det dækker det nye Power Query SDK i Visual Studio Code.
Dette selvstudium i flere dele dækker oprettelsen af en ny datakildeudvidelse til Power Query. Selvstudiet er beregnet til at blive udført sekventielt – hver lektion bygger på den connector, der blev oprettet i tidligere lektioner, og føjer trinvist nye funktioner til din connector.
I denne lektion skal du:
- Få mere at vide om funktionen Diagnostics.Trace
- Brug hjælpefunktionerne til diagnosticering til at tilføje sporingsoplysninger som en hjælp til fejlfinding af din connector
Aktivering af diagnosticering
Brugere af Power Query kan aktivere sporingslogføring ved at markere afkrydsningsfeltet under Indstillinger | Diagnosticering.
Når indstillingen er aktiveret, medfører alle efterfølgende forespørgsler, at M-programmet sender sporingsoplysninger til logfiler, der er placeret i en fast brugermappe.
Når du kører M-forespørgsler fra Power Query SDK, aktiveres sporing på projektniveau. På siden med projektegenskaber er der tre indstillinger relateret til sporing:
- Ryd log – når dette er angivet til
true
, nulstilles loggen/ryddes, når du kører dine forespørgsler. Vi anbefaler, at du beholder dette sæt tiltrue
. - Vis programsporinger – denne indstilling styrer outputtet af indbyggede sporinger fra M-programmet. Disse sporinger er kun nyttige for medlemmer af Power Query-teamet, så du vil typisk beholde dette sæt til
false
. - Vis brugersporinger – denne indstilling styrer outputtet af sporingsoplysninger fra din connector. Du skal angive dette til
true
.
Når indstillingen er aktiveret, får du vist logposter i vinduet M-forespørgselsoutput under fanen Log.
Diagnostics.Trace
Funktionen Diagnostics.Trace bruges til at skrive meddelelser til M-programmets sporingslog.
Diagnostics.Trace = (traceLevel as number, message as text, value as any, optional delayed as nullable logical as any) => ...
Vigtigt
M er et funktionelt sprog med doven evaluering. Når du bruger Diagnostics.Trace
, skal du være opmærksom på, at funktionen kun kaldes, hvis det udtryk, den er en del af, faktisk evalueres. Eksempler på dette kan findes senere i dette selvstudium.
Parameteren traceLevel
kan være en af følgende værdier (i faldende rækkefølge):
TraceLevel.Critical
TraceLevel.Error
TraceLevel.Warning
TraceLevel.Information
TraceLevel.Verbose
Når sporing er aktiveret, kan brugeren vælge det maksimale niveau af meddelelser, vedkommende vil se. Alle sporingsmeddelelser på dette niveau og under sendes til logfilen. Hvis brugeren f.eks. vælger niveauet "Advarsel", vil sporingsmeddelelserne for TraceLevel.Warning
, TraceLevel.Error
og TraceLevel.Critical
blive vist i loggene.
Parameteren message
er den faktiske tekst, der sendes til sporingsfilen. Teksten indeholder value
ikke parameteren, medmindre du eksplicit inkluderer den i teksten.
Parameteren value
er det, som funktionen returnerer. Når parameteren delayed
er angivet til true
, value
er det en parameterfunktion på nul, der returnerer den faktiske værdi, du evaluerer. Når delayed
er angivet til false
, value
er den faktiske værdi. Du kan finde et eksempel på, hvordan dette fungerer, nedenfor.
Ved hjælp af Diagnosticering. Spor i TripPin-connectoren
Hvis du vil have et praktisk eksempel på brug af Diagnostics.Trace og virkningen af delayed
parameteren, skal du opdatere TripPin-connectorens GetSchemaForEntity
funktion for at ombryde error
undtagelsen:
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);
Du kan gennemtvinge en fejl under evalueringen (til testformål!) ved at overføre et ugyldigt enhedsnavn til funktionen GetEntity
. Her kan du ændre linjen withData
i funktionen TripPinNavTable
og erstatte [Name]
med "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;
Aktivér sporing for dit projekt, og kør dine testforespørgsler. Under fanen Errors
kan du se teksten til den fejl, du har udløst:
Under fanen Log
kan du også se den samme meddelelse. Hvis du bruger forskellige værdier for parametrene message
og value
, vil disse være forskellige.
Bemærk også, at feltet Action
i logmeddelelsen indeholder navnet (Datakildetype) for filtypenavnet (i dette tilfælde Engine/Extension/TripPin
). Det gør det nemmere at finde de meddelelser, der er relateret til din udvidelse, når der er flere involverede forespørgsler, og/eller sporing af system (miksmaskine) er aktiveret.
Forsinket evaluering
Som et eksempel på, hvordan delayed
parameteren fungerer, skal du foretage nogle ændringer og køre forespørgslerne igen.
Angiv først værdien delayed
til false
, men lad parameteren være value
som den er:
Diagnostics.Trace(TraceLevel.Error, message, () => error message, false);
Når du kører forespørgslen, får du vist en fejl om, at "Vi kan ikke konvertere en værdi af typen Funktion til type", og ikke den faktiske fejl, du har udløst. Det skyldes, at kaldet nu returnerer en function
værdi i stedet for selve værdien.
Fjern derefter funktionen fra value
parameteren:
Diagnostics.Trace(TraceLevel.Error, message, error message, false);
Når du kører forespørgslen, får du vist den korrekte fejl, men hvis du markerer fanen Log , vil der ikke være nogen meddelelser. Det skyldes, at det error
ender med at blive opløftet/evalueret under opkaldet til Diagnostics.Trace
, så meddelelsen faktisk aldrig sendes.
Nu, hvor du forstår virkningen af
delayed
parameteren, skal du sørge for at nulstille connectoren tilbage til en arbejdstilstand, før du fortsætter.
Diagnosticeringshjælpefunktioner i Diagnostics.pqm
Filen Diagnostics.pqm , der er inkluderet i dette projekt, indeholder mange hjælpefunktioner, der gør sporing nemmere. Som vist i det forrige selvstudium kan du inkludere denne fil i projektet (huske at angive handlingen Opret til Kompiler) og derefter indlæse den i din connectorfil. Nederst i connectorfilen skal det nu ligne kodestykket nedenfor. Du er velkommen til at udforske de forskellige funktioner, dette modul indeholder, men i dette eksempel bruger Diagnostics.LogValue
du kun funktionerne og 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
Funktionen Diagnostics.LogValue
minder meget om Diagnostics.Trace
, og den kan bruges til at angive værdien af det, du evaluerer.
Diagnostics.LogValue = (prefix as text, value as any) as any => ...
Parameteren prefix
er forudforberedt til logmeddelelsen. Du skal bruge dette til at finde ud af, hvilket kald der skriver meddelelsen. Parameteren value
er det, som funktionen returnerer, og den skrives også til sporingen som en tekstrepræsentation af M-værdien. Hvis value
f.eks. er lig med med table
kolonnerne A og B, indeholder logfilen den tilsvarende #table
repræsentation: #table({"A", "B"}, {{"row1 A", "row1 B"}, {"row2 A", row2 B"}})
Bemærk
Serialisering af M-værdier til tekst kan være en dyr handling. Vær opmærksom på den potentielle størrelse af de værdier, du skriver til sporingen.
Bemærk
De fleste Power Query-miljøer afkorter sporingsmeddelelser til en maksimal længde.
Du skal f.eks. opdatere funktionen TripPin.Feed
for at spore de argumenter og schema
, der url
overføres til funktionen .
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;
Du skal bruge de nye _url
værdier og _schema
i kaldet til GetAllPagesByNextLink
. Hvis du brugte de oprindelige funktionsparametre, Diagnostics.LogValue
evalueres kald aldrig, hvilket medfører, at der ikke skrives nogen meddelelser til sporingen. Funktionel programmering er sjovt!
Når du kører dine forespørgsler, kan du nu se nye meddelelser i logfilen.
Adgang til URL-adresse:
Skematype:
Du kan se den serialiserede version af schema
parameteren type
i stedet for det, du får, når du gør en simpel Text.FromValue
på en typeværdi (hvilket resulterer i "type").
Diagnostics.LogFailure
Funktionen Diagnostics.LogFailure
kan bruges til at ombryde funktionskald og skriver kun til sporingen, hvis funktionskaldet mislykkes (dvs. returnerer en error
).
Diagnostics.LogFailure = (text as text, function as function) as any => ...
Diagnostics.LogFailure
Føjer en try
operator til opkaldet function
internt. Hvis kaldet mislykkes, skrives text
værdien til sporingen, før den oprindelige error
returneres. Hvis kaldet function
lykkes, returneres resultatet uden at skrive noget til sporingen. Da M-fejl ikke indeholder en fuld staksporing (dvs. du får normalt kun vist meddelelsen om fejlen), kan det være nyttigt, når du vil finde ud af, hvor fejlen blev udløst.
Som et (dårligt) eksempel skal du ændre withData
funktionens TripPinNavTable
linje for at gennemtvinge en fejl igen:
withData = Table.AddColumn(rename, "Data", each Diagnostics.LogFailure("Error in GetEntity", () => GetEntity(url, "DoesNotExist")), type table),
I sporingen kan du finde den resulterende fejlmeddelelse, der indeholder dine text
, og de oprindelige fejloplysninger.
Sørg for at nulstille din funktion til en arbejdstilstand, før du fortsætter med det næste selvstudium.
Konklusion
Denne korte (men vigtige!) lektion viste dig, hvordan du bruger diagnosticeringshjælpefunktionerne til at logge på Power Query-sporingsfilerne. Når disse funktioner bruges korrekt, er de nyttige til fejlfinding af problemer i din connector.
Bemærk
Som connectorudvikler er det dit ansvar at sikre, at du ikke logfører følsomme eller personligt identificerbare oplysninger som en del af logføringen af diagnosticering. Du skal også være forsigtig med ikke at sende for mange sporingsoplysninger, da det kan have en negativ indvirkning på ydeevnen.