·

Datadog MCP với Cursor

Cài đặt Datadog MCP trong Cursor để AI agent có thể truy vấn metric, log và monitor ngay trong trình soạn thảo.

Cursor là IDE được xây dựng quanh AI agent mode (chế độ agent tự động thực hiện nhiều bước) ngay từ nền tảng, khác với việc gắn AI như một plugin phụ trợ. Khi kết nối Datadog MCP vào Cursor, bạn có một trải nghiệm mà agent vừa "thấy" được production đang xảy ra gì, vừa "thấy" được toàn bộ codebase đang mở — và có thể tự động nối hai thế giới đó lại với nhau. Bài này đi từ cách kết nối, đến kỹ thuật nhảy từ trace span sang đúng đoạn code, bổ sung instrumentation (đo đạc, gắn theo dõi) còn thiếu, và các hạn chế thực tế bạn cần biết.

Kết Nối Datadog MCP Với Cursor Agent Mode

Cursor cấu hình MCP qua file .cursor/mcp.json trong project, hoặc ~/.cursor/mcp.json cho cấu hình global áp dụng mọi project. Cấu trúc khai báo:

{
  "mcpServers": {
    "datadog": {
      "command": "npx",
      "args": ["-y", "@datadog/mcp-server"],
      "env": {
        "DD_API_KEY": "${env:DD_API_KEY}",
        "DD_APP_KEY": "${env:DD_APP_KEY}",
        "DD_SITE": "datadoghq.com"
      }
    }
  }
}

Sau khi lưu file, mở Cursor Settings → MCP để xác nhận server datadog hiện trạng thái "Connected" (vòng tròn xanh). Khác với một số client CLI, Cursor cho phép bạn tắt/mở từng tool riêng lẻ trong danh sách tool mà server expose — hữu ích khi bạn muốn hạn chế agent chỉ đọc dữ liệu (ví dụ chỉ cho phép search_logs, get_trace, tắt hẳn các tool có khả năng ghi/thay đổi cấu hình như mute monitor).

Để dùng trong agent mode, mở chat panel, chuyển sang Agent (không phải Ask), và gõ prompt. Cursor sẽ hiện popup xác nhận trước khi thực thi tool call lần đầu với mỗi tool mới — bạn có thể chọn "Always allow" cho tool đọc dữ liệu an toàn để tránh phải xác nhận lặp lại.

Mẹo: Tắt các tool Datadog có khả năng thay đổi trạng thái (như mute/unmute monitor, tạo dashboard mới) trong danh sách tool của Cursor nếu agent chỉ cần dùng cho mục đích điều tra/đọc dữ liệu. Việc giới hạn quyền ngay từ file cấu hình an toàn hơn nhiều so với việc chỉ dựa vào bạn luôn nhớ từ chối popup xác nhận.

Nhảy Từ Trace Span Đến Đúng Đoạn Code Trong Cursor

Đây là use case mà Cursor thể hiện lợi thế rõ nhất so với việc dùng Datadog UI riêng lẻ: agent có thể mở trực tiếp file, nhảy đến đúng dòng, và thậm chí đề xuất diff sửa code — tất cả trong cùng một cửa sổ.

Ví dụ prompt:

Trace này có span "checkout.calculate_discount" tốn 1.8 giây, bất thường so
với baseline 50ms. Mở đúng hàm xử lý logic này trong codebase, giải thích
tại sao nó chậm, và đề xuất cách sửa.

Quy trình agent thực hiện: gọi get_trace để lấy chi tiết span (bao gồm resource name và tag như code.function, code.filepath nếu APM tracer của bạn có cấu hình tự động gắn thông tin này) → dùng thông tin đó (hoặc grep theo tên hàm nếu tag không có sẵn) để tìm đúng file trong workspace → mở file, đọc logic → đối chiếu với các tag khác trong span (như số lượng row trả về từ query, hoặc external call count) để chẩn đoán.

Kết quả thực tế thường như:

Hàm calculate_discount() tại src/pricing/discount_engine.py:88 gọi API bên
thứ ba "promo-rules-service" đồng bộ (blocking) cho MỖI item trong cart,
không cache kết quả dù nhiều item cùng thuộc một promo rule. Với cart có
36 item, đây chính là 36 lần gọi network tuần tự — giải thích 1.8s.

Đề xuất: 
1. Batch các item theo promo_rule_id trước khi gọi API, giảm số lần gọi.
2. Thêm cache theo promo_rule_id với TTL ngắn (ví dụ 60s) nếu rule ít thay đổi.

Bạn có thể yêu cầu agent viết luôn diff code cho đề xuất số 1 hoặc số 2 — vì đang ở agent mode trong Cursor, nó có thể tạo pull request draft ngay tại chỗ.

Mẹo: Luôn yêu cầu agent giải thích RÕ cơ chế gây chậm (ví dụ "36 lần gọi tuần tự" chứ không chỉ "code này chậm") trước khi chấp nhận đề xuất sửa code — hiểu đúng cơ chế giúp bạn đánh giá được liệu giải pháp đề xuất (cache, batch, async) có thực sự phù hợp với business logic của bạn hay không, tránh áp dụng fix "nghe có lý" nhưng sai bản chất.

Bổ Sung Instrumentation Còn Thiếu Dựa Trên Observability Gap

Một use case ít được nói đến nhưng rất giá trị: dùng AI để tìm ra những đoạn code quan trọng đang KHÔNG có instrumentation (đo đạc/theo dõi) nào — nghĩa là khi có sự cố ở đó, bạn sẽ hoàn toàn "mù" vì Datadog không có dữ liệu gì để hiển thị.

So sánh danh sách các hàm public trong module src/services/, với danh sách
span name đang xuất hiện trong APM traces của service order-service trong
7 ngày qua. Liệt kê những hàm quan trọng (được gọi từ nhiều nơi khác) mà
KHÔNG có span tương ứng nào trong Datadog.

Agent sẽ: đọc codebase để liệt kê hàm public trong module chỉ định → gọi tool APM (như liệt kê distinct span name/resource) → so khớp chéo → trả về danh sách gap.

Kết quả điển hình:

3 hàm sau được gọi thường xuyên nhưng không có span/trace tương ứng:
1. InventoryReservation.release_stale_holds() — gọi bởi cron job mỗi 5 phút,
   không có instrumentation nào, dù đây là logic có thể gây race condition
   nếu chạy chậm.
2. NotificationDispatcher.send_batch() — gọi trực tiếp SMS provider, không
   trace được latency thực tế của bên thứ ba này.
3. PricingCache.invalidate_all() — hàm nguy hiểm (xoá toàn bộ cache) nhưng
   không log/trace khi được gọi, khó điều tra nếu vô tình bị gọi sai.

Đề xuất: thêm decorator @tracer.wrap() (nếu dùng dd-trace-py) cho cả 3 hàm,
ưu tiên invalidate_all() trước vì rủi ro cao nhất.

Đây là cách dùng AI observability không phải để "chữa cháy" mà để chủ động phòng ngừa — tìm ra điểm mù trước khi nó gây ra một incident thực sự khó điều tra.

Mẹo: Chạy loại phân tích "observability gap" này định kỳ (ví dụ mỗi sprint hoặc sau mỗi lần thêm module mới), không chỉ làm một lần — codebase thay đổi liên tục và những hàm mới thêm rất dễ bị quên gắn instrumentation ngay từ đầu.

Hạn Chế Đã Biết và Cách Khắc Phục Datadog MCP Trong Cursor

Vài hạn chế thực tế cần lưu ý khi dùng kết hợp này:

  • Tag code.filepath/code.function không phải lúc nào cũng có sẵn. Nếu APM tracer của bạn (dd-trace) không được cấu hình để tự động gắn thông tin source code vào span, agent phải dựa vào việc grep theo resource name — kết quả có thể kém chính xác hơn, đặc biệt với tên hàm chung (như process(), handle()).
  • Popup xác nhận tool lặp lại có thể gây phiền khi điều tra nhiều bước. Nếu bạn chưa "Always allow" các tool đọc dữ liệu an toàn, mỗi bước trong một chuỗi điều tra dài sẽ dừng lại chờ bạn click xác nhận, làm mất tính "tự động" của agent mode.
  • Không có visibility vào rate limit còn lại theo thời gian thực. Cursor không hiển thị rõ bạn còn bao nhiêu quota API trước khi bị 429 — bạn chỉ biết khi tool call thất bại.
  • Đề xuất fix code dựa trên trace có thể thiếu ngữ cảnh business. Agent thấy "36 lần gọi API tuần tự là chậm" nhưng không biết liệu batch có làm sai logic nghiệp vụ nào (ví dụ thứ tự xử lý có ý nghĩa) — luôn review kỹ trước khi merge.

Cách khắc phục thực tế: cấu hình dd-trace với DD_TRACE_ANALYTICS_ENABLED và các flag inject source code tag (tuỳ ngôn ngữ, ví dụ Python cần cấu hình ddtrace-run đúng cách để tag đầy đủ); dùng "Always allow" có chọn lọc cho các tool an toàn; và luôn coi đề xuất sửa code từ agent là draft cần review, không phải patch để merge trực tiếp.

Mẹo: Với mọi đề xuất sửa code xuất phát từ phân tích trace, luôn yêu cầu agent viết thêm test case mô tả hành vi trước và sau khi sửa — nếu agent không thể viết được test rõ ràng cho thay đổi đó, đó là dấu hiệu bạn cần tự tay xem lại logic kỹ hơn trước khi merge, thay vì tin tưởng hoàn toàn vào suy luận từ dữ liệu trace.

Mẹo Sử Dụng Hiệu Quả

Tổng hợp thực hành tốt khi dùng Datadog MCP trong Cursor:

  • Giới hạn quyền tool ngay trong .cursor/mcp.json hoặc UI Settings, chỉ cho phép tool đọc dữ liệu nếu agent không cần thay đổi cấu hình Datadog.
  • Cấu hình dd-trace đầy đủ để span có tag code.filepath/code.function, giúp agent nhảy đúng vị trí code nhanh và chính xác hơn.
  • Chạy phân tích observability gap định kỳ để chủ động phát hiện điểm mù trước khi thành incident.
  • Luôn coi mọi đề xuất sửa code từ agent dựa trên trace là draft cần review kỹ, đặc biệt về tác động business logic.
  • Yêu cầu agent viết test case kèm mọi đề xuất fix liên quan đến performance.

Mẹo: Kết hợp use case "bổ sung instrumentation" với quy trình code review thông thường — thêm một bước nhỏ trong checklist PR: "Đã kiểm tra hàm mới có cần thêm tracing span không?". Việc này biến quan sát hệ thống từ một hoạt động phản ứng (chỉ làm khi có sự cố) thành một phần chủ động của vòng đời phát triển phần mềm.