แชร์ผ่าน


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

หมายเหตุ

เนื้อหานี้อ้างอิงเนื้อหาจากการดําเนินการแบบดั้งเดิมสําหรับการวินิจฉัยใน Visual Studio เนื้อหาจะได้รับการอัปเดตในอนาคตอันใกล้นี้เพื่อครอบคลุม Power Query SDK ใหม่ใน Visual Studio Code

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

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

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

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

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

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

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

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

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

คุณสมบัติของโครงการ

เมื่อเปิดใช้งาน คุณจะเริ่มต้นดูรายการบันทึกในหน้าต่างผลลัพธ์คิวรี 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.WarningTraceLevel.Error, และ TraceLevel.Critical จะปรากฏในล็อก

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

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

ใช้การวินิจฉัย การติดตามในตัวเชื่อมต่อ TripPin

สําหรับตัวอย่างที่ใช้ได้จริงของการใช้ Diagnostics.Trace และผลกระทบของ delayed พารามิเตอร์ ให้อัปเดตฟังก์ชันของ GetSchemaForEntity ตัวเชื่อมต่อ TripPin เพื่อตัด 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คือ ) ซึ่งทําให้ง่ายต่อการค้นหาข้อความที่เกี่ยวข้องกับส่วนขยายของคุณเมื่อเปิดใช้งานการติดตามหลายคิวรีที่เกี่ยวข้องและ/หรือการติดตามระบบ (กลไกจัดการผสมเข้าด้วยกัน)

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

ในฐานะตัวอย่างของวิธี 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 ที่รวมอยู่ในโครงการนี้ประกอบด้วยฟังก์ชันผู้ช่วยเหลือจํานวนมากที่ทําให้การติดตามง่ายขึ้น ดังที่แสดงใน บทช่วยสอนก่อนหน้านี้ คุณสามารถรวมไฟล์นี้ในโครงการของคุณ (โปรดจําไว้ว่าการตั้งค่าการดําเนินการสร้างเป็น คอมไพล์) จากนั้นโหลดไฟล์นี้ในไฟล์ตัวเชื่อมต่อของคุณ ด้านล่างของไฟล์ตัวเชื่อมต่อของคุณควรมีลักษณะบางอย่างเช่นส่วนย่อยของโค้ดด้านล่าง อย่าลังเลที่จะสํารวจฟังก์ชันต่าง ๆ ที่โมดูลนี้ให้ แต่ในตัวอย่างนี้ คุณจะใช้ 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.LogValue

ฟังก์ชัน 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;

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

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

URL การเข้าถึง:

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

ชนิดเค้าร่าง:

ข้อความชนิดเค้าร่าง

คุณเห็นพารามิเตอร์typeเวอร์ชันschemaอนุกรมแล้ว แทนที่จะเป็นสิ่งที่คุณได้รับเมื่อคุณทําอย่างง่าย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 - ทดสอบเชื่อมต่อ ion