OpenTelemetry ในปี 2023
(bit.kevinslin.com)- OpenTelemetry ซึ่งเริ่มต้นจากการควบรวม OpenTracing และ OpenCensus ในปี 2019 ได้กลายเป็นมาตรฐาน observability ที่ครอบคลุม trace, metric และ log ภายในเวลา 4 ปี
- โครงสร้างหลักแบ่งเป็น ข้อกำหนด และ implementation โดยให้ทั้งเกณฑ์สำหรับความเข้ากันได้กับ vendor และเครื่องมือจริงสำหรับ instrumentation และการรวบรวมข้อมูล
- ข้อกำหนดของ OTEL ทำให้ tracing เสถียรในปี 2020, metric ในปี 2021 และ log ในปี 2023 จน ทุก signal อยู่ในสถานะ stable แล้ว แต่การรองรับ log ยังแตกต่างกันไปในแต่ละ SDK
- OTLP และ Collector เป็นฐานสำหรับส่งและประมวลผลข้อมูล observability ในรูปแบบร่วมกัน และ agent ของ vendor อย่าง Grafana และ Datadog ก็ implement สิ่งนี้ด้วย
- OTEL ขยายขอบเขตไปถึง Collector, Semantic Conventions, OpAMP, OTTL และ Demo จนกลายเป็นฐานร่วมของ observability แบบเป็นกลางต่อ vendor
ตำแหน่งปัจจุบันของ OpenTelemetry
- OpenTelemetry หรือเรียกสั้น ๆ ว่า OTEL เริ่มต้นขึ้นในปี 2019 จากการรวม OpenTracing และ OpenCensus เข้าด้วยกัน
- เดิมทีเป็นโปรเจกต์ที่เน้น tracing แต่หลังจากการควบรวม ขอบเขตก็ขยายไปสู่ observability ทั้งหมด
- เป้าหมายคือช่วยให้องค์กรสามารถมอบ telemetry คุณภาพสูง เป็นสากล และพกพาได้
- หลังผ่านไป 4 ปี OTEL มีรากฐานดังต่อไปนี้
- มาตรฐานที่เสถียรสำหรับ metric, log และ trace
- Collector ที่สามารถรับ ประมวลผล และส่งออก telemetry ได้ในทุกสภาพแวดล้อม
- SDK ที่รองรับการทำ instrumentation ในโค้ดสำหรับภาษาหลัก ๆ
- มาตรฐานเพิ่มเติมเกี่ยวกับ Semantic Conventions และการจัดการ agent
- ปัจจุบัน OTEL เป็นโปรเจกต์ใน CNCF ที่มีความเคลื่อนไหวสูงเป็นอันดับถัดจาก Kubernetes โดยมีผู้มีส่วนร่วมกระจายอยู่ทั่ว vendor ด้าน observability รายใหญ่ และ protocol ก็ถูกนำไปใช้เกือบเป็นสากลในหมู่ผู้ให้บริการ observability
โครงสร้าง OTEL ที่แบ่งเป็นข้อกำหนดและ implementation
- OTEL ประกอบด้วยส่วนใหญ่ ๆ คือ ข้อกำหนด (specification) และ implementation
- ข้อกำหนดนิยามวิธีการจับ รวบรวม ประมวลผล และส่งออก telemetry
- ใกล้เคียงกับมาตรฐานร่วมที่ vendor ต้องปฏิบัติตามเพื่อให้เข้ากันได้กับ OTEL
- implementation คือ client library และเครื่องมือที่จัดการข้อมูล telemetry
- เป็นส่วนที่ผู้ใช้ปลายทางสัมผัสโดยตรงเมื่อทำ instrumentation กับโค้ด
- ความเสถียรของโปรเจกต์มักแสดงแยกตาม signal
- ใน OTEL คำว่า signal หมายถึงประเภทข้อมูล telemetry เช่น metric, log และ trace
- โปรเจกต์ย่อยหลักมีดังนี้
- OpenTelemetry Specification
- OpenTelemetry SDKs
- OpenTelemetry Protocol
- OpenTelemetry Collector
- Open Agent Management Protocol
- OpenTelemetry Semantic Conventions
OpenTelemetry Specification 1.24.0
- OpenTelemetry Specification เป็นรากฐานของ OTEL และให้ API, SDK และ data model ที่เป็นพื้นฐานให้มาตรฐาน OTEL อื่น ๆ
- การทำให้เสถียรดำเนินไปแยกตาม signal
- กันยายน 2020: tracing stable
- พฤศจิกายน 2021: metric stable
- เมษายน 2023: log stable
- ปัจจุบันข้อกำหนด OTEL อยู่ในสถานะ stable ในทุก signal
- เนื่องจาก log signal เพิ่งเสถียรในปี 2023 ทำให้ OTEL SDK จำนวนมากยังไม่รองรับ log
OpenTelemetry SDK และ auto instrumentation
- OTEL SDK ให้การทำ instrumentation ฝั่ง client ตามข้อกำหนด OTEL
- SDK แต่ละภาษามีระดับความพร้อมแยกกันตาม signal อย่าง metric, log และ trace
- SDK บางตัวรองรับ auto instrumentation ขึ้นอยู่กับภาษาโปรแกรม
- auto instrumentation คือวิธีที่ SDK แทรก signal โดยอัตโนมัติในโค้ดแอปพลิเคชัน ซึ่งส่วนใหญ่เป็น trace เพื่อลดภาระการทำ instrumentation ด้วยตนเอง
- ในภาษาที่ต้อง compile เช่น
goและrustauto instrumentation จะไม่ทำงาน - อย่างไรก็ตาม หากใช้เครื่องมือนอก SDK ที่อิง eBPF หรือ service mesh ก็สามารถได้การแทรก trace อัตโนมัติ
OTLP 1.0 และมาตรฐานการส่งข้อมูล
- OTLP คือ wire protocol ร่วมกัน สำหรับส่งข้อมูล observability
- วิธีส่งอย่างเป็นทางการมี 2 แบบ
- HTTP และ Protocol Buffers
- gRPC
- ข้อกำหนดนี้ถือว่า stable และสามารถ implement ได้ในทุก service ที่รับ ประมวลผล และส่งออกข้อมูล OTEL
- OTLP ถูก implement โดย OpenTelemetry Collector และ agent ของ vendor ด้าน observability อย่าง Grafana และ Datadog ก็ implement เช่นกัน
OpenTelemetry Collector 0.83.0
- OTEL Collector คือ agent ที่เป็นกลางต่อ vendor สำหรับรวบรวม แปลง และส่งข้อมูล observability
- Collector ประกอบด้วยคอมโพเนนต์ต่อไปนี้
- receivers: รับข้อมูลจากหลาย source ด้วยวิธี push/pull
- processors: แปลง กรอง เพิ่มข้อมูล และสร้างข้อมูลอนุพันธ์จากข้อมูลที่กำลังเคลื่อนที่
- exporters: ส่งข้อมูลไปยังปลายทาง downstream
- connectors: ทำงานเป็นทั้ง receiver และ exporter เพื่อเชื่อมหลาย pipeline เข้าด้วยกัน
- pipelines: chain ที่ประกอบด้วย receiver, processor ตั้งแต่ 0 ตัวขึ้นไป และ exporter
- extensions: ให้ฟังก์ชันนอกเหนือจากการประมวลผล telemetry เช่น basic auth และ health check
- คอมโพเนนต์เหล่านี้ทำงานร่วมกันเป็น observability pipeline ที่สามารถรวบรวม telemetry จาก source ใดก็ได้ ประมวลผลระหว่างทาง แล้วส่งไปยังปลายทางที่ต้องการ
- Collector แบ่งเป็น 2 โปรเจกต์
- otel-collector: มีเฉพาะคอมโพเนนต์หลักของ Collector และส่วนใหญ่เป็น logic ที่เกี่ยวข้องโดยตรงกับการประมวลผลข้อมูล OTLP
- otel-collector-contrib: ชุดรวม integration ที่มี exporter และ receiver สำหรับผู้ให้บริการ observability ส่วนใหญ่
- ณ เวลาที่เขียน
otel-collector-contribมี receiver 91 ตัว, exporter 48 ตัว, processor 24 ตัว - แนะนำให้ผู้ใช้ปลายทางใช้ OpenTelemetry Collector Builder เพื่อสร้าง custom build ของ
otel-collector-contribที่มีเฉพาะคอมโพเนนต์ที่ต้องการ - vendor อย่าง AWS และ Splunk ก็มี distribution ของ OTEL เป็นของตนเอง
OpAMP และการจัดการ agent จากระยะไกล
- OpAMP คือ network protocol สำหรับการจัดการ agent จากระยะไกล
- เป็นมาตรฐานค่อนข้างใหม่ที่เพิ่มเข้ามาใน OTEL ในปี 2022 และให้ วิธีที่เป็นกลางต่อ vendor สำหรับควบคุมกลุ่ม agent
- เป้าหมายที่ถูกจัดการอาจเป็น instance ของ
otel-collectorหรืออาจเป็น agent เฉพาะของ vendor ที่ implement OpAMP ก็ได้ - เมื่อใช้ OpAMP จะสามารถเปิดใช้ฟังก์ชันต่อไปนี้ได้
- การ deploy การตั้งค่าแบบ dynamic
- การอัปเดต agent
- การจัดการ credential
- ปัจจุบัน Go implementation ของข้อกำหนด OpAMP ยังอยู่ระหว่างดำเนินงาน
Semantic Conventions และโปรเจกต์เพิ่มเติม
- OTEL Semantic Conventions นิยาม ชุด attribute ร่วมกัน ที่ใช้ในข้อมูล observability
- ขอบเขตการใช้งานครอบคลุม cloud resource, database, exception, system และอื่น ๆ
- Semantic Conventions ถูกใช้โดย OTEL SDK และจะถูกนำไปใช้โดยอัตโนมัติใน SDK ที่รองรับ auto instrumentation
- semantic ร่วมกันทำให้สามารถเชื่อมความสัมพันธ์ระหว่าง signal ที่ต่างกันได้
- ยังมีคอมโพเนนต์หลักอื่น ๆ ของ OTEL แยกต่างหากด้วย
- OpenTelemetry Transformation Language (OTTL): ภาษาการแปลงร่วมกันสำหรับ telemetry มีทั้งประสิทธิภาพและความยืดหยุ่น และถูกออกแบบ/implement ใน
otel-collector-contrib - OTEL Demo: เว็บไซต์ช้อปปิ้งแบบ microservices ที่แสดงความสามารถของ OTEL และ SDK ภาษาส่วนใหญ่
- OpenTelemetry Transformation Language (OTTL): ภาษาการแปลงร่วมกันสำหรับ telemetry มีทั้งประสิทธิภาพและความยืดหยุ่น และถูกออกแบบ/implement ใน
การเปลี่ยนแปลงตลอด 4 ปี
- OTEL เริ่มจากการควบรวมข้อกำหนด tracing ที่แข่งขันกัน และพัฒนามาเป็น มาตรฐานอุตสาหกรรม ของ observability
- 4 ปีที่ผ่านมาเป็นช่วงเวลาของการสร้างฐานร่วมกันครอบคลุม vendor และเครื่องมือต่าง ๆ
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
OpenTelemetry มีปัญหาอยู่สองอย่าง
คล้ายกันคือเคยอยากทำ heartbeat ง่าย ๆ เพื่อดูการใช้งานในแอปเดสก์ท็อป แต่ถ้าดูจากชื่อโปรเจกต์แล้ว น่าประหลาดที่แทบเป็นไปไม่ได้เลย ปฏิกิริยาต่อคำถามก็มีน้อย จึงล้มแผนใช้ OpenTelemetry ไปทั้งหมด: https://github.com/open-telemetry/community/discussions/1598, https://github.com/open-telemetry/semantic-conventions/issue...
ตัวอย่างเช่น ไม่สามารถกำหนดบัคเก็ตใกล้กับจุดที่นิยามฮิสโตแกรมได้ ต้องส่งรายการ “override” ที่แมปจากชื่อฮิสโตแกรมไปยังบัคเก็ตให้กับที่อย่าง global exporter ถ้ามีไลบรารีที่ส่งออกเมตริก เรื่องนี้จะยุ่งเหยิงมาก: https://github.com/open-telemetry/opentelemetry-go/issues/38...
แม้ดูเว็บไซต์ของบริษัท observability ชั้นนำ บทความเกี่ยวกับ custom instrumentation ก็มีราว 4 หน้าและครอบคลุมแค่เรื่องพื้นฐานมาก ๆ OTel ไม่ได้ตามหลังเป็นพิเศษ และคำตอบโดยมากก็ใกล้เคียงกับ “แล้วแต่สถานการณ์” เมื่อสะสมประสบการณ์มากขึ้น ประเด็นแบบนี้ที่ทำให้มือใหม่สับสนก็น่าจะค่อย ๆ คลี่คลายได้
ชอบ OpenTelemetry มาก และอยากติดตามแทบทุก span ถ้าใช้เวนเดอร์สักรายคงล้มละลายเพราะค่าใช้จ่ายไปแล้ว
ติด OpenTelemetry ด้วย Java auto instrumentation แทบไม่ต้องลงแรง และส่งไปยัง ClickHouse ที่โฮสต์เอง เก็บ span มากกว่า 700 ล้านรายการต่อวันบน EC2 ราคา 100 ดอลลาร์: https://clickhouse.com/blog/how-we-used-clickhouse-to-store-...
เมื่อเก็บ trace ไว้ 1 เดือน
signoz_index_v2มี 26.9 ล้านแถว ขนาด 17.06GiB,trace_logมี 123 ล้านแถว ขนาด 2.64GiB,samples_v2มี 949 ล้านแถว ขนาด 345MiB ถือว่าบีบอัดได้ดี ถ้าใช้เครื่อง ClickHouse ตามสเปกที่แนะนำก็คงลดเวลาจูนได้ แต่ตอนนี้ก็ทำงานได้ดีอยู่ข้อเสียคือ IOPS ของดิสก์ sc1 ขนาดเล็กอยู่ราว 4 ทำให้ ClickHouse ใช้เวลาสตาร์ตประมาณ 5 นาที และแม้ UI ของ SigNoz จะมีฟีเจอร์เพียงพอ แต่ก็ยากจะคาดหวังความเนี้ยบระดับ Datadog
ที่ทำงานเก่าเคยเก็บแค่ 5% ของ trace ที่ไม่ใช่ error
ผิดหวังกับ OpenTelemetry อย่างมาก จากประสบการณ์ มันเป็น ก้อนความสับสนที่ออกแบบเกินจำเป็น และประสบการณ์ใช้งานพื้นฐานก็เป็นปฏิปักษ์ต่อผู้ใช้มาก
มันโฆษณาตัวเองว่าเป็นทั้งฟอร์แมต tracing/metrics/logging แบบทั่วไป และเป็นชุดไลบรารี plug-and-play ที่มี adapter สำหรับทุกอย่างที่จำเป็น แต่ในความเป็นจริง มันใกล้เคียงกับชุดไลบรารีครึ่ง ๆ กลาง ๆ ที่รายละเอียด implementation ภายในรั่วออกมาเยอะ คุณภาพ adapter ก็แย่ และฟีเจอร์ก็ไม่ได้มากนัก
ฟีเจอร์จำนวนมากมีเงื่อนไขแนบมาประมาณว่า มันจะทำงานเมื่อไร ที่ไหน มากแค่ไหน ตอนข้างขึ้นข้างแรมเป็นอย่างไร ตอนมองเห็นดาวพฤหัสบนท้องฟ้า และเมื่อความยาวสตริงอยู่ที่ระดับใด
ถึงอย่างนั้น ถ้ามองข้าม API ของ SDK ที่รั่วไหลและฟีเจอร์ที่ทำมาแค่ครึ่งเดียวไป คำสัญญาเรื่อง การสลับแทนกันได้ ก็ถือว่าทำได้ในระดับหนึ่ง ก่อน OTel ทุกอย่างเป็นสแต็กเฉพาะของตัวเอง แต่ตอนนี้สามารถเสียบ backend สำหรับ logging ตัวอื่นเข้ากับ SDK มาตรฐานตัวเดียว และคาดหวังได้ว่ามันจะทำงานได้โดยรวม แม้จะด้อยกว่าสแต็กแบบบูรณาการแนวดิ่ง แต่จากมุมมองสถาปัตยกรรมก็นับเป็นชัยชนะบางส่วน เพราะทำให้เกิดการแข่งขันและวิวัฒนาการเป็นส่วน ๆ ได้โดยไม่ต้องรื้อทั้งสแต็ก observability
ตัวอย่างแสดงเพียงวิธีใช้เครื่องมือ swagger เพื่อ parse สเปก OpenAPI (https://github.com/openzipkin/zipkin-api/blob/master/zipkin2...) สร้างโค้ดกาวใน Go อัตโนมัติ แล้วเรียกฟังก์ชันที่สร้างอัตโนมัติหนึ่งตัวเพื่อบันทึก trace
ไม่มีเอกสารหรืออย่างอื่นเป็นตัวอย่างเลย จนสงสัยว่ามีใครใช้แนวทางนี้จริงหรือไม่ สุดท้ายจึงไปเรียก service API (https://zipkin.io/zipkin-api/#/) โดยตรงผ่าน REST แทน OTel นั้นเจ็บปวด แต่ทางเลือกอื่นก็ไม่ได้ดีไปกว่า หวังว่าจะมีคนให้ความสนใจกับด้านนี้มากขึ้น เพราะการวัด SLO และ SLI สำคัญขึ้นเรื่อย ๆ
ไลบรารีทางการของ OTel ยังทำงานได้ไม่ดีบนเว็บฟรอนต์เอนด์ เช่น โดยค่าเริ่มต้นไม่มีวิธีเชื่อมโยง error กับ source map
web browser collector ที่โปรเจกต์ OTel เผยแพร่ใช้ Zone.js เพื่อดักแทบทุกอย่างในเบราว์เซอร์เป็น context ถ้าเคยใช้ Angular รุ่นใหม่ ๆ ก็น่าจะรู้ว่า Zone.js บางครั้งค่อนข้างเจ็บปวด และการไปแตะ global อาจทำให้เกิดพฤติกรรมที่คาดเดายาก
ก็ไม่รู้เหมือนกันว่ามีมาตรฐาน OTel สำหรับสิ่งอย่าง session replay หรือไม่ แพลตฟอร์ม telemetry หลายเจ้าอย่าง Sentry, Rollbar, DataDog รองรับสิ่งนี้ ทีม backend ดูเหมือนจะชอบมันพอสมควร และผมชอบคุณสมบัติของ span ที่ข้ามขอบเขตได้ ทำให้ตามทั้งระบบได้ด้วย tag เฉพาะตัว อย่างไรก็ตาม payload ที่สร้างขึ้นบางครั้งยืดยาวมาก และบางแพลตฟอร์ม logging ก็กะทัดรัดกว่า ในงานจริงไม่ได้รู้สึกว่าเป็นปัญหาใหญ่
เคยลอง instrument เองแล้ว แต่เกิดข้อผิดพลาดง่ายและยืดยาว เบราว์เซอร์เองก็จำเป็นต้องมีอะไรแบบ https://nodejs.org/api/async_context.html#class-asynclocalst... จริง ๆ
ในแพ็กเกจของเรา เราเสริม session replay, การติดตาม exception ที่ดีขึ้น ฯลฯ ไว้บน implementation ของ Otel/Splunk browser SDK น่าเสียดายที่สิ่งเหล่านี้ยังห่างไกลจากการมีมาให้พร้อมใช้โดยพื้นฐาน ถึงอย่างนั้น การเชื่อมเซสชันฟรอนต์เอนด์เข้ากับ trace/log ฝั่ง backend ได้ ก็ถือว่าเปลี่ยนประสบการณ์นักพัฒนาไปมาก: https://www.hyperdx.io/blog/browser-based-distributed-tracin...
มันไม่ได้แก้ปัญหาอย่างสมบูรณ์ แต่ก็เป็นจุดเริ่มต้นได้
อยากรู้ว่ามีใครเริ่มทำ frontend tracing ไปบ้างแล้วหรือยัง
ผมกับเพื่อนร่วมงานสองสามคนเคยมีความคิดที่ค่อนข้างแปลกว่า ต่อไปอาจไม่ต้องมี log แล้วก็ได้ แทนที่จะใช้ข้อความ log ก็แค่ใส่ span event เข้าไป: https://opentelemetry.io/docs/instrumentation/ruby/manual/#a...
จากนั้นก็เหลือ log ไว้แค่ชื่อ span กับลิงก์ไปยัง span นั้นใน Jaeger ประมาณนี้ เคยลองแค่ในโปรเจกต์ส่วนตัว แต่รู้สึกว่าค่อนข้างดี เพียงแต่น่าจะดีถ้า Jaeger UI รองรับรูปแบบการใช้งานแบบนี้ได้ดีกว่านี้
จริง ๆ แล้วเพื่อนร่วมงานกลุ่มนั้นก็มี talk เรื่องนี้ด้วย ถ้าอยู่แถว ๆ Hannover เยอรมนี ลองหา “Nie wieder Log-Files!” ได้ที่ https://javaforumnord.de/2023/programm/
การใช้ span กับงานที่มีความหมายทุกอย่างคล้ายกับการใช้ structured log ที่ทรงพลังกว่า สำหรับหลายระบบที่ยังต้องพก log เดิมไปด้วยอาจทำได้ยาก แต่ถ้าเป็น greenfield มากพอ ผมแนะนำ
ถ้าจะใช้ trace มีหลายอย่างที่ต้องทำงานให้ถูกต้อง ไม่งั้นก็อาจเป็นเพราะผมยังประสบการณ์น้อย เลยรู้สึกกลัวเครื่องมือก็ได้
ตอนดูงานนำเสนอเมื่อหลายปีก่อนผมคิดว่าเจ๋งมาก แต่คงยากมากที่จะโน้มน้าวนักพัฒนาที่ไม่ใช่ SRE: https://github.com/stripe/veneur
OpenTelemetry เป็น โปรเจกต์ที่ขับเคลื่อนด้วยการตลาด ออกแบบแบบคณะกรรมการและ implement อย่างไร้เดียงสาไม่มีประสิทธิภาพ ดูเหมือนมีเป้าหมายหลักเพื่อให้ CTO ของบริษัท Fortune X00 ได้ติ๊ก checkbox ในเอกสาร strategic roadmap
ไม่ใช่ของที่คนซึ่งมีทางเลือกควรใช้
ตัวอย่างการเปลี่ยนแปลงที่เราเสนออยู่ที่นี่: https://github.com/open-telemetry/opentelemetry-js/pull/4049
ถ้าช่วยแชร์เหตุผลว่าทำไมถึงมองว่าไม่ควรมีใครใช้เลยก็ดีครับ
Datadog เคยทุ่มคนจำนวนมากเข้าไปเพิ่มการรองรับ Datadog ในโปรเจกต์ OSS จริง ๆ การกระโดดเข้าไปใน codebase ที่ไม่คุ้นเคยเป็นความสามารถที่แข็งแกร่ง ดังนั้นในช่วงต้นอาชีพก็น่าจะค่อนข้างดี
OTel ทำให้โปรเจกต์ open source ใช้ abstraction layer ได้ เพื่อให้ผู้ใช้ซื้อบริการแทนการ host เองได้ ผมไม่ได้ชอบมันสุด ๆ แต่ถ้าเป็นบริการที่คนภายนอกบริษัทเราเป็นคนรัน ตอนนี้ผมคงพิจารณา OTel เพราะมันทำให้เราไม่ไปขวางผู้ใช้บางคนที่อยากใช้ Datadog
ตอนที่ผมใช้ OTel ช่วงแรกมาก ๆ Go API ไม่มีประสิทธิภาพมากจนผิดหวัง การเพิ่ม counter ต้องใช้
context.Contextและ abstraction ก็รั่ว เช่น ไม่มีวิธีตั้ง histogram bucket ตอน export ไป Prometheus ตอนนี้คงแก้แล้วมั้งprocessor ก็มีความสามารถพอตัว และชุด contrib ของ receiver กับ exporter โดยรวมก็โอเค ไม่ได้จะบอกว่าเป็นทางออกที่ดีที่สุด และขึ้นอยู่กับ use case แต่คำวิจารณ์แรงขนาดนี้ดูไม่สมเหตุสมผล อนึ่ง ผมอยู่ในทีม maintain fluent-bit
จากมุมการปฏิบัติการ ไม่ว่านักพัฒนาจะเพิ่ม observability แบบไหนใน code ก็สามารถบังคับ filtering จากศูนย์กลางได้ และ application ก็ต้องมีทางเข้ากลางที่มันคุยด้วยเพียงทางเดียว
ทุกอย่าง export OTLP ดังนั้นถ้าอยากย้ายไป backend ใหม่ก็แค่เปลี่ยนไฟล์ YAML และไม่ต้องเขียน application ใหม่เพื่อรองรับ logging backend ใหม่ ต่อให้มีข้อบกพร่อง ผมก็จะใช้ OTEL ต่อ 10 ครั้งจาก 10 ครั้ง มากกว่าย้อนกลับไปใช้วิธีเก่าที่ใช้ logging library เฉพาะ vendor
ผมเกลียด popup สมัครรับข่าวสาร ของบล็อกนี้จริง ๆ ไม่มีปุ่ม
xเลยไม่ชัดเจนเลยว่าสามารถปิดได้โดยไม่ต้องให้อีเมลใต้ปุ่ม subscribe มีข้อความ “continue reading” ที่ไม่ intuitive อย่างมาก ผมไม่รู้ด้วยซ้ำว่ามันกดได้ และคลิกข้างนอกก็ไม่ปิด แบบนี้ควรทำให้ดีกว่านี้
ส่วน OpenTelemetry ผมอยากลองมานานแล้วว่ามันมีฟีเจอร์ครบตามที่ต้องใช้ตอนส่งข้อมูลไป Datadog หรือไม่ แต่ถ้านอกเหนือจากฟีเจอร์พื้นฐานแล้วยังต้องใช้ Datadog agent อยู่ ก็เท่ากับมีอีกอย่างที่ต้องจัดการและสอนคน เลยลังเล
อยากรู้ว่ามีใครเคยต่อเข้ากับ Datadog จริง ๆ ไหม เป้าหมายไม่จำเป็นต้องผูกกับ Datadog ต่อไป แต่ตอนนี้ alert กับ log จำนวนมากอยู่ที่นั่น ดังนั้นถ้าเปลี่ยนไปใช้ OpenTelemetry ก่อน ในทางทฤษฎีก็น่าจะย้ายไปอย่างอื่นภายหลังได้
พอกด back ก็กลับไป HN เลย
สงสัยว่ายังมีฟรอนต์เอนด์ที่ไม่กัดกินกระแสรายได้อย่างหนัก ทั้งในแง่กำลังคน โครงสร้างพื้นฐาน และค่าไลเซนส์อยู่หรือเปล่า
รับรีเควสต์มากกว่า 2,000 ครั้งต่อวินาที แค่เก็บ log ไว้ก็แพงแล้ว
เราเดินสแต็ก Jaeger เองด้วย sampling 0.1% และเมื่อเทียบกับ Datadog APM แล้ว ต้นทุนแทบมองข้ามได้
สำหรับ metrics กับ logs นั้น sampling ไม่ได้มีประโยชน์มากนัก จึงไม่มีคำตอบที่ดี ถ้า gross margin ของ Datadog อยู่ที่ 80% แปลว่าจากเงินที่จ่ายไป ต้นทุนโครงสร้างพื้นฐานอย่างมากก็ 20% และถ้าค่าแรงน้อยกว่า 80% นั้น การรันสแต็กโอเพนซอร์สเองก็ช่วยลดค่าใช้จ่ายได้มาก แม้จะใช้ Datadog อยู่ เราก็ยังทำโปรเจกต์ลดการใช้งานทุก 3 เดือนอยู่ดี สุดท้ายก็ต้องคอยดูแลต่อเนื่องเหมือนกัน
ต้นทุนก็เป็นปัญหา แต่คุณอาจแปลกใจได้ว่า observability สร้างภาระให้บริการหนักกว่าที่คิด ใช้ CPU ค่อนข้างมาก
ผมยังเขียน Elasticsearch query ไว้สองสามตัวเพื่อทำรายงานพื้นฐานสำหรับหา query ที่ช้าด้วย ถ้าทำตาม tutorial ของ OTEL/Jaeger ก็ถือว่าเป็นคอนฟิกที่ค่อนข้างมาตรฐาน
traces อยู่ที่ระดับหลายร้อยรายการต่อวินาที และเก็บทั้งหมดโดยไม่ downsample ตั้ง retention ได้ 7 วัน และตอนที่ออกมาแทบยังไม่มีการ optimize จริงจังเลย ค่าใช้จ่ายรายเดือนน่าจะอยู่ระดับหลายสิบถึงหลายร้อยดอลลาร์
สามารถกำหนดพฤติกรรมของ tracing sampler ได้ด้วย environment variable ที่ตั้งในคอนเทนเนอร์ ดู
OTEL_TRACES_SAMPLERในเอกสาร: https://opentelemetry.io/docs/specs/otel/configuration/sdk-e...ตอนนี้ใช้ Datadog อยู่ แต่ทุกคนรู้ว่ามันแพงเกินไป
เธรดส่วนใหญ่พูดถึงการใช้ OpenTelemetry ส่ง metrics/logs ไปยังงาน collector ที่โฮสต์เอง
การใช้ไลบรารีมาตรฐานที่เครื่องมือ collector หลายตัวอย่าง ClickHouse รองรับนั้นมีประโยชน์อยู่แล้ว แต่อีกข้อดีคือสเปกทำให้ส่งต่อ trace ID ข้ามขอบเขตของระบบได้
ถ้าทั้งระบบของคุณและ dependencies ต่างก็ implement สเปก OpenTelemetry คุณจะได้ spans ที่แสดงรายละเอียดอย่างละเอียดว่าเกิดอะไรขึ้นระหว่างทาง เช่น รู้ได้ว่าสาเหตุที่หน้าโหลดนานคือการโหลด disk page ของฐานข้อมูล หรือ span ของ metadata plane ในบริการคลาวด์เป็นต้นเหตุของ latency สูงหรือไม่
พอใจกับความก้าวหน้าของ OpenTelemetry มาก ตอนที่ผลักดันให้เริ่มใช้เมื่อหลายปีก่อน นักพัฒนาลังเลเพราะมันใหม่และไม่เคยได้ยินชื่อ แต่พอกลับมาดูอีกครั้งเมื่อหนึ่งปีก่อน OpenTelemetry ก็อยู่ทั่วระบบของเราแล้ว และ vendor ด้าน logging/tracing ที่เราใช้ก็อยู่ระหว่างย้ายไปทางนั้นเช่นกัน