<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Blueprints on jyukki's Blog</title><link>https://jyukki.com/tags/blueprints/</link><description>Recent content in Blueprints on jyukki's Blog</description><generator>Hugo -- 0.147.0</generator><language>ko-KR</language><lastBuildDate>Sun, 16 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jyukki.com/tags/blueprints/index.xml" rel="self" type="application/rss+xml"/><item><title>2026 개발 트렌드: OpenTelemetry Blueprints, 관측성 도입이 템플릿·검증·운영 계약으로 이동한다</title><link>https://jyukki.com/posts/2026-08-16-opentelemetry-blueprints-governed-observability-trend/</link><pubDate>Sun, 16 Aug 2026 10:06:00 +0900</pubDate><guid>https://jyukki.com/posts/2026-08-16-opentelemetry-blueprints-governed-observability-trend/</guid><description>OpenTelemetry의 CNCF 졸업과 Blueprints·Reference Implementations 흐름을 바탕으로, 관측성이 SDK 도입을 넘어 검증 가능한 운영 템플릿과 데이터 계약으로 이동하는 이유를 정리합니다.</description><content:encoded><![CDATA[<p>2026년 관측성에서 눈에 띄는 변화는 새 exporter 하나가 아닙니다. OpenTelemetry가 5월 CNCF 졸업을 마치고, 5월에는 End User SIG가 <strong>Blueprints와 Reference Implementations</strong> 이니셔티브를 소개했습니다. 이미 OpenTelemetry를 쓰는 팀이 많아진 뒤에 나온 이 흐름은 중요한 질문을 바꿉니다. 이제 문제는 “어떤 SDK를 붙일까?”보다 **여러 팀이 같은 품질의 telemetry를 어떻게 반복해서 배포하고 검증할까?**에 가깝습니다.</p>
<p>이 글은 <a href="/posts/2026-07-01-opentelemetry-native-data-plane-trend/">OpenTelemetry 네이티브 데이터 플레인</a>, <a href="/posts/2026-07-18-go-compile-time-instrumentation-trend/">Go Compile-Time Instrumentation</a>, <a href="/learning/deep-dive/deep-dive-distributed-tracing-adoption-playbook/">분산 트레이싱 도입 플레이북</a>, <a href="/learning/deep-dive/deep-dive-trace-sampling-policy-tail-sampling-playbook/">Trace Sampling 정책</a>을 이어서 읽는 관점입니다. 앞선 글이 계측 방식과 데이터 파이프라인을 다뤘다면, 여기서는 그 조합을 조직의 운영 표준으로 만드는 방법을 다룹니다.</p>
<p>공식 신호는 세 가지입니다.</p>
<ul>
<li>OpenTelemetry는 2026년 5월 CNCF graduated status를 얻었고, 7월 공식 글은 이를 장기 운영 가능한 표준화 신호로 설명했습니다.</li>
<li>End User SIG는 여러 SDK·Collector·semantic convention·배포 방식을 매번 처음부터 조합하는 복잡도를 줄이기 위해 Blueprints와 Reference Implementations를 추진한다고 밝혔습니다.</li>
<li>Profiles signal은 3월 public alpha에 들어갔습니다. traces·metrics·logs만으로 끝나던 공통 계약이 profiling까지 확장될 가능성을 보여 주지만, 아직 성숙도를 분리해야 합니다.</li>
</ul>
<h2 id="이-글에서-얻는-것">이 글에서 얻는 것</h2>
<ul>
<li>OpenTelemetry의 성숙이 왜 ‘도입 프로젝트’에서 ‘운영 제품 관리’로 초점을 옮기는지 이해합니다.</li>
<li>Blueprint를 공통 YAML 묶음이 아니라, 워크로드별 telemetry 계약과 검증 경로로 설계하는 기준을 얻습니다.</li>
<li>attribute 품질·context continuity·Collector 비용·롤백을 한 번에 보는 canary 기준을 만들 수 있습니다.</li>
<li>agent workflow와 Profiles처럼 새 신호를 언제 기본 경로에 넣고 언제 실험으로 남길지 판단할 수 있습니다.</li>
</ul>
<h2 id="핵심-개념이슈">핵심 개념/이슈</h2>
<h3 id="1-cncf-졸업은-안정된-api만이-아니라-운영-책임의-이동을-뜻한다">1) CNCF 졸업은 ‘안정된 API’만이 아니라 운영 책임의 이동을 뜻한다</h3>
<p>OpenTelemetry가 졸업했다는 사실만으로 모든 서비스가 즉시 같은 설정을 쓰게 되지는 않습니다. 하지만 표준의 지속성, 다수 구현체와 벤더의 지원, 거버넌스 성숙도에 대한 신뢰가 높아졌다는 뜻은 분명합니다. 관측성 리더는 이제 “도구가 살아남을까?”보다 “우리 조직의 telemetry 데이터 품질을 누가 소유할까?”를 더 많이 고민하게 됩니다.</p>
<p>이 변화는 vendor lock-in이 사라진다는 뜻은 아닙니다. OTLP로 내보내더라도 저장소의 쿼리 언어, retention 정책, alert routing, SLO 화면, cost model은 여전히 벤더마다 다릅니다. 그래서 실무 목표를 ‘이식성 100%’로 잡기보다 아래 순서로 두는 편이 현실적입니다.</p>
<ol>
<li>애플리케이션이 표준 API·SDK와 안정된 resource attribute를 사용한다.</li>
<li>Collector 이전까지의 수집·redaction·sampling 정책을 코드와 설정으로 재현 가능하게 만든다.</li>
<li>저장·시각화 계층의 특화 기능은 명시적으로 목록화하고, 교체 비용을 정기적으로 재평가한다.</li>
</ol>
<p>즉 표준화는 특정 백엔드를 숨기는 일이 아니라, <strong>교체 가능한 부분과 의도적으로 종속된 부분을 구분하는 일</strong>입니다.</p>
<h3 id="2-blueprint의-핵심은-공통-설정이-아니라-의사결정이-재현되는-경로다">2) Blueprint의 핵심은 공통 설정이 아니라 ‘의사결정이 재현되는 경로’다</h3>
<p>Collector 설정 예제를 복사하면 빨리 시작할 수 있습니다. 그러나 서비스마다 트래픽, 개인정보, 오류 비용, critical path가 다르므로 한 YAML이 정답일 수는 없습니다. Blueprints가 유용해지는 지점은 “모두 같은 processor를 쓴다”가 아니라, 팀이 같은 질문에 같은 순서로 답하게 만드는 데 있습니다.</p>
<p>예를 들어 최소 Blueprint는 아래 네 층으로 나눌 수 있습니다.</p>
<table>
  <thead>
      <tr>
          <th>층</th>
          <th>공통 계약</th>
          <th>워크로드별 차이</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Resource</td>
          <td><code>service.name</code>, <code>service.version</code>, <code>deployment.environment</code></td>
          <td>tenant, region, release ring</td>
      </tr>
      <tr>
          <td>Instrumentation</td>
          <td>HTTP·DB·큐 경계와 오류 상태</td>
          <td>agent tool call, batch item, business span</td>
      </tr>
      <tr>
          <td>Pipeline</td>
          <td>redaction, batch, memory limit, export retry</td>
          <td>tail sampling, routing, 보존 등급</td>
      </tr>
      <tr>
          <td>Verification</td>
          <td>context propagation, 금지 attribute, drop/queue, rollback</td>
          <td>P0 trace 보존, 비용 한도, 성능 budget</td>
      </tr>
  </tbody>
</table>
<p>이 표를 먼저 만들면 ‘새 서비스에 OTel을 붙이자’는 말이 실행 가능한 계약이 됩니다. 팀은 어떤 attribute가 반드시 필요한지, 무엇을 보내면 안 되는지, 오류·지연·비용이 어느 수준이면 rollout을 멈출지를 같은 문서와 CI 체크에서 확인할 수 있습니다.</p>
<h3 id="3-새-신호가-늘수록-schema-governance가-더-중요해진다">3) 새 신호가 늘수록 schema governance가 더 중요해진다</h3>
<p>Profiles public alpha와 agentic workload의 관측 요구는 telemetry의 폭을 넓힙니다. trace에는 요청과 dependency가, log에는 사건이, profile에는 CPU·allocation·lock wait의 이유가 남습니다. agent workflow에는 모델 호출, tool 선택, retry, token 사용량, 승인 결과 같은 신호가 추가될 수 있습니다.</p>
<p>하지만 신호가 늘었다고 모든 데이터를 기본 수집하면 비용과 개인정보 노출이 같이 늘어납니다. 특히 다음은 기본 금지 목록으로 두는 편이 안전합니다.</p>
<ul>
<li>원문 request/response body, access token, session cookie</li>
<li>e-mail·전화번호처럼 식별 가능한 값</li>
<li>metric label에 들어가는 사용자 ID·주문 ID·전체 URL</li>
<li>prompt나 tool argument 원문처럼 민감정보가 섞일 수 있는 agent 입력</li>
</ul>
<p>반대로 필수 resource attribute는 처음부터 좁게 고정해야 합니다. <code>service.name</code>, <code>service.version</code>, <code>deployment.environment</code> 세 값이 누락되면 배포 전후 비교와 문제 범위 분리가 어려워집니다. 새 attribute는 owner, 자료형, cardinality 추정, 개인정보 분류, alert나 dashboard 사용처를 PR에 적게 하면 schema가 훨씬 덜 흩어집니다.</p>
<h3 id="4-reference-implementation은-정답이-아니라-검증-가능한-출발점이다">4) reference implementation은 정답이 아니라 검증 가능한 출발점이다</h3>
<p>Reference implementation을 그대로 production에 복사하는 것은 위험합니다. 데모는 교육과 검증을 위한 환경이고, 실제 서비스는 데이터 민감도·트래픽·장애 비용·조직 권한이 다릅니다. 다만 reference implementation은 ‘어떤 조합을 검증해야 하는가’의 좋은 출발점이 됩니다.</p>
<p>팀이 가져가야 할 것은 Collector topology보다 다음과 같은 검증 습관입니다.</p>
<ul>
<li>대표 요청 10~20개에서 trace parent-child 관계가 끊기지 않는가</li>
<li>오류 요청과 timeout 요청도 정상 요청처럼 service·environment를 식별할 수 있는가</li>
<li>redaction 이후에도 사고 조사에 필요한 correlation key가 남는가</li>
<li>queue latency, dropped telemetry, memory limiter hit를 같이 보는가</li>
<li>배포 후 ingest 증가율과 storage 비용을 기준선과 비교하는가</li>
</ul>
<p>이 관점은 <a href="/learning/deep-dive/deep-dive-distributed-tracing-adoption-playbook/">분산 트레이싱 도입 플레이북</a>의 경계 우선 계측과도 맞닿습니다. 좋은 템플릿은 설정을 숨기지 않습니다. 운영자가 품질 저하를 빨리 발견할 수 있도록 <strong>검증 항목과 실패 기준을 노출</strong>합니다.</p>
<h2 id="실무-적용">실무 적용</h2>
<h3 id="1-서비스-유형-4개로-시작하는-blueprint">1) 서비스 유형 4개로 시작하는 Blueprint</h3>
<p>처음부터 전사 표준을 크게 만들기보다, 요청 경로가 다른 네 유형으로 나누는 편이 낫습니다.</p>
<ol>
<li><strong>동기 HTTP/gRPC API</strong>: request duration, error, DB·외부 호출 span, deadline propagation을 기본으로 둡니다.</li>
<li><strong>비동기 consumer</strong>: message ID, consumer name, lag, retry/DLQ, 처리 결과를 기준으로 둡니다.</li>
<li><strong>batch/worker</strong>: job run ID, item success/fail, 처리량, checkpoint, 재시작 가능성을 둡니다.</li>
<li><strong>agent workflow</strong>: 모델·tool 호출의 지연과 비용, approval 결과, tool error, 민감 입력 redaction을 별도 계약으로 둡니다.</li>
</ol>
<p>각 유형에 required attribute를 3~5개만 두고, 초기에 optional attribute를 늘리지 않는 것이 좋습니다. 예컨대 비동기 consumer의 초기 contract는 <code>messaging.system</code>, <code>messaging.operation</code>, <code>service.name</code>, <code>deployment.environment</code>, <code>error.type</code> 정도로 시작할 수 있습니다. 도메인 ID는 trace/log attribute가 필요한 경우에만 hash·allowlist·retention을 별도 검토합니다.</p>
<h3 id="2-rollout은-signal-양이-아니라-신뢰도와-비용을-같이-본다">2) rollout은 signal 양이 아니라 신뢰도와 비용을 같이 본다</h3>
<p>새 Blueprint는 staging에서 끝내지 말고 5~10% traffic canary로 확인해야 합니다. 다음 표는 시작 기준으로 쓸 수 있습니다.</p>
<table>
  <thead>
      <tr>
          <th>항목</th>
          <th>통과 기준</th>
          <th>실패 시 우선 조치</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>핵심 경로 trace continuity</td>
          <td>99% 이상</td>
          <td>context propagation과 SDK 설정 확인</td>
      </tr>
      <tr>
          <td>required resource attribute 누락</td>
          <td>0건</td>
          <td>배포 차단 또는 template 수정</td>
      </tr>
      <tr>
          <td>forbidden attribute 탐지</td>
          <td>0건</td>
          <td>export 전 redaction, 수집 중단 검토</td>
      </tr>
      <tr>
          <td>Collector queue latency p95</td>
          <td>5초 이하</td>
          <td>batch·exporter·용량 점검</td>
      </tr>
      <tr>
          <td>dropped telemetry</td>
          <td>일반 0.1% 이하, P0 경로 0%</td>
          <td>sampling보다 backpressure 원인 우선 조사</td>
      </tr>
      <tr>
          <td>ingest 비용 증가</td>
          <td>기준선 대비 20% 이내 또는 명시 승인</td>
          <td>cardinality·sampling·보존 등급 조정</td>
      </tr>
  </tbody>
</table>
<p>수치는 조직마다 달라질 수 있지만, ‘성공 = span 수 증가’가 아니라는 점이 중요합니다. trace가 2배 늘어도 context가 끊기거나 비용만 늘면 운영 품질은 나빠질 수 있습니다. 반대로 필수 경로의 누락이 줄고, 장애 때 원인 후보를 찾는 시간이 30분에서 10분으로 줄었다면 더 적은 데이터도 가치가 있습니다.</p>
<h3 id="3-템플릿을-버전-관리하고-변경을-배포처럼-다룬다">3) 템플릿을 버전 관리하고 변경을 배포처럼 다룬다</h3>
<p>Blueprint는 문서가 아니라 배포물에 가깝습니다. SDK 버전, Collector processor 순서, sampling rule, semantic convention 변경은 dashboard·alert·비용·incident runbook에 영향을 줍니다. 따라서 다음을 version control에 둡니다.</p>
<ul>
<li>template 버전과 적용 서비스 목록</li>
<li>required/forbidden attribute 목록과 변경 이력</li>
<li>processor·exporter·sampling의 변경 사유와 rollback 조건</li>
<li>대표 trace fixture와 schema 검증 결과</li>
<li>비용·drop·queue의 기준선과 canary 결과</li>
</ul>
<p>특히 attribute 이름 변경은 데이터 호환성 변경입니다. <code>http.route</code>나 사용자 정의 business attribute를 바꿀 때는 일정 기간 구·신 값을 함께 지원하거나 dashboard query를 같은 배포에서 바꿔야 합니다. <a href="/posts/2026-07-01-opentelemetry-native-data-plane-trend/">OpenTelemetry 네이티브 데이터 플레인</a>에서 다룬 cardinality 관리 원칙도 이 단계에서 CI로 끌어올리는 편이 좋습니다.</p>
<h3 id="4-profiles와-agent-telemetry는-기본값보다-제한된-파일럿으로">4) Profiles와 agent telemetry는 ‘기본값’보다 제한된 파일럿으로</h3>
<p>Profiles는 유망하지만 public alpha 신호입니다. production의 기본 telemetry contract에 즉시 넣기보다, CPU-bound 또는 allocation이 큰 서비스 1~2개에서 제한적으로 확인하는 편이 안전합니다. 수집 오버헤드, backend 지원, 보존 비용, 보안 검토가 모두 남아 있기 때문입니다.</p>
<p>agent telemetry도 비슷합니다. tool call·token·retry를 보면 운영성이 좋아질 수 있지만 prompt와 argument에는 개인정보·비밀값·외부 비신뢰 입력이 섞이기 쉽습니다. 초기에는 원문을 내보내지 않고 tool name, 상태 코드, latency bucket, token count, approval outcome처럼 집계 가능한 metadata만 허용하는 것이 좋습니다. 원문이 꼭 필요하면 짧은 retention, 접근 통제, audit log를 별도 계약으로 둡니다.</p>
<h2 id="트레이드오프주의점">트레이드오프/주의점</h2>
<p>첫째, 공통 Blueprint가 너무 강하면 플랫폼팀의 병목이 됩니다. 모든 서비스가 예외 승인을 기다리게 하면 표준은 우회됩니다. 필수 최소값은 작게, 고위험 override만 명시 승인으로 두는 편이 지속 가능합니다.</p>
<p>둘째, vendor-neutral instrumentation이 vendor-neutral 운영을 보장하지는 않습니다. storage query, alert rule, cost attribution, retention은 여전히 이전 비용을 만듭니다. 표준화 성과를 과장하지 말고, 어느 계층이 이식 가능한지와 아닌지를 문서화해야 합니다.</p>
<p>셋째, semantic convention을 엄격히 적용하더라도 도메인 의미가 자동으로 생기지 않습니다. 자동 계측은 HTTP·DB·큐의 경계를 채우고, 주문 승인·정산 마감·권한 판정처럼 운영자가 실제로 묻는 업무 단계는 수동 span이나 이벤트로 보완해야 합니다.</p>
<p>넷째, 통합 신호를 늘릴수록 비용과 개인정보 위험이 커집니다. 새로운 data type을 도입할 때는 ‘수집할 수 있는가’보다 ‘장애 대응에 꼭 필요한가, 어느 기간·누가 볼 수 있는가’를 먼저 답해야 합니다.</p>
<p>의사결정 우선순위는 <strong>P0 경로의 진단 가능성 &gt; 개인정보·비밀값 보호 &gt; context와 schema의 일관성 &gt; 비용 예측 가능성 &gt; 개발자 편의성</strong>으로 두는 것이 안전합니다.</p>
<h2 id="체크리스트-또는-연습">체크리스트 또는 연습</h2>
<h3 id="체크리스트">체크리스트</h3>
<ul>
<li><input disabled="" type="checkbox"> HTTP API, consumer, batch, agent workflow의 최소 telemetry contract를 분리했다.</li>
<li><input disabled="" type="checkbox"> required resource attribute와 forbidden attribute가 버전 관리된다.</li>
<li><input disabled="" type="checkbox"> 새 계측은 trace continuity, schema, queue/drop, 비용을 함께 검증한다.</li>
<li><input disabled="" type="checkbox"> Collector 설정·sampling 정책·dashboard 변경에 rollback 기준이 있다.</li>
<li><input disabled="" type="checkbox"> 고카디널리티 식별자는 metric label에 넣지 않고, 필요 시 trace/log에도 정책적으로 제한한다.</li>
<li><input disabled="" type="checkbox"> Profiles와 agent 원문 데이터는 성숙도·민감도에 맞춰 별도 파일럿으로 다룬다.</li>
<li><input disabled="" type="checkbox"> backend 특화 기능과 표준 계층의 경계를 문서화했다.</li>
</ul>
<h3 id="연습">연습</h3>
<ol>
<li>현재 서비스 하나를 HTTP API, consumer, batch, agent workflow 중 하나로 분류하고, 반드시 남겨야 할 attribute 5개와 절대 보내면 안 되는 값 5개를 적어 보세요.</li>
<li>최근 장애 하나를 골라 trace, log, metric 중 무엇이 부족했는지 정리한 뒤, 그 빈칸을 메우는 Blueprint 검증 항목을 한 줄씩 만드세요.</li>
<li>새 Collector processor를 추가한다고 가정하고 queue latency, drop rate, ingest 비용, 개인정보 노출 가능성에 대한 중단 기준을 숫자로 작성해 보세요.</li>
</ol>
<h2 id="참고한-공식-자료">참고한 공식 자료</h2>
<ul>
<li><a href="https://opentelemetry.io/blog/2026/otel-grad-now-what/">OpenTelemetry Has Graduated… Now what?</a></li>
<li><a href="https://opentelemetry.io/blog/2026/blueprints-intro/">Introducing OTel Blueprints and Reference Implementations</a></li>
<li><a href="https://opentelemetry.io/blog/2026/profiles-alpha/">OpenTelemetry Profiles Enters Public Alpha</a></li>
</ul>
<h2 id="관련-글">관련 글</h2>
<ul>
<li><a href="/posts/2026-07-01-opentelemetry-native-data-plane-trend/">OpenTelemetry 네이티브 데이터 플레인</a></li>
<li><a href="/posts/2026-07-18-go-compile-time-instrumentation-trend/">Go Compile-Time Instrumentation</a></li>
<li><a href="/learning/deep-dive/deep-dive-distributed-tracing-adoption-playbook/">분산 트레이싱 도입 플레이북</a></li>
<li><a href="/learning/deep-dive/deep-dive-trace-sampling-policy-tail-sampling-playbook/">Trace Sampling 정책</a></li>
<li><a href="/learning/deep-dive/deep-dive-observability-baseline/">Observability Baseline</a></li>
</ul>
]]></content:encoded></item></channel></rss>