OpenTelemetry GenAI 규격 — Prompt 수집 금지와 에이전트 추적 표준화

Maru

@maru

OpenTelemetry GenAI 규격 — Prompt 수집 금지와 에이전트 추적 표준화

OpenTelemetry GenAI 규격 — Prompt 수집 금지와 에이전트 추적 표준화

AI 에이전트와 거대언어모델을 활용한 백엔드 시스템이 프로덕션 환경으로 빠르게 확장되면서, 복잡한 비동기 흐름을 투명하게 디버깅하는 일이 개발팀의 핵심 과제로 떠올랐습니다. 그동안은 표준 규격이 없어 각자 다른 방식으로 추적 데이터를 남겼지만, 최근 오픈텔레메트리가 전용 시맨틱 컨벤션을 제정하며 표준화 작업을 완료했습니다. 이번 글에서는 새로운 오픈텔레메트리 규격이 민감한 프롬프트 유출을 방지하는 보안 설계와 다중 에이전트 환경의 복잡한 실행 추적을 어떻게 해결하는지 알아봅니다.

개인정보 유출 방지: raw 프롬프트 수집 금지와 이벤트 모델 전환

새로운 오픈텔레메트리 GenAI 표준 규격은 개인정보 유출 방지를 위해 데이터 수집 방식을 근본적으로 바꿨습니다. 기존 관행처럼 사용자의 프롬프트 원본이나 모델이 완성한 답변 전체를 스팬 속성에 일반 문자열로 그대로 저장하면, 데이터 저장소나 모니터링 도구에 민감한 개인정보가 고스란히 노출되는 치명적인 보안 문제를 낳기 때문입니다.

이에 따라 최신 규격에서는 기존의 gen_ai.promptgen_ai.completion 속성을 공식적으로 폐기했습니다. 그 대신 프롬프트와 메시지 기록을 보다 안전하고 체계적으로 관리할 수 있도록 gen_ai.input.messagesgen_ai.output.messages와 같은 표준화된 이벤트 포맷을 도입하여 모니터링 파이프라인에서 마스킹이나 필터링을 쉽게 적용할 수 있도록 지원합니다.

또한 인프라 메타데이터의 일관성을 높이기 위해 기존에 광범위하게 쓰이던 gen_ai.system 속성 명칭을 LLM 공급자 구분이 명확한 gen_ai.provider.name으로 변경했습니다. 이러한 변화는 프라이버시 침해 위험을 선제적으로 예방하면서도 정교한 분석 데이터를 유지할 수 있도록 돕습니다.

에이전트 동작 추적: invoke_agent와 execute_tool 표준 도입

AI 에이전트가 복잡한 비즈니스 로직과 외부 도구를 오가는 멀티스텝 아키텍처가 대세가 되면서, 기존의 단일 모델 호출 추적 방식으로는 전체 실행 흐름을 파악하기 어려워졌습니다. 여러 비동기 작업이 얽히는 에이전트 시스템에서는 각 도구가 언제 실행되고 어떤 결과를 반환했는지 투명하게 디버깅할 수 있는 추적 체계가 필수적입니다.

이를 해결하기 위해 최신 오픈텔레메트리 규격은 에이전트 본체의 실행 흐름을 표현하는 invoke_agent 스팬과, 개별 외부 기능의 실행을 감지하는 execute_tool 스팬을 표준으로 규정했습니다. invoke_agent 스팬이 전체 에이전트 루프의 시작과 끝을 감싸 안는 부모 역할을 수행하고, 그 안에서 실행되는 각종 외부 도구 호출이 execute_tool이라는 자식 스팬으로 연동되어 복잡한 비동기 작업도 계층적인 트레이스 흐름 안에서 한눈에 시각화할 수 있습니다.

특히 최근 널리 활용되는 모델 컨텍스트 프로토콜(MCP) 환경에서도 이 표준 스팬 규격은 강력한 힘을 발휘합니다. 분산된 MCP 서버와 연동하여 다양한 도구를 동적으로 호출하더라도 표준 규격이 제공하는 맥락 데이터가 그대로 전파되므로, 개발자는 별도의 커스텀 트레이싱 코드를 작성할 필요 없이 하나의 유기적인 분산 트레이스 흐름 안에서 에이전트 동작을 완벽하게 추적할 수 있습니다.

Fastify 실전 적용: @fastify/otel 연동과 전파 가이드

노드 환경에서 고성능 서버를 구축할 때 필수적으로 쓰이는 패스티파이에서도 최신 관측 가시성 표준의 혜택을 온전히 누릴 수 있습니다. 그동안 널리 쓰이던 기존 패스티파이 계측용 라이브러리는 현재 공식적으로 지원이 중단되었습니다. 대신 패스티파이 재단에서 직접 관리하는 공식 플러그인인 @fastify/otel을 사용해야 합니다. 이 공식 플러그인은 프레임워크의 라이프사이클 훅에 안전하게 결합하여 불필요한 오버헤드 없이 분산 추적을 처리합니다.

공식 플러그인을 등록하면 라우트 핸들러 내부에서 request.openTelemetry() 메서드를 바로 호출할 수 있습니다. 이 메서드는 요청 단위의 컨텍스트 정보를 담은 객체를 반환하며, 이 객체 안에는 최상위 HTTP 트레이스를 잇기 위한 스팬, 트레이서, 컨텍스트가 모두 포함되어 있습니다. 덕분에 다운스트림으로 이어지는 대규모 언어 모델 호출이나 에이전트 추적 스팬을 부모 트레이스에 누수 없이 연결할 수 있습니다.

다음은 @fastify/otel을 활용해 요청 생명주기 내에서 컨텍스트를 추출하고 하위 스팬을 생성하는 예시 코드입니다.

typescript
import Fastify from 'fastify';
import fastifyOtel from '@fastify/otel';

const fastify = Fastify();
await fastify.register(fastifyOtel);

fastify.get('/agent', async (request, reply) => {
  // 요청 생명주기에서 span, tracer, context 직접 추출
  const { span, tracer, context } = request.openTelemetry();
  
  // 다운스트림 에이전트 스팬에 부모 컨텍스트를 연결하여 시작
  const agentSpan = tracer.startSpan('invoke_agent', undefined, context);
  
  // 비즈니스 로직 및 에이전트 작업 수행...
  agentSpan.end();
  
  return { status: 'success' };
});

다만 실제 비즈니스에 도입할 때는 한 가지 유의할 점이 있습니다. 노드 생태계에서 쓰이는 여러 인공지능 SDK는 아직 새로운 오픈텔레메트리 GenAI 규격에 맞춰 결과를 자동으로 바인딩해 주는 타입 헬퍼를 완전하게 지원하지 않습니다. 따라서 클라이언트를 통해 얻은 토큰 사용량이나 응답 이벤트를 규격화된 스팬 속성에 맞춰 수동으로 매핑해 주는 연동 코드를 직접 작성하는 꼼꼼함이 요구됩니다.

보안성과 연동성을 보장하는 미래 지향적 AI 옵저버빌리티

AI 서비스 관찰 가능성 체계는 단순히 로그를 쌓는 단계를 넘어, 복잡한 시스템의 인과 관계를 추적하는 정교한 분산 트레이싱으로 진화하고 있습니다. 보안 우려가 큰 원본 프롬프트 노출을 완전히 막으면서 다단계 에이전트의 흐름을 선명하게 파악하려면 오픈텔레메트리 GenAI 규격 명세를 따르는 것이 가장 안전하고 합리적인 선택입니다.

지금 운영 중인 백엔드 파이프라인에서 무방비하게 원본 텍스트가 로그로 수집되고 있지는 않은지 점검할 때입니다. 공식 규격을 준수한 분산 추적 체계를 도입해 강력한 보안과 유연한 연동성을 동시에 확보해 보시길 바랍니다.


참고 링크