spinny:~/writing $ less opentelemetry-nodejs-observability-guide.md
12ครั้งแรกที่คุณต้องการความสามารถในการสังเกตจริงๆ ไม่ใช่เมื่อคุณดูแดชบอร์ดอย่างใจเย็น เมื่อผู้ใช้เขียนว่า "การชำระเงินช้า" กราฟข้อผิดพลาดจะดูเป็นปกติ และในบันทึกคุณจะพบเพียงแถวของข้อความที่ไม่ได้เชื่อมต่อเท่านั้น34OpenTelemetry ถูกสร้างขึ้นเพื่อหลีกเลี่ยงช่วงเวลานั้น: ไม่ใช่เพื่อให้มีกราฟิกมากขึ้น แต่เพื่อเชื่อมโยงชิ้นส่วนต่างๆ คำขอเข้าสู่ API เรียกฐานข้อมูล ผ่านผู้ให้บริการภายนอก โพสต์งานที่อยู่ในคิว และอาจล้มเหลวสามบริการในภายหลัง หากไม่มีการติดตามแบบกระจาย คุณจะสร้างเรื่องราวนั้นขึ้นมาใหม่ด้วยมือ ด้วย OpenTelemetry อย่างน้อยคุณก็จะมีแผนที่56## ประเด็นไม่ใช่ trace แต่เป็นเรื่องราว78trace คือลำดับของ span พูดแบบนี้ก็ฟังดูเย็นชานะ ในทางปฏิบัติ span แต่ละอันเป็นเพียงส่วนหนึ่งของเรื่องราว: `POST /checkout`, `SELECT inventory`, `call payment provider`, `publish order.created`910คุณค่าจะเกิดขึ้นเมื่อคุณเริ่มตอบคำถามจริง:1112- บริการภายนอกใดที่ชะลอตัว?13- ข้อผิดพลาดมาจากเวอร์ชันใดเวอร์ชันหนึ่งโดยเฉพาะหรือไม่14- ปัญหาส่งผลกระทบต่อทุกคนหรือผู้เช่าเพียงรายเดียว?15- การลองใหม่ซ่อนการหมดเวลาหรือไม่16- งานอะซิงโครนัสเริ่มต้นแต่จากนั้นก็ไปตายที่อื่นใช่ไหม1718คำถามเหล่านี้ไม่สามารถแก้ไขได้ด้วยการรีบเร่ง `console.log` แท้จริงแล้วบันทึกที่เพิ่มไว้ในกรณีฉุกเฉินมักจะช่วยคุณได้ในวันนี้และจะกลายเป็นเสียงรบกวนในวันพรุ่งนี้1920## ฉันจะใส่สิ่งนี้ลงในแอปได้อย่างไร Node.js2122การตั้งค่าที่ดีต่อสุขภาพที่สุดนั้นง่ายดาย: แอปจะสร้างการวัดและส่งข้อมูลทางไกล ส่วน Collector จะตัดสินใจว่าจะส่งไปที่ใด2324```text25Node.js app -> OpenTelemetry Collector -> backend di observability26```2728ทำไมไม่ส่งออกไปยังผู้ขายโดยตรง? เพราะในตอนแรกดูเหมือนว่าจะเร็วกว่า จากนั้นคุณจะรู้ว่าแต่ละบริการมีการกำหนดค่าที่แตกต่างกัน การลองใหม่ที่แตกต่างกัน ตัวกรองที่แตกต่างกัน และไม่มีจุดศูนย์กลางในการลบข้อมูลที่ละเอียดอ่อนหรือเปลี่ยนปลายทาง2930Collector น่าเบื่อในรูปแบบที่ถูกต้อง ได้รับ OTLP, ทำการแบทช์, สามารถกรอง, ทำการสุ่มตัวอย่าง, สามารถเพิ่มคุณสมบัติทั่วไป และสามารถส่งออกไปยังหลายระบบได้3132## การพึ่งพาตนเอง: ดีแต่ยังไม่เพียงพอ3334ใน Node.js ฉันจะเริ่มด้วยเครื่องมือวัดอัตโนมัติ ช่วยให้คุณมองเห็น HTTP, เฟรมเวิร์กที่รองรับ, ฐานข้อมูล และไลบรารีทั่วไปได้ทันที3536```bash37npm install @opentelemetry/sdk-node \38 @opentelemetry/auto-instrumentations-node \39 @opentelemetry/exporter-trace-otlp-http40```4142จากนั้นคุณเริ่มต้น SDK ก่อนส่วนที่เหลือของแอป:4344```typescript45import { NodeSDK } from '@opentelemetry/sdk-node';46import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';47import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';4849const sdk = new NodeSDK({50 traceExporter: new OTLPTraceExporter({51 url: process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,52 }),53 instrumentations: [getNodeAutoInstrumentations()],54});5556sdk.start();57```5859อย่างไรก็ตาม สิ่งนี้จะมองเห็นกรอบงาน ไม่ใช่ผลิตภัณฑ์ของคุณ ระบบรู้ว่าคุณได้ทำการสอบถาม แต่ไม่ทราบว่าแบบสอบถามอยู่ใน "สร้างคำสั่งซื้อ" หรือ "ต่ออายุการสมัคร" เพื่อสิ่งนั้นคุณจะต้องมีคู่มือ span ในจุดที่ความเหนือกว่ามีความสำคัญ6061```typescript62const span = tracer.startSpan('checkout.create_order');6364try {65 span.setAttribute('cart.items_count', input.items.length);66 const order = await createOrder(input);67 span.setAttribute('order.id', order.id);68 return order;69} catch (error) {70 span.recordException(error as Error);71 throw error;72} finally {73 span.end();74}75```7677ฉันจะไม่ใส่คู่มือ span ไว้ที่ไหนเลย ฉันจะวางไว้ตรงไหนตอนตีสาม ฉันอยากจะเข้าใจสิ่งที่เกิดขึ้นโดยไม่ต้องอ่านโค้ดเพียงครึ่งเดียว7879## กฎสามข้อที่หลีกหนีความวุ่นวายมากมาย8081กฎข้อแรก: แต่ละบริการต้องมี `service.name` สภาพแวดล้อม และเวอร์ชัน ดูเหมือนเล็กน้อย แต่หากไม่มีคุณลักษณะเหล่านี้ trace จะมีประโยชน์น้อยกว่ามาก เมื่อการปรับใช้เกิดความเสียหาย คุณต้องการกรองตามเวอร์ชันภายในสองวินาที8283กฎข้อที่สอง: อย่าใส่ข้อมูลที่ละเอียดอ่อนในแอตทริบิวต์ อีเมล โทเค็น เพย์โหลดจำนวนเต็ม และที่อยู่ไม่ควรจบลงที่แบ็กเอนด์ที่สามารถสังเกตได้โดยไม่ได้ตั้งใจ หากคุณต้องการระบุผู้ใช้ ให้พิจารณารหัสภายใน การแฮช หรือฟิลด์ที่ละเอียดอ่อนน้อยกว่า8485กฎข้อที่สาม: ให้ความสนใจกับจำนวนสมาชิก `user.id` เป็นคุณลักษณะของ trace สมเหตุสมผล เนื่องจากเป็นป้ายกำกับเมตริก จึงสามารถทำลายต้นทุนและประสิทธิภาพของคุณได้8687## ตัวชี้วัด: น้อยแต่ดี8889ฉันจะเริ่มต้นด้วยตัวชี้วัดที่ใช้งานได้จริง:9091- อัตรา ข้อผิดพลาด และระยะเวลาของคำขอ92- เวลาแฝงของการพึ่งพาภายนอก93- จำนวนการหมดเวลาและการลองใหม่94- ความลึกของหาง95- ระยะเวลางาน;96- เปอร์เซ็นต์ของข้อผิดพลาดต่อเวอร์ชัน9798ส่วนที่เหลือจะถูกเพิ่มเมื่อจำเป็น แดชบอร์ดที่เต็มไปด้วยกราฟที่ไม่มีใครมองคือเฟอร์นิเจอร์ ไม่ใช่สิ่งที่สังเกตได้99100## บันทึก: ยังคงมีประโยชน์ แต่มีการเชื่อมโยง101102บันทึกไม่หายไป มันจะมีประโยชน์มากขึ้นเมื่อมี `trace_id` และ `span_id` ดังนั้นคุณจึงสามารถเริ่มจากบันทึกข้อผิดพลาดและเปิด trace หรือเริ่มจาก trace ที่ช้า และอ่านเฉพาะบันทึกที่สร้างขึ้นในเส้นทางนั้น103104คุณกำลังมองหาเข็มโดยไม่มีความสัมพันธ์กัน ด้วยความสัมพันธ์กัน อย่างน้อยคุณก็รู้ว่าต้องดูลิ้นชักไหน105106## รายการตรวจสอบที่ฉันจะใช้ก่อนพูดว่า "เราครอบคลุมแล้ว"107108- trace ข้ามหลายบริการจริงๆ109- บันทึกประกอบด้วย `trace_id` และ `span_id`110- Collector ได้รับการกำหนดค่าด้วยขีดจำกัดแบตช์และหน่วยความจำ111- ข้อผิดพลาดจะถูกบันทึกใน span112- มีนโยบายการสุ่มตัวอย่าง113- ตัวชี้วัดมีการควบคุมจำนวนสมาชิก114- ข้อมูลที่ละเอียดอ่อนจะถูกกรอง115- การแจ้งเตือนเริ่มจากอาการของผู้ใช้ ไม่ใช่กราฟสุ่ม116117## บทสรุป118119OpenTelemetry ไม่สามารถแก้ปัญหาการผลิตได้ด้วยตัวเอง แต่วิธีที่คุณจัดการกับพวกเขาเปลี่ยนไป แทนที่จะเพิ่มบันทึกแบบสุ่มสี่สุ่มห้า คุณเริ่มติดตามเส้นทางที่แท้จริงของคำขอ120121สำหรับฉัน สัญญาณที่บอกว่ามันใช้งานได้นั้นเรียบง่าย: เมื่อมีอะไรเกิดขึ้น ทีมงานจะหยุดถามว่า "เรากำลังมองอยู่ที่ไหน" และเริ่มถามว่า "ทำไมชิ้นนั้นถึงช้า" นั่นคือจุดที่ความสามารถในการสังเกตกลายเป็นเครื่องมือ ไม่ใช่ชุดของแดชบอร์ด122123## แหล่งที่มา124125- [OpenTelemetry: Overview](https://opentelemetry.io/docs/specs/otel/overview/)126- [OpenTelemetry Collector: Configuration](https://opentelemetry.io/docs/collector/configuration/)127- [OpenTelemetry JavaScript: Node.js getting started](https://opentelemetry.io/docs/languages/js/getting-started/nodejs/)128- [OpenTelemetry Semantic Conventions](https://opentelemetry.io/docs/concepts/semantic-conventions/)129
:OpenTelemetry อยู่ระหว่างดำเนินการ: หยุดการแก้ไขข้อบกพร่องในความมืดlines 1-129 (END) — press q to close