TripPin del 8 – Legge til diagnostikk
Merk
Dette innholdet refererer for øyeblikket til innhold fra en eldre implementering for diagnostikk i Visual Studio. Innholdet oppdateres i nær fremtid for å dekke den nye SDK-en for Power Query i Visual Studio Code.
Denne flerdelte opplæringen dekker opprettelsen av en ny datakildeutvidelse for Power Query. Opplæringen er ment å gjøres sekvensielt – hver leksjon bygger på koblingen som er opprettet i tidligere leksjoner, og legger trinnvis til nye funksjoner i koblingen.
I denne leksjonen vil du:
- Finn ut mer om diagnostics.trace-funksjonen
- Bruk hjelpefunksjonene for diagnose til å legge til sporingsinformasjon for å feilsøke koblingen
Aktivere diagnostikk
Power Query-brukere kan aktivere sporingslogging ved å velge avmerkingsboksen under Alternativer | Diagnostikk.
Når den er aktivert, vil eventuelle etterfølgende spørringer føre til at M-motoren sender sporingsinformasjon til å logge filer som er plassert i en fast brukerkatalog.
Når du kjører M-spørringer fra Power Query SDK, aktiveres sporing på prosjektnivå. På siden for prosjektegenskaper er det tre innstillinger relatert til sporing:
- Fjern logg – når dette er satt til
true
, tilbakestilles/fjernes loggen når du kjører spørringene. Vi anbefaler at du holder dette angitt tiltrue
. - Vis motorsporinger – denne innstillingen styrer utdataene for innebygde sporinger fra M-motoren. Disse sporene er bare nyttige for medlemmer av Power Query-teamet, så du vil vanligvis beholde dette angitt til
false
. - Vis brukersporinger – denne innstillingen styrer sporingsinformasjonsutdataene etter koblingen. Du vil angi dette til
true
.
Når den er aktivert, vil du begynne å se loggoppføringer i utdatavinduet for M-spørring under Fanen Logg.
Diagnostics.Trace
Diagnostics.Trace-funksjonen brukes til å skrive meldinger til M-motorens sporingslogg.
Diagnostics.Trace = (traceLevel as number, message as text, value as any, optional delayed as nullable logical as any) => ...
Viktig
M er et funksjonelt språk med lat evaluering. Når du bruker Diagnostics.Trace
, må du huske på at funksjonen bare kalles hvis uttrykket den er en del av, faktisk evalueres. Eksempler på dette finner du senere i denne opplæringen.
Parameteren traceLevel
kan være én av følgende verdier (i synkende rekkefølge):
TraceLevel.Critical
TraceLevel.Error
TraceLevel.Warning
TraceLevel.Information
TraceLevel.Verbose
Når sporing er aktivert, kan brukeren velge maksimalt antall meldinger de ønsker å se. Alle sporingsmeldinger på dette nivået og under sendes til loggen. Hvis brukeren for eksempel velger «Advarsel»-nivået, sporer meldinger fra TraceLevel.Warning
, TraceLevel.Error
og TraceLevel.Critical
vises i loggene.
Parameteren message
er den faktiske teksten som skal sendes til sporingsfilen. Teksten inneholder ikke parameteren value
med mindre du eksplisitt inkluderer den i teksten.
Parameteren value
er hva funksjonen vil returnere. Når parameteren delayed
er satt til true
, value
vil det være en nullparameterfunksjon som returnerer den faktiske verdien du evaluerer. Når delayed
er satt til false
, value
blir den faktiske verdien. Du finner et eksempel på hvordan dette fungerer nedenfor.
Bruke diagnostikk. Spor i TripPin-koblingen
Hvis du vil ha et praktisk eksempel på hvordan du bruker Diagnostics.Trace og virkningen av parameterendelayed
, kan du oppdatere TripPin-koblingens GetSchemaForEntity
funksjon for å bryte unntaketerror
:
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 fremtvinge en feil under evalueringen (for testformål!) ved å sende et ugyldig enhetsnavn til GetEntity
funksjonen. Her endrer withData
du linjen i TripPinNavTable
funksjonen, og erstatter [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;
Aktiver sporing for prosjektet, og kjør testspørringene. På fanen Errors
skal du se teksten i feilen du oppdro:
Log
I kategorien skal du også se den samme meldingen. Hvis du bruker forskjellige verdier for message
og value
parameterne, vil disse være forskjellige.
Vær også oppmerksom på Action
at feltet i loggmeldingen inneholder navnet (datakildetypen) for utvidelsen (i dette tilfellet Engine/Extension/TripPin
). Dette gjør det enklere å finne meldinger relatert til utvidelsen når det er flere spørringer involvert og/eller systemsporing (mashup-motor) er aktivert.
Forsinket evaluering
Som et eksempel på hvordan parameteren delayed
fungerer, gjør du noen endringer og kjører spørringene på nytt.
Først setter du delayed
verdien til false
, men lar parameteren value
stå som den er:
Diagnostics.Trace(TraceLevel.Error, message, () => error message, false);
Når du kjører spørringen, får du en feilmelding om at «Vi kan ikke konvertere en verdi av typen Funksjon til type type», og ikke den faktiske feilen du oppdro. Dette er fordi kallet nå returnerer en function
verdi, i stedet for selve verdien.
Deretter fjerner du funksjonen fra parameteren value
:
Diagnostics.Trace(TraceLevel.Error, message, error message, false);
Når du kjører spørringen, får du den riktige feilen, men hvis du kontrollerer Logg-fanen, blir det ingen meldinger. Dette er fordi det error
ender opp med å bli hevet/evaluert under samtalen til Diagnostics.Trace
, slik at meldingen aldri faktisk blir utdata.
Nå som du forstår virkningen av parameteren
delayed
, må du tilbakestille koblingen tilbake til en arbeidstilstand før du fortsetter.
Diagnosehjelperfunksjoner i Diagnostics.pqm
Diagnostics.pqm-filen som er inkludert i dette prosjektet, inneholder mange hjelpefunksjoner som gjør sporing enklere. Som vist i forrige opplæring, kan du inkludere denne filen i prosjektet (husk å angi kompilering av bygghandling), og deretter laste den inn i koblingsfilen. Bunnen av koblingsfilen skal nå se omtrent ut som kodesnutten nedenfor. Du kan gjerne utforske de ulike funksjonene denne modulen gir, men i dette eksemplet bruker Diagnostics.LogValue
du bare funksjonene og Diagnostics.LogFailure
funksjonene.
// 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
Funksjonen Diagnostics.LogValue
er mye lik Diagnostics.Trace
, og kan brukes til å sende ut verdien av det du evaluerer.
Diagnostics.LogValue = (prefix as text, value as any) as any => ...
Parameteren prefix
er klar til loggmeldingen. Du vil bruke dette til å finne ut hvilket anrop som sender meldingen. Parameteren value
er hva funksjonen vil returnere, og vil også bli skrevet til sporingen som en tekstrepresentasjon av M-verdien. Hvis value
for eksempel er lik en table
med kolonne A og B, vil loggen inneholde tilsvarende #table
representasjon: #table({"A", "B"}, {{"row1 A", "row1 B"}, {"row2 A", row2 B"}})
Merk
Serialisering av M-verdier til tekst kan være en dyr operasjon. Vær oppmerksom på den potensielle størrelsen på verdiene du sender til sporingen.
Merk
De fleste Power Query-miljøer avkorter sporingsmeldinger til en maksimal lengde.
Som et eksempel oppdaterer TripPin.Feed
du funksjonen for å spore url
og schema
argumenter som sendes inn i funksjonen.
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 må bruke de nye _url
verdiene i _schema
kallet til GetAllPagesByNextLink
. Hvis du brukte de opprinnelige funksjonsparameterne, Diagnostics.LogValue
ville samtalene aldri faktisk bli evaluert, noe som resulterte i at ingen meldinger ble skrevet til sporingen. Funksjonell programmering er gøy!
Når du kjører spørringene, skal du nå se nye meldinger i loggen.
Tilgang til url-adresse:
Skjematype:
Du ser den serialiserte versjonen av parameteren schema
type
i stedet for hva du får når du gjør en enkel Text.FromValue
verdi på en typeverdi (som resulterer i «type»).
Diagnostics.LogFailure
Funksjonen Diagnostics.LogFailure
kan brukes til å bryte funksjonsanrop, og vil bare skrive til sporingen hvis funksjonskallet mislykkes (det vil eksempel: returnerer en error
).
Diagnostics.LogFailure = (text as text, function as function) as any => ...
Diagnostics.LogFailure
Internt legger du til en try
operator i function
samtalen. Hvis kallet mislykkes, text
skrives verdien til sporingen før den opprinnelige returneres error
. Hvis samtalen function
lykkes, returneres resultatet uten å skrive noe til sporingen. Siden M-feil ikke inneholder en fullstendig stakksporing (det vil si at du vanligvis bare ser meldingen om feilen), kan dette være nyttig når du vil finne ut hvor feilen ble utløst.
Som et (dårlig) eksempel kan du endre withData
linjen i TripPinNavTable
funksjonen for å fremtvinge en feil igjen:
withData = Table.AddColumn(rename, "Data", each Diagnostics.LogFailure("Error in GetEntity", () => GetEntity(url, "DoesNotExist")), type table),
I sporingen finner du den resulterende feilmeldingen som inneholder din text
, og den opprinnelige feilinformasjonen.
Pass på å tilbakestille funksjonen til en arbeidstilstand før du fortsetter med neste opplæring.
Konklusjon
Denne korte (men viktige!) leksjonen viste deg hvordan du bruker diagnosehjelperfunksjonene til å logge på Power Query-sporingsfilene. Når de brukes riktig, er disse funksjonene nyttige i feilsøkingsproblemer i koblingen.
Merk
Som koblingsutvikler er det ditt ansvar å sørge for at du ikke logger sensitiv eller personlig identifiserbar informasjon (PII) som en del av diagnoseloggingen. Du må også være forsiktig med å ikke sende ut for mye sporingsinformasjon, da det kan ha en negativ ytelseseffekt.