±à¼ÍƼö: |
±¾ÎĽ«ÏêϸÆÊÎö FreeWheel Biz-UI ÍÅ¶Ó´Ó 0 µ½ 1 ¹¹½¨ºÍ¸Ä½øÈ«Á´Â··Ö²¼Ê½×·×ÙϵͳµÄ¹ý³Ì¡£
±¾ÎÄÀ´×ÔÓÚinfoq£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
Biz-UI ÍŶÓÔÚºËÐÄÒµÎñϵͳµÄ¿ª·¢¹ý³ÌÖУ¬½«¾ßÓй²ÐԵŦÄÜÄ£¿é³éÏó³öÀ´£¬Öð½¥Íê³ÉÁËÖÐ̨µÄ¹¹½¨£¬ÎªÒµÎñÂß¼ÌṩÁËÇ¿ÓÐÁ¦µÄ»ù´¡×é¼þÖ§³Å¡£ÆäÖзֲ¼Ê½×·×Ùϵͳ×÷Ϊһ¸öÖØÒªµÄ×é³É²¿·Ö£¬Îª¼à¿Ø·þÎñÖ®¼äµÄµ÷Óᢶ¨Î»ºÍµ÷ÊÔÏßÉÏÎÊÌ⣬ÌṩÁËÓÐÁ¦µÄÖ§³Å¡£
΢·þÎñ-×½³æ¼Ç
С־ËùÔڵļ¼Êõ²¿ÃŸոնÔÓ·Ö׵ĵ¥ÌåÓ¦ÓÃÍê³ÉÁ˲ð½â£¬ÍÆÐÐ΢·þÎñÀíÄ½«Ö®Ç°ÔÓô۵ò»¿É¿ª½»µÄ´úÂë°´ÒµÎñÄ£¿é²ð·Ö³ÉÒ»¸öÒ»¸öµÄ΢·þÎñ¡£Ëæ×ÅÏîÄ¿µÄÍÆ¶¯£¬´ó¼Òȷʵ¸ÐÊܵ½Î¢·þÎñ´øÀ´µÄÊÕÒæ£¬²ð½âÍêÒÔºó¶Ôµ¥¸ö΢·þÎñά»¤ÆðÀ´Ò²¸ü¼Ó·½±ã¡£µ«Óë´ËͬʱҲ´øÀ´ÁËÒ»Ð©Ö®Ç°Î´ÔøÓöµ½µÄÎÊÌâ......
Ò»Õó¼±´ÙµÄÊÖ»úÁåÉù´ò¶ÏÁËС־µÄ˼Ð÷£¬¿´×ÅÊìϤµÄÀ´µçºÅÂ룬С־ÐÄÏëÕæÊÇÅÂʲôÀ´Ê²Ã´£¬ÐÂÉϵķþÎñÁ賿ÓÖ³öÎÊÌâÁË¡£
¡°Î¹£¬Ð¡Ö¾°¡£¬ÏßÉϱ¨¾¯ÁË£¬Í¦½ô¼±µÄ£¬Äã¸Ï½ô¿´Ò»Ï°ɣ¬Ò»»áÏßÉÏÁÄ¡£¡±
ÊìÁ·µØ·¿ª±¨¾¯Óʼþ£¬´¦ÀíÕâÀàÎÊÌâ¶ÔС־À´ËµÒѾÇá³µÊì·¡£Ïêϸ·ÖÎöÁËһϱ¨¾¯ÄÚÈÝ£¬Ð¡Ö¾¶Ï¶¨ÊÇÏÂÓηþÎñ³öÎÊÌâµ¼Öµı¨¾¯¡£
¡°ÀÏÀÎÒÊÇС־£¬ÎÒÃÇÕâ±ß¸Õ¸Õ³öÀ´Ò»¸ö±¨¾¯£¬Í¦ÑÏÖØµÄ£¬¸Õ¿´ÁËÒ»ÏÂϵͳÈÕÖ¾£¬ÊÇÔÚµ÷ÄãÃǶ©µ¥·þÎñµÄʱºò³ö´íÁË£¬Äã°ï¿´Ò»Ï°ɣ¬ÎÒÒ»»á°ÑÈÕÖ¾·¢Ä㶤¶¤¡£¡±
ÀÏÀî¾¹ýÅŲ飬·¢ÏÖÊÇÉÏÓηþÎñµÄÎÊÌ⣬ÓÚÊÇ×¥½ôÁªÏµÀÏÇ®¡£¡°ÀÏÇ®°¡£¬»¹Ã»Ë¯Äذɣ¿¸Õ¸ÕС־ÄDZ߳öÎÊÌ⣬ӰÏìÁ˲»ÉÙ¿Í»§¡£²éÈÕÖ¾·¢ÏÖÊǶ©µ¥Õâ±ß±¨´íÁË£¬ÎÒ¿´ÁËһ϶©µ¥·þÎñµÄÈÕÖ¾£¬ÊÇÄãÃÇÄÇ±ßµÄ¿â´æ·þÎñ±¨Á˲»ÉÙ
500£¬Äã¸Ï½ôÆðÀ´¿´Ò»Ï°ɡ£¡±
ÆÁĻǰС־¡¢ÀÏÀî¡¢ÀÏÇ®ÕýÔÚÈÈ»ð³¯ÌìµØ×½³æÕÒ bug.

΢·þÎñ£¬×÷Ϊһ¸ö½ü¼¸Äê·Ç³£»ðÈȵϰÌ⣬ÇÐÇÐʵʵ½â¾öÁ˺ܶ൥ÌåÓ¦ÓõÄÍ´µã£¬µ«Óë´ËͬʱҲ´øÀ´ÁËһЩеÄÍ´µã¡£
FreeWheel ºËÐÄÒµÎñ²¿ÃŽáºÏ×ÔÉíµÄʵ¼ÊÇé¿ö£¬ÒÔ΢·þÎñµÄ·½Ê½¶Ô֮ǰµÄµ¥Ò»Ó¦ÓÃ×öÁ˲ð·Ö¡£Í¬Ê±£¬ÎªÁ˱ÜÃâÉÏÃæ¹ÊÊÂÀïµÄÇé¿ö·¢Éú£¬ÎÒÃÇÒýÈëÁË·Ö²¼Ê½×·×ÙϵͳÓÃÀ´½â¾ö¡¾ÈçºÎÔÚ΢·þÎñϵͳÖпìËÙ¶¨Î»ÎÊÌ⣿¡¿¡¢¡¾ÈçºÎ¹Û²ì¸´Ôӵĵ÷ÓÃÁ´¡¢·ÖÎöµ÷ÓõÄÍøÂç½á¹¹£¿¡¿µÈµÈÎÊÌâ¡£
·Ö²¼Ê½×·×Ùϵͳ
·Ö²¼Ê½×·×Ùϵͳ(Distributed Tracing System)¿ÉÒÔÓÃÀ´½â¾ö΢·þÎñϵͳÖеij£ÎÊÌⶨλ¡¢bug
×·×Ù¡¢ÍøÂç½á¹¹·ÖÎöµÈÎÊÌâ¡£¸ÃϵͳµÄÊý¾ÝÄ£ÐÍ×îÔçÓÉGoogle¡¯s Dapper ÂÛÎÄÌá³ö£¬Ö÷Òª°üº¬Èçϼ¸¸ö²¿·Ö£º
Trace: ÓÃÀ´ÃèÊö·Ö²¼Ê½ÏµÍ³ÖÐÒ»¸öÍêÕûµÄµ÷ÓÃÁ´£¬Ã¿Ò»¸ö Trace »áÓÐÒ»¸ö¶ÀÓÐµÄ Trace
ID¡£
Span: ·Ö²¼Ê½ÏµÍ³ÖеÄÒ»¸öСµÄµ÷Óõ¥Ôª£¬¿ÉÒÔÊÇÒ»¸ö΢·þÎñÖÐµÄ service, Ò²¿ÉÒÔÊÇÒ»´Î·½·¨µ÷Óã¬ÉõÖÁÒ»¸ö¼òµ¥µÄ´úÂë¿éµ÷Óá£Span
¿ÉÒÔ°üº¬Æðʼʱ¼ä´Á¡¢log µÈÐÅÏ¢¡£Ã¿Ò»¸ö Span »áÓÐÒ»¸ö¶ÀÓÐµÄ Span ID.
Span Context: °üº¬¶îÍâ Trace ÐÅÏ¢µÄÊý¾Ý½á¹¹£¬span context ¿ÉÒÔ°üº¬
Trace ID¡¢Span ID, ÒÔ¼°ÆäËûÈκÎÐèÒªÏòÏÂÓÎ service ´«µÝµÄ trace ÐÅÏ¢¡£
ÔÚÕâ»ù´¡ÉÏ£¬ÉçÇøÎªÁËʵÏÖ¸÷¸ö±à³ÌÓïÑԺ͸÷ÖÖ¿ò¼ÜµÄ½Ó¿Úͳһ£¬·¢Õ¹³öÁËOpenTracing Specification
ÒÔ¼° OpenTracing API¡£ºóÀ´Òµ½çÒ²Ïà¼ÌÍÆ³öÁ˼¸¿î±È½Ï³ÉÊìµÄ²úÆ·£¬Èç Zipkin¡¢Jaeger¡¢LightStep¡¢DataDog
µÈ¡£
·Ö²¼Ê½×·×ÙϵͳÊÇÈçºÎ½â¾ö¿ç·þÎñµ÷ÓÃʱµÄÎÊÌⶨλµÄÄØ£¿¶ÔÓÚÒ»´Î¿Í»§µ÷Ó㬷ֲ¼Ê½×·×Ùϵͳ»áÔÚÇëÇóµÄÈë¿Ú´¦Éú³ÉÒ»¸ö
TraceID£¬ÓÃÕâ¸ö TraceID °Ñ¿Í»§ÇëÇó½øÈëÿ¸ö΢·þÎñÖеĵ÷ÓÃÈÕÖ¾´®ÁªÆðÀ´£¬ÐγÉÒ»¸öʱÐòͼ¡£ÈçÏÂͼËùʾ£¬¼ÙÉè
A µÄÁ½¶Ë±íʾһ´Î¿Í»§µ÷ÓõĿªÊ¼ºÍ½áÊø£¬Öмä»á¾¹ýÀàËÆ B¡¢ C¡¢D¡¢ E µÈºó¶Ë·þÎñ¡£´ËʱÈç¹û E
³öÎÊÌ⣬¾Í¿ÉÒԺܿìËٵض¨Î»µ½£¬¶ø²»ÓÃͬʱÈà A¡¢B¡¢C¡¢D ¶¼²ÎÓë½øÀ´²éÎÊÌâ¡£

(ͼƬÀ´Ô´:www.jaegertracing.io)
Biz-UI ·Ö²¼Ê½×·×Ùϵͳʵ¼ù
¼¼ÊõÑ¡ÐÍ
ÔÚ FreeWheel ºËÐÄÒµÎñϵͳ΢·þÎñ´î½¨¹ý³ÌÖУ¬ÎÒÃÇÉî¶Èµ÷ÑÐÁËÏÖÓеķֲ¼Ê½×·×Ùϵͳ½â¾ö·½°¸£¬Õë¶ÔÆäÖм¸¸ö±È½ÏÖØÒªµÄÑ¡ÐÍÖ¸±ê×öÁËÉî¶ÈµÄÌÖÂÛ¡£
Ö¸±ê
|
ÃèÊö |
ÊÇ·ñÖ§³ÖGo Client?
|
FreeWheelºËÐÄÒµÎñϵͳ´óÁ¿Óõ½Go×÷Ϊ¿ª·¢ÓïÑÔ£¬Õâ¾ÍʹµÃÎÒÃǸüÇãÏòÓÚÌṩ±ãÀûµÄGo
¿Í»§¶ËµÄ½â¾ö·½°¸¡£ |
ÊÇ·ñÖ§³ÖgRPC?
|
¸÷¸öÒµÎñÄ£¿éÖ®¼äÖ÷Ҫͨ¹ýgRPC½øÐÐͨѶ£¬ÊÇ·ñÄÜÖ§³ÖgRPCÐÒéÊÇÒ»¸öÖØÒªµÄÆÀ¼ÛÖ¸±ê¡£ |
TraceÊý¾ÝÈçºÎ´æ´¢£¿
|
ÒµÎñ´úÂë½ÓÈëTraceÒÔºó±ØÈ»»á²úÉú´óÁ¿µÄÊý¾Ý£¬ÕâЩTraceÊý¾ÝÈçºÎ´æ´¢£¿ÈçºÎ·ÖÎö£¿ÈçºÎ¼ò½àÇåÎúµØ½«TraceÐÅϢչʾ¸ø¿ª·¢ÈËÔ±£¿ÕâÒ²ÊÇÑ¡Ð͹ý³ÌÖÐÐèÒª¿¼ÂǵÄÒ»¸öÖØÒªÖ¸±ê¡£ |
À©Õ¹ÐÔ |
Ëæ×Å»ù´¡¼Ü¹¹µÄÉý¼¶¸ÄÔ죬²»¶ÏÓÐеÄ×é¼þ±»ÒýÈë¡£ÆÀ¹À½â¾ö·½°¸ÊÇ·ñÖ§³ÖÖîÈçIstioµÈ×é¼þÒ²½«ÊÇÐèÒª¿¼ÂǵÄÎÊÌâ¡£ |
»ùÓÚÉÏÃæ¼¸¸öÖ¸±ê£¬ÎÒÃǶÔÊÐÃæÉÏÖ÷Á÷µÄ¿ªÔ´ÏîÄ¿½øÐÐɸѡ£¬°üÀ¨ Jeager¡¢Zipkin
µÈ£¬¿¼Âǵ½Êг¡Õ¼ÓÐÂÊ¡¢ÏîÄ¿³ÉÊì¶È¡¢ÏîÄ¿ÆõºÏ¶È£¬ÎÒÃÇ×îÖÕÑ¡ÔñÁËͬΪ Golang ¿ª·¢µÄ Jaeger¡£Jeager
Tracing ¿ò¼ÜÏÂÖ÷Òª°üº¬Èý´óÄ£¿é£ºTracingAgent, Tracing Collector
ºÍ Tracing Query¡£
·þÎñ
|
ÃèÊö |
Agent |
×÷ΪËÞÖ÷»úÉϵÄÒ»¸ödaemon½ø³ÌÓÃÀ´¼àÌý´Ó·þÎñ¶Ë·¢³öµÄtraceÊý¾Ý°ü£¬È»ºóÅúÁ¿µØ·¢ÍùCollector¡£Agent»á±»²¿Êðµ½ËùÓеÄËÞÖ÷»úÉÏ£¬Í¬Ê±Ò²ÊµÏÖÁ˶ÔÓÚCollectorµÄ·Óɺ͸ºÔؾùºâµÈ¹¦ÄÜ£¬ÒÔÃâËùÓÐÇëÇó¶¼·¢µ½Í¬Ò»¸öCollector
ʵÌåÉÏ¡£ |
Collecto
|
CollectorÓÃÀ´ÊÕ¼¯´ÓAgent·¢À´µÄtraceÊý¾Ý°ü£¬²¢½øÐÐһϵÁд¦Àí£¬°üÀ¨traceÊý¾Ý°üУÑé¡¢index¡¢¸ñʽת»»µÈ£¬×îÖÕ´æ´¢µ½¶ÔÓ¦µÄÊý¾Ý²Ö¿â¡£Collector¿ÉÒÔ¶Ô½ÓÏñCassandra¡¢ElasticSearchÕâÀàµÄ´æ´¢·þÎñ¡£ÔÚJaegerºóÐøµÄ°æ±¾ÀïÒ²¼ÓÈëÁ˶ÔKafkaµÄÖ§³Ö£¬Í¬Ê±ÌṩÁËÒ»¸öInjester(Ò²¾ÍÊÇÒ»¸öKafka
consumer)ÓÃÀ´Ïû·ÑKafkaÖеÄÊý¾Ý¡£ |
Query UI |
Query UIÌṩ¿ÉÊÓ»¯µÄ²éѯ·þÎñ£¬´ÓÊý¾Ý²Ö¿âÖмìË÷²éѯ¶ÔÓ¦µÄTrace
ID£¬²¢½øÐпÉÊÓ»¯µÄ¼Ó¹¤Õ¹Ê¾¡£ |
Spark Job |
Query UI²»½ö¿ÉÒÔչʾµ¥¸ötraceÖи÷¸öSpanµÄ´ÓÊô¹ØÏµÓëʱÐò¹ØÏµ£¬»¹ÄÜÌṩÁËչʾ¸÷΢·þÎñÖ®¼äµ÷ÓùØÏµµÄ¹¦ÄÜ¡£Spark
Job´ÓElasticSearch¶ÁÈ¡ÔʼµÄÊý¾Ý£¬²¢ÒÔÀëÏߵķ½Ê½½øÐÐÁ÷´¦Àí£¬·ÖÎö³ö·þÎñÖ®¼äµÄµ÷ÓùØÏµ£¬µ÷ÓôÎÊýµÈ£¬Éú³ÉµÄµ÷ÓùØÏµÊý¾Ý¿ÉÒÔÓÉQuey
UI½øÐÐչʾ¡£ |
¿Í»§¶Ë |
ÓÃÀ´ÓëÒµÎñ´úÂë½øÐм¯³É¡£ |
ÕûÌåµÄ¼Ü¹¹ÈçÏÂͼËùʾ£º

(ͼƬÀ´Ô´:www.jaegertracing.io)
ÂäµØÊµ¼ùÓëÓÅ»¯¸ÄÔì
ÐÂϵͳʵʩµÄµÚÒ»²½ÍùÍùÊÇ·ÖÎöÏÖÓм¼Êõ»·¾³£¬Ä¿µÄÊǾ¡¿ÉÄܵظ´ÓÃÒÑÓеŦÄÜ¡¢Ä£¿é£¬ÔËά»·¾³µÈ¡£ÕâÑùÄÜ´ó´ó¼õÉÙºóÐøµÄά»¤¡¢ÔËάµÈ³É±¾¡£
FreeWheel ºËÐÄÒµÎñƽ̨ÏÖÓеĻù´¡»·¾³°üÀ¨Èçϼ¸µã£º
Ê×ÏÈÊÇÏÖÓÐ΢·þÎñ¶ÔÍâÌṩµÄ½Ó¿ÚÐÒé¶àÖÖ¶àÑù£¬ÀýÈç gRPC¡¢HTTP(»ùÓÚ gRPC-Gateway)¡¢HTTP(Âã
HTTP) µÈ¡£
FreeWheel ÏÖÓÐÒ»Ì× ELK+Kafka ¼¯ÈºÓÃÀ´ÊÕ¼¯ºÍ·ÖÎöϵͳÈÕÖ¾¡£
΢·þÎñµÄ»ù´¡ÔËÐл·¾³»ùÓÚ Kubernetes+Istio£¬³ýÁËÉÙÐíµÄÌØÊâ·þÎñÔËÐÐÔÚÎïÀí»úÉÏÒÔÍ⣬¾ø´ó²¿·ÖÒµÎñ·þÎñ¶¼ÔËÐÐÔÚ
K8s ¼¯Èº(AWS EKS)ÖУ¬Ò²¾ÍÊÇ˵ÿ¸ö·þÎñµÄʵÀý¶¼×÷Ϊ¼¯ÈºÖеÄÒ»¸ö pod ÔÚÔËÐС£
»ùÓÚÒÔÉϱ³¾°£¬ÎÒÃÇÉè¼ÆÁË Tracing ϵͳʵʩ·½°¸£¬²¢¶Ô²¿·ÖÄ£¿é½øÐÐÁËÉý¼¶¸ÄÔì¡£
Ê×ÏÈ£¬ÓÉÓÚ¸÷¸ö΢·þÎñ¶ÔÍâÌṩµÄ½Ó¿ÚÒ²²»¾¡Í³Ò»£¬ÏÖÓеĽӿڰüÀ¨ gRPC¡¢gRPC-Gateway¡¢HTTP£¬ÉõÖÁ
WebSocket¡£ÎÒÃÇÔÚ Jeager-client »ù´¡ÉÏ×öÁËÒ»²ã·â×°£¬ÊµÏÖÁËÒ»¸ö Tracing
client Lib£¬¸Ã lib ¿ÉÒÔÕë¶Ô²»Í¬µÄͨѶÐÒé¶ÔÁ÷Á¿½øÐнٳ֣¬²¢½« Trace ÐÅÏ¢×¢Èëµ½ÇëÇóÖС£»¹À©Õ¹ÐԵؼÓÈëÁ˹ýÂËÆ÷(¹ýÂ˸ø¶¨ÌØÕ÷µÄÁ÷Á¿)¡¢
TraceID Éú³É¡¢TraceID ÌáÈ¡£¬Óë Zipkin Header ¼æÈݵȹ¦ÄÜ¡£Õⲿ·Ö»áËæ×ÅÆ½Ì¨µÄ²»¶ÏÀ©Õ¹ºÍ¸ÄÔì½øÐгÖÐøµÄ¸üкÍά»¤¡£
ÁíÍ⣬ΪÁ˳ä·ÖÀûÓù«Ë¾ÏÖÓÐµÄ ElasticSearch ¼¯Èº£¬ÎÒÃǾö¶¨Óà ElasticSearch
×÷Ϊ׷×ÙϵͳµÄºó¶Ë´æ´¢¡£ÓÉÓÚʹÓ󡾰Ϊд¶à¶ÁÉÙ£¬ÎªÁ˱£»¤ ElasticSerach£¬ÎÒÃǾö¶¨Óà Kafka
×÷Ϊ»º³å£¬¼´¶Ô Collecor ½øÐÐÀ©Õ¹£¬½«Êý¾Ý½øÐд¦Àí²¢×ª»»³É ElasticSearch ¿É¶ÁµÄ
json ¸ñʽдÈë Kafka£¬ ÔÙͨ¹ý logstash Ïû·ÑдÈë ElasticSearch ÖС£
´ËÍ⣬¶ÔÓÚ Spark dependency Job£¬Í¬ÑùÐèÒª½«Êý¾Ýת»»Îª¶ÔÓ¦µÄ Json ¸ñʽдÈë
Kafka£¬×îÖÕ´æ´¢µ½ ElasticSearch¡£ÕâÀï¶Ô Spark Dependency Job
µÄÊä³ö²¿·Ö×öÁËÀ©Õ¹£¬ÈÃÆäÖ§³ÖÏò Kafka Öе¼ÈëÊý¾Ý¡£×îºó£¬ÓÉÓÚ΢·þÎñϵͳÄÚ²¿²¿Êð»·¾³µÄ²îÒ죬ÎÒÃÇÌṩÁ˼æÈÝ
K8s sidecar, K8s Daemonset, On-perm daeom process
µÈ²¿Êð·½Ê½¡£
ÐÂÉè¼ÆµÄ¼Ü¹¹ÈçÏÂͼËùʾ£º

Êý¾Ý²É¼¯²ã
Öмä¼þ
¶ÔÓÚ»ùÓÚ Golang ¿ª·¢µÄ΢·þÎñ£¬Trace ÐÅÏ¢ÔÚ·þÎñÄÚ²¿´«²¥Ö÷ÒªÒÀÀµ context.Context¡£FreeWheel
ºËÐÄÒµÎñϵͳÖÐÒ»°ãÀ´½²Ö§³ÖÁ½ÖÖͨѶÐÒ飺HTTP and GRPC£¬ÆäÖÐ HTTP ½Ó¿ÚÖ÷ÒªÒÀÀµ GRPC-Gateway
×Ô¶¯Éú³É¡£µ±È»Ò²ÓÐÒ»²¿·Ö·þÎñ²»Éæ¼° GRPC£¬ Ö±½Ó¶ÔÍⱩ¶ HTTP ½Ó¿Ú¡£ÕâÀï HTTP Ö÷ÒªÃæÏòµÄµ÷Ó÷½ÊÇ
OpenAPI »òÕßǰ¶Ë UI¡£Í¬Ê±£¬·þÎñÓë·þÎñÖ®¼äÒ»°ã²ÉÓà GRPC ·½Ê½Í¨Ñ¶¡£¶ÔÓÚÕâÀೡ¾°£¬Tracinglib
ÌṩÁ˱ØÒªµÄ×é¼þ¹©ÒµÎñ΢·þÎñʹÓá£Æä´«²¥¹ý³ÌÈçÏÂͼËùʾ£º

Õë¶ÔÈë¿ÚÁ÷Á¿£¬Tracing Client Lib ·â×°ÁË HTTP Öмä¼þ¡¢ GRPC Öмä¼þ£¬ÒÔ¼°Óë
GRPC-Gateway ÕâÒ»²ãµÄ¼æÈÝ¡£Õë¶Ô³ö¿ÚÁ÷Á¿£¬Tracing Client Lib ·â×°ÁË
GRPC-Client Öмä¼þ¡£ÕâÀïµÄ¡°·â×°¡±²»µ¥µ¥Ö¸¶Ô Jaeger client lib Ìṩ·½·¨µÄ¼òµ¥
wrapper£¬»¹°üÀ¨ÖîÈç Tracing ״̬¼à²â¡¢ÇëÇó¹ýÂ˵ȹ¦ÄÜ¡£±È½ÏµäÐ͵ÄÏñ "/check_alive",
"/metrics"ÕâÀàûÓбØÒª trace µÄÇëÇó¿ÉÒÔͨ¹ýÇëÇó¹ýÂ˵ŦÄܹýÂ˵ô´Ó¶ø²»¼Ç¼
Trace¡£
Istio ¼¯³É
Á˽â Istio µÄͬѧӦ¸ÃÖªµÀ£¬Istio ±¾ÉíÖ§³Ö Jaeger Tracing ¼¯³É¡£¶ÔÓÚ¿ç·þÎñµÄÇëÇó£¬Istio
¿ÉÒÔ½Ù³ÖÖîÈç GRPC/HTTP µÈÀàÐ͵ÄÁ÷Á¿£¬Éú³É¶ÔÓ¦µÄ Trace ÐÅÏ¢¡£Òò´ËÈç¹ûÄܽ«ÒµÎñ´úÂëÖеÄ
Trace ÐÅÏ¢Óë Istio ½øÐм¯³É£¬¾ÍÄܹ»¼à¿Øµ½Õû¸öµ÷ÓÃÍøÂçÓëÒµÎñÄÚ²¿ Trace µÄÍêÕûÐÅÏ¢£¬·½±ã²é¿´
Istio sidecar µ½·þÎñÕâ¸öµ÷Óùý³ÌµÄÍøÂçÇé¿ö¡£
ÎÊÌâÔÚÓÚ£¬Istio ¼¯³É Tracing ʱ²ÉÈ¡ÁË Zipkin B3 Header ±ê×¼£¬Æä¸ñʽÈçÏ£º
X-B3-TraceId:
{TraceID}
X-B3-ParentSpanId: {ParentSpanID}
X-B3-SpanId: {SpanID}
X-B3-Sampled: {SampleFlag} |
¶ø FreeWheel ºËÐÄÒµÎñϵͳÄÚ²¿Ëù²ÉÓÃµÄ TracerHeader ¸ñʽΪ£º
FW-Trace-ID:
{TraceID}:{SpanID}:{ParentSpanID}:{SampleFlag} |
²¢ÇÒ FW Trace Header ±»¹ã·ºµØÓ¦ÓÃÔÚÒµÎñ´úÂëÖУ¬¼¯³ÉÁËÖîÈç
log, change_history µÈ·þÎñ£¬Ò»Ê±¼äÄÑÒÔ±»ÍêÈ«Ìæ»»¡£Õë¶ÔÕâ¸öÎÊÌ⣬ÎÒÃÇÖØÐ´ÁË Jaeger
Client ÖеĽ« Injector ºÍ Extractor£¬Æä½Ó¿Ú¶¨ÒåÈçÏ£º
// Injector½Ó¿ÚµÄÖ÷Òª×÷ÓÃÊǽ«Trace
HeaderÊý¾Ý°´Õռȶ¨µÄÂß¼²åÈëµ½ÉÏÏÂÎÄÖС£
type Injector interface {
// Inject ½« `SpanContext` and ×¢Èëµ½ `carrier`ÖУ¬ÕâÀïcarrierÖ÷ÒªÊÇÖ¸ÉÏÏÂÎÄContext
//
Inject(ctx SpanContext, carrier interface{}) error
}
// Extractor½Ó¿ÚµÄÖ÷Òª×÷ÓÃÊǽ«ÉÏÏÂÎÄÖеÄTraceÊý¾Ý³éÈ¡³öÀ´
type Extractor interface {
// Extract ½«ÉÏÏÂÎÄ×÷Ϊcarrier, ÌáÈ¡ÆäheaderÖеÄTraceÐÅÏ¢£¬²¢·µ»ØÒ»¸öSpanContext¶ÔÏó¡£
Extract(carrier interface{}) (SpanContext, error)
} |
ÐÂʵÏÖµÄ Injector ºÍ Extractor ͬʱ¼æÈÝ B3
Header ºÍ Freewheel Trace Header¡£·þÎñ½ÓÊÕµ½ÇëÇóʱ»áÓÅÏȲ鿴ÓÐûÓÐ B3
Header£¬ÔÚÉú³ÉРSpan µÄʱºòͬʱ²åÈë FreeWheel Trace Header¡£¼´
FreeWheel Trace Header ¼ÌÐøÔÚ·þÎñÄÚ²¿Ê¹Ó㬿ç·þÎñÖ®¼äµÄµ÷ÓÃÒÔ B3 Header
ΪÖ÷¡£
X-B3-TraceId:
{TraceID}
X-B3-ParentSpanId: {ParentSpanID}
X-B3-SpanId: {SpanID}
X-B3-Sampled: {SampleFlag}
FW-Trace-ID: {TraceID}:{SpanID}:{ParentSpanID}:{SampleFlag} |
Êý¾Ý»º³åÓëÖÐת²ã

ÉÏÎÄÌáµ½Êý¾Ý´æ´¢Ñ¡Óà ElasticSearch, Êý¾ÝµÄ²É¼¯Óë´æ´¢ÊÇÒ»¸öµäÐ͵Äд¶à¶ÁÉÙµÄÒµÎñ³¡¾°¡£¶ÔÕâÀೡ¾°£¬ÎÒÃÇÒýÈë
Kafka ×÷ΪÊý¾ÝµÄ»º³åÓëÖÐת²ã¡£»ùÓÚÕâ¸ö˼·ÎÒÃÇ¶Ô Collector ½øÐÐÁ˸ÄÔ죬¼ÓÈëÁË Collector
Kafka Producer ×é¼þ£¬ÔÚ Collector ÉϽ« span ÐÅϢתΪ json ·¢¸ø
Kafka£¬È»ºóÓÉ Logstash ×÷Ϊ Consumer ´æ´¢µ½ ElasticSearch¡£¶ÔÓÚ
Trace ÐÅÏ¢£¬ElasticSearch ´æ´¢Ö÷Òª·ÖΪÁ½´ó²¿·Ö£º·þÎñ/²Ù×÷Ë÷ÒýºÍ Span Ë÷Òý¡£·þÎñ/²Ù×÷Ë÷ÒýÖ÷ÒªÓÃÀ´Îª
query ui Ìṩ¿ìËÙ¼ìË÷·þÎñ(Service Name)ºÍ²Ù×÷(Operation Name),
½á¹¹ÈçÏ£º
//Ë÷Òý½á¹¹
{ "serviceName": "v3_adaptor",
"operationName": "HTTP GET"
} |
Span ½á¹¹ÌåÓÉ Tracing ¿Í»§¶ËÉú³É£¬Ö÷Ҫһϼ¸´ó²¿·Ö£º
»ù´¡ trace ÐÅÏ¢£¬Èç traceID, spanID, parentID, operationName,duration¡£
Tags£¬Õⲿ·ÖÖ÷Òª°üº¬ÒµÎñÂß¼Ïà¹ØµÄÐÅÏ¢Èç request method, url, response
code µÈ¡£
References£¬Ö÷ÒªÓÃÀ´±íʾ Span µÄ¸¸×Ó´ÓÊô¹ØÏµ¡£
Process£¬·þÎñµÄ»ù±¾ÐÅÏ¢¡£
Logs£¬ÓÃÓÚ¸øÒµÎñ´úÂëÀ©Õ¹Ê¹Óá£
//Span body
{ "traceID": "5082be69746ed84a",
"spanID": "5082be69746ed84a",
"operationName": "HTTP GET",
"startTime": ..., "duration":
616, "references": [
{ "refType": "CHILD_OF",
"spanID": "14a9e000a96a2671",
"traceID": "259f404f8409a4d7"
}
], "tags": [
{ "key": "http.url",
"type": "string", "value":
"/services/v3/**.xml"
},
{ "key": "http.status_code",
"type": "int64", "value":
"500"
},
//...
], "logs": [], "process":
{ "serviceName": "your_service_name",
"tags": [
{ "key": "hostname",
"type": "string", "value":
"xx-mac"
},
//...
]
}
} |
´æ´¢Óë¼ÆËã²ã

ÕâÒ»²ãÖ÷ÒªÓÃÓÚ¶Ô Trace Êý¾Ý½øÐг־û¯ºÍÀëÏß·ÖÎö¡£ÀûÓà ElasticSearch »á¶ÔÊý¾Ý½øÐÐ·ÖÆ¬£¬·Ö
index µÄ´æ´¢£¬·ÀÖ¹ÀúÊ·Êý¾Ý¶ªÊ§£¬·½±ã¶ÔÀúÊ·ÎÊÌâ½øÐлØËÝ¡£²»¹ý¼ÈÈ»Ìáµ½³Ö¾Ã»¯¾ÍÄÑÃâÒª¿¼ÂÇÊý¾Ý¹æÄ£µÄÎÊÌ⣬³ÖÐø´óÁ¿µÄÀúÊ·Êý¾ÝдÈëµ½
ElasticSeach »á²»¶ÏÔö¼ÓÆä¸ºµ££¬¶øÇÒ¶ÔÓÚ¹ýÓÚ¾ÃÔ¶µÄÀúÊ·Êý¾Ý£¬±»¼ìË÷µ½µÄƵÂÊÒ²Ïà¶Ô½ÏС¡£ÕâÀïÎÒÃDzÉÈ¡¶¨ÆÚ¹éµµµÄ²ßÂÔ£¬¶ÔÓÚ³¬¹ý
30 ÌìµÄÊý¾Ý½øÐй鵵£¬×ª´æµ½ ES Ö®ÍâÒÔ±¸²»Ê±Ö®Ðè¡£ElasticSearch Ö»¶ÔÏà¶Ô½Ï¡°ÈÈ¡±µÄÊý¾ÝÌṩ¼ìË÷·þÎñ¡£
ÀëÏß·ÖÎöÖ÷ÒªÓÃÓÚ¶Ô EalsticSearch ÖÐµÄ Span Êý¾Ý½øÐзÖÎö£¬ÉÏÎÄÎÒÃÇÌáµ½Ò»¸ö Span
Êý¾Ý½á¹¹°üº¬Æä×ÔÉíµÄ TraceID ºÍËü¸¸½ÚµãµÄ TraceID£¬Ã¿Ò»¸ö½Úµã¶¼°üº¬×ÔÉí´ÓÊôÓëÄĸö·þÎñ¡£

ÕâÀïÎÒÃÇÖ»¹ØÐÄ¿ç·þÎñÖ®¼äµÄµ÷ÓùØÏµ£¬ÀýÈçÉÏͼ£¬ÀëÏß·ÖÎöʱֻ¿¼ÂÇ A, B, C, E Õ⼸¸ö½Úµã£¬ÓÉÓÚ
D ½ÚµãÓë C, E ½Úµã¶¼ÔÚ·þÎñ 3 ÄÚ²¿£¬ËùÒÔ½«ÆäºöÂÔ¡£·ÖÎö³öÀ´µÄ½á¹ûÈçͼËùʾ

չʾ²ã
չʾ²ãÖ÷ÒªÖ¸ Query-UI, ¹¦ÄÜÊÇ´Ó ElacticSearch ÖвéѯÊý¾Ý£¬¶Ô¾ßÓÐÏàͬ TraceID
µÄÊý¾Ý½øÐоۺϣ¬²¢ÔÚǰ¶Ë½øÐÐäÖȾ¡£´Ó QueryUI ÖпÉÒÔÇåÎúµÄ¿´µ½Ò»ÌõÇëÇó¾ÀúÁ˼¸¸ö²»Í¬µÄ·þÎñ(ÒÔ²»Í¬ÑÕÉ«±ê×¢)£¬ÔÚÿ¸ö·þÎñÖеĵ½´ïʱ¼äºÍ½áÊøÊ±¼ä£¬Õû¸öÇëÇó×ܹ²¾ÀúµÄʱ¼äµÈ¡£

δÀ´Õ¹Íû
Ëæ×Å FreeWheel ºËÐÄÒµÎñƽ̨²»¶ÏµØÀ©³äºÍÑݽø£¬·Ö²¼Ê½×·×ÙϵͳҲÐèÒª½øÐв»¶ÏÉý¼¶¸ÄÔìÒÔÊÊÅäÒµÎñÐèÇó¡£ÀýÈ粿·ÖÒµÎñ´úÂëÕýÔÚ³¢ÊÔ
Serverless µÄ·½Ê½£¬Ò²¾ÍÒªÇó Tracing ϵͳ֧³ÖÖîÈç AWS Lambda µÈʹÓó¡¾°¡£¶ÔÓÚÕâÖÖÐÎʽµÄÐèÇó£¬ÎÒÃǽ«½ô¸úÒµÎñ£¬³ÖÐøµ÷ÑУ¬ÒÔÆÚ·þÎñ¸ü¶àµÄ³¡¾°¡£´ËÍ⣬ÏÖÓзþÎñµ÷ÓÃÍØÆËÍøÂçÊÇ»ùÓÚÀëÏßÊý¾ÝÉú³ÉµÄ£¬ÎÒÃÇÒ²ÆÚÍûδÀ´ÄÜÕÒµ½Ò»Ð©ÔÚÏß´¦ÀíµÄ½â¾ö·½°¸£¬Èç
Flink¡¢Spark Streaming µÈ£¬×öµ½ÊµÊ±µÄµ÷ÓùØÏµÍ³¼Æ¡£
|