TripPin ส่วนที่ 8 - การเพิ่มการวินิจฉัย

บทช่วยสอนหลายส่วนนี้ครอบคลุมถึงการสร้างส่วนขยายแหล่งข้อมูลใหม่Power Queryแหล่งข้อมูล บทช่วยสอนมีไว้เพื่อให้แต่ละบทเรียนที่สร้างบนตัวเชื่อมต่อที่สร้างขึ้นในบทเรียนก่อนหน้านี้ เพิ่มความสามารถใหม่ๆ — ลงในตัวเชื่อมต่อของคุณแบบเพิ่มหน่วย

ในบทเรียนนี้ คุณจะต้อง:

  • เรียนรู้เกี่ยวกับฟังก์ชัน Diagnostics.Trace
  • ใช้ฟังก์ชันผู้ช่วยเหลือการวินิจฉัยเพื่อเพิ่มข้อมูลการติดตามเพื่อช่วยแก้จุดบกพร่องของตัวเชื่อมต่อของคุณ

เปิดใช้งานการวินิจฉัย

Power Queryเปิดใช้งานการบันทึกการติดตามได้โดยการเลือกกล่องกาเครื่องหมายใต้ ตัวเลือก| การวินิจฉัย

เปิดใช้งานการติดตามใน Power Query

เมื่อเปิดใช้งาน คิวรีใด ๆ ที่ตามมาจะทําให้โปรแกรม M ปล่อยข้อมูลการติดตามเพื่อบันทึกไฟล์ที่อยู่ในไดเรกทอรีผู้ใช้แบบคงที่

เมื่อเรียกใช้คิวรี M จากPower Query SDK การติดตามจะเปิดใช้งานในระดับโครงการ บนหน้าคุณสมบัติของโครงการ มีการตั้งค่าสามแบบที่เกี่ยวข้องกับการติดตาม:

  • ล้างรายการบันทึก — เมื่อตั้งค่าเป็น true บันทึกจะถูกรีเซ็ต/ล้างเมื่อคุณเรียกใช้คิวรีของคุณ เราขอแนะเริ่มให้คุณเก็บชุด true นี้เป็น
  • แสดงการติดตามกลไกจัดการ — การตั้งค่านี้ควบคุมผลลัพธ์ของการติดตามที่มีอยู่แล้วภายในจากกลไกจัดการ M โดยทั่วไปการติดตามเหล่านี้จะมีประโยชน์กับสมาชิกของทีมทีม Power Query ดังนั้นโดยทั่วไปแล้วคุณจะต้องเก็บชุด false นี้เป็น
  • แสดงการติดตามผู้ใช้ — การตั้งค่านี้จะควบคุมผลลัพธ์ของข้อมูลการติดตามโดยตัวเชื่อมต่อของคุณ คุณจะต้องตั้งค่าเป็น true

Projectคุณสมบัติ

เมื่อเปิดใช้งานคุณจะเริ่มเห็นรายการบันทึกในหน้าต่างผลลัพธ์คิวรี M ภายใต้แท็บบันทึก

Diagnostics.Trace

ฟังก์ชัน Diagnostics.Trace ถูกใช้เพื่อเขียนข้อความลงในบันทึกการติดตามของโปรแกรม M

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

ข้อสำคัญ

M เป็นภาษาที่ใช้งานได้พร้อมกับการประเมินผลที่ขี้เกียจ เมื่อใช้ Diagnostics.Trace โปรดทราบว่าฟังก์ชันจะถูกเรียกเท่านั้นถ้านิพจน์เป็นส่วนหนึ่งของ ได้รับการประเมิน ตัวอย่างนี้สามารถพบได้ในภายหลังในบทช่วยสอนนี้

พารามิเตอร์ traceLevel สามารถเป็นหนึ่งในค่าต่อไปนี้ (จากมากไปหาน้อย):

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

เมื่อเปิดใช้งานการติดตาม ผู้ใช้สามารถเลือกระดับสูงสุดของข้อความที่พวกเขาต้องการเห็นได้ ข้อความการติดตามทั้งหมดของระดับนี้และด้านล่างจะแสดงผลลัพธ์ไปยังบันทึก ตัวอย่างเช่น ถ้าผู้ใช้เลือกระดับ "คําเตือน" ข้อความการติดตามของ TraceLevel.Warning และ TraceLevel.Error TraceLevel.Critical จะปรากฏในบันทึก

messageพารามิเตอร์ เป็นข้อความจริงที่จะส่งออกไปยังไฟล์การติดตาม โปรดทราบว่าข้อความจะไม่ประกอบด้วย value พารามิเตอร์ เว้นแต่ว่าคุณได้รวมไว้ในข้อความอย่างชัดเจน

valueพารามิเตอร์ คือสิ่งฟังก์ชันจะส่งกลับ เมื่อ delayed พารามิเตอร์ถูกตั้งค่าเป็น true value จะเป็นฟังก์ชันพารามิเตอร์ศูนย์ที่ส่งกลับค่าจริงที่คุณประเมิน delayedเมื่อตั้งค่าเป็น false value จะเป็นค่าจริง ตัวอย่างของวิธีการนี้จะดู ได้ที่ด้านล่าง

ใช้ Diagnostics.Trace ในตัวเชื่อมต่อ TripPin

ตัวอย่างการปฏิบัติของการใช้ Diagnostics.Trace และผลกระทบของ delayed พารามิเตอร์ ให้อัปเดตฟังก์ชันของตัวเชื่อมต่อ TripPin GetSchemaForEntity เพื่อตัด error ข้อยกเว้น:

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

คุณสามารถบังคับให้เกิดข้อผิดพลาดในระหว่างการประเมิน (เพื่อวัตถุประสงค์ในการทดสอบ!) โดยผ่านชื่อเอนทิตีที่ไม่ถูกต้อง GetEntity ไปยังฟังก์ชัน ที่นี่คุณ withData เปลี่ยนเส้น TripPinNavTable ในฟังก์ชัน แทนที่ [Name] "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;

เปิดใช้งานการติดตามโครงการ ของคุณ และเรียกใช้คิวรีทดสอบของคุณ บนแท็บ Errors คุณควรเห็นข้อความของข้อผิดพลาดที่คุณเกิดขึ้น:

ข้อความแสดงข้อผิดพลาด

นอกจากนี้ บนแท็บ Log คุณควรเห็นข้อความเดียวกัน โปรดทราบว่าถ้าคุณใช้ค่าที่แตกต่างกันเพื่อพารามิเตอร์ และ message value พารามิเตอร์เหล่านี้จะแตกต่างกัน

บันทึกข้อผิดพลาด

นอกจากนี้ โปรดทราบว่าเขตข้อมูล Action ของข้อความบันทึกประกอบด้วยชื่อ (ชนิดแหล่งข้อมูล) ของส่วนขยายของคุณ (ในกรณีนี้ Engine/Extension/TripPin คือ) ซึ่งช่วยให้ง่ายต่อการค้นหาข้อความที่เกี่ยวข้องกับส่วนขยายของคุณเมื่อมีการเปิดใช้งานการติดตามหลายคิวรีที่เกี่ยวข้องและ/หรือระบบ (กลไกจัดการ mashup)

การประเมินล่าช้า

ตัวอย่างของวิธีการใช้งานพารามิเตอร์ delayed คุณจะแก้ไขและเรียกใช้คิวรีอีกครั้ง

ก่อนอื่น ให้ delayed ตั้งค่าเป็น false แต่ปล่อย value พารามิเตอร์ไว้เป็นดังนี้:

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

เมื่อคุณเรียกใช้คิวรี คุณจะได้รับข้อผิดพลาดที่ "เราไม่สามารถแปลงค่าของชนิดฟังก์ชันเป็นชนิด" และไม่ใช่ข้อผิดพลาดจริงที่คุณเกิดขึ้น เนื่องจากตอนนี้การเรียกส่งกลับค่า function แทนที่จะส่งกลับค่าเอง

ถัดไป ให้ลบฟังก์ชันออกจาก value พารามิเตอร์:

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

เมื่อคุณเรียกใช้คิวรี คุณจะได้รับข้อผิดพลาดที่ถูกต้อง แต่ถ้าคุณตรวจสอบ แท็บ บันทึก จะไม่มีข้อความ เนื่องจากค่า error สิ้นสุดที่เพิ่มขึ้น/ประเมินระหว่าง การเรียก ไปยัง ดังนั้น Diagnostics.Trace ข้อความจะไม่แสดงผลลัพธ์ที่แท้จริง

หลังจากที่คุณเข้าใจผลกระทบของพารามิเตอร์ตรวจสอบ delayed ให้แน่ใจว่าได้รีเซ็ตตัวเชื่อมต่อของคุณกลับไปยังสถานะการใช้งานได้ก่อนดําเนินการต่อ

ฟังก์ชันผู้ช่วยเหลือการวินิจฉัยใน Diagnostics.pqm

ไฟล์ Diagnostics.pqm ที่รวมอยู่ในโครงการนี้ประกอบด้วยฟังก์ชันผู้ช่วยเหลือจํานวนมากที่ช่วยให้คุณติดตามได้ง่ายขึ้น ดังที่แสดงในบท ช่วยสอนก่อนหน้า คุณสามารถรวมไฟล์นี้ในโครงการของคุณ (อย่าลืมตั้งค่าการแอคชันการสร้างเป็น คอมไพล์) แล้วโหลดลงในไฟล์ตัวเชื่อมต่อของคุณ ด้านล่างของไฟล์ตัวเชื่อมต่อของคุณควรมีลักษณะบางอย่างเช่นส่วนย่อยของโค้ดด้านล่าง คุณสามารถส7รวลฟังก์ชันต่าง ๆ ที่โมดูลนี้มีให้ แต่ในตัวอย่างนี้ คุณจะใช้เฉพาะ Diagnostics.LogValue ฟังก์ชัน Diagnostics.LogFailure และ เท่านั้น

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

Diagnostics.LogValueฟังก์ชัน จะเหมือนกับ Diagnostics.Trace มาก และ สามารถใช้เพื่อแสดงผลค่าของสิ่งที่คุณประเมิน

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

prefixพารามิเตอร์ จะอยู่ก่อนข้อความบันทึก คุณจะต้องใช้ข้อมูลนี้ในการที่จะค้นหาผลลัพธ์ข้อความ valueพารามิเตอร์ คือสิ่งที่ฟังก์ชันจะส่งกลับ และจะถูกเขียนลงในการติดตามในรูปแบบข้อความที่แสดงของค่า M ตัวอย่างเช่น ถ้า value เท่ากับ ที่มีคอลัมน์ table A และ B บันทึกจะประกอบด้วยตัวแทนที่ #table เทียบเท่ากัน: #table({"A", "B"}, {{"row1 A", "row1 B"}, {"row2 A", row2 B"}})

หมายเหตุ

การใส่ค่า M เป็นอนุกรมอาจเป็นการดําเนินการที่มีราคาแพง โปรดระวังขนาดที่เป็นไปได้ของค่าที่คุณส่งออกไปยังการติดตาม

หมายเหตุ

สภาพแวดล้อมPower Queryส่วนใหญ่จะตัดข้อความการติดตามออกให้มีความยาวสูงสุด

ตัวอย่างเช่น คุณจะอัปเดตฟังก์ชันเพื่อ TripPin.Feed ติดตาม url อาร์กิวเมนต์ และ schema ที่ส่งผ่านไปยังฟังก์ชัน

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;

โปรดทราบว่าคุณจะต้องใช้ค่า _url และ _schema ใหม่ในการเรียก GetAllPagesByNextLink ไปยัง หากคุณใช้พารามิเตอร์ของฟังก์ชัน ต้นฉบับ การโทรจะไม่ถูกประเมินผลจริง Diagnostics.LogValue ส่งผลให้ไม่มีข้อความที่เขียนเพื่อติดตาม การเขียนโปรแกรมที่ใช้งานได้สนุกมาก!

เมื่อคุณเรียกใช้คิวรีของคุณ ตอนนี้คุณควรเห็นข้อความใหม่ในบันทึก

การเข้าถึง URL:  การเข้าถึงข้อความ url

ชนิด Schema:  ข้อความชนิด Schema

โปรดทราบว่าคุณจะเห็นพารามิเตอร์เวอร์ชันอนุกรม แทนที่สิ่งที่คุณจะได้รับเมื่อคุณดําเนินการอย่างง่ายๆ กับค่าชนิด schema type Text.FromValue (ซึ่งให้ผลลัพธ์เป็น "ชนิด")

Diagnostics.LogFailure

ฟังก์ชัน Diagnostics.LogFailure สามารถใช้เพื่อตัดการเรียกฟังก์ชัน และจะเขียนลงในการติดตามเท่านั้น ถ้าการเรียกฟังก์ชันล้มเหลว (นั่นคือ error ส่งกลับ )

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

ภายใน เพิ่ม Diagnostics.LogFailure ตัวเรียกใช้ try ตัว function ถูกเรียกใช้ หากการเรียกล้มเหลว ค่า text จะถูกเขียนไปยังการติดตามก่อนที่จะส่งกลับ error ต้นฉบับ หาก function การเรียกประสบความสเร็จ ผลลัพธ์จะถูกส่งกลับโดยไม่ต้องเขียนอะไรลงในการติดตาม เนื่องจากข้อผิดพลาด M ไม่มีการติดตามสแตกแบบเต็มรูปแบบ (ซึ่งโดยทั่วไปแล้วคุณจะเห็นเฉพาะข้อความของข้อผิดพลาด) สิ่งนี้จะเป็นประโยชน์เมื่อคุณต้องการระบุจุดที่ข้อผิดพลาดเกิดขึ้นจริง ๆ

ในฐานะตัวอย่าง (ไม่ดี) ให้ withData ปรับเปลี่ยนบรรทัดของ TripPinNavTable ฟังก์ชันเพื่อบังคับให้เกิดข้อผิดพลาดอีกครั้ง:

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

ในการติดตาม คุณสามารถค้นหาข้อความแสดงข้อผิดพลาดที่เป็นผลลัพธ์ที่มี text , และข้อมูลข้อผิดพลาดเดิมได้

ข้อความ LogFailure

ตรวจสอบให้แน่ใจว่าได้รีเซ็ตฟังก์ชันของคุณสถานะการใช้งานได้ก่อนที่จะดําเนินการต่อด้วยบทช่วยสอนถัดไป

บทสรุป

บทเรียนสั้น ๆ นี้ (แต่สําคัญ!) แสดงให้คุณเห็นถึงวิธีการใช้ฟังก์ชันตัวช่วยเหลือการวินิจฉัยเพื่อPower Queryไฟล์การติดตาม เมื่อใช้งานอย่างถูกต้อง ฟังก์ชันเหล่านี้มีประโยชน์มากในการดีบักปัญหาภายในตัวเชื่อมต่อของคุณ

หมายเหตุ

ในฐานะนักพัฒนาตัวเชื่อมต่อ เป็นความรับผิดชอบของคุณเพื่อให้แน่ใจว่า คุณไม่บันทึกข้อมูลที่อ่อนไหวหรือระบุตัวตนส่วนบุคคล (PII) เป็นส่วนหนึ่งของการบันทึกการวินิจฉัยของคุณ คุณยังต้องระมัดระวังไม่ให้มีข้อมูลการติดตามมากเกินไป เนื่องจากอาจส่งผลกระทบด้านประสิทธิภาพเชิงลบได้

ขั้นตอนถัดไป

TripPin ส่วนที่ 9 - TestConnection