ããã«ã¡ã¯ãæè¡é¨ã® Taiki (@taiki45) ã§ãã
è¿å¹´ã® Web ãµã¼ãã¹ã®éçºã§ã¯ãã¤ã¯ããµã¼ãã¹ã«ä»£è¡¨ãããããã«åæ£ã¢ã¼ããã¯ãã£ãæ¡ç¨ãããããã«ãªã£ã¦ãã¾ãããå¤§è¦æ¨¡ã§ãç´ æ©ããããã¯ãéçºãããããã«ãã¯ãã¯ãããã§ããã¤ã¯ããµã¼ãã¹ãæ¡ç¨ã忣ã¢ã¼ããã¯ãã£ã¸ã®ç§»è¡ãé²ãã¦ãã¾ã*1ãä»åã¯ããã®ãããªåæ£ã¢ã¼ããã¯ãã£ãå©ç¨ããã·ã¹ãã æ§ç¯ã«ããã¦å¿ é ã®ã³ã³ãã¼ãã³ãã«ãªãã¤ã¤ãã忣ãã¬ã¼ã·ã³ã°ã«ã¤ãã¦ãã¯ãã¯ãããã§ã®äºä¾ãç´¹ä»ãããã¨æãã¾ãã
忣ãã¬ã¼ã·ã³ã°ã¨ã¯
ãã¤ã¯ããµã¼ãã¹ã®ãããªåæ£ã¢ã¼ããã¯ãã£ã§ã¯ãåã ã®ãµã¼ãã¹å士ã®éä¿¡ãè¤éã«ãªããããã¢ããªã·ãã¯ã¢ã¼ããã¯ãã£ã¨æ¯è¼ãã¦ãã·ã¹ãã å ¨ä½ã¨ãã¦ã®æ¯ãèããææ¡ãããã¨ãé£ãããªãã¾ããããã¯ãããã¯ãéçºã«ããã¦ã¯ãé害çºçæã®åå ç©¶æãé£ãããªã£ããããããã¯ã·ã¹ãã å ¨ä½ã§ã®ããã©ã¼ãã³ã¹ã®åæãé£ãããªãã¨ãã£ãåé¡ã¨ãã¦é¡å¨åãã¾ãã 忣ãã¬ã¼ã·ã³ã°ã¯ãã®ãããªåé¡ã«å¯¾å¦ããããã®ãã¼ã«ã§ããéçºè ããç¹å®ã®ã¯ã©ã¤ã¢ã³ããªã¯ã¨ã¹ããå¦çããã®ã«é¢ãã£ããµã¼ãã¹ãæ¢ããããã¬ã¤ãã³ã·ã«é¢ããããã©ã¼ãã³ã¹ããããã°ããæã«å©ç¨ããã¾ãã
忣ãã¬ã¼ã·ã³ã°ã®å®ç¾ã®ã¢ããã¼ãã«ã¯å¤§ããããã¦2種é¡ãããä¸ã¤ã¯ Black-box schemes *2ãããä¸ã¤ã Annotation-based schemes ã¨å¼ã°ãã¦ãã¾ãã åè ã® Black-box schemes ã¯ã·ã¹ãã å ã®åãµã¼ãã¹ã«æãå ¥ããå¿ è¦ããªããã¨ãå©ç¹ã§ãããããã¨å¼ãæãã«ç¹å®ã®ãªã¯ã¨ã¹ãã«å¯¾ããåæã¯ã§ãã¾ãããå¾è ã® Annotation-based schemes ã¯åãµã¼ãã¹ã«åæ£ãã¬ã¼ã·ã³ã°ç¨ã®ã¡ã¿ãã¼ã¿ã䏿µãµã¼ãã¹*3ã¸ã¨ä¼æãããå®è£ ãå ãããã¨ãå¿ è¦ã«ãªãã¨ããæ¬ ç¹ãããã¾ãããç¹å®ã®ãªã¯ã¨ã¹ããåæãããã¨ãã§ãã¾ããAnnotation-based schemes 㯠Google ã® Dapper*4 ã Twitter ã® Zipkin*5 çã«æ¡ç¨ããã¦ãããWeb ãµã¼ãã¹æ¥çã§ã¯ä¸»æµãªããã§ãã
Annotation-based schemes ã«åºã¥ãå®è£
Annotation-based schemes ã«åºã¥ãã忣ãã¬ã¼ã·ã³ã°ã·ã¹ãã ã®å®è£ ã®ä»çµã¿ã大ã¾ãã«èª¬æããã¨ãã¦ã¼ã¶ã¼ãããªã¯ã¨ã¹ãããããæåã®ãã¤ã³ãã§ “ãã¬ã¼ã¹ID” ã¨ãã忣ãã¬ã¼ã·ã³ã°ã·ã¹ãã å ã§ä¸æã¨ãªãæååãçºè¡ãããã¬ã¼ã¹IDã “ã¢ããã¼ã·ã§ã³” ã¨å¼ã°ããå¦ççµæçã®è¿½å æ å ±ãå«ãã ãã°ãã¹ãã¬ã¼ã¸ã«ä¿åããããã«ä¸æµã«åå¨ãããµã¼ãã¹ã¸ãªã¯ã¨ã¹ããçºè¡ããéã«ãã¬ã¼ã¹IDã¨ã¢ããã¼ã·ã§ã³ã伿ãã¦ããã¾ãããã®ãããªããã¬ã¼ã¹IDã«ç´ä»ãä¸é£ã®ãã°ã®ã¾ã¨ã¾ããã “ãã¬ã¼ã¹” ã¨å¼ã³ã¾ãããã®ãã¬ã¼ã¹ããã¬ã¼ã¹IDããã¼ã«ãã¦ã¹ãã¬ã¼ã¸ããæ¤ç´¢ãããã¨ã«ãããç¹å®ã®ãªã¯ã¨ã¹ãã«é¢ãã£ããµã¼ãã¹ãç¹å®ããããã¾ãè¤æ°ã®ãã¬ã¼ã¹æ å ±ãéè¨ãããã¨ã§åæ£ã·ã¹ãã å ã®ã³ãã¥ãã±ã¼ã·ã§ã³ãã¿ã¼ã³ãåæãããã¨ãã§ãã¾ããã¾ããåãµã¼ãã¹ããªã¯ã¨ã¹ãã®å¦çãéå§/çµäºããæå»ããã¬ã¼ã¹ãã°ã«ä¸ç·ã«ä¿åããã°ãã¬ã¤ãã³ã·ã®ç®åºãã§ãã¾ããGoogle ã® Dapper ã Twitter ã® Zipkin ã¨ãã£ãå®è£ ã§ã¯ããã¬ã¼ã¹ãã°ã®ã¿ã¤ã ã¹ã¿ã³ãããåãã°ã®è¦ªåé¢ä¿ãç®åºããã®ã§ã¯ãªãã åãã¬ã¼ã¹å ã§ä¸æã¨ãªãæååã§ãã “ã¹ãã³ID” ããã°ã®èå¥åã¨ãã¦å©ç¨ãããã°ã®è¦ªåé¢ä¿ãã¹ãã³IDã§è¡¨ç¾ããããã«ãªã£ã¦ãã¾ãã
ã»ã¨ãã©ã®åæ£ãã¬ã¼ã·ã³ã°ã·ã¹ãã ã¯æ¬¡ã®ãããªã³ã³ãã¼ãã³ãã«åè§£ã§ãã¾ã:
- Instrumented library: åãµã¼ãã¹ã®ã¢ããªã±ã¼ã·ã§ã³ã«çµã¿è¾¼ã¿ããã¬ã¼ã¹IDã®æ¡çªã伿ããã¬ã¼ã¹ãã°ã®éä¿¡ãæ ãã©ã¤ãã©ãª
- Log Collector: åãµã¼ãã¹ã¤ã³ã¹ã¿ã³ã¹ããéä¿¡ããããã¬ã¼ã¹ãã°ã®éç´ãæ ã
- Storage and Query:ãã¬ã¼ã¹ãã¼ã¿ã®ä¿åã¨æ¤ç´¢ãæ ã
- UI: 人éããã¬ã¼ã¹ãã¼ã¿ãæ¤ç´¢ã»åæããéã«å©ç¨ãã
Instrumented library ã¯åè¨èªåãã«æ´åããå¿ è¦ãããã®ã§ãå忣ãã¬ã¼ã·ã³ã°ã·ã¹ãã æ®åã®ããã«ããã¯ã«ãªã£ã¦ãã¾ãããã®åé¡ãç·©åãã¹ã OpenTracing*6 ã®ããã« Instrumented library API ã®æ¨æºåãé²ãã¦ããããã¸ã§ã¯ããããã¾ãã
ã¯ãã¯ãããã§ã®å°å ¥
忣ãã¬ã¼ã·ã³ã°ã·ã¹ãã ã®é¸å®
ã¯ãã¯ãããã§åæ£ãã¬ã¼ã·ã³ã°ãå°å ¥ããã«å½ãããããã¤ãã®ç¹ãèæ ®ã㦠AWS ãæä¾ããããã¼ã¸ããµã¼ãã¹ã§ãã AWS X-Ray*7 ãæ¡ç¨ãã¾ãããã¯ãã¯ãããå ã§ã¯ä¸è¬çãªã¦ã¼ã¹ã±ã¼ã¹ãæ³å®ãã¦ããã®ã§ãæ¢åã®åæ£ãã¬ã¼ã·ã³ã°å®è£ ãå©ç¨ãããã¨ã決ãã¾ããã忣ãã¬ã¼ã·ã³ã°ã·ã¹ãã å®è£ ã¨ãã¦æ¡ç¨ä¾ãå¤ãéçºãæ´»çºãª Zipkin ã«ç¦ç¹ãå½ã¦ã¾ããããå¤§è¦æ¨¡ãªç°å¢ã§ Zipkin ãå©ç¨ããã«ã¯ Cassandra/HBase/Manhattan ããããã®éç¨ãå¿ è¦ã§ããããã¼ã¿ã¹ãã¢ãèªåãã¡ã§éç¨ããããã¯ã解決ãããåé¡ã«ãã©ã¼ã«ã¹ã§ããããã¼ã¸ããµã¼ãã¹ã®å©ç¨ã«æ¯è¼åªä½ãããã¾ãããã¯ãã¯ãããã§ã¯ AWS ãç©æ¥µçã«æ´»ç¨ããã¤ã³ãã©ã¹ãã©ã¯ãã£ãæ§ç¯ãã¦ãããã¨ããã AWS X-Ray ã®æ¤è¨¼ãå§ãã¾ããã
æ¤è¨¼éå§æç¹ã§ã¯ AWS X-Ray ãæä¾ãã Instrumented library 㯠Java/Node.js/Python ã®ã¿ã®ãµãã¼ã*8ã§ãã¯ãã¯ãããã§ã¯ã»ã¨ãã©ã®ãµã¼ãã¹ã¯ Ruby ãç¨ãã¦å®è£ ããã¦ããããããã®ã¾ã¾ã§ã¯ AWS X-Ray ã¯å©ç¨ã§ãã¾ããã§ããããµã¼ããã¼ãã£è£½ã®ãã®ãç¹ã«åå¨ããªãã£ãã®ã§ãããInstrumented library ã®å®è£ æ¹æ³ã«ã¤ãã¦ã¯ç®å¦ãç«ã£ã¦ãããã¨ãåã³ Instumentation library ãèªåãã¡ã§ç®¡çã§ãããã¨ã§ä»ã®åæ£ãã¬ã¼ã·ã³ã°ã·ã¹ãã ã¸ä½ãã³ã¹ãã§ç§»è¡ã§ããä½å°ãæ®ããå©ç¹ããã£ãã®ã§ãèªä½ãããã¨ã«ãã¾ãããèªä½ãã Instrumented library ã§ãã aws-xray gem 㯠OSS ã¨ãã¦å ¬éãã¦ãã¾ã*9ã
ç¾ç¶ã®æ§æ
AWS X-Ray ãå©ç¨ããã¯ãã¯ãããã§ã®åæ£ãã¬ã¼ã·ã³ã°ã¯ä»¥ä¸ã®ãããªæ§æã§å®ç¾ããã¦ãã¾ã:
- Instrumented library: aws-xray gem ãå©ç¨
- Log Collector: AWS X-Ray ã®æä¾ãã X-Ray daemon ã¨ããã½ããã¦ã§ã¢*10ãå©ç¨
- ECS ãå©ç¨ãã¦ããã¢ããªã±ã¼ã·ã§ã³ã§ã¯ãããã Sidecar æ§æãåã£ã¦ãã¾ã
- EC2 ã¤ã³ã¹ã¿ã³ã¹ä¸ã§åä½ãã¦ããã¢ããªã±ã¼ã·ã§ã³ã«ã¤ãã¦ã¯ EC2 ã¤ã³ã¹ã¿ã³ã¹ã®ä¸ã« X-Ray daemon ããã»ã¹ãåä½ããã¦ãã¾ã
- Instrumented library ãã UDP ã§ X-Ray daemon ã«ãã¬ã¼ã¹ãã°ãéä¿¡ããX-Ray daemon ããããã¡ãªã³ã°ã¨ AWS ã®ç®¡çãã API ã¸ã®ãã¬ã¼ã¹ãã°ã®éä¿¡ãæ ãã¾ã
- Storage and Query: Storage ã¯ãã¡ãå´ããã¯è¦ãã¾ãããQuery ã¨ã㦠AWS X-Ray ã®æä¾ãã API*11ãå©ç¨ãã¾ã
- UI: AWS ã³ã³ã½ã¼ã«ã«çµã¿è¾¼ã¾ãã¦ãã¾ã*12
aws-xray gem ã®å®è£ ã«ããã¦ããã¬ã¼ããªããèæ ®ãã¤ã¤ã¢ã³ãã¼ããããæ´»ç¨ãããã¨ã«ãããã»ã¨ãã©ã® Rails ã¢ããªã±ã¼ã·ã§ã³ã§ã¯ gem ã®å°å ¥ã¨ X-Ray daemon ã¸ã®æ¥ç¶æ å ±ãè¨å®ããã®ã¿ã§ããã¬ã¼ã¹ãã°ã®åéãéå§ã§ããããã«ãªã£ã¦ãã¾ãã
ä»å¾ã®å±æ
ç¾ç¶ã¯ãã¼ã¿ã AWS X-Ray ã«éããã¨ããã¾ã§ã§ãã¾ã æ¬æ ¼çãªãã¬ã¼ã¹ãã¼ã¿ã®æ´»ç¨ã«ã¯è³ã£ã¦ãã¾ããããã¼ã¿ã®åéã«ã¤ãã¦ã¯ã社å ã®ä¸»è¦ãªãµã¼ãã¹ãã«ãã¼ãã¦ããããµã¼ãã¹ãããã®ãã¼ãæ°ã¯ç¾å¨ç´70ã»ã©ã§ãã
ã¨ã©ã¼ãã©ãã«ã¼ãªã©ã«è¨é²ããã¦ãããã¬ã¼ã¹IDãã該å½ãªã¯ã¨ã¹ãã«é¢ããåæãã§ããããã«ãªã£ã¦ãã¾ã:
ãµã³ããªã³ã°æ¹å¼ã«ã¤ãã¦ã¯ Head-based coherent sampling*13 ãæ¡ç¨ãã¦ãããã¦ã¼ã¶ã¼ãããªã¯ã¨ã¹ããåããæåã®ãµã¼ãã¹ã§ sampled/not sampled ãæ±ºãã¦ä¸æµãµã¼ãã¹ã«ä¼æããã¦ãã¾ãããµã³ããªã³ã°ã¬ã¼ãã«ã¤ãã¦ã¯ãç¹ã« rps ã®é«ããµã¼ãã¹ã®ã¿1%è¨å®ãä»ã®ãµã¼ãã¹ã«ã¤ãã¦ã¯100%è¨å®ã§éç¨ãã¦ãã¾ãããµã³ããªã³ã°ã«ã¤ãã¦ã¯èª²é¡ããããããã·ã§ã³ã¯ãªãã£ã«ã«ãªãµã¼ãã¹*14ã®å¦çãå«ããã¬ã¼ã¹ã¯ãã©ãã«ã·ã¥ã¼ãã£ã³ã°ç¨éã«å ¨ä»¶ä¿åãã¦ããããã§ãããæµéã®é«ããµã¼ãã¹ã䏿µã«ããã±ã¼ã¹ã§ã¯ãµã³ãã«ããããã¬ã¼ã¹ã®å²åãå°ãªãããã©ãã«ã·ã¥ã¼ãã£ã³ã°ãè¡ãã¦ã¼ã¹ã±ã¼ã¹ã§æ¯éãããã¾ãããã®å¯¾çã¨ãã¦ããã¹æ¯ã«ãããµã³ããªã³ã°è¨å®çãå®è£ ã»å°å ¥ããäºå®ã§ã*15ã
ã¯ãã¯ãããã§ã¯ Barbeque*16 ã¨ããéåæã¸ã§ãã·ã¹ãã ãå©ç¨ãã¦éåæã¸ã§ããå®è¡ãã¦ãã¾ããå¤ãã®ã¸ã§ã㯠Web ã¢ããªã±ã¼ã·ã§ã³ã®ãªã¯ã¨ã¹ãã«ããããªã¬ã¼ããã¦ããã®ã§ããªã¯ã¨ã¹ãã¨ã¸ã§ãå®è¡ã¨ã®ç´ä»ããè¨é²ã§ããããã«ããäºå®ã§ãã
ã¾ããã·ã¹ãã å ¨ä½ã®ã¬ã¤ãã³ã·å¤åãæ¤ç¥ã§ããããã«ãAWS X-Ray ã® API ãå©ç¨ãã¦ç£è¦ã·ã¹ãã ãæ§ç¯ããäºå®ã§ããç£è¦ã·ã¹ãã ã«ã¤ãã¦ã¯èªåã§å®è£ ãã以å¤ã«ã AWS X-Ray ã®æ©è½è¿½å ã«ãæå¾ ãã¦ãã¾ãã
ãããã«
AWS X-Ray ãå©ç¨ãã忣ãã¬ã¼ã·ã³ã°ã®å®ç¾ã«ã¤ãã¦ãã¯ãã¯ãããã§ã®äºä¾ãç´¹ä»ãã¾ãããã¯ãã¯ãããã§ã¯æ¯è¼çå¤§è¦æ¨¡ãª Web ãµã¼ãã¹éçºãè¡ããã¦ããã忣ã¢ã¼ããã¯ãã£å¨è¾ºã«åå¨ããè峿·±ãåé¡ãå¤ã ããã¾ãããã®ãããªèª²é¡è§£æ±ºãä¸ç·ã«åãçµã仲éãç©æ¥µçã«åéãã¦ãã¾ãã
*1:http://techlife.cookpad.com/entry/2016/03/16/100043
*2:M. K. Aguilera, J. C. Mogul, J. L. Wiener, P. Reynolds, and A. Muthitacharoen. Performance Debugging for Dis- tributed Systems of Black Boxes. In Proceedings of the 19th ACM Symposium on Operating Systems Principles, December 2003.
*3:ããã§ã¯ã¦ã¼ã¶ã¼ãããªã¯ã¨ã¹ããåããããã³ãå´ã “䏿µ"ããã®å対å´ã "䏿µ” ã¨å¼ã³ã¾ã
*4:https://research.google.com/pubs/pub36356.html
*7:https://aws.amazon.com/xray/
*8:ä»ã§ã¯ Go è¨èªåãã®ã©ã¤ãã©ãªããµãã¼ãããã¾ãã https://aws.amazon.com/jp/about-aws/whats-new/2017/08/aws-x-ray-sdk-for-go-beta/
*9:https://github.com/taiki45/aws-xray
*10:http://docs.aws.amazon.com/xray/latest/devguide/xray-daemon.html
*11:http://docs.aws.amazon.com/xray/latest/api/Welcome.html
*12:http://docs.aws.amazon.com/xray/latest/devguide/xray-console.html
*13:http://www.pdl.cmu.edu/PDL-FTP/SelfStar/CMU-PDL-14-102_abs.shtml
*14:ä¾ãã°èª²éç³»ãµã¼ãã¹
*15:http://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-java-configuration.html#xray-sdk-java-configuration-sampling