AWS 監控與疑難排解
John Q. Martin
Principal Consultant

from flask import Flask
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.ext.flask.middleware import XRayMiddleware
app = Flask(__name__)
xray_recorder.configure(
service='MyFlaskApp',
sampling=True,
context_missing='LOG_ERROR',
daemon_address='127.0.0.1:2000'
)
XRayMiddleware(app, xray_recorder)
LOG_ERROR 可避免程式當掉掛上 middleware 後,所有進站請求都會自動追蹤。
# 插裝所有支援的函式庫
from aws_xray_sdk.core import patch_all
patch_all()
# 或選擇性插裝
from aws_xray_sdk.core import patch
patch(['boto3', 'requests', 'psycopg2'])

@xray_recorder.capture('process_order')
def process_order(order_id):
order = get_order(order_id)
return process_payment(order)
def process_order(order_id):
with xray_recorder.capture('fetch_order'):
order = db.query(Order).filter_by(
id=order_id).first()
with xray_recorder.capture('process_payment'):
return payment_service.charge(order.total)
xray_recorder.put_annotation(
'order_id', order_id)
xray_recorder.put_annotation(
'user_id', user_id)
xray_recorder.put_metadata(
'order_details',
{'items': order.items,
'total': order.total})
def process_order(order_id):
try:
order = get_order(order_id)
payment = process_payment(order)
return payment
except PaymentError as e:
xray_recorder.put_annotation(
'error_type', 'payment_failed')
xray_recorder.put_metadata(
'error_details',
{'message': str(e), 'order_id': order_id})
raise
const AWSXRay = require('aws-xray-sdk-core');
const xrayExpress = require('aws-xray-sdk-express');
const app = require('express')();
AWSXRay.config([AWSXRay.plugins.EC2Plugin]);
// 為所有進站請求開啟 segment
app.use(xrayExpress.openSegment('MyExpressApp'));
app.get('/api/orders/:id', async (req, res) => {
const order = await fetchOrder(req.params.id);
res.json({ order });
});
// 回應後關閉 segment
app.use(xrayExpress.closeSegment());
// 自動插裝
const AWS = AWSXRay.captureAWS(require('aws-sdk'));
const https = AWSXRay.captureHTTPs(require('https'));
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all
patch_all() # 插裝 AWS SDK 呼叫
def lambda_handler(event, context):
xray_recorder.put_annotation(
'user_id', event['user_id'])
result = process_user(event['user_id'])
return {
'statusCode': 200,
'body': json.dumps(result)
}
Tracing: Active
ECS Task
|_ Application Container
| sends to xray-daemon:2000
|_ X-Ray Daemon Container
forwards to X-Ray service
xray_recorder.configure(
service='MyECSApp',
daemon_address='xray-daemon:2000'
)
amazon/aws-xray-daemon 映像,UDP 連接埠 2000AWS_XRAY_DAEMON_ADDRESS=xray-daemon:2000sudo systemctl start xray
sudo systemctl enable xray
TotalBufferSizeMB: 24
Concurrency: 8
Region: "us-east-1"
Socket:
UDPAddress: "127.0.0.1:2000"
TCPAddress: "127.0.0.1:2000"
Logging:
LogLevel: "info"
LogPath: "/var/log/xray/xray-daemon.log"
LocalMode: false
{
"Effect": "Allow",
"Action": [
"xray:PutTraceSegments",
"xray:PutTelemetryRecords",
"xray:GetSamplingRules",
"xray:GetSamplingTargets",
"xray:GetSamplingStatisticSummaries"
],
"Resource": "*"
}
使用受管原則 AWSXRayDaemonWriteAccess。
套用到:
沒有正確權限時,daemon 會執行但無聲失敗,無法送出片段。

patch_all() 自動插裝;decorator 與內容管理器為手動插裝AWSXRayDaemonWriteAccess IAM 原則AWS 監控與疑難排解