TripPin-osa 8 – Diagnostiikan lisääminen
Muistiinpano
Tämä sisältö viittaa tällä hetkellä visual studion diagnostiikan vanhan toteutuksen sisältöön. Sisältö päivitetään lähitulevaisuudessa kattamaan uusi Power Query SDK Visual Studio Codessa.
Tässä moniosaisessa opetusohjelmassa käsitellään uuden tietolähdelaajennuksen luomista Power Querylle. Opetusohjelma on tarkoitus tehdä järjestyksessä – jokainen oppitunti perustuu aiemmilla oppitunneilla luotuun liittimeen ja lisää uusia ominaisuuksia liittimeen.
Tällä oppitunnilla:
- Lisätietoja Diagnostics.Trace-funktiosta
- Diagnostiikan apufunktioiden avulla voit lisätä jäljitystietoja liittimen virheenkorjauksen helpottamiseksi
Diagnostiikan käyttöönotto
Power Query -käyttäjät voivat ottaa jäljityksen kirjaamisen käyttöön valitsemalla valintaruudun kohdassa Asetukset | Diagnostiikka.
Kun tämä asetus on käytössä, kaikki myöhemmät kyselyt aiheuttavat sen, että M-moduuli lähettää jäljitystiedot kiinteässä käyttäjähakemistossa sijaitseviin lokitiedostoihin.
Kun M-kyselyitä suoritetaan Power Query SDK:sta, jäljitys otetaan käyttöön projektitasolla. Projektin ominaisuudet -sivulla on kolme jäljitykseen liittyvää asetusta:
- Tyhjennä Log – kun tämän asetuksena
true
on , loki nollautuu tai tyhjennetään, kun suoritat kyselyt. Suosittelemme, että pidät tämän asetuksen arvonatrue
. - Näytä moduulin jäljitykset – tämä asetus määrittää M-moduulin sisältämien jäljitysten tulokset. Nämä jäljitystiedostot ovat hyödyllisiä vain Power Query -tiimin jäsenille, joten haluat yleensä pitää tämän asetuksena
false
. - Näytä käyttäjien jäljitykset – tämä asetus ohjaa liittimesi tulostamien tietojen jäljitystä. Tämän arvoksi
true
kannattaa asettaa .
Kun se on käytössä, näet lokimerkinnät M-kyselyn tuloste -ikkunassa Log-välilehden alla.
Diagnostics.Trace
Diagnostics.Trace-funktiolla kirjoitetaan sanomia M-moduulin jäljityslokiin.
Diagnostics.Trace = (traceLevel as number, message as text, value as any, optional delayed as nullable logical as any) => ...
Tärkeä
M on funktionaalinen kieli, jossa arviointi on laiskuutta. Kun käytät Diagnostics.Trace
-funktiota, muista, että funktiota kutsutaan vain, jos lauseke, johon se on osa, arvioidaan. Esimerkkejä tästä on jäljempänä tässä opetusohjelmassa.
traceLevel
Parametri voi olla yksi seuraavista arvoista (laskevassa järjestyksessä):
TraceLevel.Critical
TraceLevel.Error
TraceLevel.Warning
TraceLevel.Information
TraceLevel.Verbose
Kun jäljitys on käytössä, käyttäjä voi valita enimmäismäärän sanomia, jotka hän haluaa nähdä. Kaikki tällä tasolla ja sen alapuolella olevat jäljitysviestit tulostetaan lokiin. Jos käyttäjä esimerkiksi valitsee varoitustason, -viestin jäljitysviestit TraceLevel.Warning
TraceLevel.Error
TraceLevel.Critical
näkyvät lokeissa.
message
Parametri on todellinen teksti, joka tulostetaan jäljitystiedostoon. Teksti ei sisällä parametria, value
ellet nimenomaisesti sisällytä sitä tekstiin.
Funktio value
palauttaa parametrin. Kun parametrin delayed
arvoksi true
on määritetty , value
on nollaparametrifunktio, joka palauttaa arvioitavan todellisen arvon. Kun delayed
arvona false
on , value
on todellinen arvo. Esimerkki tämän toiminnasta on alla.
Diagnostiikan käyttö. Jäljitys TripPin-liittimessä
Käytännöllinen esimerkki Diagnostics.Trace-kohteen käytöstä ja parametrin delayed
vaikutuksesta on trippin-liittimen funktion GetSchemaForEntity
päivittäminen poikkeuksen error
rivittämiseksi:
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);
Voit pakottaa virheen arvioinnin aikana (testitarkoituksiin!) välittämällä funktiolle virheellisen entiteetin GetEntity
nimen. Tässä muutat funktion withData
riviä TripPinNavTable
ja korvaat [Name]
arvolla "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;
Ota jäljitys käyttöön projektille ja suorita testikyselyt. Errors
Välilehdessä pitäisi näkyä esiin esiin tuomasi virheen teksti:
Välilehdessä Log
pitäisi myös näkyä sama sanoma. Jos käytät - ja value
-message
parametreille eri arvoja, ne ovat erilaiset.
Huomaa myös, että Action
lokiviestin kentässä on tunnisteen nimi (tietolähteen laji) (tässä tapauksessa Engine/Extension/TripPin
). Tämä helpottaa laajennukseen liittyvien viestien löytämistä, kun mukana on useita kyselyitä ja/tai järjestelmän (koostemoduulin) jäljitys on käytössä.
Viivästynyt arviointi
Esimerkkinä parametrin delayed
toiminnasta teet joitakin muutoksia ja suoritat kyselyt uudelleen.
Määritä ensin arvoksi delayed
false
, mutta jätä value
parametri ennalle:
Diagnostics.Trace(TraceLevel.Error, message, () => error message, false);
Kun suoritat kyselyn, näyttöön tulee virhesanoma "Function-tyyppistä arvoa ei voi muuntaa tyypiksi", eikä varsinaista virhettä. Tämä johtuu siitä, että kutsu palauttaa function
nyt arvon itse arvon sijaan.
Poista seuraavaksi funktio parametrista value
:
Diagnostics.Trace(TraceLevel.Error, message, error message, false);
Kun suoritat kyselyn, saat oikean virheen, mutta jos tarkistat Loki-välilehden, viestejä ei ole. Tämä johtuu siitä, että error
lopulta ne korotetaan tai arvioidaan kohteen Diagnostics.Trace
kutsun aikana, joten viestiä ei koskaan varsinaisesti tuoda.
Nyt kun ymmärrät parametrin
delayed
vaikutuksen, muista palauttaa liittimesi takaisin toimintatilaan ennen jatkamista.
Diagnostiikan apufunktiot kohteessa Diagnostics.pqm
Tähän projektiin sisältyvä Diagnostics.pqm-tiedosto sisältää useita apufunktioita, jotka helpottavat jäljitystä. Kuten edellisessä opetusohjelmassa näytettiin, voit sisällyttää tämän tiedoston projektiin (muistaen määrittää muodostamistoiminnon kääntämään) ja ladata sen sitten liitintiedostoon. Liitintiedoston alaosassa pitäisi nyt olla alla olevan koodikatkelman kaltainen. Voit tutustua tämän moduulin tarjoaihin funktioihin, mutta tässä esimerkissä käytät vain - ja Diagnostics.LogFailure
-Diagnostics.LogValue
funktioita.
// 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
Funktio Diagnostics.LogValue
on samankaltainen kuin Diagnostics.Trace
, ja sen avulla voidaan tulostaa arvioitavan kohteen arvo.
Diagnostics.LogValue = (prefix as text, value as any) as any => ...
prefix
Parametri on log-sanoman esiliitetty. Voit tämän avulla selvittää, mikä kutsu tulostaa viestin. Funktio value
palauttaa parametrin, ja se kirjoitetaan myös jäljitykseen M-arvon tekstiesityksenä. Jos esimerkiksi value
on yhtä suuri kuin table
sarakkeiden A ja B kanssa, loki sisältää vastaavan #table
esityksen: #table({"A", "B"}, {{"row1 A", "row1 B"}, {"row2 A", row2 B"}})
Muistiinpano
M-arvojen sarjoittaminen tekstiksi voi olla kallista. Ota huomioon niiden arvojen mahdollinen koko, jotka tulostat jäljitykseen.
Muistiinpano
Useimmat Power Query -ympäristöt katkaisevat jäljitysviestit enimmäispituuteen.
Esimerkkinä funktio päivitetään funktioon TripPin.Feed
välitettyjen url
ja schema
välitettyjen argumenttien jäljittämiseksi.
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;
Sinun on käytettävä :n uutta _url
ja _schema
arvoa kutsussa GetAllPagesByNextLink
. Jos käyttäisit alkuperäisiä funktioparametreja, Diagnostics.LogValue
kutsuja ei koskaan arvioitu, jolloin jäljitykseen ei olisi kirjoitettu mitään sanomia. Funktionaalinen ohjelmointi on hauskaa!
Kun suoritat kyselyt, näet lokissa nyt uudet viestit.
URL-osoitteen käyttäminen:
Rakenteen tyyppi:
Näet sarjoitetun version -parametrista schema
type
sen sijaan, mitä saisit, kun teet yksinkertaisen Text.FromValue
tyyppiarvon (jonka tuloksena on "tyyppi").
Diagnostics.LogFailure
Funktiolla Diagnostics.LogFailure
voidaan rivittää funktiokutsuja, ja se kirjoittaa jäljitykseen vain, jos funktiokutsu epäonnistuu (eli palauttaa arvon error
).
Diagnostics.LogFailure = (text as text, function as function) as any => ...
Lisää sisäisesti Diagnostics.LogFailure
operaattorin try
kutsuun function
. Jos kutsu epäonnistuu, text
arvo kirjoitetaan jäljitykseen ennen alkuperäisen -kohteen error
palauttamista. function
Jos kutsu onnistuu, tulos palautetaan kirjoittamatta mitään jäljitystiedostoon. Koska M-virheet eivät sisällä täyttä pinon jäljitystä (eli näet yleensä vain virheen sanoman), tästä voi olla hyötyä, kun haluat paikantaa virheen esiintyneen paikan.
Muokkaa (huono)-esimerkissä funktion TripPinNavTable
riviä siten, withData
että se pakottaa virheen uudelleen:
withData = Table.AddColumn(rename, "Data", each Diagnostics.LogFailure("Error in GetEntity", () => GetEntity(url, "DoesNotExist")), type table),
Voit löytää jäljityksestä tulokseksi saatavan virhesanoman, joka sisältää - text
, - ja alkuperäiset virhetiedot.
Muista palauttaa funktiosi toimintatilaan ennen seuraavan opetusohjelman jatkamista.
Yhteenveto
Tämä lyhyt (mutta tärkeä!) oppitunti näytti sinulle, miten voit käyttää diagnostiikka-aputoimintofunktioita kirjautuaksesi Power Queryn jäljitystiedostoihin. Oikein käytettynä nämä funktiot ovat hyödyllisiä yhdistimen ongelmien virheenkorjauksessa.
Muistiinpano
Liittimen kehittäjänä sinun vastuullasi on varmistaa, ettet kirjaa luottamuksellisia tai henkilökohtaisesti tunnistettavia tietoja (PII) diagnostiikan kirjaamisen osana. Sinun on myös varottava tulostamasta liikaa jäljitystietoja, sillä sillä se voi vaikuttaa haitallisesti suorituskykyyn.