Azure API Management에서 MCP 서버 트래픽 모니터링하기

이 문서에서는 Azure API Management가 MCP 서버로의 트래픽에 대해 내보내는 원격 분석, 도구 인수와 결과에 대한 페이로드 로깅을 사용하도록 설정하는 방법, 그리고 Azure Monitor에서 데이터를 쿼리하는 방법을 알아봅니다.  

필수 조건

MCP 서버의 기본 텔레메트리

모든 MCP 요청에 대해 API Management는 MCP별 차원으로 Application Insights 요청 행을 작성하고 표준 기간 필드를 설정합니다. 구성을 변경하지 않고 도구별 대기 시간을 차트로 작성할 수 있습니다. 자세한 내용은 이 문서의 뒷부분에 있는 MCP 원격 분석 참조 섹션을 참조하세요.  

메모

MCP 원격 분석은 표준 원격 분석 특성 이름(예 gen_ai.*: )을 정의하는 생성 AI에 대한 OpenTelemetry 의미 체계 규칙을 따르므로 도구 간에 데이터가 일관됩니다.

인수 및 결과에 대한 페이로드 로깅 사용 설정

기본적으로 API Management는 도구 호출의 인수와 결과를 캡처하지 않습니다. MCP 서버에 대한 캡처를 사용하도록 설정하려면 다음을 수행합니다.

  1. Azure Portal에서 API Management 인스턴스로 이동합니다. 

  2. API>MCP 서버를 선택한 다음, 기록할 MCP 서버를 선택합니다. 

  3. 설정>진단 로그를 선택합니다. 

  4. 프런트 엔드 및 백 엔드 페이로드 로깅을 사용하도록 설정합니다. 저장을 선택합니다. 

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입니다. 페이로드 로깅을 사용하도록 설정한 경우에만 존재합니다.