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.
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ı olaraktrue
tutmanı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
false
tutmak istersiniz. - Kullanıcı İzlemelerini Göster: Bu ayar, bağlayıcınızın izleme bilgileri çıkışını denetler. Bunu olarak
true
ayarlamak istersiniz.
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.Warning
TraceLevel.Error
izleme 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ığındatrue
value
, değerlendirdiğiniz gerçek değeri döndüren sıfır parametre işlevi olacaktır. delayed
olarak ayarlandığında false
value
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:
Ayrıca, sekmede Log
aynı iletiyi görmeniz gerekir. ve value
parametreleri için message
farklı değerler kullanırsanız, bunlar farklı olabilir.
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 false
ayarlayı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.Trace
sı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.Trace
ve 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:
Şema türü:
Bir tür değeri üzerinde basit Text.FromValue
bir işlem yaptığınızda elde ettiğiniz değer yerine parametresinin schema
type
serileş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 error
dö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 error
dö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 text
ve özgün hata bilgilerini içeren sonuç hata iletisini bulabilirsiniz.
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.