AWS X-Ray คืออะไร? การแนะนำฟังก์ชันล่าสุดของ AWS

นี่เป็นบทความแปล ที่มีเนื้อหามาจากบทความภาษาญี่ปุ่นของ Classmethod, Inc. ในหัวข้อ「AWS再入門ブログリレー2022 X-Ray編」 หากผู้อ่านสนใจอ่านเนื้อหาต้นฉบับสามารถอ่านได้ที่ลิ้งค์ "บทความต้นฉบับ" ด้านล่าง เนื้อหาในบทความนี้การอธิบายบางอย่างจะถูกปรับให้เข้าใจง่ายขึ้นทำให้แตกต่างจากต้นฉบับในบางจุด

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

สวัสดีครับ LIGHT จากบริษัท Classmethod (Thailand) ครับ

ครั้งนี้อยากจะมาแนะนำให้ทุกคนได้รู้จักกับบริการ AWS X-Ray กันครับ

AWS X-Ray คือ?

เป็นบริการ managed service ของ AWS ที่ทำหน้าที่ในการรวบรวมข้อมูลเกี่ยวกับการ Request ที่ไปยังแอพพลิเคชั่น ในขณะที่ CloudWatch ช่วยให้คุณเห็นประสิทธิภาพของ infrastructure layer แต่ X-Ray จะกำหนดเป้าหมาย Application layer และรวบรวมข้อมูลต่างๆ เช่น Response time และ response status เป็นต้น ซึ่งมีประโยชน์อย่างมากในการช่วยระบุปัญหาด้านประสิทธิภาพ และ ปัญหาคอขวดของแอพพลิเคชัน โดยเฉพาะอย่างยิ่งกับบริการที่มีการเรียกใช้สูง อย่าง microservices โดย X-Ray จะใช้ Agent (X-Ray Daemon) เป็นตัวขับเคลื่อนการทำงานแยกจากแอพพลิเคชัน หลังจากรวบรวมข้อมูล Traces จากแอพพลิเคชันมาแล้วก็จะใช้ SDK ทำการส่งไปยัง X-Ray Daemon
การทำงานพื้นฐานของ X-Ray Daemon จะบัฟเฟอร์ข้อมูลแล้วส่งต่อไปยัง X-Ray API เป็นระยะๆ

นอกจาก EC2 แล้ว ยังสามารถใช้ร่วมกับบริการต่างๆ มากมาย เช่น ECS, Lambda, API Gateway เป็นต้น โดยวิธีการใช้งานร่วมกันจะแตกต่างกันไปตามบริการ

อย่างเช่น คุณสามารถใช้ sidecar บน ECS หรือ เปิดใช้งาน ACTIVE TRACING ผ่าน management console ของ Lambda ได้

ด้วยการผสานรวมกับ SDK และบริการต่างๆ คุณสามารถตรวจสอบประสิทธิภาพของบริการต่างๆบน AWS ได้อย่างทั่วถึง

ภาพรวมของ AWS X-Ray

X-Ray จะจัดระเบียบข้อมูล Request ที่เข้ามาเป็นลำดับขั้นคือ Traces, segment, และ Subsegments

AWS Blackbelt Online Seminar AWS X-Ray (ภาษาญี่ปุ่น)

segment เป็นข้อมูลเชิงพฤติกรรม ที่จะระบุข้อมูลที่เกี่ยวกับ ใครเป็นผู้ส่ง request แบบไหนไปยังบริการใด

AWS Blackbelt Online Seminar AWS X-Ray (ภาษาญี่ปุ่น)

Subsegments เป็นข้อมูลเพิ่มเติมเกี่ยวกับการเรียกใช้ เช่น ในระหว่างที่มีการส่ง Request ไปยัง Lambda หากมีการ Request ไปยัง DynamoDB ระบบจะทำการบันทึกส่วนนั้นเป็น Subsegments

เมื่อ Request ไปยัง ALB หากมีการ Response กลับไปยังผลลัพธ์ของ Request เพื่อไปสู่บริการอื่น Request ที่จะไปยังบริการนั้นคือ Subsegments

AWS Blackbelt Online Seminar AWS X-Ray (ภาษาญี่ปุ่น)

เดี๋ยวเราจะมาดูกันว่าในระหว่างที่ทำการ Request อยู่ หากมี Request จากบริการอื่นเข้ามา X-Ray จะบันทึกข้อมูลอย่างไร

สร้างแอพพลิเคชั่นตัวอย่างขึ้นมาแล้วลองดู service map

X-Ray เป็นบริการที่มีเงื่อนไขว่าต้องมีแอพพลิเคชั่นอยู่จึงยากต่อการทดสอบ แต่ทว่า เราสามารถทดสอบโดยใช้งานแอพพลิเคชั่นทดสอบได้ตามตัวอย่างในเอกสารอย่างเป็นทางการของ AWS

AWS X-Ray sample application - AWS X-Ray

หากต้องการลองใช้ด้วย ECS คุณสามารถใช้ข้อมูลใน Repository ของ aws-samples ทางด้านล่างนี้ได้ครับ

GitHub - aws-samples/aws-xray-fargate: Code examples showing how to run AWS X-Ray as a sidecar container on Fargate for deep application insights.

และขอแนะนำเอกสาร Tutorial อย่างเป็นทางการตามลิ้งค์ทางด้านล่างนี้ด้วยครับ

ด้วยเอกสารชุดนี้ คุณสามารถเรียนรู้บริการตรวจสอบทั้งหมดของ AWS รวมไปถึง X-Ray ด้วย

ในครั้งนี้เราจะมาลองตัวอย่างการใช้งาน ECS Fargate ของ aws-sample กัน โดยจะรัน daemon ด้วย sidecar ผ่าน ECS ตามภาพด้านล่าง และจะใช้ image อย่างเป็นทางการของ sidecar container ที่มีอยู่แล้ว

โครงสร้างของแอพพลิเคชั่นนี้ client จะเข้าถึง ServiceA แล้ว Request จาก ServiceA จะไปยัง ServiceB

ServiceB มีกลไกในการตอบกลับ Error 403 ที่ 50% ดังนั้นคุณจึงสามารถรวม Traces นอกจาก Response 200 ใน service map ได้โดยไม่ต้องมีการทดสอบที่หนักหน่วงได้

GitHub - aws-samples/aws-xray-fargate: Code examples showing how to run AWS X-Ray as a sidecar container on Fargate for deep application insights.

X-Ray เป็นบริการที่แสดงผลประสิทธิภาพของแอพพลิเคชันโดยอัตโนมัติ มาลองดู service map กัน

จะมีระบุเวลาในการตอบสนองโดยเฉลี่ย และ จำนวนการ Traces เป็นหน่วยเวลา รวมถึงยังสามารถตั้งค่าให้แสดงสัญลักษณ์บริการได้ด้วย เมื่อจำนวนบริการเพิ่มขึ้นก็จะมีการแสดงบน service map ซึ่งจะมีประโยชน์มากสำหรับการค้นหา Request หรือ บริการที่ส่งผลต่อประสิทธิภาพโดยรวม

นอกจากนี้ยังสามารถเปลี่ยนขนาดของวงกลมตามปริมาณ Traffic ได้อีกด้วย

โดยจะแสดง Request ต่างๆแยกตามสีดังนี้

-เขียว :การเรียกใช้ปกติ

-แดง :error 5XX (เซิร์ฟเวอร์ล้มเหลว)

-เหลือง :error 4XX (ข้อผิดพลาดของ Client)

-ม่วง :request 429 (throttling error)

ในครั้งนี้เกิด Error 403 วงกลมจึงแสดงเป็นสีเหลือง

โครงสร้าง Segment

สามารถดู Raw data ของแต่ละ Segment จากข้อมูล traces ในรูปแบบ json ได้
และสามารถมูลแยกกันเป็น Segment และ subsegments จาก json ได้

Segment จะเก็บฟิลด์ต่างๆ เช่น start_time และ end_time รวมถึงฟิลด์เช่น http ที่จะบันทึกข้อมูลรายละเอียดเกี่ยวกับ Request HTTP อีกด้วย

ในกรณีนี้จะมีรูปแบบเป็น 1 Segment สำหรับ ServiceA และ 1 Segment สำหรับ ServiceB
เมื่อมีการ Request ไปยัง ServiceA ในระหว่างการแลกเปลี่ยนข้อมูล ก็จะมีการ Request ไปยัง ServiceB ด้วย และส่วนนั้นจะถูกบันทึกเป็น subsegments ของ ServiceA

Segment ที่ตรงกับ Request ที่ไปยัง ServiceA จะไม่มี parent_id แต่ Request ที่ไปยัง ServiceB จะมี parent_id

โดยการทำงานนี้จะเก็บข้อมูลว่ามีการเรียกใช้จาก Segment ใดบ้าง

{
    "Id": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "Duration": 0.012,
    "LimitExceeded": false,
    "Segments": [
        {
            "Id": "74315e1e5eadaf1b",
            "Document": {
                "id": "74315e1e5eadaf1b",
                "name": "x-ray-test-alb-2000110801.ap-northeast-1.elb.amazonaws.com",
                "start_time": 1648210028.556,
                "trace_id": "1-623db06c-7aad45e40389b8f527905ef3",
                "end_time": 1648210028.559,
                "parent_id": "7786108cf08d1821",
                "http": {
                    "request": {
                        "url": "http://<ServiceBのURL>/create",
                        "method": "POST",
                        "user_agent": "",
                        "client_ip": "xx.xx.xx.xx",
                        "x_forwarded_for": true
                    },
                    "response": {
                        "status": 200
                    }
                },
                "aws": {
                    "ecs": {
                        "container": "ip-10-0-0-188.ap-northeast-1.compute.internal"
                    },
                    "xray": {
                        "package": "aws-xray-sdk",
                        "sdk_version": "3.3.4",
                        "sdk": "X-Ray for Node.js"
                    }
                },
                "service": {
                    "name": "unknown",
                    "version": "unknown",
                    "runtime": "node",
                    "runtime_version": "v8.17.0"
                },
                "origin": "AWS::ECS::Container"
            }
        },
        {
            "Id": "c79b3ab5e9522982",
            "Document": {
                "id": "c79b3ab5e9522982",
                "name": "service-a-alb-100671050.ap-northeast-1.elb.amazonaws.com",
                "start_time": 1648210028.55,
                "trace_id": "1-623db06c-7aad45e40389b8f527905ef3",
                "end_time": 1648210028.562,
                "http": {
                    "request": {
                        "url": "http://<ServiceAのURL>",
                        "method": "GET",
                        "user_agent": "curl/7.81.0",
                        "client_ip": "xx.xx.xx.xx",
                        "x_forwarded_for": true
                    },
                    "response": {
                        "status": 200
                    }
                },
                "aws": {
                    "ecs": {
                        "container": "ip-10-0-0-63.ap-northeast-1.compute.internal"
                    },
                    "xray": {
                        "package": "aws-xray-sdk",
                        "sdk_version": "3.3.4",
                        "sdk": "X-Ray for Node.js"
                    }
                },
                "annotations": {
                    "service": "service-b-request"
                },
                "service": {
                    "name": "unknown",
                    "version": "unknown",
                    "runtime": "node",
                    "runtime_version": "v8.17.0"
                },
                "origin": "AWS::ECS::Container",
                "subsegments": [
                    {
                        "id": "7786108cf08d1821",
                        "name": "x-ray-test-alb-2000110801.ap-northeast-1.elb.amazonaws.com",
                        "start_time": 1648210028.55,
                        "end_time": 1648210028.561,
                        "http": {
                            "request": {
                                "url": "http://<ServiceBのURL>/create",
                                "method": "POST"
                            },
                            "response": {
                                "status": 200,
                                "content_length": 50
                            }
                        },
                        "namespace": "remote"
                    }
                ]
            }
        }
    ]
}

X-Ray Analytics

X-Ray Analytics เป็นบริการที่ใช้ในการแสดงภาพและวิเคราะห์ข้อมูลการติดตามเพื่อรับข้อมูลเชิงลึกทางด้านประสิทธิภาพ

AWS Blackbelt Online Seminar AWS X-Ray

ฟังก์ชั่นสำคัญของ Analytics คือสามารถแสดงข้อมูล Response time distribution ได้
ซึ่งสามารถตรวจสอบได้ว่าใน Request ทั้งหมดมีตัวที่ใช้เวลาอยู่เท่าไดบ้างได้ในพริบตา

โดยการคลิกลาก คุณสามารถรวมข้อมูล Request ที่ใช้เวลามากใน Response time distribution ได้อย่างง่ายดาย (จะแสดงเป็นสีน้ำเงิน) รวมทั้งยังสามารถรับข้อมูล อย่างเช่น Request ที่ใช้เวลาเกิดขึ้นเมื่อไหร่ , status HTTP code เป็นแบบไหนบ้าง เป็นต้น

นอกจากนี้ยังมีฟังก์ชั่น Time series activity
ที่จะแสดงการเกิด Traces ในแต่ละช่วงเวลาว่ามากน้อยเพียงใดตามความเข้มของสี

และยังสามารถรวมข้อมูล Traces ในแต่ละช่วงเวลา และ Time series activity ได้อีกด้วย

X-Ray Insights

X-Ray Insights เป็นบริการที่ตรวจจับความผิดปกติของประสิทธิภาพและผลกระทบโดยอัตโนมัติ
ในขณะที่ Analytics เป็นบริการสำหรับการแสดงข้อมูลของ Trace data เพื่อรับข้อมูลที่เชิงลึกมากขึ้น

หลังจากที่ X-Ray ตรวจพบความผิดปกติจากการติดตามโดยอัตโนมัติ คุณสามารถใช้ Event Bridge เพื่อแจ้งเตือนให้ทราบได้
โดยฟังก์ชั่นนี้จะไม่มีการเปิดใช้งานไว้ผู้ใช้งานต้องทำการเปิดใช้งานด้วยตนเอง

sampling

sampling เป็น การระบุ Request ว่าจะทำการบันทึกเท่าใด (ในค่าเริ่มต้นจะไม่ได้รวมข้อมูล Request ทั้งหมด)

ใน management console การตั้งค่าเริ่มต้นจะเป็นตามภาพทางด้านล่างนี้

โดย sampling จะบันทึก Request แรกทุกๆ 1 วินาที จากนั้น 5% ต่อ Request ที่ตามมา

นอกจากนี้คุณยังสามารถพิจารณาเกี่ยวกับราคาและเป้าหมายที่ต้องการตรวจสอบแล้วสร้าง sampling rule ขึ้นมาใหม่ได้
ในการสร้าง sampling rule ใหม่ ให้คำนึงถึงลำดับความสำคัญที่ต่ำกว่าที่อาจจะมีความสำคัญเหนือกว่าได้

สรุป

AWS X-Ray เป็นบริการที่เหมาะไว้ใช้ในการตรวจสอบประสิทธิภาพโดยรวมของระบบครับ ใช้งานร่วมได้กับหลากหลายบริการ แถมยังมีตัวอย่างให้เราได้ทดลองใช้ได้ก่อนด้วย หวังว่าทุกคนจะรู้จักบริการนี้เพิ่มขึ้นไม่มากก็น้อยจากบทความนี้นะครับ