OpenTelemetry pada 2023
(bit.kevinslin.com)- OpenTelemetry, yang dimulai dari penggabungan OpenTracing dan OpenCensus pada 2019, dalam 4 tahun telah menjadi standar observabilitas yang mencakup trace, metric, dan log
- Struktur intinya terbagi menjadi spesifikasi dan implementasi, yang bersama-sama menyediakan acuan kompatibilitas vendor serta alat instrumentasi dan pengumpulan yang nyata
- Spesifikasi OTEL menstabilkan tracing pada 2020, metric pada 2021, dan log pada 2023, sehingga semua sinyal kini berstatus stable, tetapi dukungan log masih berbeda-beda antar SDK
- OTLP dan Collector menjadi fondasi untuk mengirim dan memproses data observabilitas dalam format umum, dan agen vendor seperti Grafana dan Datadog juga mengimplementasikannya
- OTEL memperluas cakupannya ke Collector, Semantic Conventions, OpAMP, OTTL, hingga Demo, dan berkembang sebagai fondasi bersama observabilitas yang netral terhadap vendor
Posisi OpenTelemetry saat ini
- OpenTelemetry, disingkat OTEL, dimulai pada 2019 dari penggabungan OpenTracing dan OpenCensus
- Pada awalnya ini adalah proyek yang berpusat pada tracing, tetapi setelah penggabungan cakupannya meluas ke seluruh observabilitas
- Tujuannya adalah membantu organisasi menyediakan telemetri yang berkualitas tinggi, umum, dan portabel
- Setelah 4 tahun, OTEL kini memiliki fondasi berikut
- standar stabil untuk metric, log, dan trace
- Collector yang dapat menerima, memproses, dan mengekspor telemetri di lingkungan apa pun
- SDK yang mendukung instrumentasi kode di bahasa-bahasa utama
- standar tambahan terkait Semantic Conventions dan manajemen agen
- Saat ini OTEL adalah proyek paling aktif di CNCF setelah Kubernetes, dengan kontributor yang tersebar di berbagai vendor observabilitas utama, dan protokolnya juga telah diadopsi hampir secara universal di antara para penyedia observabilitas
Komponen OTEL yang terbagi menjadi spesifikasi dan implementasi
- Secara garis besar, OTEL terdiri dari spesifikasi (specification) dan implementasi (implementation)
- Spesifikasi mendefinisikan cara menangkap, mengumpulkan, memproses, dan mengekspor telemetri
- Ini mendekati standar bersama yang harus diikuti vendor agar kompatibel dengan OTEL
- Implementasi adalah library klien dan alat untuk menangani data telemetri
- Inilah bagian yang langsung dihadapi pengguna akhir saat menginstrumentasi kode
- Stabilitas proyek biasanya ditandai per sinyal
- Dalam OTEL, sinyal berarti jenis data telemetri seperti metric, log, dan trace
- Subproyek utamanya adalah sebagai berikut
- OpenTelemetry Specification
- OpenTelemetry SDKs
- OpenTelemetry Protocol
- OpenTelemetry Collector
- Open Agent Management Protocol
- OpenTelemetry Semantic Conventions
OpenTelemetry Specification 1.24.0
- OpenTelemetry Specification adalah fondasi OTEL dan menyediakan API, SDK, serta model data yang menjadi dasar standar OTEL lainnya
- Proses stabilisasi berlangsung per sinyal
- September 2020: tracing stable
- November 2021: metric stable
- April 2023: log stable
- Saat ini spesifikasi OTEL berada dalam status stable untuk semua sinyal
- Karena sinyal log baru distabilkan pada 2023, masih banyak OTEL SDK yang belum mendukung log
OpenTelemetry SDK dan instrumentasi otomatis
- OTEL SDK menyediakan instrumentasi sisi klien berdasarkan spesifikasi OTEL
- Setiap SDK per bahasa memiliki tingkat kematangan tersendiri untuk sinyal metric, log, dan trace
- Beberapa SDK mendukung instrumentasi otomatis (auto instrumentation) tergantung bahasa pemrogramannya
- Instrumentasi otomatis adalah cara SDK menyuntikkan sinyal ke dalam kode aplikasi secara otomatis, terutama trace, untuk mengurangi beban instrumentasi manual
- Pada bahasa terkompilasi seperti
godanrust, instrumentasi otomatis tidak berjalan - Namun, di luar SDK, instrumentasi trace otomatis bisa diperoleh dengan alat berbasis eBPF atau service mesh
OTLP 1.0 dan standar pengiriman data
- OTLP adalah wire protocol umum untuk mengirim data observabilitas
- Ada dua metode transport resmi
- HTTP dan Protocol Buffers
- gRPC
- Spesifikasi ini dianggap stable dan dapat diimplementasikan di semua layanan yang menerima, memproses, dan mengekspor data OTEL
- OTLP diimplementasikan oleh OpenTelemetry Collector, dan juga oleh agen dari vendor observabilitas seperti Grafana dan Datadog
OpenTelemetry Collector 0.83.0
- OTEL Collector adalah agen netral vendor yang mengumpulkan, mengubah, dan mengirim data observabilitas
- Collector terdiri dari komponen berikut
- receivers: menerima data dari berbagai sumber dengan metode push/pull
- processors: mengubah, memfilter, memperkaya, dan menurunkan data saat transit
- exporters: mengirim data ke tujuan downstream
- connectors: bertindak sebagai receiver sekaligus exporter dan menghubungkan beberapa pipeline
- pipelines: rantai yang terdiri dari receiver, nol atau lebih processor, dan exporter
- extensions: menyediakan fungsi di luar pemrosesan telemetri, seperti basic auth dan health check
- Komponen-komponen ini bersama-sama bekerja sebagai pipeline observabilitas untuk mengumpulkan telemetri dari sumber mana pun, memprosesnya saat transit, lalu mengirimkannya ke tujuan yang diinginkan
- Collector terbagi menjadi dua proyek
- otel-collector: hanya mencakup komponen inti Collector dan terutama berisi logika yang langsung terkait dengan pemrosesan data OTLP
- otel-collector-contrib: kumpulan integrasi yang mencakup exporter dan receiver untuk sebagian besar penyedia observabilitas
- Pada saat penulisan,
otel-collector-contribmencakup 91 receiver, 48 exporter, dan 24 processor - Pengguna akhir disarankan menggunakan OpenTelemetry Collector Builder untuk membuat build kustom
otel-collector-contribyang hanya berisi komponen yang diperlukan - Vendor seperti AWS dan Splunk juga menyediakan distribusi OTEL mereka sendiri
OpAMP dan manajemen agen jarak jauh
- OpAMP adalah protokol jaringan untuk manajemen agen jarak jauh
- Ini adalah standar yang relatif baru yang ditambahkan ke OTEL pada 2022, dan menyediakan cara netral vendor untuk mengendalikan sekumpulan agen
- Objek yang dikelola bisa berupa instance
otel-collector, atau agen khusus vendor yang mengimplementasikan OpAMP - Dengan OpAMP, fitur berikut dapat diaktifkan
- deployment konfigurasi dinamis
- pembaruan agen
- manajemen kredensial
- Saat ini implementasi Go dari spesifikasi OpAMP masih berstatus work in progress
Semantic Conventions dan proyek tambahan
- OTEL Semantic Conventions mendefinisikan sekumpulan atribut umum yang digunakan dalam data observabilitas
- Cakupan penerapannya mencakup resource cloud, database, exception, sistem, dan lainnya
- Semantic Conventions digunakan oleh OTEL SDK, dan pada SDK yang mendukung instrumentasi otomatis, ia diterapkan secara otomatis
- Semantik bersama memungkinkan korelasi di antara sinyal yang berbeda
- Komponen penting lain dari OTEL juga ada secara terpisah
- OpenTelemetry Transformation Language (OTTL): bahasa transformasi umum untuk telemetri, dengan performa dan fleksibilitas, yang dirancang dan diimplementasikan di
otel-collector-contrib - OTEL Demo: situs belanja berbasis microservice yang menampilkan kapabilitas OTEL dan sebagian besar SDK bahasanya
- OpenTelemetry Transformation Language (OTTL): bahasa transformasi umum untuk telemetri, dengan performa dan fleksibilitas, yang dirancang dan diimplementasikan di
Perubahan selama 4 tahun
- OTEL berawal dari penggabungan spesifikasi tracing yang saling bersaing lalu berkembang menjadi standar industri untuk observabilitas
- Empat tahun terakhir adalah periode membangun fondasi bersama di seluruh vendor dan alat
1 komentar
Komentar Hacker News
Ada dua masalah dengan OpenTelemetry
Mirip dengan itu, saya ingin mengimplementasikan heartbeat sederhana untuk memahami penggunaan di aplikasi desktop, tetapi mengingat nama proyeknya, secara mengejutkan itu hampir mustahil. Respons terhadap pertanyaan juga minim, jadi saya sepenuhnya membatalkan rencana memakai OpenTelemetry: https://github.com/open-telemetry/community/discussions/1598, https://github.com/open-telemetry/semantic-conventions/issue...
Misalnya, bucket tidak bisa didefinisikan di dekat tempat histogram didefinisikan. Anda harus meneruskan daftar “override” yang memetakan nama histogram ke bucket ke tempat seperti exporter global. Ini jadi sangat berantakan jika ada library yang mengekspor metrik: https://github.com/open-telemetry/opentelemetry-go/issues/38...
Kalau melihat situs web perusahaan-perusahaan observability terkemuka, tulisan tentang instrumentasi kustom hanya sekitar 4 halaman dan hanya membahas hal-hal yang sangat dasar. OTel tidak secara khusus tertinggal; jawabannya umumnya lebih dekat ke “tergantung situasinya”. Seiring bertambahnya pengalaman, bagian-bagian seperti ini yang membingungkan bagi pemula bisa diselesaikan
Saya sangat menyukai OpenTelemetry dan ingin melacak hampir semua span. Kalau memakai vendor tertentu, mungkin sudah bangkrut karena biayanya
Dengan instrumentasi otomatis Java, saya memasang OpenTelemetry hampir tanpa upaya, lalu mengirimkannya ke ClickHouse yang di-host sendiri dan menyimpan lebih dari 700 juta span per hari di EC2 seharga 100 dolar: https://clickhouse.com/blog/how-we-used-clickhouse-to-store-...
Dengan retensi trace 1 bulan,
signoz_index_v2berisi 26,9 juta baris dengan 17.06GiB,trace_logberisi 123 juta baris dengan 2.64GiB, dansamples_v2berisi 949 juta baris dengan 345MiB, jadi rasio kompresinya bagus. Kalau memakai mesin ClickHouse sesuai spesifikasi rekomendasi, mungkin waktu tuning bisa dikurangi, tetapi sekarang pun berjalan baikKekurangannya adalah IOPS disk sc1 kecil hanya sekitar 4, jadi startup ClickHouse memakan waktu sekitar 5 menit, dan meski UI SigNoz fungsinya cukup, sulit berharap polish setingkat Datadog
Di tempat kerja sebelumnya, kami hanya mengumpulkan 5% trace yang bukan error
Saya sangat kecewa dengan OpenTelemetry. Dari pengalaman, ini adalah gumpalan membingungkan yang dirancang berlebihan, dan pengalaman penggunaan default-nya sangat tidak ramah pengguna
Ia mempromosikan dirinya sebagai format tracing/metrik/log yang umum serta kumpulan pustaka plug-and-play dengan adaptor untuk semua yang dibutuhkan, tetapi pada kenyataannya lebih dekat ke kumpulan pustaka setengah matang dengan banyak implementasi internal yang bocor, kualitas adaptor buruk, dan fitur yang tidak banyak
Banyak fitur disertai petunjuk seperti kapan, di mana, seberapa banyak, saat fase bulan seperti apa, ketika Jupiter terlihat di langit, dan ketika panjang string kira-kira berapa fitur itu akan bekerja
Meski begitu, jika mengabaikan API SDK yang bocor dan fitur-fitur yang setengah diimplementasikan, janji dapat diganti-ganti cukup ditepati. Sebelum OTel, semuanya adalah stack khusus, tetapi sekarang kita bisa mencolokkan backend logging lain ke satu SDK standar dan berharap sebagian besar berfungsi. Ini lebih buruk daripada stack yang terintegrasi vertikal, tetapi dari sudut pandang arsitektur ini adalah kemenangan parsial karena memungkinkan persaingan dan evolusi per bagian tanpa harus merombak seluruh stack observability
Contohnya hanya menunjukkan cara mem-parsing spesifikasi OpenAPI (https://github.com/openzipkin/zipkin-api/blob/master/zipkin2...) dengan tool swagger, menghasilkan kode perekat Go secara otomatis, lalu mencatat trace dengan memanggil satu fungsi yang dihasilkan otomatis
Tidak ada dokumentasi atau contoh lain sama sekali, jadi saya jadi bertanya-tanya apakah ada orang yang benar-benar memakai pendekatan ini, dan akhirnya memakai API layanan (https://zipkin.io/zipkin-api/#/) secara langsung lewat panggilan REST. OTel memang menyakitkan, tetapi alternatifnya juga tidak lebih baik. Seiring pengukuran SLO dan SLI makin penting, saya berharap ada lebih banyak perhatian di area ini
Pustaka resmi OTel masih belum bekerja dengan baik di frontend web. Misalnya, dalam kondisi default tidak ada cara untuk mengaitkan error dengan sourcemap
Kolektor browser web yang dirilis proyek OTel memakai Zone.js untuk mencegat hampir semua hal di browser sebagai konteks. Jika pernah memakai Angular modern, Anda tahu Zone.js kadang cukup menyakitkan dan dapat menyentuh global sehingga menghasilkan perilaku yang sulit diprediksi
Saya juga tidak tahu apakah ada standar OTel untuk hal seperti session replay. Banyak platform telemetry seperti Sentry, Rollbar, dan DataDog mendukungnya. Tim backend tampaknya cukup menyukainya, dan saya suka sifat lintas batas span yang bisa mengikuti seluruh sistem dengan tag unik. Namun payload yang dihasilkan terkadang sangat verbose, dan sebagian platform logging lebih ringkas. Dalam praktiknya saya tidak merasa ini masalah besar
Saya juga pernah melakukan instrumentasi langsung, tetapi rawan error dan verbose. Browser benar-benar membutuhkan sesuatu seperti https://nodejs.org/api/async_context.html#class-asynclocalst...
Di paket kami, kami menambahkan session replay, pelacakan exception yang lebih baik, dan sebagainya di atas implementasi SDK browser Otel/Splunk. Sayangnya, hal-hal seperti ini jauh dari bawaan. Meski begitu, kemampuan menghubungkan sesi frontend dengan trace/log backend menurut saya telah sangat mengubah developer experience: https://www.hyperdx.io/blog/browser-based-distributed-tracin...
Tidak sepenuhnya menyelesaikan masalah, tetapi bisa menjadi titik awal
Saya penasaran apakah ada orang yang pernah mulai melakukan frontend tracing sedikit saja
Bersama beberapa rekan, saya pernah punya gagasan yang agak nyeleneh bahwa kita tidak lagi membutuhkan log. Alih-alih pesan log, cukup tempelkan span event: https://opentelemetry.io/docs/instrumentation/ruby/manual/#a...
Lalu yang dicatat sebagai log hanya judul span dan tautan span terkait di Jaeger. Saya baru mencobanya di proyek pribadi, tapi rasanya cukup bagus; hanya saja akan lebih baik kalau UI Jaeger lebih mendukung pola penggunaan seperti ini
Bahkan rekan-rekan itu juga pernah memberi presentasi tentang topik ini. Kalau berada di sekitar Hannover, Jerman, coba cari “Nie wieder Log-Files!” di https://javaforumnord.de/2023/programm/
Memakai span untuk semua pekerjaan yang bermakna mirip dengan memakai structured log yang lebih kuat. Ini sulit untuk banyak sistem yang harus tetap membawa log lama, tetapi kalau cukup greenfield, saya merekomendasikannya
Untuk memakai trace, ada banyak hal yang harus berjalan dengan benar. Atau mungkin saya masih kurang pengalaman sehingga alat-alatnya terasa menakutkan
Saat melihat presentasinya beberapa tahun lalu, saya pikir itu keren, tetapi tampaknya akan sangat sulit meyakinkan developer yang bukan SRE: https://github.com/stripe/veneur
OpenTelemetry adalah proyek yang digerakkan pemasaran, dirancang secara naif dan tidak efisien ala komite, dan tampaknya tujuan utamanya adalah membantu CTO Fortune X00 mencentang kotak di dokumen roadmap strategis mereka
Ini bukan sesuatu yang seharusnya dipakai oleh orang yang punya pilihan
Contoh perubahan yang kami ajukan ada di sini: https://github.com/open-telemetry/opentelemetry-js/pull/4049
Saya ingin tahu alasan Anda mengapa menurut Anda tidak seorang pun sebaiknya memakainya
Datadog memang benar-benar menugaskan banyak orang untuk menambahkan dukungan Datadog ke proyek OSS. Terjun ke codebase asing adalah kemampuan yang kuat, jadi mungkin cukup bagus untuk awal karier
OTel membuat proyek open-source memakai lapisan abstraksi, sehingga pengguna bisa membeli layanan alih-alih self-hosting. Saya tidak terlalu menyukainya, tetapi untuk layanan yang dioperasikan orang di luar perusahaan, sekarang saya mungkin akan mempertimbangkan OTel. Karena kalau ada pengguna yang ingin memakai Datadog, kami tidak menghalanginya
Saat saya memakai OTel yang masih sangat awal, API Go-nya sangat tidak efisien sehingga mengecewakan. Untuk menaikkan counter perlu
context.Context, dan abstraksinya juga bocor, misalnya tidak ada cara mengatur bucket histogram saat mengekspor ke Prometheus. Saya rasa sekarang kemungkinan sudah diperbaikiProcessor-nya juga cukup mumpuni, dan kumpulan receiver serta exporter contrib secara umum juga cukup baik. Saya tidak mengatakan ini solusi terbaik dan memang tergantung use case, tetapi kritik sekeras itu tampaknya tidak beralasan. Sebagai catatan, saya termasuk tim maintainer fluent-bit
Dari sudut pandang operasi, apa pun observability yang ditambahkan developer ke kode, kita bisa memaksakan filtering secara terpusat, dan cukup ada satu jalur masuk terpusat yang digunakan aplikasi
Karena semuanya mengekspor OTLP, ketika ingin pindah ke backend baru, cukup ubah file YAML; tidak perlu menulis ulang aplikasi untuk mendukung backend logging baru. Dibanding kembali ke cara lama memakai library logging khusus vendor, dengan segala kekurangannya saya akan tetap memilih OTEL 10 dari 10 kali
Saya benar-benar tidak suka popup langganan di blog ini. Tidak ada tombol
x, jadi sama sekali tidak jelas bahwa kita bisa menutupnya tanpa memberikan emailDi bawah tombol berlangganan ada “continue reading” yang sangat tidak intuitif; saya tidak menyangka itu bisa dipakai, dan mengeklik area luar juga tidak menutupnya. Hal seperti ini perlu diperbaiki
Soal OpenTelemetry, saya sudah lama ingin menguji apakah ia menyediakan semua fitur yang dibutuhkan saat mengirim data ke Datadog. Namun jika selain fitur dasar kita masih tetap membutuhkan agen Datadog, itu berarti ada satu hal lagi yang harus dikelola dan diajarkan, jadi saya ragu
Saya penasaran apakah ada yang benar-benar pernah menghubungkannya ke Datadog. Tujuannya memang bukan harus terus terikat pada Datadog, tetapi saat ini cukup banyak alert dan log kami ada di sana, jadi jika lebih dulu beralih ke OpenTelemetry, secara teori nanti kami bisa pindah ke yang lain
Saat saya menekan tombol kembali, saya malah kembali ke HN
Saya penasaran apakah masih ada frontend yang tidak banyak menggerus aliran pendapatan dari sisi biaya tenaga kerja, infrastruktur, dan lisensi
Saat menerima lebih dari 2.000 request per detik, mempertahankan log saja sudah mahal
Kami menjalankan stack Jaeger sendiri dengan sampling 0,1%, dan dibanding Datadog APM biayanya bisa dibilang dapat diabaikan
Untuk metrik dan log, sampling tidak terlalu berguna, jadi tidak ada jawaban yang bagus. Jika margin kotor Datadog 80%, maka dari pembayaran Anda biaya infrastrukturnya paling banyak 20%; dan jika biaya tenaga kerja lebih kecil dari 80% itu, Anda bisa memangkas banyak biaya dengan menjalankan sendiri stack open source. Meski memakai Datadog, kami tetap menjalankan proyek untuk mengurangi penggunaan tiap 3 bulan, jadi bagaimanapun tetap perlu dirawat terus
Biaya memang masalah, tetapi Anda mungkin terkejut bahwa observability membebani layanan lebih berat dari yang dikira. Ia memakai CPU cukup banyak
Saya juga menulis beberapa query Elasticsearch untuk membuat laporan dasar guna menemukan query yang lambat. Jika mengikuti tutorial OTEL/Jaeger, ini konfigurasi yang cukup standar
Trace berada di kisaran ratusan per detik dan semuanya dikumpulkan tanpa downsampling. Masa retensi bisa disetel 7 hari, dan saat saya keluar hampir tidak ada optimasi nyata. Seingat saya biaya bulanannya sekitar puluhan sampai ratusan dolar
Anda bisa mendefinisikan perilaku tracing sampler lewat environment variable yang dapat disetel pada container. Lihat
OTEL_TRACES_SAMPLERdi dokumentasi: https://opentelemetry.io/docs/specs/otel/configuration/sdk-e...Saat ini kami memakai Datadog, tetapi semua orang tahu itu terlalu mahal
Sebagian besar thread ini membahas pengiriman metrik/log dengan OpenTelemetry ke pekerjaan collector yang di-hosting sendiri
Memakai library standar yang didukung berbagai alat collector seperti ClickHouse itu sendiri sudah berguna, tetapi manfaat lainnya adalah spesifikasinya memungkinkan trace ID diteruskan melintasi batas sistem
Jika Anda dan semua dependency Anda mengimplementasikan spesifikasi OpenTelemetry, Anda bisa mendapatkan span yang menunjukkan secara terperinci apa yang terjadi sepanjang perjalanan. Misalnya, Anda bisa mengetahui apakah penyebab pemuatan halaman lama adalah pemuatan disk page di database, atau apakah span metadata plane dari layanan cloud adalah penyebab latensi tinggi
Saya sangat puas dengan kemajuan OpenTelemetry. Ketika saya mendorong adopsinya beberapa tahun lalu, para developer ragu karena itu baru dan belum pernah mereka dengar; tetapi ketika saya melihatnya lagi setahun lalu, OpenTelemetry sudah ada di berbagai bagian sistem kami dan vendor log/tracing yang kami gunakan juga sedang beralih ke sana