이 문서에서는 Azure API Management가 MCP 서버로의 트래픽에 대해 내보내는 원격 분석, 도구 인수와 결과에 대한 페이로드 로깅을 사용하도록 설정하는 방법, 그리고 Azure Monitor에서 데이터를 쿼리하는 방법을 알아봅니다.
필수 조건
MCP 서버가 하나 이상 있는 API Management 인스턴스입니다. REST API를 MCP 서버로 노출하거나 기존 MCP 서버 노출을 참조하세요.
API Management 인스턴스에 연결된 Application Insights 리소스입니다. 자세한 내용은 Azure API Management Application Insights 구성을 참조하세요.
MCP 서버의 기본 텔레메트리
모든 MCP 요청에 대해 API Management는 MCP별 차원으로 Application Insights 요청 행을 작성하고 표준 기간 필드를 설정합니다. 구성을 변경하지 않고 도구별 대기 시간을 차트로 작성할 수 있습니다. 자세한 내용은 이 문서의 뒷부분에 있는 MCP 원격 분석 참조 섹션을 참조하세요.
메모
MCP 원격 분석은 표준 원격 분석 특성 이름(예 gen_ai.*: )을 정의하는 생성 AI에 대한 OpenTelemetry 의미 체계 규칙을 따르므로 도구 간에 데이터가 일관됩니다.
인수 및 결과에 대한 페이로드 로깅 사용 설정
기본적으로 API Management는 도구 호출의 인수와 결과를 캡처하지 않습니다. MCP 서버에 대한 캡처를 사용하도록 설정하려면 다음을 수행합니다.
Azure Portal에서 API Management 인스턴스로 이동합니다.
API>MCP 서버를 선택한 다음, 기록할 MCP 서버를 선택합니다.
설정>진단 로그를 선택합니다.
프런트 엔드 및 백 엔드 페이로드 로깅을 사용하도록 설정합니다. 저장을 선택합니다.
Caution
도구 인수 및 결과에는 프롬프트, 고객 데이터 또는 비밀이 포함될 수 있습니다. 필요한 MCP 서버 및 환경에 대해서만 페이로드 로깅을 사용하도록 설정합니다. 광범위한 롤아웃 전에 스크러빙 또는 클레임 허용 목록을 적용합니다.
KQL을 사용하여 MCP 트래픽 쿼리
다음은 MCP 트래픽을 분석하기 위해 Azure Monitor 실행할 수 있는 샘플 Kusto 쿼리입니다. 이러한 예제에서는 해당하는 경우 MCP 서버의 이름으로 바꿉 sales-mcp 니다.
지정된 MCP 서버에서 마지막 50개 도구 호출 나열
requests
| where customDimensions["api.type"] == "Mcp"
and customDimensions["service.name"] == "sales-mcp"
and customDimensions["gen_ai.operation.name"] == "tools/call"
| project timestamp,
tool = customDimensions["gen_ai.tool.name"],
session = customDimensions["gen_ai.conversation.id"],
client = strcat(customDimensions["user_agent.name"], "/",
customDimensions["user_agent.version"]),
durationMs = duration,
success
| order by timestamp desc
| take 50
도구 호출 볼륨별 상위 MCP 클라이언트
requests
| where customDimensions["api.type"] == "Mcp"
and customDimensions["gen_ai.operation.name"] == "tools/call"
| summarize calls = count()
by client = strcat(customDimensions["user_agent.name"], "/",
customDimensions["user_agent.version"])
| top 10 by calls desc
지난 24시간 동안의 도구당 p50 및 p95 대기 시간
requests
| where customDimensions["api.type"] == "Mcp"
and customDimensions["gen_ai.operation.name"] == "tools/call"
and timestamp > ago(24h)
| summarize p50 = percentile(duration, 50),
p95 = percentile(duration, 95),
calls = count()
by tool = tostring(customDimensions["gen_ai.tool.name"])
| order by p95 desc
시간 경과에 따른 도구별 오류율
requests
| where customDimensions["api.type"] == "Mcp"
and customDimensions["gen_ai.operation.name"] == "tools/call"
| summarize total = count(),
failures = countif(success == false)
by bin(timestamp, 5m),
tool = tostring(customDimensions["gen_ai.tool.name"])
| extend errorRate = todouble(failures) / total
| render timechart
특정 도구로 전송된 인수 검사
이 시나리오에서는 MCP 서버에 페이로드 로깅을 사용하도록 설정해야 합니다.
requests
| where customDimensions["api.type"] == "Mcp"
and customDimensions["service.name"] == "sales-mcp"
and customDimensions["gen_ai.tool.name"] == "create_quote"
and timestamp > ago(1h)
| project timestamp,
session = customDimensions["gen_ai.conversation.id"],
args = customDimensions["gen_ai.tool.call.arguments"],
result = customDimensions["gen_ai.tool.call.result"]
추적 정책을 사용하여 사용자 지정 차원 추가
기본 제공 스키마(예: 사용자 지정 x-agent-id 헤더, JWT 클레임 또는 상관 관계 ID)에 없는 데이터를 캡처하려면 MCP 서버 범위에서 추적 정책을 사용합니다.
Warning
MCP 범위에 연결된 정책에서 context.Response.Body에 액세스하지 마세요. MCP 응답이 스트리밍되고 본문을 읽으면 스트림이 중단됩니다.
MCP 원격 분석 참조
모든 MCP 요청에 다음과 같은 차원이 표시됩니다.
| 재산 | 설명 |
|---|---|
gen_ai.operation.name |
JSON-RPC 메서드(tools/list 또는 tools/call). |
gen_ai.conversation.id |
MCP 세션 ID입니다. |
network.protocol.name |
MCP(프로토콜 이름). |
network.protocol.version |
프로토콜 버전입니다. |
auth.type |
인바운드 인증 방법입니다. |
user_agent.name |
MCP 클라이언트 이름(예: vscode 또는 claude-desktop). |
user_agent.version |
MCP 클라이언트 버전입니다. |
service.name |
MCP 서버 이름. |
service.version |
MCP 서버 버전입니다. |
api.type |
API 유형 판별자(Mcp). |
error.message |
실패 시 오류 문자열 |
error.type |
오류 범주( 오류 발생시) |
도구/목록의 추가 필드
| Metric | 설명 |
|---|---|
ToolCount |
응답에 반환된 도구 수입니다. |
tools/call의 추가 필드
| 재산 | 설명 |
|---|---|
gen_ai.tool.name |
에이전트가 호출한 도구입니다. |
gen_ai.tool.type |
도구 유형입니다. |
gen_ai.tool.call.arguments |
인수 JSON입니다. 페이로드 로깅을 사용하도록 설정한 경우에만 존재합니다. |
gen_ai.tool.call.result |
결과 JSON입니다. 페이로드 로깅을 사용하도록 설정한 경우에만 존재합니다. |