1.初探 OpenTelemetry
2.OpenTelemetryãSpring Cloud SleuthãKafkaãJagerå®ç°åå¸å¼è·è¸ª
初探 OpenTelemetry
OpenTelemetry 是源码一个由 OpenTracing 和 OpenCensus 合并而成的开放源代码项目,旨在统一软件性能和行为分析的解析 Metrics、Logs 和 Traces 数据格式。源码作为 CNCF 的解析阿里巴巴抢单源码孵化项目,它提供了标准化的源码工具、API 和 SDK,解析使得开发人员能够轻松地在不同后端(如 Prometheus、源码Jaeger 或云服务)之间共享和处理可观测性数据,解析而无需频繁地调整代码或代理配置。源码
以前,解析由于每个可观测性后端使用不同的源码webeditor源码检测库,缺乏标准化导致数据移植困难,解析维护负担重。源码OpenTelemetry 的解析诞生旨在解决这个问题,它通过创建一个通用的源码 SDK 和 API,使数据能够无缝地在各种工具间流动,记事源码无论是在开源还是商业平台,极大地提升了数据的可移植性和可维护性。
OpenTelemetry 支持的 Traces 功能强大,记录单个请求的追踪,包括分布式追踪,tphouse 源码以及 Span(工作单元)中的 Span Context、Attributes(元数据)、Events(时间点)、Links(关联)、Status(状态)和 Span Kind(类型)。thinfell源码Metrics 负责实时度量,Logs 则提供详细日志记录,而 Baggage 作为上下文信息,便于跨 Span 传递信息。
Baggage 的使用需注意,它与 Span 属性独立,且存储在 HTTP 头中,适用于网络内的隐私数据传输。OTel Baggage 可用于保持跨服务的上下文信息,但需谨慎处理,因为没有内置的完整性检查。
综上,OpenTelemetry 通过标准化和统一的工具,简化了可观测性数据的收集、处理和分享,为开发者和运维人员提供了强大的性能监控和诊断工具。
OpenTelemetryãSpring Cloud SleuthãKafkaãJagerå®ç°åå¸å¼è·è¸ª
åå¸å¼è·è¸ªå¯è®©æ¨æ·±å ¥äºè§£ç¹å®æå¡å¨åå¸å¼è½¯ä»¶ç³»ç»ä¸ä½ä¸ºæ´ä½çä¸é¨åæ¯å¦ä½æ§è¡çãå®è·è¸ªåè®°å½ä»èµ·ç¹å°ç®çå°ç请æ±ä»¥åå®ä»¬ç»è¿çç³»ç»ã
å¨æ¬æä¸ï¼æ们å°ä½¿ç¨ OpenTelemetryãSpring Cloud SleuthãKafka å Jaeger å¨ä¸ä¸ª Spring Boot å¾®æå¡ ä¸å®ç°åå¸å¼è·è¸ªã
æ们å æ¥ççåå¸å¼è¿½è¸ªä¸çä¸äºåºæ¬æ¯è¯ã
跨度ï¼è¡¨ç¤ºç³»ç»å çå个工ä½åå ã跨度å¯ä»¥ç¸äºåµå¥ä»¥æ¨¡æå·¥ä½çå解ãä¾å¦ï¼ä¸ä¸ªè·¨åº¦å¯è½æ£å¨è°ç¨ä¸ä¸ª REST 端ç¹ï¼ç¶åå¦ä¸ä¸ªå跨度å¯è½æ¯è¯¥ç«¯ç¹è°ç¨å¦ä¸ä¸ªï¼ççå¨ä¸åçæå¡ä¸ã
Traceï¼ææå ±äº«ç¸åæ ¹è·¨åº¦ç跨度éåï¼æè æ´ç®åå°è¯´ï¼å°ææ跨度å建为åå§è¯·æ±çç´æ¥ç»æã跨度çå±æ¬¡ç»æï¼æ¯ä¸ªè·¨åº¦å¨æ ¹è·¨åº¦æè¾¹é½æèªå·±çç¶è·¨åº¦ï¼å¯ç¨äºå½¢ææåæ ç¯å¾ï¼æ¾ç¤ºè¯·æ±å¨éè¿åç§ç»ä»¶æ¶çè·¯å¾ã
OpenTelemetry ï¼ä¹ç®ç§°ä¸º OTelï¼æ¯ä¸ä¸ªä¾åºåä¸ç«çå¼æº Observability æ¡æ¶ï¼ç¨äºæ£æµãçæãæ¶éå导åºé¥æµæ°æ®ï¼ä¾å¦ è·è¸ª ã ææ å æ¥å¿ ãä½ä¸º äºåç 计ç®åºéä¼ (CNCF) çåµå项ç®ï¼OTel æ¨å¨æä¾ä¸ä¾åºåæ å ³çç»ä¸åºå API éââ主è¦ç¨äºæ¶éæ°æ®å¹¶å°å ¶ä¼ è¾å°æå¤ãOTel æ£å¨æ为çæå管çé¥æµæ°æ®çä¸çæ åï¼å¹¶è¢«å¹¿æ³éç¨ã
Sleuth æ¯ä¸ä¸ªç± Spring Cloud å¢é管çåç»´æ¤ç项ç®ï¼æ¨å¨å°åå¸å¼è·è¸ªåè½éæå° Spring Boot åºç¨ç¨åºä¸ãå®ä½ä¸ºä¸ä¸ªå ¸åSpring Starterç . 以ä¸æ¯ä¸äºå¼ç®±å³ç¨ç Sleuth å·¥å ·ï¼
Sleuth æ·»å äºä¸ä¸ªæ¦æªå¨ï¼ä»¥ç¡®ä¿å¨è¯·æ±ä¸ä¼ éææè·è¸ªä¿¡æ¯ãæ¯æ¬¡è°ç¨æ¶ï¼é½ä¼å建ä¸ä¸ªæ°ç Spanãå®å¨æ¶å°ååºåå ³éã
Sleuth è½å¤è·è¸ªæ¨ç请æ±åæ¶æ¯ï¼ä»¥ä¾¿æ¨å¯ä»¥å°è¯¥éä¿¡ä¸ç¸åºçæ¥å¿æ¡ç®ç¸å ³èãæ¨è¿å¯ä»¥å°è·è¸ªä¿¡æ¯å¯¼åºå°å¤é¨ç³»ç»ä»¥å¯è§å延è¿ã
Jaeger æåç± Uber çå¢éæ建ï¼ç¶åäº å¹´å¼æºãå®äº 年被æ¥å为äºåçåµå项ç®ï¼å¹¶äº å¹´æ¯ä¸ãä½ä¸º CNCF çä¸é¨åï¼Jaeger æ¯äºåç æ¶æ ä¸å ¬è®¤ç项ç®ãå®çæºä»£ç 主è¦æ¯ç¨ Go ç¼åçãJaeger çæ¶æå æ¬ï¼
ä¸ Jaeger 类似ï¼Zipkin å¨å ¶æ¶æä¸ä¹æä¾äºç¸åçç»ä»¶éã尽管 Zipkin æ¯ä¸ä¸ªè¾èç项ç®ï¼ä½ Jaeger å ·ææ´ç°ä»£åå¯æ©å±ç设计ã对äºæ¤ç¤ºä¾ï¼æ们éæ© Jaeger ä½ä¸ºå端ã
让æ们设计ä¸ä¸ª Spring Boot å¾®æå¡ï¼
è¿ä¸ä¸ªå¾®æå¡æ¨å¨ï¼
è¿æ¯ä¸ºäºè§å¯ OpenTelemetry å¦ä½ç»å Spring Cloud Sleuth å¤ç代ç çèªå¨æ£æµä»¥åçæåä¼ è¾è·è¸ªæ°æ®ãä¸é¢çè线æè·äºå¾®æå¡å¯¼åºçè·è¸ªæ°æ®çè·¯å¾ï¼éè¿OTLPï¼OpenTelemetry Protocolï¼ä¼ è¾å°OpenTelemetry Collectorï¼æ¶éå¨ä¾æ¬¡å¤ç并å°è·è¸ªæ°æ®å¯¼åºå°å端Jaegerè¿è¡åå¨åæ¥è¯¢ã
ä½¿ç¨ monorepoï¼æ们ç项ç®ç»æå¦ä¸ï¼
第 1 æ¥ï¼æ·»å POM ä¾èµé¡¹
è¿æ¯ä½¿ç¨ OTel å Spring Cloud Sleuth å®ç°åå¸å¼è·è¸ªçå ³é®ãæ们çç®æ æ¯ä¸å¿ æå¨æ£æµæ们ç代ç ï¼å æ¤æ们ä¾é è¿äºä¾èµé¡¹æ¥å®æå®ä»¬è®¾è®¡çå·¥ä½ââèªå¨æ£æµæ们ç代ç ï¼é¤äºè·è¸ªå®ç°ãå°é¥æµæ°æ®å¯¼åºå° OTel æ¶éå¨çã
第 2 æ¥ï¼OpenTelemetry é ç½®
OpenTelemetry æ¶éå¨ç«¯ç¹
对äºæ¯ä¸ªå¾®æå¡ï¼æ们éè¦å¨å ¶ä¸æ·»å 以ä¸é ç½®application.ymlï¼è¯·åé ä¸é¢é¨åä¸ç示ä¾ç段ï¼ãspring.sleuth.otel.exporter.otlp.endpoint主è¦æ¯é ç½®OTel Collector端ç¹ãå®åè¯å¯¼åºå¨ï¼å¨æ们çä¾åä¸æ¯ Sleuthï¼éè¿ OTLP å°è·è¸ªæ°æ®åéå°æå®çæ¶éå¨ç«¯ç¹pose æå¡ã
è·è¸ªæ°æ®æ¦çæ½æ ·
spring.sleuth.otel.config.trace-id-ratio-basedå±æ§å®ä¹äºè·è¸ªæ°æ®çéæ ·æ¦çãå®æ ¹æ®æä¾ç»éæ ·å¨çåæ°å¯¹ä¸é¨å迹线è¿è¡éæ ·ãæ¦çæ½æ ·å 许 OpenTelemetry è·è¸ªç¨æ·éè¿ä½¿ç¨éæºæ½æ ·ææ¯éä½è·¨åº¦æ¶éææ¬ãå¦æ该æ¯çå°äº 1.0ï¼åæäºè¿¹çº¿å°ä¸ä¼è¢«å¯¼åºã对äºæ¤ç¤ºä¾ï¼æ们å°éæ ·é 置为 1.0ã%ã
æå ³å ¶ä» OTel Spring Cloud Sleuth å±æ§ï¼è¯·åé 常è§åºç¨ç¨åºå±æ§ã
OpenTelemetry é ç½®æ件
æ们éè¦é¡¹ç®æ ¹ç®å½ä¸ç OTel é ç½®æ件otel-config.yamlãå 容å¦ä¸ãæ¤é ç½®æ件å®ä¹äº OTel æ¥æ¶å¨ãå¤çå¨å导åºå¨çè¡ä¸ºãæ£å¦æ们æçå°çï¼æ们å®ä¹äºæ们çæ¥æ¶å¨æ¥çå¬ gRPC å HTTPï¼å¤çå¨ä½¿ç¨æ¹å¤çå导åºå¨ä½ä¸º jaeger åæ¥å¿è®°å½ã
第 3 æ¥ï¼docker-compose å°ææå 容串å¨ä¸èµ·
让æ们ççæ们éè¦å¯å¨åªäº docker 容å¨æ¥è¿è¡è¿ä¸ä¸ªå¾®æå¡å¹¶è§å¯å®ä»¬çåå¸å¼è·è¸ªï¼åä¸ä¸ªå¾®æå¡å¨ä¸é¢çé¨åä¸è¿è¡äºè§£éã
è¿è¡docker-compose up -d以è°åºææä¹ä¸ªå®¹å¨ï¼
第 4 æ¥ï¼è¿½è¸ªæ°æ®å¨è¡å¨
å¿«ä¹ä¹è·¯
ç°å¨ï¼è®©æ们å¯å¨customer-service-bffæµç¨çå ¥å£ç¹ï¼ä»¥å建æ°å®¢æ·ã
å¯å¨ Jaeger UIï¼ /?target=http%3A//localhost%3A/%2C]æ[/url]æå¡æç´¢customer-service-bffï¼åå»Find Tracesæé®ï¼è¿æ¯æ们çå°çå建客æ·è·è¸ªï¼å®è·¨è¶ä¸ä¸ªæå¡ï¼æ»å ±è·¨è¶å 个ï¼æç»æ¶é´ . 毫ç§ã
é¤äº Trace Timeline è§å¾ï¼ä¸é¢çå±å¹æªå¾ï¼ï¼Jaeger è¿æä¾äºä¸ä¸ªå¾å½¢è§å¾ï¼Trace Graphå¨å³ä¸è§çä¸æèåä¸éæ©ï¼ï¼
ä¸ä¸ªå¾®æå¡å¨ docker ä¸çæ¥å¿è¾åºæ¾ç¤ºç¸åçè·è¸ª idï¼ä»¥çº¢è²çªåºæ¾ç¤ºï¼å¹¶æ ¹æ®å ¶åºç¨ç¨åºå称æ¾ç¤ºä¸åç跨度 idï¼åºç¨ç¨åºå称åå ¶å¯¹åºç跨度 id 以å¹é çé¢è²çªåºæ¾ç¤ºï¼ãå¨ çæ åµä¸customer-serviceï¼ç¸åç span id ä» REST API 请æ±ä¼ éå° Kafka åå¸è 请æ±ã
customer-service让æä»¬å¨ docker ä¸æåæ们çPostgreSQL æ°æ®åºï¼ç¶åéå¤ä»customer-service-bff. internal server erroræ£å¦é¢æçé£æ ·ï¼æ们å¾å°äºãæ£æ¥ Jaegerï¼æ们çå°ä»¥ä¸è·è¸ªï¼å¼å¸¸å æ è·è¸ªæ±æ¨SocketTimeoutExceptionï¼å次å¦é¢æçé£æ ·ã
è¯å«é¿æè¿è¡ç跨度
Jaeger UI å 许æ们æç´¢è¶ è¿æå®æ大æç»æ¶é´çè·è¸ªãä¾å¦ï¼æ们å¯ä»¥æç´¢ææèæ¶è¶ è¿ æ¯«ç§çè·è¸ªãç¶åï¼æ们å¯ä»¥æ·±å ¥ç 究é¿æè¿è¡çè·è¸ªä»¥è°æ¥å ¶æ ¹æ¬åå ã
å¨è¿ä¸ªæ äºä¸ï¼æä»¬ä» OpenTelemetryãSpring Cloud Sleuth å Jaeger çè§åº¦è§£åäºåå¸å¼è·è¸ªï¼éªè¯äº REST API è°ç¨å Kafka pub/sub ä¸åå¸å¼è·è¸ªçèªå¨æ£æµãæå¸æè¿ä¸ªæ äºè½è®©ä½ æ´å¥½å°ç解è¿äºè·è¸ªæ¡æ¶åå·¥å ·ï¼å°¤å ¶æ¯ OpenTelemetryï¼ä»¥åå®å¦ä½ä»æ ¹æ¬ä¸æ¹åæä»¬å¨ åå¸å¼ç³»ç» ä¸è¿è¡å¯è§å¯æ§çæ¹å¼ã