Khi log biết tự điều tra: TReNDS dùng AI Agent để tìm Root Cause trong chưa đầy một phút


Một dòng ERROR thực ra không hề nhỏ

Không có lỗi nào chỉ là một dòng chữ màu đỏ.

Giả sử lúc 2 giờ 13 phút sáng, một service đang chạy bình thường bỗng ném ra:

1NullPointerException at OrderService.java:142

Nếu nhìn bằng mắt người bình thường, đây chỉ là vài chục ký tự.

Nhưng phía sau mấy chục ký tự ấy có thể là cả một đoàn tàu vừa trật bánh.

Một request đi vào load balancer, chạy qua API, nhảy sang một service khác, gọi database, chạm Redis, gọi một API thanh toán, nhận về một giá trị kỳ quặc, rồi ở đâu đó trong hàng nghìn dòng code có một anh lập trình viên — rất có thể là chính chúng ta sáu tháng trước — quên kiểm tra null.

Server không biết buồn.

Nó chỉ viết:

1ERROR

rồi tiếp tục sống.

Con người mới là người phải đau khổ.

Kỹ sư nhận alert, mở CloudWatch, tìm đúng log stream, kéo lên vài chục dòng, kéo xuống vài chục dòng, đọc stack trace, mở GitHub, tìm file, tìm dòng code, xem hàm này gọi hàm nào, rồi cố dựng lại trong đầu:

Chuyện quái gì vừa xảy ra?

Đó chính là Root Cause Analysis (RCA).

Monitoring thường trả lời được:

Cái gì đang cháy?

Nhưng RCA phải trả lời một câu khó hơn:

Vì sao nó cháy?

Ngày 7/8/2026, AWS đăng một case study khá thú vị của TReNDS Center về cách họ biến quá trình này thành một pipeline gần như tự động bằng Amazon CloudWatch, Lambda, Amazon Bedrock và Strands Agents SDK. Hệ thống đang được TReNDS sử dụng trong production. (Amazon Web Services, Inc.)

Điều đáng nói không nằm ở việc họ “đưa log cho LLM đọc”.

Nếu chỉ làm thế thì khá chán.

Điểm thú vị là họ cho AI quyền đi điều tra.

Alert và điều tra là hai việc khác nhau

TReNDS, viết tắt của Center for Translational Research in Neuroimaging and Data Science, vận hành nhiều ứng dụng nghiên cứu và API trên Amazon EKS. Log từ các workload được Fluent Bit chuyển vào Amazon CloudWatch. Hạ tầng này đã chạy trên AWS từ năm 2019. (Amazon Web Services, Inc.)

Monitoring của họ vốn không thiếu.

Khi hệ thống lỗi, họ biết.

Nhưng biết một căn nhà đang cháy và biết cái ổ điện nào đã phát tia lửa là hai chuyện rất khác nhau.

Quy trình cũ đại khái như thế này:

 1Alert
 2 3Engineer mở CloudWatch
 4 5Tìm stack trace
 6 7Đọc log trước và sau lỗi
 8 9Mở GitHub
1011Tìm file liên quan
1213Đọc code
1415Lần theo execution path
1617Đưa ra giả thuyết
1819Root Cause

Theo TReNDS, những lỗi tương đối đơn giản cũng có thể mất khoảng 15–30 phút điều tra. Những lỗi liên quan nhiều service có thể lâu hơn đáng kể. (Amazon Web Services, Inc.)

Vấn đề nằm ở chỗ phần lớn 15–30 phút đó không phải lúc nào cũng cần một bộ não thiên tài.

Kỹ sư đang làm những việc rất cơ học:

  • lấy thêm log;
  • tìm file;
  • mở đúng dòng;
  • đọc stack trace;
  • tìm hàm được gọi;
  • tìm error message trong repository;
  • nối các mẩu thông tin lại với nhau.

Nói hơi kỳ một chút, chúng ta đang dùng một kỹ sư có nhiều năm kinh nghiệm như một con trỏ chuột biết suy nghĩ.

Và đây là nơi AI Agent bắt đầu hợp lý.

Đừng đưa log cho LLM, hãy đưa cho nó một chiếc kính lúp

Có một cách rất đơn giản để dùng AI cho incident:

1ERROR
23LLM
45"Nguyên nhân có thể là..."

Cách này nhìn rất thông minh trong demo.

Nhưng ở production thì có một vấn đề.

LLM chỉ biết những gì chúng ta đưa vào prompt.

Nếu prompt chỉ có:

1NullPointerException at OrderService.java:142

thì nó cũng giống một bác sĩ chỉ được nghe:

Bệnh nhân đau bụng.

Sau đó phải đoán bệnh.

Có thể đoán đúng.

Cũng có thể bệnh nhân chỉ ăn sáu tô bún bò.

TReNDS chọn kiến trúc khác.

Họ cho model các tool để nó tự đi lấy bằng chứng.

Kiến trúc tổng quát:

 1Application
 2 3Amazon EKS
 4 5Fluent Bit
 6 7CloudWatch Logs
 8 9Subscription Filter
1011AWS Lambda
1213Strands Agent
1415Amazon Bedrock
16   ↙        ↘
17Logs       GitHub
18context    source code
19    ↘       ↙
20   Reasoning
2122Root Cause Analysis
2324Amazon SNS
2526Email / Slack

CloudWatch subscription filter theo dõi những pattern như:

1ERROR
2Exception
3FATAL
4CRITICAL

Khi một event phù hợp xuất hiện, dữ liệu được chuyển sang Lambda. Subscription filter của CloudWatch được thiết kế để chuyển các log event phù hợp sang các destination như Lambda hoặc Kinesis gần thời gian thực. (AWS Documentation)

Lambda sau đó khởi chạy một Strands Agent sử dụng model trên Amazon Bedrock.

Nhưng đây mới chỉ là lúc cuộc điều tra bắt đầu.

Agent không phải một prompt dài

Một trong những ý mình thích nhất trong kiến trúc này là họ không cố nhét cả thế giới vào context window.

Agent được cung cấp một số công cụ.

Ví dụ:

1fetch_log_context()
2fetch_source_code()
3search_github_code()

Rồi model tự quyết định lúc nào cần dùng cái gì.

Trong Strands, một Python function bình thường có thể được biến thành tool bằng decorator @tool. Docstring và type hint được dùng để mô tả chức năng cũng như schema tham số cho model. (Strands Agents SDK)

Ví dụ đơn giản:

 1from strands import tool
 2
 3@tool
 4def fetch_source_code(file_path: str, repo: str) -> str:
 5    """
 6    Lấy source code từ repository.
 7
 8    Args:
 9        file_path: đường dẫn file cần đọc
10        repo: repository cần truy cập
11    """
12    ...

Nhìn thì chẳng có gì ghê gớm.

Nhưng sự thay đổi nằm ở quyền chủ động.

Thay vì chương trình viết cứng:

1read_log()
2read_file_a()
3read_file_b()
4search_keyword()

ta nói:

1Đây là lỗi.
2
3Đây là những công cụ anh có.
4
5Điều tra đi.

Model trở thành nơi quyết định bước tiếp theo của quá trình điều tra.

Đây chính là khác biệt giữa một workflow cố định và agentic workflow.

Chiếc đèn pin đầu tiên: lấy thêm log

Một dòng error thường không đủ.

Giả sử log có dạng:

110:21:01 Received payment request
210:21:02 Calling payment gateway
310:21:04 Gateway timeout
410:21:04 Retry failed
510:21:05 payment_response=None
610:21:05 NullPointerException

Nếu chúng ta chỉ gửi dòng cuối:

1NullPointerException

model nhìn thấy cái xác nhưng không nhìn thấy hiện trường.

TReNDS vì thế xây một tool để lấy log xung quanh thời điểm xảy ra lỗi.

Đại khái:

1@tool
2def fetch_log_context(
3    log_group: str,
4    log_stream: str,
5    timestamp: int,
6    window_seconds: int = 30
7):
8    ...

Agent có thể lấy khoảng thời gian trước và sau error, ví dụ ±30 giây.

Quan trọng hơn, họ giới hạn truy vấn trong cùng log stream.

Điều đó giúp tránh một nồi lẩu log từ hàng chục container chạy song song.

Khi ấy AI có thể nhìn thấy một chuỗi sự kiện tương đối sạch:

1request
23warning
45timeout
67retry
89exception

Từ một tấm ảnh chụp cái xác, nó bắt đầu có camera an ninh.

Theo kiến trúc TReNDS, CloudWatch event chứa thông tin logStream, cho phép agent lấy thêm những dòng log của đúng container đã phát sinh lỗi. (Amazon Web Services, Inc.)

Chiếc đèn pin thứ hai: mở source code

Đây mới là đoạn mình thấy đáng học nhất.

Stack trace nói:

1OrderService.java:142

Agent không ngồi tưởng tượng dòng 142 có gì.

Nó gọi:

1fetch_source_code(
2    "src/services/OrderService.java"
3)

Sau đó đọc code thật.

Ví dụ nó tìm thấy:

1PaymentResponse response =
2    paymentGateway.charge(order);
3
4String transactionId =
5    response.getTransactionId();

Trong log trước đó lại có:

1payment_response=None

Bây giờ câu chuyện gần như tự nối lại:

1Payment gateway timeout
23charge() trả null
45response không được kiểm tra
67getTransactionId()
89NullPointerException

Đây không còn là:

AI đoán nguyên nhân lỗi.

Mà gần hơn với:

AI thu thập bằng chứng rồi suy luận nguyên nhân lỗi.

Hai câu nhìn khá giống nhau.

Nhưng về mặt engineering, chúng cách nhau rất xa.

Agent có thể lần theo code như một kỹ sư

Giả sử dòng lỗi nằm ở:

1checkout.py

Agent mở file và thấy:

1payment = process_payment(order)

Nó chưa có câu trả lời.

Nó tiếp tục tìm process_payment().

Sau đó phát hiện:

1return payment_gateway.charge(...)

Nó lại mở implementation của payment_gateway.

Rồi có thể phát hiện bug nằm sâu hơn.

Con đường điều tra lúc này có thể là:

 1Stack trace
 2 3checkout.py
 4 5process_payment()
 6 7payment_gateway.py
 8 9retry()
1011HTTP timeout
1213None
1415missing null check

Điểm quan trọng là con đường này không cần được lập trình viên viết trước.

Theo AWS, nếu việc đọc file đầu tiên cho thấy lỗi nằm trong shared utility hoặc dependency khác, agent có thể tiếp tục lần theo chuỗi đó. Nếu stack trace không đủ thông tin, agent cũng có thể tìm error string trong codebase. (Amazon Web Services, Inc.)

Đó là thứ workflow kiểu:

1if error A → làm B
2if error C → làm D

rất khó bao phủ hết.

Production có một tài năng đặc biệt.

Nó luôn tìm ra loại lỗi mà chúng ta chưa viết if.

System Prompt thực ra khá đơn giản

Một điều khác đáng chú ý là system prompt của TReNDS không phải một cuốn kinh dài 14 trang.

Tinh thần của nó chỉ là:

 1Bạn là một Senior Site Reliability Engineer.
 2
 31. Xác định root cause từ stack trace.
 42. Đọc source code liên quan.
 53. Trả về:
 6
 7- Severity
 8- Root cause
 9- Source code liên quan
10- Suggested fix
11- Những vùng khác có thể bị ảnh hưởng

Chiến lược điều tra không bị hard-code.

Prompt quy định:

Tôi muốn kết quả trông như thế nào.

Tool quy định:

Anh có thể làm gì.

Model quyết định:

Tôi nên làm gì tiếp theo.

Đây là một cách chia trách nhiệm khá đẹp:

 1Prompt
 2→ mục tiêu + luật chơi
 3
 4Tools
 5→ khả năng tác động vào thế giới
 6
 7LLM
 8→ suy luận + lựa chọn hành động
 9
10Code truyền thống
11→ authentication + permission + validation + execution

Một agent production tốt không phải là LLM được quyền làm mọi thứ.

Nó là LLM đứng giữa những cánh cửa rất nhỏ.

Mỗi cánh cửa chỉ mở đúng một việc.

Tại sao tool càng nhỏ càng tốt?

Hãy tưởng tượng ta cho agent một tool:

1execute_anything(command)

Thế là xong.

Agent quyền năng như Thanos.

Và đội security bắt đầu mất ngủ.

Một thiết kế hợp lý hơn là:

1fetch_log_context()
2fetch_source_code()
3search_repository()
4query_metrics()
5get_deployment_info()

Mỗi tool có input rõ ràng.

Mỗi tool có permission rõ ràng.

Agent được tự do suy nghĩ, nhưng khả năng hành động vẫn bị giới hạn bởi hệ thống.

Đây là nguyên tắc rất quan trọng khi đưa agent vào production:

Đừng cố kiểm soát mọi suy nghĩ của model. Hãy kiểm soát những thứ nó có thể chạm vào.

Strands hỗ trợ custom Python functions, MCP server và các loại tool khác để xây lớp khả năng này cho agent. (Strands Agents SDK)

Một incident từ đầu tới cuối

Giả sử lúc 10:21 hệ thống xuất hiện:

1ERROR
2NullPointerException
3OrderService.java:142

Bước 1: CloudWatch bắt được lỗi

Subscription filter phát hiện:

1ERROR

và gửi event sang Lambda.

Bước 2: Lambda giải mã event

CloudWatch gửi payload dạng gzip nén và base64 encode.

Lambda lấy ra:

1log_group
2log_stream
3timestamp
4error_message

Bước 3: Agent bắt đầu điều tra

Model thấy:

1OrderService.java:142

Nó gọi:

1fetch_log_context()

và nhận:

1Payment gateway timeout
2Retry failed
3payment_response=None
4NullPointerException

Bước 4: Agent mở source code

Nó gọi:

1fetch_source_code(
2    "OrderService.java"
3)

và tìm thấy:

1response.getTransactionId()

mà không có kiểm tra response == null.

Bước 5: Agent tìm thêm

Có thể nó search repository và phát hiện:

1RefundService.java:89

cũng có pattern tương tự.

Bước 6: Kết luận

Kết quả gửi về có dạng:

 1Severity: HIGH
 2
 3Root Cause:
 4Payment gateway có thể trả null khi timeout.
 5OrderService không kiểm tra null trước khi
 6gọi getTransactionId().
 7
 8Suggested Fix:
 9Thêm null check và xử lý retry/fallback.
10
11Related Areas:
12RefundService có pattern tương tự.

Bước 7: SNS gửi thông báo

Kết quả cuối cùng có thể được fan-out qua email hoặc Slack. Đây chính là flow production được TReNDS mô tả. (Amazon Web Services, Inc.)

Kỹ sư mở điện thoại lên.

Thay vì:

1PRODUCTION ERROR!!!

họ nhận được:

 1Production lỗi.
 2
 3Nó lỗi ở đây.
 4
 5Khả năng cao vì cái này.
 6
 7Đây là đoạn code.
 8
 9Có thể sửa như thế này.
10
11À, file kia cũng có nguy cơ tương tự.

Alert bỗng nhiên từ một tiếng chuông báo cháy biến thành một anh kỹ sư trực đêm đã chạy xuống tầng hầm xem thử khói phát ra từ đâu.

Từ 30 phút xuống dưới 60 giây

Theo TReNDS, sau khi triển khai hệ thống, thời gian investigation giảm từ khoảng 15–30 phút xuống dưới 60 giây. (Amazon Web Services, Inc.)

Đây là con số đáng chú ý.

Nhưng mình nghĩ điều quan trọng hơn không phải:

130 phút → 1 phút

Mà là bản chất của 29 phút biến mất.

Trước đây:

1Engineer
2├── tìm log
3├── tìm context
4├── tìm source
5├── đọc file
6├── search repository
7└── nối thông tin

Sau này:

 1Agent
 2├── tìm log
 3├── tìm context
 4├── tìm source
 5├── đọc file
 6├── search repository
 7└── nối thông tin
 8
 9Engineer
10└── kiểm tra kết luận

Con người được đẩy lên một tầng abstraction cao hơn.

Giống compiler đã giải phóng chúng ta khỏi việc tự viết assembly cho từng phép cộng.

Agent không nhất thiết thay kỹ sư SRE.

Nó lấy bớt phần đi bộ giữa các hệ thống ra khỏi công việc của SRE.

Nhưng có một vấn đề rất đời thường: cùng một lỗi có thể la hét 10.000 lần

Production có một thói quen xấu.

Một bug xảy ra không nhất thiết gửi một error.

Nó có thể gửi:

1ERROR
2ERROR
3ERROR
4ERROR
5ERROR
6ERROR
7...

Nếu mỗi ERROR gọi một LLM Agent, chúng ta vừa phát minh ra một cỗ máy đổi exception thành hóa đơn.

TReNDS giải quyết chuyện này bằng deduplication sử dụng DynamoDB: sau release, nếu cùng code path tiếp tục tạo ra error lặp lại, chỉ occurrence đầu tiên cần kích hoạt phân tích; các lần sau được lọc đi. (Amazon Web Services, Inc.)

Ý tưởng này cực kỳ quan trọng.

Agentic architecture không nên là:

1Event
2→ LLM

Mà nên gần với:

 1Event
 2 3Filter
 4 5Normalize
 6 7Fingerprint
 8 9Deduplicate
1011Priority
1213Agent

Không phải mọi tiếng động trong nhà đều cần gọi Sherlock Holmes.

Có lúc chỉ là con mèo làm rơi cái muỗng.

Có thể fingerprint lỗi như thế nào?

Giả sử hệ thống nhận:

1NullPointerException
2OrderService.java:142
3request_id=abc123
4user_id=7788

và vài giây sau:

1NullPointerException
2OrderService.java:142
3request_id=def456
4user_id=9981

Request khác nhau.

User khác nhau.

Nhưng về bản chất có thể cùng một lỗi.

Ta có thể normalize thành:

1NullPointerException
2OrderService.java:142

rồi tạo fingerprint:

1import hashlib
2
3def incident_fingerprint(error_type, file, line):
4    text = f"{error_type}:{file}:{line}"
5    return hashlib.sha256(text.encode()).hexdigest()

Sau đó:

1fingerprint
23DynamoDB / Redis
45đã phân tích?
6 ┌──┴──┐
7yes    no
8 ↓      ↓
9skip   Agent

Trong production thực tế chắc chắn phức tạp hơn.

Nhưng ý chính vẫn vậy:

AI đắt nhất khi chúng ta bắt nó suy nghĩ lại thứ nó vừa suy nghĩ xong.

Không phải error nào cũng cần Sonnet

TReNDS cũng thử nhiều model khác nhau trên Amazon Bedrock và đánh giá chúng dựa trên các tiêu chí như khả năng reasoning về code, độ tin cậy khi sử dụng tool, latency và chi phí. Họ chọn Claude Sonnet làm model chính cho workload này. (Amazon Web Services, Inc.)

Nhưng phần thú vị hơn nằm ở hướng phát triển tiếp theo.

Không nhất thiết:

1mọi lỗi
23model mạnh

Ta có thể làm:

1                    ┌→ known / simple → model nhỏ
2ERROR → classifier ─┤
3                    └→ complex / novel → model mạnh

Ví dụ:

1Connection timeout
2Known pattern
3Confidence = 0.99

không nhất thiết phải triệu hồi một model reasoning lớn.

Trong khi:

1race condition
2+
33 services
4+
5distributed transaction
6+
76 files

lại là chuyện khác.

TReNDS cho biết họ đang nghiên cứu chiến lược tiered model: lỗi đơn giản có thể đi qua model nhẹ hơn, còn lỗi mới hoặc phức tạp được chuyển sang Sonnet để phân tích sâu hơn. (Amazon Web Services, Inc.)

Đây cũng là một pattern đáng nhớ khi triển khai LLM:

Model routing thường quan trọng không kém model selection.

Amazon Bedrock hiện cung cấp nhiều foundation model thông qua một lớp dịch vụ chung, vì vậy kiến trúc ứng dụng có thể thay đổi model mà không phải viết lại toàn bộ hệ thống agent. Danh sách model và khả năng hỗ trợ vẫn tiếp tục thay đổi theo thời gian. (AWS Documentation)

Bước tiếp theo sẽ là Runbook

Hãy tưởng tượng agent phát hiện:

1Redis connection exhausted

Source code giúp nó hiểu lỗi.

Log giúp nó hiểu chuyện gì vừa xảy ra.

Nhưng trong công ty thường còn một thứ khác:

1runbooks/
2├── redis-connection-exhausted.md
3├── database-lag.md
4├── payment-timeout.md
5└── kubernetes-oom.md

Đây là ký ức của tổ chức.

Một kỹ sư lâu năm gặp lỗi Redis có thể nói:

À lỗi này năm ngoái từng dính rồi. Đừng restart bừa. Kiểm tra connection pool trước.

Người mới thì không biết.

AI cũng không biết.

Trừ khi ta cho nó đọc.

TReNDS vì thế đang nghiên cứu kết nối Amazon Bedrock Knowledge Bases với runbook nội bộ và các incident report cũ. (Amazon Web Services, Inc.)

Lúc đó hệ thống bắt đầu có ba loại trí nhớ:

1Logs
2→ chuyện vừa xảy ra
3
4Source code
5→ hệ thống hiện đang hoạt động thế nào
6
7Runbook + incidents
8→ chúng ta từng học được gì

Khi ba thứ này gặp nhau, RCA mới thực sự thú vị.

Và rồi đến GitHub Issue, thậm chí Pull Request

Con đường tiếp theo gần như tự nhiên:

 1Detect
 2 3Investigate
 4 5Root Cause
 6 7Suggest Fix
 8 9Create Issue
1011Create PR
1213Test
1415Human Review
1617Merge

TReNDS cho biết họ cũng đang hướng tới việc tự động tạo GitHub issue và pull request khi agent xác định được một cách sửa tiềm năng. (Amazon Web Services, Inc.)

Nghe đến đây rất dễ bị phấn khích rồi nối tiếp:

1Agent tự merge
23Agent tự deploy
45Agent tự phá production lần hai

Thôi.

Ta nên phân biệt rất rõ:

1Read

và:

1Write

Một agent chỉ có quyền:

1read logs
2read metrics
3read source

có blast radius tương đối thấp.

Agent có quyền:

1modify code
2merge PR
3restart pod
4rollback deployment
5change database

là một sinh vật hoàn toàn khác.

Càng tiến gần hệ thống production, mỗi bước nên có permission, policy, validation và human approval tương ứng.

AI có thể rất thông minh.

Nhưng DROP TABLE vẫn chạy ở tốc độ của database, không chạy ở tốc độ suy nghĩ của AI.

Nếu tự xây một hệ thống tương tự, mình sẽ chia thành 6 lớp

Mô hình TReNDS khá gọn. Nhưng nếu triển khai ở một hệ thống lớn, mình sẽ nghĩ về nó theo sáu lớp.

Lớp 1: Detection

Nguồn có thể là:

  • application log;
  • Kubernetes event;
  • Prometheus alert;
  • OpenTelemetry trace;
  • database alert;
  • message queue;
  • API gateway;
  • infrastructure metric.

Mục tiêu chỉ là:

1Có chuyện bất thường.

Đừng bắt LLM làm việc mà regex, threshold hoặc anomaly detector đã làm tốt.

Lớp 2: Incident normalization

Biến:

110.000 log lines

thành:

1Incident
2{
3    service,
4    error_type,
5    timestamp,
6    deployment,
7    stacktrace,
8    fingerprint
9}

Đây là bước rất hay bị bỏ quên.

Garbage in, Sherlock Holmes cũng khó điều tra.

Lớp 3: Context retrieval

Agent có thể lấy:

 1logs
 2traces
 3metrics
 4source code
 5deployment diff
 6Git history
 7recent PR
 8config
 9feature flags
10runbooks
11past incidents

RCA càng tốt khi evidence càng tốt.

Lớp 4: Reasoning

Đây mới là chỗ dành cho model.

Nhiệm vụ:

1evidence
23hypothesis
45cross-check
67root cause

LLM nên được khuyến khích phân biệt:

1Observed evidence
2Likely cause
3Confidence
4Missing evidence
5Suggested action

Thay vì phán như thánh:

1Chắc chắn lỗi do Redis.

Lớp 5: Action

Ban đầu chỉ:

1Slack
2Email
3Ticket

Sau đó mới cân nhắc:

1Create issue
2Create PR
3Rollback
4Restart

Quyền càng mạnh, guardrail càng phải dày.

Lớp 6: Learning

Sau khi kỹ sư xác nhận:

1Agent đúng / sai

hãy lưu lại.

Sau vài nghìn incident, dữ liệu này trở thành một tài sản rất giá trị để:

  • đánh giá model;
  • cải thiện prompt;
  • cải thiện tool;
  • xây routing;
  • tìm lỗi lặp;
  • đo confidence;
  • tạo incident knowledge base.

Nếu không có feedback loop, agent sẽ mãi mãi là một nhân viên mới đi làm ngày đầu.

Một thứ mình sẽ thêm: trace

Kiến trúc TReNDS tập trung nhiều vào log stream và source code.

Nhưng trong microservice lớn, mình sẽ muốn agent nhìn thêm distributed tracing.

Ví dụ:

 1mobile
 2 3API gateway
 4 5order-service
 6 7payment-service
 8 9fraud-service
1011database

Một request có thể chạy qua năm service.

Nếu chỉ nhìn từng log stream, ta giống như đứng ở năm căn phòng khác nhau và nghe người trong phòng kể lại.

Trace ID biến chúng thành một câu chuyện duy nhất:

1trace_id = 12345

Agent có thể đi:

 1ERROR
 2 3trace_id
 4 5toàn bộ spans
 6 7span có latency bất thường
 8 9service liên quan
1011logs
1213source code

Lúc ấy RCA không còn là:

1Log → Code

mà trở thành:

 1Log
 2 + Trace
 3 + Metric
 4 + Code
 5 + Deployment
 6 + Runbook
 7 + Incident history
 8 9      Agent
1011 Root Cause hypothesis

Đây mới là hình dạng mà mình nghĩ các hệ thống observability có AI sẽ dần tiến tới.

Điều đáng học nhất không phải Amazon Bedrock

Nếu bỏ hết tên sản phẩm ra, kiến trúc TReNDS còn lại:

 1Event
 2 3Filter
 4 5Agent
 6 7Tools
 8 9Evidence
1011Reasoning
1213Structured Result

Chúng ta hoàn toàn có thể thay:

1CloudWatch

bằng Elasticsearch, Loki hay OpenSearch.

Thay:

1Bedrock

bằng một model nội bộ.

Thay:

1Strands

bằng framework agent khác hoặc một vòng tool calling tự viết.

Thay:

1SNS

bằng Kafka, Slack webhook hay hệ thống notification riêng.

Phần mềm có thể thay.

Pattern vẫn còn nguyên.

Và đó mới là thứ đáng học.

Từ observability sang investigability

Ngày xưa chúng ta xây monitoring để máy tính nói:

Tôi đang đau.

Sau đó observability cố giúp kỹ sư hỏi:

Đau ở đâu?

Agentic RCA tiến thêm một bước:

Tôi đang đau ở đây. Tôi đã xem log, kiểm tra trace, mở đoạn code liên quan và đây là ba nguyên nhân có khả năng nhất.

Đó là một thay đổi khá lớn.

Máy tính trước đây chỉ để lại dấu chân.

Con người đi theo dấu chân.

Bây giờ chúng ta đang xây những hệ thống có thể tự quay lại nhìn dấu chân của chính mình.

Nó đọc những electron vừa chạy qua CPU.

Đọc những byte vừa rơi xuống log.

Lần ngược những function call được viết từ vài tháng trước.

Mở repository.

So sánh bằng chứng.

Rồi vài chục giây sau gửi cho một con người đang uống cà phê:

1Tôi nghĩ tôi biết mình vừa chết vì sao.

Nghe hơi ngáo.

Nhưng về mặt kỹ thuật, nó chỉ là:

1tool calling
2+
3context retrieval
4+
5reasoning

Xong thuật toán, quá dễ.

Phần khó vẫn như mọi hệ thống production khác:

  • dữ liệu có sạch không;
  • log có đủ context không;
  • trace có nối được không;
  • source code có đúng version đang deploy không;
  • tool có permission quá rộng không;
  • incident có deduplicate không;
  • model sai thì ai kiểm tra;
  • agent được phép hành động đến đâu.

LLM không làm những câu hỏi này biến mất.

Nó chỉ khiến chúng trở nên quan trọng hơn.

Tổng kết

Case study của TReNDS cho thấy một hướng ứng dụng AI Agent rất thực tế: không tạo thêm một chatbot nữa, mà cắm agent vào đúng nơi con người đang phải làm những thao tác lặp đi lặp lại giữa nhiều hệ thống.

Kiến trúc cốt lõi khá đơn giản:

 1Production error
 2 3Detect
 4 5Collect evidence
 6 7Read logs
 8 9Read code
1011Reason
1213Root Cause
1415Suggested fix
1617Human

Theo TReNDS, pipeline này đã giúp giảm thời gian investigation từ khoảng 15–30 phút xuống dưới 60 giây trong workload của họ. (Amazon Web Services, Inc.)

Nhưng có lẽ bài học đáng nhớ hơn là:

Agent không trở nên hữu ích chỉ vì model thông minh. Nó trở nên hữu ích khi được đặt cạnh đúng dữ liệu và được trao đúng công cụ.

Một LLM đứng một mình chỉ có thể nói.

Một LLM có log, source code, trace, runbook và những tool nhỏ được kiểm soát chặt chẽ bắt đầu có thể điều tra.

Và có lẽ đây mới là một trong những nơi AI Agent thực sự phù hợp với production: không thay người kỹ sư quyết định mọi thứ, mà chạy trước vài bước, bật đèn pin, mở đúng cánh cửa và chỉ cho chúng ta xem nơi nào đang có khói.

Cảm ơn các bạn đã quan tâm và theo dõi bài viết, hẹn gặp lại ở các bài viết tiếp theo.

Tham khảo

Bình luận