Del via


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.

Aktiver sporing i Power Query.

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 til true.
  • 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.

Prosjektegenskaper.

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.Errorog 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:

Feilmelding.

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.

Feillogg.

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:

Tilgang til url-melding.

Skjematype:

Skjematypemelding.

Du ser den serialiserte versjonen av parameteren schema typei 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.

LogFailure-melding.

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.

Neste trinn

TripPin Del 9 - Test Koble til ion