2023 में OpenTelemetry
(bit.kevinslin.com)- 2019 में OpenTracing और OpenCensus के विलय से शुरू हुआ OpenTelemetry, 4 साल में trace·metrics·logs को समेटने वाला observability standard बन गया
- इसकी मुख्य संरचना specification और implementation में बंटी है, जो vendor compatibility के लिए मानक और वास्तविक instrumentation·collection tools दोनों प्रदान करती है
- OTEL specification में 2020 में tracing, 2021 में metrics, और 2023 में logs stable हुए, जिससे सभी signals stable स्थिति में पहुंच गए, हालांकि logs support अभी भी SDK के अनुसार अलग-अलग है
- OTLP और Collector observability data को common format में भेजने और process करने की बुनियाद हैं, और Grafana·Datadog जैसे vendor agents भी इन्हें implement करते हैं
- OTEL Collector, Semantic Conventions, OpAMP, OTTL, और Demo तक अपना दायरा बढ़ाते हुए vendor-neutral observability की common foundation के रूप में विस्तार कर रहा है
OpenTelemetry की वर्तमान स्थिति
- OpenTelemetry, संक्षेप में OTEL, 2019 में OpenTracing और OpenCensus के एक होने से शुरू हुआ
- शुरुआत में यह tracing-केंद्रित project था, लेकिन विलय के बाद इसका दायरा पूरे observability क्षेत्र तक फैल गया
- इसका लक्ष्य संगठनों को high-quality, universal, portable telemetry उपलब्ध कराने में मदद करना है
- 4 साल बाद OTEL के पास अब यह आधार है
- metrics, logs, और traces के लिए stable standards
- ऐसा Collector जो किसी भी environment में telemetry receive, process, और export कर सके
- प्रमुख भाषाओं में code instrumentation को support करने वाले SDKs
- Semantic Conventions और agent management से जुड़े अतिरिक्त standards
- फिलहाल OTEL, CNCF में Kubernetes के बाद सबसे सक्रिय project है, और इसके contributors प्रमुख observability vendors में फैले हुए हैं; इसका protocol भी observability providers के बीच लगभग सार्वभौमिक रूप से अपनाया जा चुका है
specification और implementation में बंटी OTEL संरचना
- OTEL मुख्य रूप से specification और implementation से मिलकर बना है
- specification यह परिभाषित करती है कि telemetry को capture, collect, process, और export कैसे किया जाए
- इसे उस common standard के रूप में देखा जा सकता है जिसे vendors को OTEL-compatible बनने के लिए मानना होता है
- implementation वे client libraries और tools हैं जो telemetry data को संभालते हैं
- यही वह हिस्सा है जिससे end users code instrumentation करते समय सीधे जुड़ते हैं
- project की stability आम तौर पर signal के आधार पर दिखाई जाती है
- OTEL में signal का मतलब metrics, logs, traces जैसे telemetry data types से है
- प्रमुख subprojects इस प्रकार हैं
- 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 standards आधारित हैं
- stabilization signal के अनुसार आगे बढ़ी
- सितंबर 2020: tracing stable
- नवंबर 2021: metrics stable
- अप्रैल 2023: logs stable
- वर्तमान में OTEL specification सभी signals पर stable स्थिति में है
- क्योंकि log signal सिर्फ 2023 में stable हुआ, इसलिए अभी भी कई OTEL SDKs logs को support नहीं करते
OpenTelemetry SDK और auto instrumentation
- OTEL SDK OTEL specification पर आधारित client-side instrumentation प्रदान करता है
- हर language SDK में metrics, logs, और traces signals के लिए maturity अलग-अलग हो सकती है
- कुछ SDKs programming language के आधार पर auto instrumentation support करते हैं
- auto instrumentation में SDK application code में signals, खासकर traces, अपने-आप inject करता है ताकि manual instrumentation का बोझ कम हो
goऔरrustजैसी compiled languages में auto instrumentation काम नहीं करता- हालांकि SDK के बाहर eBPF या service mesh आधारित tools का उपयोग करके automatic trace injection पाया जा सकता है
OTLP 1.0 और data transfer standard
- OTLP observability data भेजने के लिए एक common wire protocol है
- इसके दो आधिकारिक transport तरीके हैं
- HTTP और Protocol Buffers
- gRPC
- इस specification को stable माना जाता है, और OTEL data को receive, process, तथा export करने वाली सभी services में इसे implement किया जा सकता है
- OTLP को OpenTelemetry Collector implement करता है, और Grafana तथा Datadog जैसे observability vendors के agents भी इसे implement करते हैं
OpenTelemetry Collector 0.83.0
- OTEL Collector observability data को collect, transform, और transfer करने वाला vendor-neutral agent है
- Collector निम्न components से बना होता है
- receivers: कई sources से push/pull तरीके से data लेते हैं
- processors: रास्ते में data को transform, filter, enrich, और derive करते हैं
- exporters: data को downstream destinations तक भेजते हैं
- connectors: receiver और exporter दोनों की तरह काम करते हैं और कई pipelines को जोड़ते हैं
- pipelines: receiver, 0 या अधिक processors, और exporter से बनी chain
- extensions: basic auth, health check जैसी telemetry processing से बाहर की सुविधाएं देते हैं
- ये components मिलकर observability pipeline के रूप में काम करते हैं, जिससे किसी भी source से telemetry इकट्ठा की जा सकती है, रास्ते में उसे process किया जा सकता है, और फिर मनचाहे destination तक भेजा जा सकता है
- Collector दो projects में बंटा है
- otel-collector: इसमें Collector के सिर्फ core components शामिल हैं, और यह मुख्य रूप से OTLP data processing से सीधे जुड़े logic को रखता है
- otel-collector-contrib: यह integrations का संग्रह है, जिसमें अधिकांश observability providers के लिए exporters और receivers शामिल हैं
- लिखे जाने के समय
otel-collector-contribमें 91 receivers, 48 exporters, और 24 processors शामिल हैं - end users को सलाह दी जाती है कि वे OpenTelemetry Collector Builder का उपयोग करके सिर्फ जरूरत के components वाला
otel-collector-contribcustom build बनाएं - AWS और Splunk जैसे vendors भी अपने OTEL distribution प्रदान करते हैं
OpAMP और agent का remote management
- OpAMP agent remote management के लिए एक network protocol है
- यह 2022 में OTEL में जोड़ा गया अपेक्षाकृत नया standard है, जो agents के समूह को नियंत्रित करने का vendor-neutral तरीका देता है
- प्रबंधन का लक्ष्य
otel-collectorinstances भी हो सकते हैं और OpAMP implement करने वाले vendor-specific agents भी - OpAMP की मदद से ये सुविधाएं सक्षम की जा सकती हैं
- dynamic configuration deployment
- agent updates
- credentials management
- फिलहाल OpAMP specification की Go implementation work-in-progress स्थिति में है
Semantic Conventions और अतिरिक्त projects
- OTEL Semantic Conventions observability data में उपयोग होने वाले common attributes set को परिभाषित करती हैं
- इनके दायरे में cloud resources, databases, exceptions, और systems शामिल हैं
- Semantic Conventions का उपयोग OTEL SDKs करते हैं, और auto instrumentation support करने वाले SDKs में ये अपने-आप लागू हो जाती हैं
- common semantics अलग-अलग signals के बीच correlation संभव बनाती हैं
- OTEL के अन्य प्रमुख components भी अलग से मौजूद हैं
- OpenTelemetry Transformation Language (OTTL): telemetry के लिए common transformation language, जिसे performance और flexibility के साथ
otel-collector-contribमें design और implement किया गया है - OTEL Demo: microservice-आधारित shopping site जो OTEL features और अधिकांश language SDKs को दिखाती है
- OpenTelemetry Transformation Language (OTTL): telemetry के लिए common transformation language, जिसे performance और flexibility के साथ
4 साल का बदलाव
- OTEL प्रतिस्पर्धी tracing specifications के विलय से शुरू होकर observability का industry standard बन गया
- पिछले 4 साल vendors और tools के पूरे ecosystem के लिए common foundation बनाने का समय रहे हैं
1 टिप्पणियां
Hacker News की राय
OpenTelemetry में दो समस्याएँ हैं
इसी तरह desktop app में usage समझने के लिए एक साधारण heartbeat implement करना चाहता था, लेकिन project के नाम को देखते हुए आश्चर्यजनक रूप से यह लगभग असंभव था। सवालों पर response भी कम मिला, इसलिए OpenTelemetry का plan पूरी तरह छोड़ दिया: https://github.com/open-telemetry/community/discussions/1598, https://github.com/open-telemetry/semantic-conventions/issue...
उदाहरण के लिए histogram define करने वाली जगह के पास buckets define नहीं किए जा सकते। किसी global exporter जैसी जगह पर histogram name से bucket तक mapping वाली “override” list पास करनी पड़ती है। अगर metrics emit करने वाली library हो, तो यह बहुत messy हो जाता है: https://github.com/open-telemetry/opentelemetry-go/issues/38...
अग्रणी observability कंपनियों की websites देखें तो custom instrumentation पर लेख लगभग 4 pages के होते हैं और सिर्फ़ बहुत basic बातें cover करते हैं। OTel खास तौर पर पीछे नहीं है, और जवाब आम तौर पर “स्थिति पर निर्भर करता है” जैसा होता है। अनुभव बढ़ने पर शुरुआती लोगों को उलझाने वाले ये हिस्से भी सुलझाए जा सकते हैं
मुझे OpenTelemetry बहुत पसंद है और मैं लगभग हर span track करना चाहता हूँ। अगर कोई vendor इस्तेमाल किया होता, तो cost की वजह से दिवालिया हो जाता
Java auto-instrumentation से लगभग बिना मेहनत OpenTelemetry जोड़ा, और self-hosted ClickHouse में भेजकर $100 वाले EC2 पर रोज़ 700 million से ज़्यादा spans store करता हूँ: https://clickhouse.com/blog/how-we-used-clickhouse-to-store-...
traces को 1 महीने तक retain करने के हिसाब से
signoz_index_v2में 26.9 million rows और 17.06GiB,trace_logमें 123 million rows और 2.64GiB,samples_v2में 949 million rows और 345MiB के आसपास है, यानी compression अच्छा है। Recommended specs वाली ClickHouse machine इस्तेमाल करता तो tuning time कम हो जाता, लेकिन अभी भी यह ठीक काम कर रहा हैdownside यह है कि छोटे sc1 disk का IOPS करीब 4 है, इसलिए ClickHouse start होने में लगभग 5 मिनट लगते हैं, और SigNoz UI में features पर्याप्त हैं, लेकिन Datadog जैसी polish expect करना मुश्किल है
पिछली नौकरी में non-error traces के सिर्फ़ 5% collect करते थे
OpenTelemetry से मुझे काफ़ी निराशा हुई। मेरे अनुभव में यह ज़रूरत से ज़्यादा डिज़ाइन किया गया, उलझा हुआ ढेर है, और इसका default usage experience बहुत user-hostile है
यह खुद को universal tracing/metrics/logs format और plug-and-play libraries के ऐसे सेट की तरह promote करता है जिसमें हर ज़रूरत की चीज़ के लिए adapters हैं, लेकिन असल में यह आधा-अधूरा libraries का सेट ज़्यादा लगता है, जिसके internal implementation काफ़ी leak होते हैं, adapters की quality खराब है, और features भी बहुत ज़्यादा नहीं हैं
कई features के साथ ऐसे संकेत जुड़े होते हैं कि वे कब, कहाँ, कितना, चाँद की अवस्था कैसी हो, जब बृहस्पति आसमान में दिख रहा हो, और string length कितनी हो, तब काम करेंगे
फिर भी leaking SDK API और आधे-अधूरे implemented features को ignore करें, तो replaceability का वादा कुछ हद तक पूरा करता है। OTel से पहले सब कुछ proprietary stack था, लेकिन अब एक standard SDK में अलग logging backend plug करके आम तौर पर काम करने की उम्मीद की जा सकती है। यह vertically integrated stack से कमतर है, लेकिन observability stack को पूरा बदले बिना हिस्सों में competition और evolution संभव बनाता है, इसलिए architecture के नज़रिए से यह partial win है
example सिर्फ़ यह दिखाता है कि swagger tools से OpenAPI spec (https://github.com/openzipkin/zipkin-api/blob/master/zipkin2...) को parse करके Go glue code auto-generate कैसे करें, और फिर एक auto-generated function call करके trace कैसे record करें
documentation या कोई और example बिल्कुल नहीं था, इसलिए शक हुआ कि क्या इस approach को असल में कोई इस्तेमाल भी करता है, और अंत में REST calls के जरिए service API (https://zipkin.io/zipkin-api/#/) को सीधे इस्तेमाल करना पड़ा। OTel दर्दनाक है, लेकिन alternatives भी बेहतर नहीं हैं। SLO और SLI measurement जैसे-जैसे ज्यादा महत्वपूर्ण हो रहे हैं, उम्मीद है इस क्षेत्र में और रुचि बढ़ेगी
OTel official libraries अभी web frontend में अच्छी तरह काम नहीं करतीं। उदाहरण के लिए, default state में errors को sourcemaps से जोड़ने का कोई तरीका नहीं है
OTel project द्वारा deploy किया गया web browser collector Zone.js इस्तेमाल करता है और browser की लगभग हर चीज़ को context के रूप में intercept करता है। अगर आपने modern Angular इस्तेमाल किया है, तो आपको पता होगा कि Zone.js कभी-कभी काफी painful हो सकता है और globals को touch करके unpredictable behavior बना सकता है
session replay जैसी चीज़ों के लिए OTel standard भी मुझे नहीं पता। Sentry, Rollbar, DataDog जैसे कई telemetry platforms इसे support करते हैं। backend teams इसे काफी पसंद करती दिखती हैं, और unique tags के साथ पूरे system में follow किए जा सकने वाले spans की boundary-crossing property मुझे पसंद है। हालांकि generate होने वाला payload कभी-कभी बहुत verbose होता है, और कुछ logging platforms ज्यादा compact हैं। practice में यह मुझे बड़ा issue नहीं लगा
direct instrumentation भी किया है, लेकिन वह error-prone और verbose था। browser में भी सच में https://nodejs.org/api/async_context.html#class-asynclocalst... जैसी चीज़ की ज़रूरत है
हमारे package में हम Otel/Splunk browser SDK implementation के ऊपर session replay, improved exception tracking आदि जोड़ रहे हैं। दुर्भाग्य से ये चीज़ें default में मिलने से बहुत दूर हैं। फिर भी frontend sessions को backend traces/logs से जोड़ पाना developer experience में बड़ा बदलाव है, ऐसा मेरा मानना है: https://www.hyperdx.io/blog/browser-based-distributed-tracin...
यह problem को पूरी तरह solve नहीं करता, लेकिन starting point है
जानना चाहूँगा कि क्या किसी ने frontend tracing थोड़ा भी शुरू किया है
कुछ सहकर्मियों के साथ हमने यह थोड़ा अजीब-सा विचार किया कि अब logs की ज़रूरत नहीं है। Log messages की जगह span events जोड़ दें: https://opentelemetry.io/docs/instrumentation/ruby/manual/#a...
फिर बस span title और Jaeger में उस span का link log में छोड़ने जैसा तरीका। मैंने इसे सिर्फ़ personal project में आज़माया है, लेकिन काफ़ी ठीक लगा; बस अच्छा होगा अगर Jaeger UI इस तरह के उपयोग को बेहतर support करे
असल में उन सहकर्मियों ने इसी topic पर talk भी दी है। अगर आप जर्मनी में Hannover के पास हैं, तो https://javaforumnord.de/2023/programm/ पर “Nie wieder Log-Files!” खोजें
हर meaningful काम के लिए spans इस्तेमाल करना, ज़्यादा powerful structured logs इस्तेमाल करने जैसा है। कई systems में यह मुश्किल है जहाँ existing logs को साथ रखना पड़ता है, लेकिन अगर project काफ़ी greenfield हो तो मैं इसकी सलाह दूँगा
Traces इस्तेमाल करने के लिए बहुत-सी चीज़ों का सही तरह से काम करना ज़रूरी है। या शायद मेरा experience अभी कम है, इसलिए tools डरावने लगते हैं
कुछ साल पहले presentation देखी थी तो यह cool लगा था, लेकिन लगा कि non-SRE developers को मनाना बहुत मुश्किल होगा: https://github.com/stripe/veneur
OpenTelemetry एक marketing-driven project है, committee-style design में भोलेपन और inefficient तरीके से implement किया गया है, और ऐसा लगता है कि इसका मुख्य लक्ष्य Fortune X00 CTOs को strategic roadmap documents में checkbox tick करने देना है
जिसके पास choice हो, उसके इस्तेमाल करने लायक चीज़ नहीं है
हमने जो changes submit किए उनका example यहाँ है: https://github.com/open-telemetry/opentelemetry-js/pull/4049
अच्छा होगा अगर आप share करें कि आपको क्यों लगता है कि किसी को भी इसे इस्तेमाल नहीं करना चाहिए
Datadog ने सच में OSS projects में Datadog support जोड़ने के लिए बड़ी संख्या में लोगों को लगाया था। अनजान codebases में कूद पड़ना एक strong skill है, इसलिए early career के लिए यह काफ़ी अच्छा भी रहा होगा
OTel open-source projects को abstraction layer इस्तेमाल करने देता है, ताकि users self-hosting के बजाय खरीद सकें। यह मुझे बहुत पसंद नहीं है, लेकिन अगर service company के बाहर के लोग run कर रहे हों, तो अब शायद मैं OTel consider करूँगा। क्योंकि अगर कोई user Datadog इस्तेमाल करना चाहे, तो हम उसके रास्ते में नहीं आएँगे
जब मैंने बहुत early OTel इस्तेमाल किया था, तो Go API बहुत inefficient था, इसलिए निराशा हुई थी। Counter increment करने के लिए
context.Contextचाहिए होता था, और Prometheus में export करते समय histogram buckets set करने का तरीका न होना जैसी abstraction leaks भी थीं। अब शायद उन्होंने इसे ठीक कर लिया होगाProcessors भी काफ़ी capable हैं, और receivers व exporters contrib collection भी कुल मिलाकर ठीक है। मैं यह नहीं कह रहा कि यह best solution है—use case पर निर्भर करता है—लेकिन इतनी तीखी आलोचना उचित नहीं लगती। संदर्भ के लिए, मैं fluent-bit maintenance team में हूँ
Operations perspective से, developers code में जो भी observability जोड़ें, आप central filtering enforce कर सकते हैं, और applications के लिए एक ही central entry path होता है
सब कुछ OTLP export करता है, इसलिए अगर नए backend पर जाना हो तो बस YAML file बदलनी होती है; नए logging backend को support करने के लिए application दोबारा लिखने की ज़रूरत नहीं होती। Vendor-specific logging libraries इस्तेमाल करने वाले पुराने तरीके पर लौटने की बजाय, कमियाँ हों तब भी 10 में से 10 बार मैं OTEL ही इस्तेमाल करता रहूँगा
इस blog का subscription popup मुझे सच में बहुत खराब लगा।
xbutton नहीं है, इसलिए यह बिल्कुल clear नहीं है कि email दिए बिना इसे close किया जा सकता हैSubscribe button के नीचे बहुत non-intuitive “continue reading” है; मुझे नहीं लगा था कि वह काम करेगा, और बाहर click करने पर भी यह close नहीं हुआ। ऐसी चीज़ों को बेहतर होना चाहिए
OpenTelemetry के बारे में, मैं काफी समय से test करना चाहता था कि Datadog को data भेजते समय यह सारी ज़रूरी functionality देता है या नहीं। लेकिन अगर basic functionality के अलावा अब भी Datadog agent चाहिए, तो manage और train करने के लिए एक और चीज़ बढ़ जाएगी, इसलिए हिचकिचाहट है
जानना चाहता हूँ कि क्या किसी ने इसे सच में Datadog से जोड़ा है। लक्ष्य ज़रूरी नहीं कि Datadog से हमेशा बंधे रहना हो, लेकिन अभी alerts और logs का अच्छा-खासा हिस्सा वहीं है, इसलिए अगर पहले OpenTelemetry पर switch करें तो theoretically बाद में किसी और चीज़ पर जा सकेंगे
Back दबाया तो HN पर वापस चला गया
सोच रहा हूँ कि क्या अभी भी कोई ऐसा फ्रंटएंड है जो लोगों, इन्फ्रास्ट्रक्चर और लाइसेंस लागत के लिहाज़ से revenue stream को बुरी तरह नहीं खा जाता
हमें प्रति सेकंड 2,000 से ज़्यादा requests मिलती हैं, और सिर्फ logs बनाए रखना भी महँगा है
हम अपना Jaeger stack 0.1% sampling के साथ चला रहे हैं, और Datadog APM की तुलना में लागत नगण्य है
metrics और logs के लिए sampling बहुत उपयोगी नहीं है, इसलिए कोई अच्छा जवाब नहीं है। अगर Datadog का gross margin 80% है, तो आपके भुगतान में infrastructure cost ज्यादा से ज्यादा 20% होगी, और अगर लोगों की लागत उस 80% से कम है, तो open source stack खुद चलाकर आप काफी खर्च घटा सकते हैं। Datadog इस्तेमाल करते हुए भी हम हर 3 महीने में usage घटाने का project करते हैं, इसलिए किसी भी हाल में इसे लगातार संभालना ही पड़ता है
लागत भी समस्या है, लेकिन यह देखकर हैरानी हो सकती है कि observability service पर उम्मीद से ज्यादा भारी पड़ती है। यह काफी CPU इस्तेमाल करती है
slow queries ढूँढने के लिए basic reports बनाने को कुछ Elasticsearch queries भी लिखी थीं। OTEL/Jaeger tutorial follow करें तो यह काफी standard setup है
traces प्रति सेकंड सैकड़ों के स्तर पर थे और downsampling के बिना सब collect किए जाते थे। retention period 7 दिन तक configure किया जा सकता था, और मेरे छोड़ने के समय वास्तविक optimization बहुत कम था। मासिक लागत शायद दसियों से सैकड़ों डॉलर के आसपास थी
containers में set किए जा सकने वाले environment variables से tracing sampler का व्यवहार define किया जा सकता है। docs में
OTEL_TRACES_SAMPLERदेखें: https://opentelemetry.io/docs/specs/otel/configuration/sdk-e...अभी हम Datadog इस्तेमाल करते हैं, लेकिन सब जानते हैं कि यह बहुत महँगा है
इस thread का ज्यादातर हिस्सा OpenTelemetry के ज़रिए metrics/logs को self-hosted collector jobs में भेजने की बात कर रहा है
ClickHouse जैसे कई collector tools द्वारा support की जाने वाली standard library इस्तेमाल करना अपने आप में उपयोगी है, लेकिन एक और फायदा यह है कि specification system boundaries के पार trace ID pass करने की सुविधा देती है
अगर आप और आपकी dependencies सभी OpenTelemetry spec implement करते हैं, तो आपको ऐसे spans मिल सकते हैं जो journey के दौरान क्या हुआ इसका बारीक view देते हैं। उदाहरण के लिए, page loading में देर की वजह database में disk page load था या किसी cloud service के metadata plane span की high latency थी, यह पता चल सकता है
OpenTelemetry की प्रगति से बहुत संतुष्ट हूँ। कुछ साल पहले जब मैंने इसे अपनाने पर जोर दिया था, तो developers हिचक रहे थे कि यह नया है और उन्होंने इसका नाम नहीं सुना; लेकिन 1 साल पहले जब फिर देखा, तो OpenTelemetry हमारे system में हर जगह था और जिन logging/tracing vendors का हम इस्तेमाल करते हैं वे भी उसी तरफ जा रहे थे