Aracılığıyla paylaş


TripPin bölüm 8 - Tanılama ekleme

Not

Bu içerik şu anda Visual Studio'da tanılama için eski bir uygulamadaki içeriğe başvurur. İçerik yakın gelecekte Visual Studio Code'daki yeni Power Query SDK'sını kapsayacak şekilde güncelleştirilecektir.

Bu çok bölümlü öğretici, Power Query için yeni bir veri kaynağı uzantısı oluşturmayı kapsar. Öğreticinin sırayla yapılması amaçlanır; her ders önceki derslerde oluşturulan bağlayıcı üzerinde oluşturulur ve bağlayıcınıza artımlı olarak yeni özellikler ekler.

Bu derste şunları yapacaksınız:

  • Diagnostics.Trace işlevi hakkında bilgi edinin
  • Bağlayıcınızda hata ayıklamaya yardımcı olmak üzere izleme bilgileri eklemek için Tanılama yardımcı işlevlerini kullanın

Tanılamayı etkinleştirme

Power Query kullanıcıları, Seçenekler | altındaki onay kutusunu seçerek izleme günlüğünü etkinleştirebilir Tanılama.

Power Query'de izlemeyi etkinleştirin.

Etkinleştirildikten sonra, sonraki sorgular M altyapısının izleme bilgilerini sabit bir kullanıcı dizininde bulunan günlük dosyalarına yaymasına neden olur.

M sorgularını Power Query SDK'sının içinden çalıştırırken, izleme proje düzeyinde etkinleştirilir. Proje özellikleri sayfasında, izlemeyle ilgili üç ayar vardır:

  • Günlüğü Temizle: Bu ayar olarak ayarlandığında true, sorgularınızı çalıştırdığınızda günlük sıfırlanır/temizlenir. Bu ayarı olarak truetutmanızı öneririz.
  • Altyapı İzlemelerini Göster: Bu ayar M altyapısından gelen yerleşik izlemelerin çıkışını denetler. Bu izlemeler yalnızca Power Query ekibinin üyeleri için yararlıdır, bu nedenle genellikle bu ayarı olarak falsetutmak istersiniz.
  • Kullanıcı İzlemelerini Göster: Bu ayar, bağlayıcınızın izleme bilgileri çıkışını denetler. Bunu olarak trueayarlamak istersiniz.

Proje özellikleri.

Etkinleştirildikten sonra, Günlük sekmesinin altındaki M Sorgu Çıktısı penceresinde günlük girdilerini görmeye başlarsınız.

Diagnostics.Trace

Diagnostics.Trace işlevi, M altyapısının izleme günlüğüne ileti yazmak için kullanılır.

Diagnostics.Trace = (traceLevel as number, message as text, value as any, optional delayed as nullable logical as any) => ...

Önemli

M, yavaş değerlendirmeye sahip işlevsel bir dildir. kullanırken Diagnostics.Trace, işlevin yalnızca bir parçası olduğu ifade gerçekten değerlendirilirse çağrılacağını unutmayın. Bunun örnekleri bu öğreticinin ilerleyen bölümlerinde bulunabilir.

traceLevel parametresi aşağıdaki değerlerden biri olabilir (azalan sırada):

  • TraceLevel.Critical
  • TraceLevel.Error
  • TraceLevel.Warning
  • TraceLevel.Information
  • TraceLevel.Verbose

İzleme etkinleştirildiğinde, kullanıcı görmek istediğiniz ileti üst sınırını seçebilir. Bu düzeydeki ve altındaki tüm izleme iletileri günlüğe çıkış olarak görüntülenir. Örneğin, kullanıcı "Uyarı" düzeyini seçerse , ve TraceLevel.Critical iletilerini TraceLevel.WarningTraceLevel.Errorizleme günlüklerde görünür.

message parametresi, izleme dosyasına çıkış olacak gerçek metindir. Açıkça metne value eklemediğiniz sürece metin parametresini içermez.

value işlevin döndüreceği parametredir. delayed parametresi olarak ayarlandığındatruevalue, değerlendirdiğiniz gerçek değeri döndüren sıfır parametre işlevi olacaktır. delayed olarak ayarlandığında falsevalue gerçek değer olacaktır. Bunun nasıl çalıştığını gösteren bir örnek aşağıda bulunabilir.

Tanılama'yı kullanma. TripPin bağlayıcısında izleme

Diagnostics.Trace kullanmanın pratik bir örneği ve parametresinin delayed etkisi için TripPin bağlayıcısının GetSchemaForEntity işlevini özel durumu sarmalamak üzere güncelleştirinerror:

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);

İşleve geçersiz bir varlık adı GetEntity geçirerek değerlendirme sırasında (test amacıyla!) bir hatayı zorlayabilirsiniz. Burada işlevinin satırını değiştirip [Name] yerine öğesini yazın"DoesNotExist".TripPinNavTable withData

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;

Projeniz için izlemeyi etkinleştirin ve test sorgularınızı çalıştırın. Sekmede Errors , oluşturduğunuz hatanın metnini görmeniz gerekir:

Hata iletisi.

Ayrıca, sekmede Log aynı iletiyi görmeniz gerekir. ve value parametreleri için message farklı değerler kullanırsanız, bunlar farklı olabilir.

Hata günlüğü.

Ayrıca, günlük iletisinin alanının uzantınızın adını (Veri Kaynağı Türü) içerdiğini de unutmayın Action (bu örnekte). Engine/Extension/TripPin Bu, birden çok sorgu söz konusu olduğunda ve/veya sistem (karma altyapısı) izleme etkinleştirildiğinde uzantınızla ilgili iletileri bulmayı kolaylaştırır.

Gecikmeli değerlendirme

Parametresinin delayed nasıl çalıştığını gösteren bir örnek olarak bazı değişiklikler yapacak ve sorguları yeniden çalıştıracaksınız.

İlk olarak değerini olarak falseayarlayındelayed, ancak parametresini value olduğu gibi bırakın:

Diagnostics.Trace(TraceLevel.Error, message, () => error message, false);

Sorguyu çalıştırdığınızda, "İşlev türündeki bir değeri Tür türüne dönüştüremiyoruz" hatasını alırsınız ve oluşturduğunuz gerçek hatayı değil. Bunun nedeni, çağrının artık değerin kendisi yerine bir function değer döndürmesidir.

Ardından işlevi parametresinden value kaldırın:

Diagnostics.Trace(TraceLevel.Error, message, error message, false);

Sorguyu çalıştırdığınızda doğru hatayı alırsınız, ancak Günlük sekmesini denetlerseniz ileti olmaz. Bunun nedenierror, çağrısı Diagnostics.Tracesırasında değerinin yükseltilmesi/değerlendirilmesidir, bu nedenle ileti hiçbir zaman gerçekten çıkış olmaz.

Parametresinin etkisini anladığınıza delayed göre, devam etmeden önce bağlayıcınızı yeniden çalışma durumuna sıfırladığınızdan emin olun.

Diagnostics.pqm dosyasındaki tanılama yardımcı işlevleri

Bu projeye dahil edilen Diagnostics.pqm dosyası, izlemeyi kolaylaştıran birçok yardımcı işlev içerir. Önceki öğreticide gösterildiği gibi, bu dosyayı projenize ekleyebilir (Derleme Eylemini Derleme olarak ayarlamayı unutmayın) ve ardından bağlayıcı dosyanıza yükleyebilirsiniz. Bağlayıcı dosyanızın alt kısmı artık aşağıdaki kod parçacığına benzer olmalıdır. Bu modülün sağladığı çeşitli işlevleri keşfetmekte çekinmeyin, ancak bu örnekte yalnızca ve Diagnostics.LogFailure işlevlerini kullanacaksınızDiagnostics.LogValue.

// 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

Diagnostics.LogValue işlevi çok benzerdir Diagnostics.Traceve değerlendirdiğiniz değerin çıktısını almak için kullanılabilir.

Diagnostics.LogValue = (prefix as text, value as any) as any => ...

prefix parametresi günlük iletisine eklenir. Bunu, iletiyi hangi çağrı çıkışının çıkaracağını bulmak için kullanırsınız. value parametresi işlevin döndüreceği parametredir ve ayrıca M değerinin metin gösterimi olarak izlemesine yazılır. Örneğin, A ve B sütunlarını içeren a'ya table eşitsevalue, günlük eşdeğer #table gösterimini içerir:#table({"A", "B"}, {{"row1 A", "row1 B"}, {"row2 A", row2 B"}})

Not

M değerlerini metne seri hale getirmek pahalı bir işlem olabilir. İzlemeye çıkardığınız değerlerin olası boyutunu unutmayın.

Not

Power Query ortamlarının çoğu izleme iletilerini maksimum uzunluğa kadar kesecektir.

Örneğin, işleve TripPin.Feed geçirilen ve schema bağımsız değişkenlerini izlemek url için işlevini güncelleştireceksiniz.

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ğrısında yeni _url ve _schema değerlerini kullanmanız gerekir GetAllPagesByNextLink. Özgün işlev parametrelerini kullandıysanız, Diagnostics.LogValue çağrılar hiçbir zaman değerlendirilmez ve bu da izleme için hiçbir iletinin yazılmamasıyla sonuçlanır. İşlevsel programlama eğlencelidir!

Sorgularınızı çalıştırdığınızda artık günlükte yeni iletiler görmeniz gerekir.

Url'ye erişme:

URL iletisine erişme.

Şema türü:

Şema türü iletisi.

Bir tür değeri üzerinde basit Text.FromValue bir işlem yaptığınızda elde ettiğiniz değer yerine parametresinin schema typeserileştirilmiş sürümünü ("tür" olarak sonuçlanan) görürsünüz.

Diagnostics.LogFailure

İşlev Diagnostics.LogFailure çağrılarını sarmak için kullanılabilir ve yalnızca işlev çağrısı başarısız olursa (yani bir errordöndürür) izlemesine yazar.

Diagnostics.LogFailure = (text as text, function as function) as any => ...

Dahili olarak çağrısına Diagnostics.LogFailure function bir try işleç ekler. Çağrı başarısız olursa, text özgün errordöndürülmeden önce değer izlemesine yazılır. function Çağrı başarılı olursa, sonuç izlemesine hiçbir şey yazmadan döndürülür. M hataları tam yığın izlemesi içermediğinden (yani genellikle yalnızca hata iletisini görürsünüz), hatanın oluştuğu yeri saptamak istediğinizde bu yararlı olabilir.

(Kötü) bir örnek olarak, bir hatayı bir kez daha zorlamak için işlevin TripPinNavTable satırını değiştirinwithData:

withData = Table.AddColumn(rename, "Data", each Diagnostics.LogFailure("Error in GetEntity", () => GetEntity(url, "DoesNotExist")), type table),

İzlemede, öğesini textve özgün hata bilgilerini içeren sonuç hata iletisini bulabilirsiniz.

LogFailure iletisi.

Sonraki öğreticiye devam etmeden önce işlevinizi çalışma durumuna sıfırlamayı unutmayın.

Sonuç

Bu kısa (ancak önemli!) ders, Tanılama yardımcı işlevlerini kullanarak Power Query izleme dosyalarına nasıl oturum açabileceğinizi gösterdi. Düzgün kullanıldığında, bu işlevler bağlayıcınızdaki hata ayıklama sorunlarında yararlıdır.

Not

Bağlayıcı geliştiricisi olarak, tanılama günlüğünüzün bir parçası olarak hassas veya kişisel bilgileri (PII) günlüğe kaydetmediğinizden emin olmak sizin sorumluluğunuzdadır. Ayrıca çok fazla izleme bilgisi vermemeye dikkat etmeniz gerekir, bunun olumsuz bir performans etkisi olabilir.

Sonraki adımlar

TripPin Bölüm 9 - Test Bağlan ion